| /* |
| * 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. |
| */ |
| |
| 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 (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 |