1/*
2 * Copyright 2015 Google Inc.
3 *
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
6 */
7
8#ifndef SkPixmapPriv_DEFINED
9#define SkPixmapPriv_DEFINED
10
11#include "include/codec/SkEncodedOrigin.h"
12#include "include/core/SkPixmap.h"
13#include "src/core/SkAutoPixmapStorage.h"
14
15class SkPixmapPriv {
16public:
17 /**
18 * Copy the pixels in this pixmap into dst, applying the orientation transformations specified
19 * by the flags. If the inputs are invalid, this returns false and no copy is made.
20 */
21 static bool Orient(const SkPixmap& dst, const SkPixmap& src, SkEncodedOrigin);
22
23 static bool ShouldSwapWidthHeight(SkEncodedOrigin o);
24 static SkImageInfo SwapWidthHeight(const SkImageInfo& info);
25
26 /**
27 * Decode an image and then copy into dst, applying origin.
28 *
29 * @param dst SkPixmap to write the final image, after
30 * applying the origin.
31 * @param origin SkEncodedOrigin to apply to the raw pixels.
32 * @param decode Function for decoding into a pixmap without
33 * applying the origin.
34 */
35
36 template <typename Fn>
37 static bool Orient(const SkPixmap& dst, SkEncodedOrigin origin, Fn&& decode) {
38 SkAutoPixmapStorage storage;
39 const SkPixmap* tmp = &dst;
40 if (origin != kTopLeft_SkEncodedOrigin) {
41 auto info = dst.info();
42 if (ShouldSwapWidthHeight(origin)) {
43 info = SwapWidthHeight(info);
44 }
45 if (!storage.tryAlloc(info)) {
46 return false;
47 }
48 tmp = &storage;
49 }
50 if (!decode(*tmp)) {
51 return false;
52 }
53 if (tmp != &dst) {
54 return Orient(dst, *tmp, origin);
55 }
56 return true;
57 }
58
59 static void ResetPixmapKeepInfo(SkPixmap* pm, const void* address, size_t rowBytes) {
60 pm->fRowBytes = rowBytes;
61 pm->fPixels = address;
62 }
63};
64
65#endif
66