/* * 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 SkPixmapPriv_DEFINED #define SkPixmapPriv_DEFINED #include "include/codec/SkEncodedOrigin.h" #include "include/core/SkPixmap.h" #include "src/core/SkAutoPixmapStorage.h" class SkPixmapPriv { 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 bool ShouldSwapWidthHeight(SkEncodedOrigin o); 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. */ static bool Orient(const SkPixmap& dst, SkEncodedOrigin origin, std::function decode) { SkAutoPixmapStorage storage; const SkPixmap* tmp = &dst; if (origin != kTopLeft_SkEncodedOrigin) { auto info = dst.info(); if (ShouldSwapWidthHeight(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; } static void ResetPixmapKeepInfo(SkPixmap* pm, const void* address, size_t rowBytes) { pm->fRowBytes = rowBytes; pm->fPixels = address; } }; #endif