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 SkPixmap_DEFINED |
9 | #define SkPixmap_DEFINED |
10 | |
11 | #include "include/core/SkColor.h" |
12 | #include "include/core/SkFilterQuality.h" |
13 | #include "include/core/SkImageInfo.h" |
14 | |
15 | class SkData; |
16 | struct SkMask; |
17 | |
18 | /** \class SkPixmap |
19 | SkPixmap provides a utility to pair SkImageInfo with pixels and row bytes. |
20 | SkPixmap is a low level class which provides convenience functions to access |
21 | raster destinations. SkCanvas can not draw SkPixmap, nor does SkPixmap provide |
22 | a direct drawing destination. |
23 | |
24 | Use SkBitmap to draw pixels referenced by SkPixmap; use SkSurface to draw into |
25 | pixels referenced by SkPixmap. |
26 | |
27 | SkPixmap does not try to manage the lifetime of the pixel memory. Use SkPixelRef |
28 | to manage pixel memory; SkPixelRef is safe across threads. |
29 | */ |
30 | class SK_API SkPixmap { |
31 | public: |
32 | |
33 | /** Creates an empty SkPixmap without pixels, with kUnknown_SkColorType, with |
34 | kUnknown_SkAlphaType, and with a width and height of zero. Use |
35 | reset() to associate pixels, SkColorType, SkAlphaType, width, and height |
36 | after SkPixmap has been created. |
37 | |
38 | @return empty SkPixmap |
39 | */ |
40 | SkPixmap() |
41 | : fPixels(nullptr), fRowBytes(0), fInfo(SkImageInfo::MakeUnknown(0, 0)) |
42 | {} |
43 | |
44 | /** Creates SkPixmap from info width, height, SkAlphaType, and SkColorType. |
45 | addr points to pixels, or nullptr. rowBytes should be info.width() times |
46 | info.bytesPerPixel(), or larger. |
47 | |
48 | No parameter checking is performed; it is up to the caller to ensure that |
49 | addr and rowBytes agree with info. |
50 | |
51 | The memory lifetime of pixels is managed by the caller. When SkPixmap goes |
52 | out of scope, addr is unaffected. |
53 | |
54 | SkPixmap may be later modified by reset() to change its size, pixel type, or |
55 | storage. |
56 | |
57 | @param info width, height, SkAlphaType, SkColorType of SkImageInfo |
58 | @param addr pointer to pixels allocated by caller; may be nullptr |
59 | @param rowBytes size of one row of addr; width times pixel size, or larger |
60 | @return initialized SkPixmap |
61 | */ |
62 | SkPixmap(const SkImageInfo& info, const void* addr, size_t rowBytes) |
63 | : fPixels(addr), fRowBytes(rowBytes), fInfo(info) |
64 | {} |
65 | |
66 | /** Sets width, height, row bytes to zero; pixel address to nullptr; SkColorType to |
67 | kUnknown_SkColorType; and SkAlphaType to kUnknown_SkAlphaType. |
68 | |
69 | The prior pixels are unaffected; it is up to the caller to release pixels |
70 | memory if desired. |
71 | |
72 | example: https://fiddle.skia.org/c/@Pixmap_reset |
73 | */ |
74 | void reset(); |
75 | |
76 | /** Sets width, height, SkAlphaType, and SkColorType from info. |
77 | Sets pixel address from addr, which may be nullptr. |
78 | Sets row bytes from rowBytes, which should be info.width() times |
79 | info.bytesPerPixel(), or larger. |
80 | |
81 | Does not check addr. Asserts if built with SK_DEBUG defined and if rowBytes is |
82 | too small to hold one row of pixels. |
83 | |
84 | The memory lifetime pixels are managed by the caller. When SkPixmap goes |
85 | out of scope, addr is unaffected. |
86 | |
87 | @param info width, height, SkAlphaType, SkColorType of SkImageInfo |
88 | @param addr pointer to pixels allocated by caller; may be nullptr |
89 | @param rowBytes size of one row of addr; width times pixel size, or larger |
90 | |
91 | example: https://fiddle.skia.org/c/@Pixmap_reset_2 |
92 | */ |
93 | void reset(const SkImageInfo& info, const void* addr, size_t rowBytes); |
94 | |
95 | /** Changes SkColorSpace in SkImageInfo; preserves width, height, SkAlphaType, and |
96 | SkColorType in SkImage, and leaves pixel address and row bytes unchanged. |
97 | SkColorSpace reference count is incremented. |
98 | |
99 | @param colorSpace SkColorSpace moved to SkImageInfo |
100 | |
101 | example: https://fiddle.skia.org/c/@Pixmap_setColorSpace |
102 | */ |
103 | void setColorSpace(sk_sp<SkColorSpace> colorSpace); |
104 | |
105 | /** Deprecated. |
106 | */ |
107 | bool SK_WARN_UNUSED_RESULT reset(const SkMask& mask); |
108 | |
109 | /** Sets subset width, height, pixel address to intersection of SkPixmap with area, |
110 | if intersection is not empty; and return true. Otherwise, leave subset unchanged |
111 | and return false. |
112 | |
113 | Failing to read the return value generates a compile time warning. |
114 | |
115 | @param subset storage for width, height, pixel address of intersection |
116 | @param area bounds to intersect with SkPixmap |
117 | @return true if intersection of SkPixmap and area is not empty |
118 | */ |
119 | bool SK_WARN_UNUSED_RESULT (SkPixmap* subset, const SkIRect& area) const; |
120 | |
121 | /** Returns width, height, SkAlphaType, SkColorType, and SkColorSpace. |
122 | |
123 | @return reference to SkImageInfo |
124 | */ |
125 | const SkImageInfo& info() const { return fInfo; } |
126 | |
127 | /** Returns row bytes, the interval from one pixel row to the next. Row bytes |
128 | is at least as large as: width() * info().bytesPerPixel(). |
129 | |
130 | Returns zero if colorType() is kUnknown_SkColorType. |
131 | It is up to the SkBitmap creator to ensure that row bytes is a useful value. |
132 | |
133 | @return byte length of pixel row |
134 | */ |
135 | size_t rowBytes() const { return fRowBytes; } |
136 | |
137 | /** Returns pixel address, the base address corresponding to the pixel origin. |
138 | |
139 | It is up to the SkPixmap creator to ensure that pixel address is a useful value. |
140 | |
141 | @return pixel address |
142 | */ |
143 | const void* addr() const { return fPixels; } |
144 | |
145 | /** Returns pixel count in each pixel row. Should be equal or less than: |
146 | rowBytes() / info().bytesPerPixel(). |
147 | |
148 | @return pixel width in SkImageInfo |
149 | */ |
150 | int width() const { return fInfo.width(); } |
151 | |
152 | /** Returns pixel row count. |
153 | |
154 | @return pixel height in SkImageInfo |
155 | */ |
156 | int height() const { return fInfo.height(); } |
157 | |
158 | /** |
159 | * Return the dimensions of the pixmap (from its ImageInfo) |
160 | */ |
161 | SkISize dimensions() const { return fInfo.dimensions(); } |
162 | |
163 | SkColorType colorType() const { return fInfo.colorType(); } |
164 | |
165 | SkAlphaType alphaType() const { return fInfo.alphaType(); } |
166 | |
167 | /** Returns SkColorSpace, the range of colors, associated with SkImageInfo. The |
168 | reference count of SkColorSpace is unchanged. The returned SkColorSpace is |
169 | immutable. |
170 | |
171 | @return SkColorSpace in SkImageInfo, or nullptr |
172 | */ |
173 | SkColorSpace* colorSpace() const { return fInfo.colorSpace(); } |
174 | |
175 | /** Returns smart pointer to SkColorSpace, the range of colors, associated with |
176 | SkImageInfo. The smart pointer tracks the number of objects sharing this |
177 | SkColorSpace reference so the memory is released when the owners destruct. |
178 | |
179 | The returned SkColorSpace is immutable. |
180 | |
181 | @return SkColorSpace in SkImageInfo wrapped in a smart pointer |
182 | */ |
183 | sk_sp<SkColorSpace> refColorSpace() const { return fInfo.refColorSpace(); } |
184 | |
185 | /** Returns true if SkAlphaType is kOpaque_SkAlphaType. |
186 | Does not check if SkColorType allows alpha, or if any pixel value has |
187 | transparency. |
188 | |
189 | @return true if SkImageInfo has opaque SkAlphaType |
190 | */ |
191 | bool isOpaque() const { return fInfo.isOpaque(); } |
192 | |
193 | /** Returns SkIRect { 0, 0, width(), height() }. |
194 | |
195 | @return integral rectangle from origin to width() and height() |
196 | */ |
197 | SkIRect bounds() const { return SkIRect::MakeWH(this->width(), this->height()); } |
198 | |
199 | /** Returns number of pixels that fit on row. Should be greater than or equal to |
200 | width(). |
201 | |
202 | @return maximum pixels per row |
203 | */ |
204 | int rowBytesAsPixels() const { return int(fRowBytes >> this->shiftPerPixel()); } |
205 | |
206 | /** Returns bit shift converting row bytes to row pixels. |
207 | Returns zero for kUnknown_SkColorType. |
208 | |
209 | @return one of: 0, 1, 2, 3; left shift to convert pixels to bytes |
210 | */ |
211 | int shiftPerPixel() const { return fInfo.shiftPerPixel(); } |
212 | |
213 | /** Returns minimum memory required for pixel storage. |
214 | Does not include unused memory on last row when rowBytesAsPixels() exceeds width(). |
215 | Returns SIZE_MAX if result does not fit in size_t. |
216 | Returns zero if height() or width() is 0. |
217 | Returns height() times rowBytes() if colorType() is kUnknown_SkColorType. |
218 | |
219 | @return size in bytes of image buffer |
220 | */ |
221 | size_t computeByteSize() const { return fInfo.computeByteSize(fRowBytes); } |
222 | |
223 | /** Returns true if all pixels are opaque. SkColorType determines how pixels |
224 | are encoded, and whether pixel describes alpha. Returns true for SkColorType |
225 | without alpha in each pixel; for other SkColorType, returns true if all |
226 | pixels have alpha values equivalent to 1.0 or greater. |
227 | |
228 | For SkColorType kRGB_565_SkColorType or kGray_8_SkColorType: always |
229 | returns true. For SkColorType kAlpha_8_SkColorType, kBGRA_8888_SkColorType, |
230 | kRGBA_8888_SkColorType: returns true if all pixel alpha values are 255. |
231 | For SkColorType kARGB_4444_SkColorType: returns true if all pixel alpha values are 15. |
232 | For kRGBA_F16_SkColorType: returns true if all pixel alpha values are 1.0 or |
233 | greater. |
234 | |
235 | Returns false for kUnknown_SkColorType. |
236 | |
237 | @return true if all pixels have opaque values or SkColorType is opaque |
238 | |
239 | example: https://fiddle.skia.org/c/@Pixmap_computeIsOpaque |
240 | */ |
241 | bool computeIsOpaque() const; |
242 | |
243 | /** Returns pixel at (x, y) as unpremultiplied color. |
244 | Returns black with alpha if SkColorType is kAlpha_8_SkColorType. |
245 | |
246 | Input is not validated: out of bounds values of x or y trigger an assert() if |
247 | built with SK_DEBUG defined; and returns undefined values or may crash if |
248 | SK_RELEASE is defined. Fails if SkColorType is kUnknown_SkColorType or |
249 | pixel address is nullptr. |
250 | |
251 | SkColorSpace in SkImageInfo is ignored. Some color precision may be lost in the |
252 | conversion to unpremultiplied color; original pixel data may have additional |
253 | precision. |
254 | |
255 | @param x column index, zero or greater, and less than width() |
256 | @param y row index, zero or greater, and less than height() |
257 | @return pixel converted to unpremultiplied color |
258 | |
259 | example: https://fiddle.skia.org/c/@Pixmap_getColor |
260 | */ |
261 | SkColor getColor(int x, int y) const; |
262 | |
263 | /** Look up the pixel at (x,y) and return its alpha component, normalized to [0..1]. |
264 | This is roughly equivalent to SkGetColorA(getColor()), but can be more efficent |
265 | (and more precise if the pixels store more than 8 bits per component). |
266 | |
267 | @param x column index, zero or greater, and less than width() |
268 | @param y row index, zero or greater, and less than height() |
269 | @return alpha converted to normalized float |
270 | */ |
271 | float getAlphaf(int x, int y) const; |
272 | |
273 | /** Returns readable pixel address at (x, y). Returns nullptr if SkPixelRef is nullptr. |
274 | |
275 | Input is not validated: out of bounds values of x or y trigger an assert() if |
276 | built with SK_DEBUG defined. Returns nullptr if SkColorType is kUnknown_SkColorType. |
277 | |
278 | Performs a lookup of pixel size; for better performance, call |
279 | one of: addr8, addr16, addr32, addr64, or addrF16(). |
280 | |
281 | @param x column index, zero or greater, and less than width() |
282 | @param y row index, zero or greater, and less than height() |
283 | @return readable generic pointer to pixel |
284 | */ |
285 | const void* addr(int x, int y) const { |
286 | return (const char*)fPixels + fInfo.computeOffset(x, y, fRowBytes); |
287 | } |
288 | |
289 | /** Returns readable base pixel address. Result is addressable as unsigned 8-bit bytes. |
290 | Will trigger an assert() if SkColorType is not kAlpha_8_SkColorType or |
291 | kGray_8_SkColorType, and is built with SK_DEBUG defined. |
292 | |
293 | One byte corresponds to one pixel. |
294 | |
295 | @return readable unsigned 8-bit pointer to pixels |
296 | */ |
297 | const uint8_t* addr8() const { |
298 | SkASSERT(1 == fInfo.bytesPerPixel()); |
299 | return reinterpret_cast<const uint8_t*>(fPixels); |
300 | } |
301 | |
302 | /** Returns readable base pixel address. Result is addressable as unsigned 16-bit words. |
303 | Will trigger an assert() if SkColorType is not kRGB_565_SkColorType or |
304 | kARGB_4444_SkColorType, and is built with SK_DEBUG defined. |
305 | |
306 | One word corresponds to one pixel. |
307 | |
308 | @return readable unsigned 16-bit pointer to pixels |
309 | */ |
310 | const uint16_t* addr16() const { |
311 | SkASSERT(2 == fInfo.bytesPerPixel()); |
312 | return reinterpret_cast<const uint16_t*>(fPixels); |
313 | } |
314 | |
315 | /** Returns readable base pixel address. Result is addressable as unsigned 32-bit words. |
316 | Will trigger an assert() if SkColorType is not kRGBA_8888_SkColorType or |
317 | kBGRA_8888_SkColorType, and is built with SK_DEBUG defined. |
318 | |
319 | One word corresponds to one pixel. |
320 | |
321 | @return readable unsigned 32-bit pointer to pixels |
322 | */ |
323 | const uint32_t* addr32() const { |
324 | SkASSERT(4 == fInfo.bytesPerPixel()); |
325 | return reinterpret_cast<const uint32_t*>(fPixels); |
326 | } |
327 | |
328 | /** Returns readable base pixel address. Result is addressable as unsigned 64-bit words. |
329 | Will trigger an assert() if SkColorType is not kRGBA_F16_SkColorType and is built |
330 | with SK_DEBUG defined. |
331 | |
332 | One word corresponds to one pixel. |
333 | |
334 | @return readable unsigned 64-bit pointer to pixels |
335 | */ |
336 | const uint64_t* addr64() const { |
337 | SkASSERT(8 == fInfo.bytesPerPixel()); |
338 | return reinterpret_cast<const uint64_t*>(fPixels); |
339 | } |
340 | |
341 | /** Returns readable base pixel address. Result is addressable as unsigned 16-bit words. |
342 | Will trigger an assert() if SkColorType is not kRGBA_F16_SkColorType and is built |
343 | with SK_DEBUG defined. |
344 | |
345 | Each word represents one color component encoded as a half float. |
346 | Four words correspond to one pixel. |
347 | |
348 | @return readable unsigned 16-bit pointer to first component of pixels |
349 | */ |
350 | const uint16_t* addrF16() const { |
351 | SkASSERT(8 == fInfo.bytesPerPixel()); |
352 | SkASSERT(kRGBA_F16_SkColorType == fInfo.colorType() || |
353 | kRGBA_F16Norm_SkColorType == fInfo.colorType()); |
354 | return reinterpret_cast<const uint16_t*>(fPixels); |
355 | } |
356 | |
357 | /** Returns readable pixel address at (x, y). |
358 | |
359 | Input is not validated: out of bounds values of x or y trigger an assert() if |
360 | built with SK_DEBUG defined. |
361 | |
362 | Will trigger an assert() if SkColorType is not kAlpha_8_SkColorType or |
363 | kGray_8_SkColorType, and is built with SK_DEBUG defined. |
364 | |
365 | @param x column index, zero or greater, and less than width() |
366 | @param y row index, zero or greater, and less than height() |
367 | @return readable unsigned 8-bit pointer to pixel at (x, y) |
368 | */ |
369 | const uint8_t* addr8(int x, int y) const { |
370 | SkASSERT((unsigned)x < (unsigned)fInfo.width()); |
371 | SkASSERT((unsigned)y < (unsigned)fInfo.height()); |
372 | return (const uint8_t*)((const char*)this->addr8() + y * fRowBytes + (x << 0)); |
373 | } |
374 | |
375 | /** Returns readable pixel address at (x, y). |
376 | |
377 | Input is not validated: out of bounds values of x or y trigger an assert() if |
378 | built with SK_DEBUG defined. |
379 | |
380 | Will trigger an assert() if SkColorType is not kRGB_565_SkColorType or |
381 | kARGB_4444_SkColorType, and is built with SK_DEBUG defined. |
382 | |
383 | @param x column index, zero or greater, and less than width() |
384 | @param y row index, zero or greater, and less than height() |
385 | @return readable unsigned 16-bit pointer to pixel at (x, y) |
386 | */ |
387 | const uint16_t* addr16(int x, int y) const { |
388 | SkASSERT((unsigned)x < (unsigned)fInfo.width()); |
389 | SkASSERT((unsigned)y < (unsigned)fInfo.height()); |
390 | return (const uint16_t*)((const char*)this->addr16() + y * fRowBytes + (x << 1)); |
391 | } |
392 | |
393 | /** Returns readable pixel address at (x, y). |
394 | |
395 | Input is not validated: out of bounds values of x or y trigger an assert() if |
396 | built with SK_DEBUG defined. |
397 | |
398 | Will trigger an assert() if SkColorType is not kRGBA_8888_SkColorType or |
399 | kBGRA_8888_SkColorType, and is built with SK_DEBUG defined. |
400 | |
401 | @param x column index, zero or greater, and less than width() |
402 | @param y row index, zero or greater, and less than height() |
403 | @return readable unsigned 32-bit pointer to pixel at (x, y) |
404 | */ |
405 | const uint32_t* addr32(int x, int y) const { |
406 | SkASSERT((unsigned)x < (unsigned)fInfo.width()); |
407 | SkASSERT((unsigned)y < (unsigned)fInfo.height()); |
408 | return (const uint32_t*)((const char*)this->addr32() + y * fRowBytes + (x << 2)); |
409 | } |
410 | |
411 | /** Returns readable pixel address at (x, y). |
412 | |
413 | Input is not validated: out of bounds values of x or y trigger an assert() if |
414 | built with SK_DEBUG defined. |
415 | |
416 | Will trigger an assert() if SkColorType is not kRGBA_F16_SkColorType and is built |
417 | with SK_DEBUG defined. |
418 | |
419 | @param x column index, zero or greater, and less than width() |
420 | @param y row index, zero or greater, and less than height() |
421 | @return readable unsigned 64-bit pointer to pixel at (x, y) |
422 | */ |
423 | const uint64_t* addr64(int x, int y) const { |
424 | SkASSERT((unsigned)x < (unsigned)fInfo.width()); |
425 | SkASSERT((unsigned)y < (unsigned)fInfo.height()); |
426 | return (const uint64_t*)((const char*)this->addr64() + y * fRowBytes + (x << 3)); |
427 | } |
428 | |
429 | /** Returns readable pixel address at (x, y). |
430 | |
431 | Input is not validated: out of bounds values of x or y trigger an assert() if |
432 | built with SK_DEBUG defined. |
433 | |
434 | Will trigger an assert() if SkColorType is not kRGBA_F16_SkColorType and is built |
435 | with SK_DEBUG defined. |
436 | |
437 | Each unsigned 16-bit word represents one color component encoded as a half float. |
438 | Four words correspond to one pixel. |
439 | |
440 | @param x column index, zero or greater, and less than width() |
441 | @param y row index, zero or greater, and less than height() |
442 | @return readable unsigned 16-bit pointer to pixel component at (x, y) |
443 | */ |
444 | const uint16_t* addrF16(int x, int y) const { |
445 | SkASSERT(kRGBA_F16_SkColorType == fInfo.colorType() || |
446 | kRGBA_F16Norm_SkColorType == fInfo.colorType()); |
447 | return reinterpret_cast<const uint16_t*>(this->addr64(x, y)); |
448 | } |
449 | |
450 | /** Returns writable base pixel address. |
451 | |
452 | @return writable generic base pointer to pixels |
453 | */ |
454 | void* writable_addr() const { return const_cast<void*>(fPixels); } |
455 | |
456 | /** Returns writable pixel address at (x, y). |
457 | |
458 | Input is not validated: out of bounds values of x or y trigger an assert() if |
459 | built with SK_DEBUG defined. Returns zero if SkColorType is kUnknown_SkColorType. |
460 | |
461 | @param x column index, zero or greater, and less than width() |
462 | @param y row index, zero or greater, and less than height() |
463 | @return writable generic pointer to pixel |
464 | */ |
465 | void* writable_addr(int x, int y) const { |
466 | return const_cast<void*>(this->addr(x, y)); |
467 | } |
468 | |
469 | /** Returns writable pixel address at (x, y). Result is addressable as unsigned |
470 | 8-bit bytes. Will trigger an assert() if SkColorType is not kAlpha_8_SkColorType |
471 | or kGray_8_SkColorType, and is built with SK_DEBUG defined. |
472 | |
473 | One byte corresponds to one pixel. |
474 | |
475 | @param x column index, zero or greater, and less than width() |
476 | @param y row index, zero or greater, and less than height() |
477 | @return writable unsigned 8-bit pointer to pixels |
478 | */ |
479 | uint8_t* writable_addr8(int x, int y) const { |
480 | return const_cast<uint8_t*>(this->addr8(x, y)); |
481 | } |
482 | |
483 | /** Returns writable_addr pixel address at (x, y). Result is addressable as unsigned |
484 | 16-bit words. Will trigger an assert() if SkColorType is not kRGB_565_SkColorType |
485 | or kARGB_4444_SkColorType, and is built with SK_DEBUG defined. |
486 | |
487 | One word corresponds to one pixel. |
488 | |
489 | @param x column index, zero or greater, and less than width() |
490 | @param y row index, zero or greater, and less than height() |
491 | @return writable unsigned 16-bit pointer to pixel |
492 | */ |
493 | uint16_t* writable_addr16(int x, int y) const { |
494 | return const_cast<uint16_t*>(this->addr16(x, y)); |
495 | } |
496 | |
497 | /** Returns writable pixel address at (x, y). Result is addressable as unsigned |
498 | 32-bit words. Will trigger an assert() if SkColorType is not |
499 | kRGBA_8888_SkColorType or kBGRA_8888_SkColorType, and is built with SK_DEBUG |
500 | defined. |
501 | |
502 | One word corresponds to one pixel. |
503 | |
504 | @param x column index, zero or greater, and less than width() |
505 | @param y row index, zero or greater, and less than height() |
506 | @return writable unsigned 32-bit pointer to pixel |
507 | */ |
508 | uint32_t* writable_addr32(int x, int y) const { |
509 | return const_cast<uint32_t*>(this->addr32(x, y)); |
510 | } |
511 | |
512 | /** Returns writable pixel address at (x, y). Result is addressable as unsigned |
513 | 64-bit words. Will trigger an assert() if SkColorType is not |
514 | kRGBA_F16_SkColorType and is built with SK_DEBUG defined. |
515 | |
516 | One word corresponds to one pixel. |
517 | |
518 | @param x column index, zero or greater, and less than width() |
519 | @param y row index, zero or greater, and less than height() |
520 | @return writable unsigned 64-bit pointer to pixel |
521 | */ |
522 | uint64_t* writable_addr64(int x, int y) const { |
523 | return const_cast<uint64_t*>(this->addr64(x, y)); |
524 | } |
525 | |
526 | /** Returns writable pixel address at (x, y). Result is addressable as unsigned |
527 | 16-bit words. Will trigger an assert() if SkColorType is not |
528 | kRGBA_F16_SkColorType and is built with SK_DEBUG defined. |
529 | |
530 | Each word represents one color component encoded as a half float. |
531 | Four words correspond to one pixel. |
532 | |
533 | @param x column index, zero or greater, and less than width() |
534 | @param y row index, zero or greater, and less than height() |
535 | @return writable unsigned 16-bit pointer to first component of pixel |
536 | */ |
537 | uint16_t* writable_addrF16(int x, int y) const { |
538 | return reinterpret_cast<uint16_t*>(writable_addr64(x, y)); |
539 | } |
540 | |
541 | /** Copies a SkRect of pixels to dstPixels. Copy starts at (0, 0), and does not |
542 | exceed SkPixmap (width(), height()). |
543 | |
544 | dstInfo specifies width, height, SkColorType, SkAlphaType, and |
545 | SkColorSpace of destination. dstRowBytes specifics the gap from one destination |
546 | row to the next. Returns true if pixels are copied. Returns false if |
547 | dstInfo address equals nullptr, or dstRowBytes is less than dstInfo.minRowBytes(). |
548 | |
549 | Pixels are copied only if pixel conversion is possible. If SkPixmap colorType() is |
550 | kGray_8_SkColorType, or kAlpha_8_SkColorType; dstInfo.colorType() must match. |
551 | If SkPixmap colorType() is kGray_8_SkColorType, dstInfo.colorSpace() must match. |
552 | If SkPixmap alphaType() is kOpaque_SkAlphaType, dstInfo.alphaType() must |
553 | match. If SkPixmap colorSpace() is nullptr, dstInfo.colorSpace() must match. Returns |
554 | false if pixel conversion is not possible. |
555 | |
556 | Returns false if SkPixmap width() or height() is zero or negative. |
557 | |
558 | @param dstInfo destination width, height, SkColorType, SkAlphaType, SkColorSpace |
559 | @param dstPixels destination pixel storage |
560 | @param dstRowBytes destination row length |
561 | @return true if pixels are copied to dstPixels |
562 | */ |
563 | bool readPixels(const SkImageInfo& dstInfo, void* dstPixels, size_t dstRowBytes) const { |
564 | return this->readPixels(dstInfo, dstPixels, dstRowBytes, 0, 0); |
565 | } |
566 | |
567 | /** Copies a SkRect of pixels to dstPixels. Copy starts at (srcX, srcY), and does not |
568 | exceed SkPixmap (width(), height()). |
569 | |
570 | dstInfo specifies width, height, SkColorType, SkAlphaType, and |
571 | SkColorSpace of destination. dstRowBytes specifics the gap from one destination |
572 | row to the next. Returns true if pixels are copied. Returns false if |
573 | dstInfo address equals nullptr, or dstRowBytes is less than dstInfo.minRowBytes(). |
574 | |
575 | Pixels are copied only if pixel conversion is possible. If SkPixmap colorType() is |
576 | kGray_8_SkColorType, or kAlpha_8_SkColorType; dstInfo.colorType() must match. |
577 | If SkPixmap colorType() is kGray_8_SkColorType, dstInfo.colorSpace() must match. |
578 | If SkPixmap alphaType() is kOpaque_SkAlphaType, dstInfo.alphaType() must |
579 | match. If SkPixmap colorSpace() is nullptr, dstInfo.colorSpace() must match. Returns |
580 | false if pixel conversion is not possible. |
581 | |
582 | srcX and srcY may be negative to copy only top or left of source. Returns |
583 | false if SkPixmap width() or height() is zero or negative. Returns false if: |
584 | abs(srcX) >= Pixmap width(), or if abs(srcY) >= Pixmap height(). |
585 | |
586 | @param dstInfo destination width, height, SkColorType, SkAlphaType, SkColorSpace |
587 | @param dstPixels destination pixel storage |
588 | @param dstRowBytes destination row length |
589 | @param srcX column index whose absolute value is less than width() |
590 | @param srcY row index whose absolute value is less than height() |
591 | @return true if pixels are copied to dstPixels |
592 | */ |
593 | bool readPixels(const SkImageInfo& dstInfo, void* dstPixels, size_t dstRowBytes, int srcX, |
594 | int srcY) const; |
595 | |
596 | /** Copies a SkRect of pixels to dst. Copy starts at (srcX, srcY), and does not |
597 | exceed SkPixmap (width(), height()). dst specifies width, height, SkColorType, |
598 | SkAlphaType, and SkColorSpace of destination. Returns true if pixels are copied. |
599 | Returns false if dst address equals nullptr, or dst.rowBytes() is less than |
600 | dst SkImageInfo::minRowBytes. |
601 | |
602 | Pixels are copied only if pixel conversion is possible. If SkPixmap colorType() is |
603 | kGray_8_SkColorType, or kAlpha_8_SkColorType; dst.info().colorType must match. |
604 | If SkPixmap colorType() is kGray_8_SkColorType, dst.info().colorSpace must match. |
605 | If SkPixmap alphaType() is kOpaque_SkAlphaType, dst.info().alphaType must |
606 | match. If SkPixmap colorSpace() is nullptr, dst.info().colorSpace must match. Returns |
607 | false if pixel conversion is not possible. |
608 | |
609 | srcX and srcY may be negative to copy only top or left of source. Returns |
610 | false SkPixmap width() or height() is zero or negative. Returns false if: |
611 | abs(srcX) >= Pixmap width(), or if abs(srcY) >= Pixmap height(). |
612 | |
613 | @param dst SkImageInfo and pixel address to write to |
614 | @param srcX column index whose absolute value is less than width() |
615 | @param srcY row index whose absolute value is less than height() |
616 | @return true if pixels are copied to dst |
617 | */ |
618 | bool readPixels(const SkPixmap& dst, int srcX, int srcY) const { |
619 | return this->readPixels(dst.info(), dst.writable_addr(), dst.rowBytes(), srcX, srcY); |
620 | } |
621 | |
622 | /** Copies pixels inside bounds() to dst. dst specifies width, height, SkColorType, |
623 | SkAlphaType, and SkColorSpace of destination. Returns true if pixels are copied. |
624 | Returns false if dst address equals nullptr, or dst.rowBytes() is less than |
625 | dst SkImageInfo::minRowBytes. |
626 | |
627 | Pixels are copied only if pixel conversion is possible. If SkPixmap colorType() is |
628 | kGray_8_SkColorType, or kAlpha_8_SkColorType; dst SkColorType must match. |
629 | If SkPixmap colorType() is kGray_8_SkColorType, dst SkColorSpace must match. |
630 | If SkPixmap alphaType() is kOpaque_SkAlphaType, dst SkAlphaType must |
631 | match. If SkPixmap colorSpace() is nullptr, dst SkColorSpace must match. Returns |
632 | false if pixel conversion is not possible. |
633 | |
634 | Returns false if SkPixmap width() or height() is zero or negative. |
635 | |
636 | @param dst SkImageInfo and pixel address to write to |
637 | @return true if pixels are copied to dst |
638 | */ |
639 | bool readPixels(const SkPixmap& dst) const { |
640 | return this->readPixels(dst.info(), dst.writable_addr(), dst.rowBytes(), 0, 0); |
641 | } |
642 | |
643 | /** Copies SkBitmap to dst, scaling pixels to fit dst.width() and dst.height(), and |
644 | converting pixels to match dst.colorType() and dst.alphaType(). Returns true if |
645 | pixels are copied. Returns false if dst address is nullptr, or dst.rowBytes() is |
646 | less than dst SkImageInfo::minRowBytes. |
647 | |
648 | Pixels are copied only if pixel conversion is possible. If SkPixmap colorType() is |
649 | kGray_8_SkColorType, or kAlpha_8_SkColorType; dst SkColorType must match. |
650 | If SkPixmap colorType() is kGray_8_SkColorType, dst SkColorSpace must match. |
651 | If SkPixmap alphaType() is kOpaque_SkAlphaType, dst SkAlphaType must |
652 | match. If SkPixmap colorSpace() is nullptr, dst SkColorSpace must match. Returns |
653 | false if pixel conversion is not possible. |
654 | |
655 | Returns false if SkBitmap width() or height() is zero or negative. |
656 | |
657 | Scales the image, with filterQuality, to match dst.width() and dst.height(). |
658 | filterQuality kNone_SkFilterQuality is fastest, typically implemented with |
659 | nearest neighbor filter. kLow_SkFilterQuality is typically implemented with |
660 | bilerp filter. kMedium_SkFilterQuality is typically implemented with |
661 | bilerp filter, and mip-map filter when size is reduced. |
662 | kHigh_SkFilterQuality is slowest, typically implemented with bicubic filter. |
663 | |
664 | @param dst SkImageInfo and pixel address to write to |
665 | @return true if pixels are scaled to fit dst |
666 | |
667 | example: https://fiddle.skia.org/c/@Pixmap_scalePixels |
668 | */ |
669 | bool scalePixels(const SkPixmap& dst, SkFilterQuality filterQuality) const; |
670 | |
671 | /** Writes color to pixels bounded by subset; returns true on success. |
672 | Returns false if colorType() is kUnknown_SkColorType, or if subset does |
673 | not intersect bounds(). |
674 | |
675 | @param color unpremultiplied color to write |
676 | @param subset bounding integer SkRect of written pixels |
677 | @return true if pixels are changed |
678 | |
679 | example: https://fiddle.skia.org/c/@Pixmap_erase |
680 | */ |
681 | bool erase(SkColor color, const SkIRect& subset) const; |
682 | |
683 | /** Writes color to pixels inside bounds(); returns true on success. |
684 | Returns false if colorType() is kUnknown_SkColorType, or if bounds() |
685 | is empty. |
686 | |
687 | @param color unpremultiplied color to write |
688 | @return true if pixels are changed |
689 | */ |
690 | bool erase(SkColor color) const { return this->erase(color, this->bounds()); } |
691 | |
692 | /** Writes color to pixels bounded by subset; returns true on success. |
693 | if subset is nullptr, writes colors pixels inside bounds(). Returns false if |
694 | colorType() is kUnknown_SkColorType, if subset is not nullptr and does |
695 | not intersect bounds(), or if subset is nullptr and bounds() is empty. |
696 | |
697 | @param color unpremultiplied color to write |
698 | @param subset bounding integer SkRect of pixels to write; may be nullptr |
699 | @return true if pixels are changed |
700 | |
701 | example: https://fiddle.skia.org/c/@Pixmap_erase_3 |
702 | */ |
703 | bool erase(const SkColor4f& color, const SkIRect* subset = nullptr) const; |
704 | |
705 | private: |
706 | const void* fPixels; |
707 | size_t fRowBytes; |
708 | SkImageInfo fInfo; |
709 | |
710 | friend class SkPixmapPriv; |
711 | }; |
712 | |
713 | #endif |
714 | |