OLD | NEW |
---|---|
1 /* | 1 /* |
2 * Copyright 2006 The Android Open Source Project | 2 * Copyright 2006 The Android Open Source Project |
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 #ifndef SkBitmap_DEFINED | 8 #ifndef SkBitmap_DEFINED |
9 #define SkBitmap_DEFINED | 9 #define SkBitmap_DEFINED |
10 | 10 |
11 #include "SkColor.h" | 11 #include "SkColor.h" |
12 #include "SkColorTable.h" | 12 #include "SkColorTable.h" |
13 #include "SkImageInfo.h" | 13 #include "SkImageInfo.h" |
14 #include "SkPoint.h" | 14 #include "SkPoint.h" |
15 #include "SkRefCnt.h" | 15 #include "SkRefCnt.h" |
16 | 16 |
17 struct SkMask; | 17 struct SkMask; |
18 struct SkIRect; | 18 struct SkIRect; |
19 struct SkRect; | 19 struct SkRect; |
20 class SkPaint; | 20 class SkPaint; |
21 class SkPixelRef; | 21 class SkPixelRef; |
22 class SkPixelRefFactory; | 22 class SkPixelRefFactory; |
23 class SkRegion; | 23 class SkRegion; |
24 class SkString; | 24 class SkString; |
25 class GrTexture; | 25 class GrTexture; |
26 | 26 |
27 /** \class SkBitmap | 27 /** \class SkBitmap |
28 | 28 |
29 The SkBitmap class specifies a raster bitmap. A bitmap has an integer width | 29 The SkBitmap class specifies a raster bitmap. A bitmap has an integer width |
30 and height, and a format (config), and a pointer to the actual pixels. | 30 and height, and a format (colortype), and a pointer to the actual pixels. |
31 Bitmaps can be drawn into a SkCanvas, but they are also used to specify the | 31 Bitmaps can be drawn into a SkCanvas, but they are also used to specify the |
32 target of a SkCanvas' drawing operations. | 32 target of a SkCanvas' drawing operations. |
33 A const SkBitmap exposes getAddr(), which lets a caller write its pixels; | 33 A const SkBitmap exposes getAddr(), which lets a caller write its pixels; |
34 the constness is considered to apply to the bitmap's configuration, not | 34 the constness is considered to apply to the bitmap's configuration, not |
35 its contents. | 35 its contents. |
36 */ | 36 */ |
37 class SK_API SkBitmap { | 37 class SK_API SkBitmap { |
38 public: | 38 public: |
39 class SK_API Allocator; | 39 class SK_API Allocator; |
40 | 40 |
41 enum Config { | 41 enum Config { |
42 kNo_Config, //!< bitmap has not been configured | 42 kNo_Config, //!< bitmap has not been configured |
43 kA8_Config, //!< 8-bits per pixel, with only alpha specified (0 is transparent, 0xFF is opaque) | 43 kA8_Config, //!< 8-bits per pixel, with only alpha specified (0 is transparent, 0xFF is opaque) |
44 kIndex8_Config, //!< 8-bits per pixel, using SkColorTable to specify the colors | 44 kIndex8_Config, //!< 8-bits per pixel, using SkColorTable to specify the colors |
45 kRGB_565_Config, //!< 16-bits per pixel, (see SkColorPriv.h for packi ng) | 45 kRGB_565_Config, //!< 16-bits per pixel, (see SkColorPriv.h for packi ng) |
46 kARGB_4444_Config, //!< 16-bits per pixel, (see SkColorPriv.h for packi ng) | 46 kARGB_4444_Config, //!< 16-bits per pixel, (see SkColorPriv.h for packi ng) |
47 kARGB_8888_Config, //!< 32-bits per pixel, (see SkColorPriv.h for packi ng) | 47 kARGB_8888_Config, //!< 32-bits per pixel, (see SkColorPriv.h for packi ng) |
48 }; | 48 }; |
49 | 49 |
50 // do not add this to the Config enum, otherwise the compiler will let us | 50 // do not add this to the Config enum, otherwise the compiler will let us |
51 // pass this as a valid parameter for Config. | 51 // pass this as a valid parameter for Config. |
52 enum { | 52 enum { |
53 kConfigCount = kARGB_8888_Config + 1 | 53 kConfigCount = kARGB_8888_Config + 1 |
54 }; | 54 }; |
55 | 55 |
56 /** Return the config for the bitmap. */ | |
57 Config config() const; | |
scroggo
2014/06/05 16:59:34
Should we deprecate this one too?
| |
58 | |
59 SK_ATTR_DEPRECATED("use config()") | |
60 Config getConfig() const { return this->config(); } | |
scroggo
2014/06/05 16:59:34
Does Chrome still use this version? I removed Andr
| |
61 | |
56 /** | 62 /** |
57 * Default construct creates a bitmap with zero width and height, and no pi xels. | 63 * Default construct creates a bitmap with zero width and height, and no pi xels. |
58 * Its config is set to kNo_Config. | 64 * Its colortype is set to kUnknown_SkColorType. |
59 */ | 65 */ |
60 SkBitmap(); | 66 SkBitmap(); |
61 | 67 |
62 /** | 68 /** |
63 * Copy the settings from the src into this bitmap. If the src has pixels | 69 * Copy the settings from the src into this bitmap. If the src has pixels |
64 * allocated, they will be shared, not copied, so that the two bitmaps will | 70 * allocated, they will be shared, not copied, so that the two bitmaps will |
65 * reference the same memory for the pixels. If a deep copy is needed, | 71 * reference the same memory for the pixels. If a deep copy is needed, |
66 * where the new bitmap has its own separate copy of the pixels, use | 72 * where the new bitmap has its own separate copy of the pixels, use |
67 * deepCopyTo(). | 73 * deepCopyTo(). |
68 */ | 74 */ |
(...skipping 25 matching lines...) Expand all Loading... | |
94 if (kUnknown_SkColorType == this->colorType()) { | 100 if (kUnknown_SkColorType == this->colorType()) { |
95 return false; | 101 return false; |
96 } | 102 } |
97 if (info) { | 103 if (info) { |
98 *info = this->info(); | 104 *info = this->info(); |
99 } | 105 } |
100 return true; | 106 return true; |
101 } | 107 } |
102 #endif | 108 #endif |
103 | 109 |
104 /** Return the number of bytes per pixel based on the config. If the config | 110 /** |
105 does not have at least 1 byte per (e.g. kA1_Config) then 0 is returned. | 111 * Return the number of bytes per pixel based on the colortype. If the colo rtype is |
112 * kUnknown_SkColorType, then 0 is returned. | |
106 */ | 113 */ |
107 int bytesPerPixel() const { return fInfo.bytesPerPixel(); } | 114 int bytesPerPixel() const { return fInfo.bytesPerPixel(); } |
108 | 115 |
109 /** Return the rowbytes expressed as a number of pixels (like width and | 116 /** |
110 height). Note, for 1-byte per pixel configs like kA8_Config, this will | 117 * Return the rowbytes expressed as a number of pixels (like width and heig ht). |
111 return the same as rowBytes(). Is undefined for configs that are less | 118 * If the colortype is kUnknown_SkColorType, then 0 is returned. |
112 than 1-byte per pixel (e.g. kA1_Config) | |
113 */ | 119 */ |
114 int rowBytesAsPixels() const { | 120 int rowBytesAsPixels() const { |
115 return fRowBytes >> this->shiftPerPixel(); | 121 return fRowBytes >> this->shiftPerPixel(); |
116 } | 122 } |
117 | 123 |
118 /** Return the shift amount per pixel (i.e. 0 for 1-byte per pixel, 1 for | 124 /** |
119 2-bytes per pixel configs, 2 for 4-bytes per pixel configs). Return 0 | 125 * Return the shift amount per pixel (i.e. 0 for 1-byte per pixel, 1 for 2- bytes per pixel |
120 for configs that are not at least 1-byte per pixel (e.g. kA1_Config | 126 * colortypes, 2 for 4-bytes per pixel colortypes). Return 0 for kUnknown_S kColorType. |
121 or kNo_Config) | |
122 */ | 127 */ |
123 int shiftPerPixel() const { return this->bytesPerPixel() >> 1; } | 128 int shiftPerPixel() const { return this->bytesPerPixel() >> 1; } |
124 | 129 |
125 /////////////////////////////////////////////////////////////////////////// | 130 /////////////////////////////////////////////////////////////////////////// |
126 | 131 |
127 /** Return true iff the bitmap has empty dimensions. | 132 /** Return true iff the bitmap has empty dimensions. |
128 * Hey! Before you use this, see if you really want to know drawsNothing() instead. | 133 * Hey! Before you use this, see if you really want to know drawsNothing() instead. |
129 */ | 134 */ |
130 bool empty() const { return fInfo.isEmpty(); } | 135 bool empty() const { return fInfo.isEmpty(); } |
131 | 136 |
132 /** Return true iff the bitmap has no pixelref. Note: this can return true e ven if the | 137 /** Return true iff the bitmap has no pixelref. Note: this can return true e ven if the |
133 * dimensions of the bitmap are > 0 (see empty()). | 138 * dimensions of the bitmap are > 0 (see empty()). |
134 * Hey! Before you use this, see if you really want to know drawsNothing() instead. | 139 * Hey! Before you use this, see if you really want to know drawsNothing() instead. |
135 */ | 140 */ |
136 bool isNull() const { return NULL == fPixelRef; } | 141 bool isNull() const { return NULL == fPixelRef; } |
137 | 142 |
138 /** Return true iff drawing this bitmap has no effect. | 143 /** Return true iff drawing this bitmap has no effect. |
139 */ | 144 */ |
140 bool drawsNothing() const { return this->empty() || this->isNull(); } | 145 bool drawsNothing() const { return this->empty() || this->isNull(); } |
141 | 146 |
142 /** Return the config for the bitmap. */ | |
143 Config config() const; | |
144 | |
145 SK_ATTR_DEPRECATED("use config()") | |
146 Config getConfig() const { return this->config(); } | |
147 | |
148 /** Return the number of bytes between subsequent rows of the bitmap. */ | 147 /** Return the number of bytes between subsequent rows of the bitmap. */ |
149 size_t rowBytes() const { return fRowBytes; } | 148 size_t rowBytes() const { return fRowBytes; } |
150 | 149 |
151 /** | 150 /** |
152 * Set the bitmap's alphaType, returning true on success. If false is | 151 * Set the bitmap's alphaType, returning true on success. If false is |
153 * returned, then the specified new alphaType is incompatible with the | 152 * returned, then the specified new alphaType is incompatible with the |
154 * Config, and the current alphaType is unchanged. | 153 * colortype, and the current alphaType is unchanged. |
155 * | 154 * |
156 * Note: this changes the alphatype for the underlying pixels, which means | 155 * Note: this changes the alphatype for the underlying pixels, which means |
157 * that all bitmaps that might be sharing (subsets of) the pixels will | 156 * that all bitmaps that might be sharing (subsets of) the pixels will |
158 * be affected. | 157 * be affected. |
159 */ | 158 */ |
160 bool setAlphaType(SkAlphaType); | 159 bool setAlphaType(SkAlphaType); |
161 | 160 |
162 /** Return the address of the pixels for this SkBitmap. | 161 /** Return the address of the pixels for this SkBitmap. |
163 */ | 162 */ |
164 void* getPixels() const { return fPixels; } | 163 void* getPixels() const { return fPixels; } |
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
221 improve performance by avoiding unnecessary overhead and resource | 220 improve performance by avoiding unnecessary overhead and resource |
222 consumption on the device. | 221 consumption on the device. |
223 */ | 222 */ |
224 void setIsVolatile(bool); | 223 void setIsVolatile(bool); |
225 | 224 |
226 /** Reset the bitmap to its initial state (see default constructor). If we a re a (shared) | 225 /** Reset the bitmap to its initial state (see default constructor). If we a re a (shared) |
227 owner of the pixels, that ownership is decremented. | 226 owner of the pixels, that ownership is decremented. |
228 */ | 227 */ |
229 void reset(); | 228 void reset(); |
230 | 229 |
230 #ifdef SK_SUPPORT_LEGACY_COMPUTE_CONFIG_SIZE | |
scroggo
2014/06/05 16:59:34
This needs to be defined in skia_for_android_frame
| |
231 /** Given a config and a width, this computes the optimal rowBytes value. Th is is called automatically | 231 /** Given a config and a width, this computes the optimal rowBytes value. Th is is called automatically |
232 if you pass 0 for rowBytes to setConfig(). | 232 if you pass 0 for rowBytes to setConfig(). |
233 */ | 233 */ |
234 static size_t ComputeRowBytes(Config c, int width); | 234 static size_t ComputeRowBytes(Config c, int width); |
235 | 235 |
236 /** Return the bytes-per-pixel for the specified config. If the config is | 236 /** Return the bytes-per-pixel for the specified config. If the config is |
237 not at least 1-byte per pixel, return 0, including for kNo_Config. | 237 not at least 1-byte per pixel, return 0, including for kNo_Config. |
238 */ | 238 */ |
239 static int ComputeBytesPerPixel(Config c); | 239 static int ComputeBytesPerPixel(Config c); |
240 | 240 |
241 /** Return the shift-per-pixel for the specified config. If the config is | 241 /** Return the shift-per-pixel for the specified config. If the config is |
242 not at least 1-byte per pixel, return 0, including for kNo_Config. | 242 not at least 1-byte per pixel, return 0, including for kNo_Config. |
243 */ | 243 */ |
244 static int ComputeShiftPerPixel(Config c) { | 244 static int ComputeShiftPerPixel(Config c) { |
245 return ComputeBytesPerPixel(c) >> 1; | 245 return ComputeBytesPerPixel(c) >> 1; |
246 } | 246 } |
247 | 247 |
248 static int64_t ComputeSize64(Config, int width, int height); | 248 static int64_t ComputeSize64(Config, int width, int height); |
249 static size_t ComputeSize(Config, int width, int height); | 249 static size_t ComputeSize(Config, int width, int height); |
250 #endif | |
250 | 251 |
251 /** | 252 /** |
252 * This will brute-force return true if all of the pixels in the bitmap | 253 * This will brute-force return true if all of the pixels in the bitmap |
253 * are opaque. If it fails to read the pixels, or encounters an error, | 254 * are opaque. If it fails to read the pixels, or encounters an error, |
254 * it will return false. | 255 * it will return false. |
255 * | 256 * |
256 * Since this can be an expensive operation, the bitmap stores a flag for | 257 * Since this can be an expensive operation, the bitmap stores a flag for |
257 * this (isOpaque). Only call this if you need to compute this value from | 258 * this (isOpaque). Only call this if you need to compute this value from |
258 * "unknown" pixels. | 259 * "unknown" pixels. |
259 */ | 260 */ |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
295 /** | 296 /** |
296 * Allocate a pixelref to match the specified image info, using the default | 297 * Allocate a pixelref to match the specified image info, using the default |
297 * allocator. | 298 * allocator. |
298 * On success, the bitmap's pixels will be "locked", and return true. | 299 * On success, the bitmap's pixels will be "locked", and return true. |
299 * On failure, the bitmap will be set to empty and return false. | 300 * On failure, the bitmap will be set to empty and return false. |
300 */ | 301 */ |
301 bool allocPixels(const SkImageInfo& info) { | 302 bool allocPixels(const SkImageInfo& info) { |
302 return this->allocPixels(info, NULL, NULL); | 303 return this->allocPixels(info, NULL, NULL); |
303 } | 304 } |
304 | 305 |
305 /** | |
306 * Legacy helper function, which creates an SkImageInfo from the specified | |
307 * config and then calls allocPixels(info). | |
308 */ | |
309 bool allocConfigPixels(Config, int width, int height, bool isOpaque = false) ; | |
310 | |
311 bool allocN32Pixels(int width, int height, bool isOpaque = false) { | 306 bool allocN32Pixels(int width, int height, bool isOpaque = false) { |
312 SkImageInfo info = SkImageInfo::MakeN32Premul(width, height); | 307 SkImageInfo info = SkImageInfo::MakeN32Premul(width, height); |
313 if (isOpaque) { | 308 if (isOpaque) { |
314 info.fAlphaType = kOpaque_SkAlphaType; | 309 info.fAlphaType = kOpaque_SkAlphaType; |
315 } | 310 } |
316 return this->allocPixels(info); | 311 return this->allocPixels(info); |
317 } | 312 } |
318 | 313 |
319 /** | 314 /** |
320 * Install a pixelref that wraps the specified pixels and rowBytes, and | 315 * Install a pixelref that wraps the specified pixels and rowBytes, and |
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
377 @param dstSize Size of destination buffer. Must be large enough to hold | 372 @param dstSize Size of destination buffer. Must be large enough to hold |
378 pixels using indicated stride. | 373 pixels using indicated stride. |
379 @param dstRowBytes Width of each line in the buffer. If 0, uses | 374 @param dstRowBytes Width of each line in the buffer. If 0, uses |
380 bitmap's internal stride. | 375 bitmap's internal stride. |
381 @param preserveDstPad Must we preserve padding in the dst | 376 @param preserveDstPad Must we preserve padding in the dst |
382 */ | 377 */ |
383 bool copyPixelsTo(void* const dst, size_t dstSize, size_t dstRowBytes = 0, | 378 bool copyPixelsTo(void* const dst, size_t dstSize, size_t dstRowBytes = 0, |
384 bool preserveDstPad = false) const; | 379 bool preserveDstPad = false) const; |
385 | 380 |
386 /** Use the standard HeapAllocator to create the pixelref that manages the | 381 /** Use the standard HeapAllocator to create the pixelref that manages the |
387 pixel memory. It will be sized based on the current width/height/config. | 382 pixel memory. It will be sized based on the current ImageInfo. |
388 If this is called multiple times, a new pixelref object will be created | 383 If this is called multiple times, a new pixelref object will be created |
389 each time. | 384 each time. |
390 | 385 |
391 If the bitmap retains a reference to the colortable (assuming it is | 386 If the bitmap retains a reference to the colortable (assuming it is |
392 not null) it will take care of incrementing the reference count. | 387 not null) it will take care of incrementing the reference count. |
393 | 388 |
394 @param ctable ColorTable (or null) to use with the pixels that will | 389 @param ctable ColorTable (or null) to use with the pixels that will |
395 be allocated. Only used if config == Index8_Config | 390 be allocated. Only used if colortype == kIndex_8_SkColor Type |
396 @return true if the allocation succeeds. If not the pixelref field of | 391 @return true if the allocation succeeds. If not the pixelref field of |
397 the bitmap will be unchanged. | 392 the bitmap will be unchanged. |
398 */ | 393 */ |
399 bool allocPixels(SkColorTable* ctable = NULL) { | 394 bool allocPixels(SkColorTable* ctable = NULL) { |
400 return this->allocPixels(NULL, ctable); | 395 return this->allocPixels(NULL, ctable); |
401 } | 396 } |
402 | 397 |
403 /** Use the specified Allocator to create the pixelref that manages the | 398 /** Use the specified Allocator to create the pixelref that manages the |
404 pixel memory. It will be sized based on the current width/height/config. | 399 pixel memory. It will be sized based on the current ImageInfo. |
405 If this is called multiple times, a new pixelref object will be created | 400 If this is called multiple times, a new pixelref object will be created |
406 each time. | 401 each time. |
407 | 402 |
408 If the bitmap retains a reference to the colortable (assuming it is | 403 If the bitmap retains a reference to the colortable (assuming it is |
409 not null) it will take care of incrementing the reference count. | 404 not null) it will take care of incrementing the reference count. |
410 | 405 |
411 @param allocator The Allocator to use to create a pixelref that can | 406 @param allocator The Allocator to use to create a pixelref that can |
412 manage the pixel memory for the current | 407 manage the pixel memory for the current ImageInfo. |
413 width/height/config. If allocator is NULL, the standard | 408 If allocator is NULL, the standard HeapAllocator will b e used. |
414 HeapAllocator will be used. | |
415 @param ctable ColorTable (or null) to use with the pixels that will | 409 @param ctable ColorTable (or null) to use with the pixels that will |
416 be allocated. Only used if config == Index8_Config. | 410 be allocated. Only used if colortype == kIndex_8_SkColor Type. |
417 If it is non-null and the config is not Index8, it will | 411 If it is non-null and the colortype is not indexed, it w ill |
418 be ignored. | 412 be ignored. |
419 @return true if the allocation succeeds. If not the pixelref field of | 413 @return true if the allocation succeeds. If not the pixelref field of |
420 the bitmap will be unchanged. | 414 the bitmap will be unchanged. |
421 */ | 415 */ |
422 bool allocPixels(Allocator* allocator, SkColorTable* ctable); | 416 bool allocPixels(Allocator* allocator, SkColorTable* ctable); |
423 | 417 |
424 /** | 418 /** |
425 * Return the current pixelref object or NULL if there is none. This does | 419 * Return the current pixelref object or NULL if there is none. This does |
426 * not affect the refcount of the pixelref. | 420 * not affect the refcount of the pixelref. |
427 */ | 421 */ |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
471 | 465 |
472 /** | 466 /** |
473 * Some bitmaps can return a copy of their pixels for lockPixels(), but | 467 * Some bitmaps can return a copy of their pixels for lockPixels(), but |
474 * that copy, if modified, will not be pushed back. These bitmaps should | 468 * that copy, if modified, will not be pushed back. These bitmaps should |
475 * not be used as targets for a raster device/canvas (since all pixels | 469 * not be used as targets for a raster device/canvas (since all pixels |
476 * modifications will be lost when unlockPixels() is called.) | 470 * modifications will be lost when unlockPixels() is called.) |
477 */ | 471 */ |
478 bool lockPixelsAreWritable() const; | 472 bool lockPixelsAreWritable() const; |
479 | 473 |
480 /** Call this to be sure that the bitmap is valid enough to be drawn (i.e. | 474 /** Call this to be sure that the bitmap is valid enough to be drawn (i.e. |
481 it has non-null pixels, and if required by its config, it has a | 475 it has non-null pixels, and if required by its colortype, it has a |
482 non-null colortable. Returns true if all of the above are met. | 476 non-null colortable. Returns true if all of the above are met. |
483 */ | 477 */ |
484 bool readyToDraw() const { | 478 bool readyToDraw() const { |
485 return this->getPixels() != NULL && | 479 return this->getPixels() != NULL && |
486 (this->colorType() != kIndex_8_SkColorType || NULL != fColorTable ); | 480 (this->colorType() != kIndex_8_SkColorType || NULL != fColorTable ); |
487 } | 481 } |
488 | 482 |
489 /** Returns the pixelRef's texture, or NULL | 483 /** Returns the pixelRef's texture, or NULL |
490 */ | 484 */ |
491 GrTexture* getTexture() const; | 485 GrTexture* getTexture() const; |
(...skipping 13 matching lines...) Expand all Loading... | |
505 uint32_t getGenerationID() const; | 499 uint32_t getGenerationID() const; |
506 | 500 |
507 /** Call this if you have changed the contents of the pixels. This will in- | 501 /** Call this if you have changed the contents of the pixels. This will in- |
508 turn cause a different generation ID value to be returned from | 502 turn cause a different generation ID value to be returned from |
509 getGenerationID(). | 503 getGenerationID(). |
510 */ | 504 */ |
511 void notifyPixelsChanged() const; | 505 void notifyPixelsChanged() const; |
512 | 506 |
513 /** | 507 /** |
514 * Fill the entire bitmap with the specified color. | 508 * Fill the entire bitmap with the specified color. |
515 * If the bitmap's config does not support alpha (e.g. 565) then the alpha | 509 * If the bitmap's colortype does not support alpha (e.g. 565) then the alp ha |
516 * of the color is ignored (treated as opaque). If the config only supports | 510 * of the color is ignored (treated as opaque). If the colortype only suppo rts |
517 * alpha (e.g. A1 or A8) then the color's r,g,b components are ignored. | 511 * alpha (e.g. A1 or A8) then the color's r,g,b components are ignored. |
518 */ | 512 */ |
519 void eraseColor(SkColor c) const { | 513 void eraseColor(SkColor c) const { |
520 this->eraseARGB(SkColorGetA(c), SkColorGetR(c), SkColorGetG(c), | 514 this->eraseARGB(SkColorGetA(c), SkColorGetR(c), SkColorGetG(c), |
521 SkColorGetB(c)); | 515 SkColorGetB(c)); |
522 } | 516 } |
523 | 517 |
524 /** | 518 /** |
525 * Fill the entire bitmap with the specified color. | 519 * Fill the entire bitmap with the specified color. |
526 * If the bitmap's config does not support alpha (e.g. 565) then the alpha | 520 * If the bitmap's colortype does not support alpha (e.g. 565) then the alp ha |
527 * of the color is ignored (treated as opaque). If the config only supports | 521 * of the color is ignored (treated as opaque). If the colortype only suppo rts |
528 * alpha (e.g. A1 or A8) then the color's r,g,b components are ignored. | 522 * alpha (e.g. A1 or A8) then the color's r,g,b components are ignored. |
529 */ | 523 */ |
530 void eraseARGB(U8CPU a, U8CPU r, U8CPU g, U8CPU b) const; | 524 void eraseARGB(U8CPU a, U8CPU r, U8CPU g, U8CPU b) const; |
531 | 525 |
532 SK_ATTR_DEPRECATED("use eraseARGB or eraseColor") | 526 SK_ATTR_DEPRECATED("use eraseARGB or eraseColor") |
533 void eraseRGB(U8CPU r, U8CPU g, U8CPU b) const { | 527 void eraseRGB(U8CPU r, U8CPU g, U8CPU b) const { |
534 this->eraseARGB(0xFF, r, g, b); | 528 this->eraseARGB(0xFF, r, g, b); |
535 } | 529 } |
536 | 530 |
537 /** | 531 /** |
538 * Fill the specified area of this bitmap with the specified color. | 532 * Fill the specified area of this bitmap with the specified color. |
539 * If the bitmap's config does not support alpha (e.g. 565) then the alpha | 533 * If the bitmap's colortype does not support alpha (e.g. 565) then the alp ha |
540 * of the color is ignored (treated as opaque). If the config only supports | 534 * of the color is ignored (treated as opaque). If the colortype only suppo rts |
541 * alpha (e.g. A1 or A8) then the color's r,g,b components are ignored. | 535 * alpha (e.g. A1 or A8) then the color's r,g,b components are ignored. |
542 */ | 536 */ |
543 void eraseArea(const SkIRect& area, SkColor c) const; | 537 void eraseArea(const SkIRect& area, SkColor c) const; |
544 | 538 |
545 /** Scroll (a subset of) the contents of this bitmap by dx/dy. If there are | 539 /** Scroll (a subset of) the contents of this bitmap by dx/dy. If there are |
546 no pixels allocated (i.e. getPixels() returns null) the method will | 540 no pixels allocated (i.e. getPixels() returns null) the method will |
547 still update the inval region (if present). If the bitmap is immutable, | 541 still update the inval region (if present). If the bitmap is immutable, |
548 do nothing and return false. | 542 do nothing and return false. |
549 | 543 |
550 @param subset The subset of the bitmap to scroll/move. To scroll the | 544 @param subset The subset of the bitmap to scroll/move. To scroll the |
551 entire contents, specify [0, 0, width, height] or just | 545 entire contents, specify [0, 0, width, height] or just |
552 pass null. | 546 pass null. |
553 @param dx The amount to scroll in X | 547 @param dx The amount to scroll in X |
554 @param dy The amount to scroll in Y | 548 @param dy The amount to scroll in Y |
555 @param inval Optional (may be null). Returns the area of the bitmap that | 549 @param inval Optional (may be null). Returns the area of the bitmap that |
556 was scrolled away. E.g. if dx = dy = 0, then inval would | 550 was scrolled away. E.g. if dx = dy = 0, then inval would |
557 be set to empty. If dx >= width or dy >= height, then | 551 be set to empty. If dx >= width or dy >= height, then |
558 inval would be set to the entire bounds of the bitmap. | 552 inval would be set to the entire bounds of the bitmap. |
559 @return true if the scroll was doable. Will return false if the bitmap | 553 @return true if the scroll was doable. Will return false if the colortyp e is kUnkown or |
560 uses an unsupported config for scrolling (only kA8, | 554 if the bitmap is immutable. |
561 kIndex8, kRGB_565, kARGB_4444, kARGB_8888 are supported). | |
562 If no pixels are present (i.e. getPixels() returns false) | 555 If no pixels are present (i.e. getPixels() returns false) |
563 inval will still be updated, and true will be returned. | 556 inval will still be updated, and true will be returned. |
564 */ | 557 */ |
565 bool scrollRect(const SkIRect* subset, int dx, int dy, | 558 bool scrollRect(const SkIRect* subset, int dx, int dy, |
566 SkRegion* inval = NULL) const; | 559 SkRegion* inval = NULL) const; |
567 | 560 |
568 /** | 561 /** |
569 * Return the SkColor of the specified pixel. In most cases this will | 562 * Return the SkColor of the specified pixel. In most cases this will |
570 * require un-premultiplying the color. Alpha only configs (A1 and A8) | 563 * require un-premultiplying the color. Alpha only colortypes (e.g. kAlpha _8_SkColorType) |
571 * return black with the appropriate alpha set. The value is undefined | 564 * return black with the appropriate alpha set. The value is undefined |
572 * for kNone_Config or if x or y are out of bounds, or if the bitmap | 565 * for kUnknown_SkColorType or if x or y are out of bounds, or if the bitma p |
573 * does not have any pixels (or has not be locked with lockPixels()). | 566 * does not have any pixels (or has not be locked with lockPixels()). |
574 */ | 567 */ |
575 SkColor getColor(int x, int y) const; | 568 SkColor getColor(int x, int y) const; |
576 | 569 |
577 /** Returns the address of the specified pixel. This performs a runtime | 570 /** Returns the address of the specified pixel. This performs a runtime |
578 check to know the size of the pixels, and will return the same answer | 571 check to know the size of the pixels, and will return the same answer |
579 as the corresponding size-specific method (e.g. getAddr16). Since the | 572 as the corresponding size-specific method (e.g. getAddr16). Since the |
580 check happens at runtime, it is much slower than using a size-specific | 573 check happens at runtime, it is much slower than using a size-specific |
581 version. Unlike the size-specific methods, this routine also checks if | 574 version. Unlike the size-specific methods, this routine also checks if |
582 getPixels() returns null, and returns that. The size-specific routines | 575 getPixels() returns null, and returns that. The size-specific routines |
583 perform a debugging assert that getPixels() is not null, but they do | 576 perform a debugging assert that getPixels() is not null, but they do |
584 not do any runtime checks. | 577 not do any runtime checks. |
585 */ | 578 */ |
586 void* getAddr(int x, int y) const; | 579 void* getAddr(int x, int y) const; |
587 | 580 |
588 /** Returns the address of the pixel specified by x,y for 32bit pixels. | 581 /** Returns the address of the pixel specified by x,y for 32bit pixels. |
589 * In debug build, this asserts that the pixels are allocated and locked, | 582 * In debug build, this asserts that the pixels are allocated and locked, |
590 * and that the config is 32-bit, however none of these checks are performe d | 583 * and that the colortype is 32-bit, however none of these checks are perfo rmed |
591 * in the release build. | 584 * in the release build. |
592 */ | 585 */ |
593 inline uint32_t* getAddr32(int x, int y) const; | 586 inline uint32_t* getAddr32(int x, int y) const; |
594 | 587 |
595 /** Returns the address of the pixel specified by x,y for 16bit pixels. | 588 /** Returns the address of the pixel specified by x,y for 16bit pixels. |
596 * In debug build, this asserts that the pixels are allocated and locked, | 589 * In debug build, this asserts that the pixels are allocated and locked, |
597 * and that the config is 16-bit, however none of these checks are performe d | 590 * and that the colortype is 16-bit, however none of these checks are perfo rmed |
598 * in the release build. | 591 * in the release build. |
599 */ | 592 */ |
600 inline uint16_t* getAddr16(int x, int y) const; | 593 inline uint16_t* getAddr16(int x, int y) const; |
601 | 594 |
602 /** Returns the address of the pixel specified by x,y for 8bit pixels. | 595 /** Returns the address of the pixel specified by x,y for 8bit pixels. |
603 * In debug build, this asserts that the pixels are allocated and locked, | 596 * In debug build, this asserts that the pixels are allocated and locked, |
604 * and that the config is 8-bit, however none of these checks are performed | 597 * and that the colortype is 8-bit, however none of these checks are perfor med |
605 * in the release build. | 598 * in the release build. |
606 */ | 599 */ |
607 inline uint8_t* getAddr8(int x, int y) const; | 600 inline uint8_t* getAddr8(int x, int y) const; |
608 | 601 |
609 /** Returns the color corresponding to the pixel specified by x,y for | 602 /** Returns the color corresponding to the pixel specified by x,y for |
610 * colortable based bitmaps. | 603 * colortable based bitmaps. |
611 * In debug build, this asserts that the pixels are allocated and locked, | 604 * In debug build, this asserts that the pixels are allocated and locked, |
612 * that the config is kIndex8, and that the colortable is allocated, | 605 * that the colortype is indexed, and that the colortable is allocated, |
613 * however none of these checks are performed in the release build. | 606 * however none of these checks are performed in the release build. |
614 */ | 607 */ |
615 inline SkPMColor getIndex8Color(int x, int y) const; | 608 inline SkPMColor getIndex8Color(int x, int y) const; |
616 | 609 |
617 /** Set dst to be a setset of this bitmap. If possible, it will share the | 610 /** Set dst to be a setset of this bitmap. If possible, it will share the |
618 pixel memory, and just point into a subset of it. However, if the config | 611 pixel memory, and just point into a subset of it. However, if the colort ype |
619 does not support this, a local copy will be made and associated with | 612 does not support this, a local copy will be made and associated with |
620 the dst bitmap. If the subset rectangle, intersected with the bitmap's | 613 the dst bitmap. If the subset rectangle, intersected with the bitmap's |
621 dimensions is empty, or if there is an unsupported config, false will be | 614 dimensions is empty, or if there is an unsupported colortype, false will be |
622 returned and dst will be untouched. | 615 returned and dst will be untouched. |
623 @param dst The bitmap that will be set to a subset of this bitmap | 616 @param dst The bitmap that will be set to a subset of this bitmap |
624 @param subset The rectangle of pixels in this bitmap that dst will | 617 @param subset The rectangle of pixels in this bitmap that dst will |
625 reference. | 618 reference. |
626 @return true if the subset copy was successfully made. | 619 @return true if the subset copy was successfully made. |
627 */ | 620 */ |
628 bool extractSubset(SkBitmap* dst, const SkIRect& subset) const; | 621 bool extractSubset(SkBitmap* dst, const SkIRect& subset) const; |
629 | 622 |
630 /** Makes a deep copy of this bitmap, respecting the requested colorType, | 623 /** Makes a deep copy of this bitmap, respecting the requested colorType, |
631 * and allocating the dst pixels on the cpu. | 624 * and allocating the dst pixels on the cpu. |
632 * Returns false if either there is an error (i.e. the src does not have | 625 * Returns false if either there is an error (i.e. the src does not have |
633 * pixels) or the request cannot be satisfied (e.g. the src has per-pixel | 626 * pixels) or the request cannot be satisfied (e.g. the src has per-pixel |
634 * alpha, and the requested config does not support alpha). | 627 * alpha, and the requested colortype does not support alpha). |
635 * @param dst The bitmap to be sized and allocated | 628 * @param dst The bitmap to be sized and allocated |
636 * @param ct The desired colorType for dst | 629 * @param ct The desired colorType for dst |
637 * @param allocator Allocator used to allocate the pixelref for the dst | 630 * @param allocator Allocator used to allocate the pixelref for the dst |
638 * bitmap. If this is null, the standard HeapAllocator | 631 * bitmap. If this is null, the standard HeapAllocator |
639 * will be used. | 632 * will be used. |
640 * @return true if the copy was made. | 633 * @return true if the copy was made. |
641 */ | 634 */ |
642 bool copyTo(SkBitmap* dst, SkColorType ct, Allocator* = NULL) const; | 635 bool copyTo(SkBitmap* dst, SkColorType ct, Allocator* = NULL) const; |
643 | 636 |
644 bool copyTo(SkBitmap* dst, Allocator* allocator = NULL) const { | 637 bool copyTo(SkBitmap* dst, Allocator* allocator = NULL) const { |
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
698 bool extractAlpha(SkBitmap* dst, const SkPaint* paint, Allocator* allocator, | 691 bool extractAlpha(SkBitmap* dst, const SkPaint* paint, Allocator* allocator, |
699 SkIPoint* offset) const; | 692 SkIPoint* offset) const; |
700 | 693 |
701 SkDEBUGCODE(void validate() const;) | 694 SkDEBUGCODE(void validate() const;) |
702 | 695 |
703 class Allocator : public SkRefCnt { | 696 class Allocator : public SkRefCnt { |
704 public: | 697 public: |
705 SK_DECLARE_INST_COUNT(Allocator) | 698 SK_DECLARE_INST_COUNT(Allocator) |
706 | 699 |
707 /** Allocate the pixel memory for the bitmap, given its dimensions and | 700 /** Allocate the pixel memory for the bitmap, given its dimensions and |
708 config. Return true on success, where success means either setPixels | 701 colortype. Return true on success, where success means either setPix els |
709 or setPixelRef was called. The pixels need not be locked when this | 702 or setPixelRef was called. The pixels need not be locked when this |
710 returns. If the config requires a colortable, it also must be | 703 returns. If the colortype requires a colortable, it also must be |
711 installed via setColorTable. If false is returned, the bitmap and | 704 installed via setColorTable. If false is returned, the bitmap and |
712 colortable should be left unchanged. | 705 colortable should be left unchanged. |
713 */ | 706 */ |
714 virtual bool allocPixelRef(SkBitmap*, SkColorTable*) = 0; | 707 virtual bool allocPixelRef(SkBitmap*, SkColorTable*) = 0; |
715 private: | 708 private: |
716 typedef SkRefCnt INHERITED; | 709 typedef SkRefCnt INHERITED; |
717 }; | 710 }; |
718 | 711 |
719 /** Subclass of Allocator that returns a pixelref that allocates its pixel | 712 /** Subclass of Allocator that returns a pixelref that allocates its pixel |
720 memory from the heap. This is the default Allocator invoked by | 713 memory from the heap. This is the default Allocator invoked by |
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
771 }; | 764 }; |
772 | 765 |
773 SkImageInfo fInfo; | 766 SkImageInfo fInfo; |
774 | 767 |
775 uint32_t fRowBytes; | 768 uint32_t fRowBytes; |
776 | 769 |
777 uint8_t fFlags; | 770 uint8_t fFlags; |
778 | 771 |
779 void internalErase(const SkIRect&, U8CPU a, U8CPU r, U8CPU g, U8CPU b)const; | 772 void internalErase(const SkIRect&, U8CPU a, U8CPU r, U8CPU g, U8CPU b)const; |
780 | 773 |
781 /* Internal computations for safe size. | |
782 */ | |
783 static int64_t ComputeSafeSize64(Config config, | |
784 uint32_t width, | |
785 uint32_t height, | |
786 size_t rowBytes); | |
787 static size_t ComputeSafeSize(Config config, | |
788 uint32_t width, | |
789 uint32_t height, | |
790 size_t rowBytes); | |
791 | |
792 /* Unreference any pixelrefs or colortables | 774 /* Unreference any pixelrefs or colortables |
793 */ | 775 */ |
794 void freePixels(); | 776 void freePixels(); |
795 void updatePixelsFromRef() const; | 777 void updatePixelsFromRef() const; |
796 | 778 |
797 void legacyUnflatten(SkReadBuffer&); | 779 void legacyUnflatten(SkReadBuffer&); |
798 | 780 |
799 static void WriteRawPixels(SkWriteBuffer*, const SkBitmap&); | 781 static void WriteRawPixels(SkWriteBuffer*, const SkBitmap&); |
800 static bool ReadRawPixels(SkReadBuffer*, SkBitmap*); | 782 static bool ReadRawPixels(SkReadBuffer*, SkBitmap*); |
801 | 783 |
(...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
912 } | 894 } |
913 | 895 |
914 /////////////////////////////////////////////////////////////////////////////// | 896 /////////////////////////////////////////////////////////////////////////////// |
915 // | 897 // |
916 // Helpers until we can fully deprecate SkBitmap::Config | 898 // Helpers until we can fully deprecate SkBitmap::Config |
917 // | 899 // |
918 extern SkBitmap::Config SkColorTypeToBitmapConfig(SkColorType); | 900 extern SkBitmap::Config SkColorTypeToBitmapConfig(SkColorType); |
919 extern SkColorType SkBitmapConfigToColorType(SkBitmap::Config); | 901 extern SkColorType SkBitmapConfigToColorType(SkBitmap::Config); |
920 | 902 |
921 #endif | 903 #endif |
OLD | NEW |