diff options
Diffstat (limited to 'gfx/skia/skia/src/codec/SkPixmapUtils.h')
-rw-r--r-- | gfx/skia/skia/src/codec/SkPixmapUtils.h | 61 |
1 files changed, 61 insertions, 0 deletions
diff --git a/gfx/skia/skia/src/codec/SkPixmapUtils.h b/gfx/skia/skia/src/codec/SkPixmapUtils.h new file mode 100644 index 0000000000..e438fbbe83 --- /dev/null +++ b/gfx/skia/skia/src/codec/SkPixmapUtils.h @@ -0,0 +1,61 @@ +/* + * Copyright 2015 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + */ + +#ifndef SkPixmapUtils_DEFINED +#define SkPixmapUtils_DEFINED + +#include "include/codec/SkEncodedOrigin.h" +#include "include/core/SkImageInfo.h" +#include "include/core/SkPixmap.h" +#include "src/core/SkAutoPixmapStorage.h" + +class SkPixmapUtils { +public: + /** + * Copy the pixels in this pixmap into dst, applying the orientation transformations specified + * by the flags. If the inputs are invalid, this returns false and no copy is made. + */ + static bool Orient(const SkPixmap& dst, const SkPixmap& src, SkEncodedOrigin); + + static SkImageInfo SwapWidthHeight(const SkImageInfo& info); + + /** + * Decode an image and then copy into dst, applying origin. + * + * @param dst SkPixmap to write the final image, after + * applying the origin. + * @param origin SkEncodedOrigin to apply to the raw pixels. + * @param decode Function for decoding into a pixmap without + * applying the origin. + */ + + template <typename Fn> + static bool Orient(const SkPixmap& dst, SkEncodedOrigin origin, Fn&& decode) { + SkAutoPixmapStorage storage; + const SkPixmap* tmp = &dst; + if (origin != kTopLeft_SkEncodedOrigin) { + auto info = dst.info(); + if (SkEncodedOriginSwapsWidthHeight(origin)) { + info = SwapWidthHeight(info); + } + if (!storage.tryAlloc(info)) { + return false; + } + tmp = &storage; + } + if (!decode(*tmp)) { + return false; + } + if (tmp != &dst) { + return Orient(dst, *tmp, origin); + } + return true; + } + +}; + +#endif // SkPixmapUtils_DEFINED |