| /* | 
 |  * 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 SkPixmapUtilsPriv_DEFINED | 
 | #define SkPixmapUtilsPriv_DEFINED | 
 |  | 
 | #include "include/codec/SkEncodedOrigin.h" | 
 | #include "include/codec/SkPixmapUtils.h" | 
 | #include "include/core/SkImageInfo.h" | 
 | #include "include/core/SkPixmap.h" | 
 | #include "src/core/SkAutoPixmapStorage.h" | 
 |  | 
 | namespace SkPixmapUtils { | 
 |  | 
 | /** | 
 |  *  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> | 
 | 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; | 
 | } | 
 |  | 
 | }  // namespace SkPixmapUtils | 
 |  | 
 | #endif // SkPixmapUtilsPriv_DEFINED |