OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2015 Google Inc. | 2 * Copyright 2015 Google Inc. |
3 * | 3 * |
4 * Use of this source code is governed by a BSD-style license that can be | 4 * Use of this source code is governed by a BSD-style license that can be |
5 * found in the LICENSE file. | 5 * found in the LICENSE file. |
6 */ | 6 */ |
7 | 7 |
8 #include "SkColorPriv.h" | 8 #include "SkColorPriv.h" |
9 #include "SkConfig8888.h" | 9 #include "SkConfig8888.h" |
10 #include "SkMask.h" | 10 #include "SkMask.h" |
11 #include "SkPixmap.h" | 11 #include "SkPixmap.h" |
12 #include "SkUtils.h" | 12 #include "SkUtils.h" |
13 | 13 |
14 void SkAutoPixmapUnlock::reset(const SkPixmap& pm, void (*unlock)(void*), void*
ctx) { | 14 void SkAutoPixmapUnlock::reset(const SkPixmap& pm, void (*unlock)(void*), void*
ctx) { |
15 SkASSERT(pm.addr() != NULL); | 15 SkASSERT(pm.addr() != nullptr); |
16 | 16 |
17 this->unlock(); | 17 this->unlock(); |
18 fPixmap = pm; | 18 fPixmap = pm; |
19 fUnlockProc = unlock; | 19 fUnlockProc = unlock; |
20 fUnlockContext = ctx; | 20 fUnlockContext = ctx; |
21 fIsLocked = true; | 21 fIsLocked = true; |
22 } | 22 } |
23 | 23 |
24 ////////////////////////////////////////////////////////////////////////////////
///////////////// | 24 ////////////////////////////////////////////////////////////////////////////////
///////////////// |
25 | 25 |
26 void SkPixmap::reset() { | 26 void SkPixmap::reset() { |
27 fPixels = NULL; | 27 fPixels = nullptr; |
28 fCTable = NULL; | 28 fCTable = nullptr; |
29 fRowBytes = 0; | 29 fRowBytes = 0; |
30 fInfo = SkImageInfo::MakeUnknown(); | 30 fInfo = SkImageInfo::MakeUnknown(); |
31 } | 31 } |
32 | 32 |
33 void SkPixmap::reset(const SkImageInfo& info, const void* addr, size_t rowBytes,
SkColorTable* ct) { | 33 void SkPixmap::reset(const SkImageInfo& info, const void* addr, size_t rowBytes,
SkColorTable* ct) { |
34 if (addr) { | 34 if (addr) { |
35 SkASSERT(info.validRowBytes(rowBytes)); | 35 SkASSERT(info.validRowBytes(rowBytes)); |
36 } | 36 } |
37 fPixels = addr; | 37 fPixels = addr; |
38 fCTable = ct; | 38 fCTable = ct; |
39 fRowBytes = rowBytes; | 39 fRowBytes = rowBytes; |
40 fInfo = info; | 40 fInfo = info; |
41 } | 41 } |
42 | 42 |
43 bool SkPixmap::reset(const SkMask& src) { | 43 bool SkPixmap::reset(const SkMask& src) { |
44 if (SkMask::kA8_Format == src.fFormat) { | 44 if (SkMask::kA8_Format == src.fFormat) { |
45 this->reset(SkImageInfo::MakeA8(src.fBounds.width(), src.fBounds.height(
)), | 45 this->reset(SkImageInfo::MakeA8(src.fBounds.width(), src.fBounds.height(
)), |
46 src.fImage, src.fRowBytes, NULL); | 46 src.fImage, src.fRowBytes, nullptr); |
47 return true; | 47 return true; |
48 } | 48 } |
49 this->reset(); | 49 this->reset(); |
50 return false; | 50 return false; |
51 } | 51 } |
52 | 52 |
53 bool SkPixmap::extractSubset(SkPixmap* result, const SkIRect& subset) const { | 53 bool SkPixmap::extractSubset(SkPixmap* result, const SkIRect& subset) const { |
54 SkIRect srcRect, r; | 54 SkIRect srcRect, r; |
55 srcRect.set(0, 0, this->width(), this->height()); | 55 srcRect.set(0, 0, this->width(), this->height()); |
56 if (!r.intersect(srcRect, subset)) { | 56 if (!r.intersect(srcRect, subset)) { |
57 return false; // r is empty (i.e. no intersection) | 57 return false; // r is empty (i.e. no intersection) |
58 } | 58 } |
59 | 59 |
60 // If the upper left of the rectangle was outside the bounds of this SkBitma
p, we should have | 60 // If the upper left of the rectangle was outside the bounds of this SkBitma
p, we should have |
61 // exited above. | 61 // exited above. |
62 SkASSERT(static_cast<unsigned>(r.fLeft) < static_cast<unsigned>(this->width(
))); | 62 SkASSERT(static_cast<unsigned>(r.fLeft) < static_cast<unsigned>(this->width(
))); |
63 SkASSERT(static_cast<unsigned>(r.fTop) < static_cast<unsigned>(this->height(
))); | 63 SkASSERT(static_cast<unsigned>(r.fTop) < static_cast<unsigned>(this->height(
))); |
64 | 64 |
65 const void* pixels = NULL; | 65 const void* pixels = nullptr; |
66 if (fPixels) { | 66 if (fPixels) { |
67 const size_t bpp = fInfo.bytesPerPixel(); | 67 const size_t bpp = fInfo.bytesPerPixel(); |
68 pixels = (const uint8_t*)fPixels + r.fTop * fRowBytes + r.fLeft * bpp; | 68 pixels = (const uint8_t*)fPixels + r.fTop * fRowBytes + r.fLeft * bpp; |
69 } | 69 } |
70 result->reset(fInfo.makeWH(r.width(), r.height()), pixels, fRowBytes, fCTabl
e); | 70 result->reset(fInfo.makeWH(r.width(), r.height()), pixels, fRowBytes, fCTabl
e); |
71 return true; | 71 return true; |
72 } | 72 } |
73 | 73 |
74 bool SkPixmap::readPixels(const SkImageInfo& requestedDstInfo, void* dstPixels,
size_t dstRB, | 74 bool SkPixmap::readPixels(const SkImageInfo& requestedDstInfo, void* dstPixels,
size_t dstRB, |
75 int x, int y) const { | 75 int x, int y) const { |
76 if (kUnknown_SkColorType == requestedDstInfo.colorType()) { | 76 if (kUnknown_SkColorType == requestedDstInfo.colorType()) { |
77 return false; | 77 return false; |
78 } | 78 } |
79 if (NULL == dstPixels || dstRB < requestedDstInfo.minRowBytes()) { | 79 if (nullptr == dstPixels || dstRB < requestedDstInfo.minRowBytes()) { |
80 return false; | 80 return false; |
81 } | 81 } |
82 if (0 == requestedDstInfo.width() || 0 == requestedDstInfo.height()) { | 82 if (0 == requestedDstInfo.width() || 0 == requestedDstInfo.height()) { |
83 return false; | 83 return false; |
84 } | 84 } |
85 | 85 |
86 SkIRect srcR = SkIRect::MakeXYWH(x, y, requestedDstInfo.width(), requestedDs
tInfo.height()); | 86 SkIRect srcR = SkIRect::MakeXYWH(x, y, requestedDstInfo.width(), requestedDs
tInfo.height()); |
87 if (!srcR.intersect(0, 0, this->width(), this->height())) { | 87 if (!srcR.intersect(0, 0, this->width(), this->height())) { |
88 return false; | 88 return false; |
89 } | 89 } |
(...skipping 19 matching lines...) Expand all Loading... |
109 | 109 |
110 static uint16_t pack_8888_to_4444(unsigned a, unsigned r, unsigned g, unsigned b
) { | 110 static uint16_t pack_8888_to_4444(unsigned a, unsigned r, unsigned g, unsigned b
) { |
111 unsigned pixel = (SkA32To4444(a) << SK_A4444_SHIFT) | | 111 unsigned pixel = (SkA32To4444(a) << SK_A4444_SHIFT) | |
112 (SkR32To4444(r) << SK_R4444_SHIFT) | | 112 (SkR32To4444(r) << SK_R4444_SHIFT) | |
113 (SkG32To4444(g) << SK_G4444_SHIFT) | | 113 (SkG32To4444(g) << SK_G4444_SHIFT) | |
114 (SkB32To4444(b) << SK_B4444_SHIFT); | 114 (SkB32To4444(b) << SK_B4444_SHIFT); |
115 return SkToU16(pixel); | 115 return SkToU16(pixel); |
116 } | 116 } |
117 | 117 |
118 bool SkPixmap::erase(SkColor color, const SkIRect& inArea) const { | 118 bool SkPixmap::erase(SkColor color, const SkIRect& inArea) const { |
119 if (NULL == fPixels) { | 119 if (nullptr == fPixels) { |
120 return false; | 120 return false; |
121 } | 121 } |
122 SkIRect area; | 122 SkIRect area; |
123 if (!area.intersect(this->bounds(), inArea)) { | 123 if (!area.intersect(this->bounds(), inArea)) { |
124 return false; | 124 return false; |
125 } | 125 } |
126 | 126 |
127 U8CPU a = SkColorGetA(color); | 127 U8CPU a = SkColorGetA(color); |
128 U8CPU r = SkColorGetR(color); | 128 U8CPU r = SkColorGetR(color); |
129 U8CPU g = SkColorGetG(color); | 129 U8CPU g = SkColorGetG(color); |
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
200 break; | 200 break; |
201 } | 201 } |
202 default: | 202 default: |
203 return false; // no change, so don't call notifyPixelsChanged() | 203 return false; // no change, so don't call notifyPixelsChanged() |
204 } | 204 } |
205 return true; | 205 return true; |
206 } | 206 } |
207 | 207 |
208 ////////////////////////////////////////////////////////////////////////////////
////////////////// | 208 ////////////////////////////////////////////////////////////////////////////////
////////////////// |
209 | 209 |
210 SkAutoPixmapStorage::SkAutoPixmapStorage() : fStorage(NULL) {} | 210 SkAutoPixmapStorage::SkAutoPixmapStorage() : fStorage(nullptr) {} |
211 | 211 |
212 SkAutoPixmapStorage::~SkAutoPixmapStorage() { | 212 SkAutoPixmapStorage::~SkAutoPixmapStorage() { |
213 this->freeStorage(); | 213 this->freeStorage(); |
214 } | 214 } |
215 | 215 |
216 bool SkAutoPixmapStorage::tryAlloc(const SkImageInfo& info) { | 216 bool SkAutoPixmapStorage::tryAlloc(const SkImageInfo& info) { |
217 this->freeStorage(); | 217 this->freeStorage(); |
218 | 218 |
219 size_t rb = info.minRowBytes(); | 219 size_t rb = info.minRowBytes(); |
220 size_t size = info.getSafeSize(rb); | 220 size_t size = info.getSafeSize(rb); |
221 if (0 == size) { | 221 if (0 == size) { |
222 return false; | 222 return false; |
223 } | 223 } |
224 void* pixels = sk_malloc_flags(size, 0); | 224 void* pixels = sk_malloc_flags(size, 0); |
225 if (NULL == pixels) { | 225 if (nullptr == pixels) { |
226 return false; | 226 return false; |
227 } | 227 } |
228 this->reset(info, pixels, rb); | 228 this->reset(info, pixels, rb); |
229 fStorage = pixels; | 229 fStorage = pixels; |
230 return true; | 230 return true; |
231 } | 231 } |
232 | 232 |
233 void SkAutoPixmapStorage::alloc(const SkImageInfo& info) { | 233 void SkAutoPixmapStorage::alloc(const SkImageInfo& info) { |
234 if (!this->tryAlloc(info)) { | 234 if (!this->tryAlloc(info)) { |
235 sk_throw(); | 235 sk_throw(); |
236 } | 236 } |
237 } | 237 } |
OLD | NEW |