Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(31)

Side by Side Diff: include/core/SkBitmap.h

Issue 159173004: SkBitmap now really stores SkImageInfo -- config is just a ruse (Closed) Base URL: https://skia.googlecode.com/svn/trunk
Patch Set: Created 6 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « no previous file | include/core/SkImageInfo.h » ('j') | include/core/SkImageInfo.h » ('J')
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after
72 72
73 /** Copies the src bitmap into this bitmap. Ownership of the src bitmap's pi xels remains 73 /** Copies the src bitmap into this bitmap. Ownership of the src bitmap's pi xels remains
74 with the src bitmap. 74 with the src bitmap.
75 */ 75 */
76 SkBitmap& operator=(const SkBitmap& src); 76 SkBitmap& operator=(const SkBitmap& src);
77 /** Swap the fields of the two bitmaps. This routine is guaranteed to never fail or throw. 77 /** Swap the fields of the two bitmaps. This routine is guaranteed to never fail or throw.
78 */ 78 */
79 // This method is not exported to java. 79 // This method is not exported to java.
80 void swap(SkBitmap& other); 80 void swap(SkBitmap& other);
81 81
82 ///////////////////////////////////////////////////////////////////////////
83
84 const SkImageInfo& info() const { return fInfo; }
85
86 int width() const { return fInfo.fWidth; }
scroggo 2014/02/10 21:45:44 Why did width and height lose the doc stating that
reed1 2014/02/10 21:59:51 If you think it adds value, I will add it. I didn'
87 int height() const { return fInfo.fHeight; }
88 SkColorType colorType() const { return fInfo.fColorType; }
89 SkAlphaType alphaType() const { return fInfo.fAlphaType; }
90
91 /** Return the number of bytes per pixel based on the config. If the config
92 does not have at least 1 byte per (e.g. kA1_Config) then 0 is returned.
93 */
94 int bytesPerPixel() const { return fInfo.bytesPerPixel(); }
95
96 /** Return the rowbytes expressed as a number of pixels (like width and
97 height). Note, for 1-byte per pixel configs like kA8_Config, this will
98 return the same as rowBytes(). Is undefined for configs that are less
99 than 1-byte per pixel (e.g. kA1_Config)
100 */
101 int rowBytesAsPixels() const {
102 return fRowBytes >> this->shiftPerPixel();
103 }
104
105 /** Return the shift amount per pixel (i.e. 0 for 1-byte per pixel, 1 for
106 2-bytes per pixel configs, 2 for 4-bytes per pixel configs). Return 0
107 for configs that are not at least 1-byte per pixel (e.g. kA1_Config
108 or kNo_Config)
109 */
110 int shiftPerPixel() const { return this->bytesPerPixel() >> 1; }
111
112 ///////////////////////////////////////////////////////////////////////////
113
82 /** Return true iff the bitmap has empty dimensions. 114 /** Return true iff the bitmap has empty dimensions.
83 */ 115 */
84 bool empty() const { return 0 == fWidth || 0 == fHeight; } 116 bool empty() const { return fInfo.isEmpty(); }
85 117
86 /** Return true iff the bitmap has no pixelref. Note: this can return true e ven if the 118 /** Return true iff the bitmap has no pixelref. Note: this can return true e ven if the
87 dimensions of the bitmap are > 0 (see empty()). 119 dimensions of the bitmap are > 0 (see empty()).
88 */ 120 */
89 bool isNull() const { return NULL == fPixelRef; } 121 bool isNull() const { return NULL == fPixelRef; }
90 122
91 /** Return the config for the bitmap. */ 123 /** Return the config for the bitmap. */
92 Config config() const { return (Config)fConfig; } 124 Config config() const;
93 125
94 SK_ATTR_DEPRECATED("use config()") 126 SK_ATTR_DEPRECATED("use config()")
95 Config getConfig() const { return this->config(); } 127 Config getConfig() const { return this->config(); }
96 128
97 /** Return the bitmap's width, in pixels. */
98 int width() const { return fWidth; }
99
100 /** Return the bitmap's height, in pixels. */
101 int height() const { return fHeight; }
102
103 /** Return the number of bytes between subsequent rows of the bitmap. */ 129 /** Return the number of bytes between subsequent rows of the bitmap. */
104 size_t rowBytes() const { return fRowBytes; } 130 size_t rowBytes() const { return fRowBytes; }
105 131
106 /** Return the shift amount per pixel (i.e. 0 for 1-byte per pixel, 1 for
107 2-bytes per pixel configs, 2 for 4-bytes per pixel configs). Return 0
108 for configs that are not at least 1-byte per pixel (e.g. kA1_Config
109 or kNo_Config)
110 */
111 int shiftPerPixel() const { return fBytesPerPixel >> 1; }
112
113 /** Return the number of bytes per pixel based on the config. If the config
114 does not have at least 1 byte per (e.g. kA1_Config) then 0 is returned.
115 */
116 int bytesPerPixel() const { return fBytesPerPixel; }
117
118 /** Return the rowbytes expressed as a number of pixels (like width and
119 height). Note, for 1-byte per pixel configs like kA8_Config, this will
120 return the same as rowBytes(). Is undefined for configs that are less
121 than 1-byte per pixel (e.g. kA1_Config)
122 */
123 int rowBytesAsPixels() const { return fRowBytes >> (fBytesPerPixel >> 1); }
124
125 SkAlphaType alphaType() const { return (SkAlphaType)fAlphaType; }
126
127 /** 132 /**
128 * Set the bitmap's alphaType, returning true on success. If false is 133 * Set the bitmap's alphaType, returning true on success. If false is
129 * returned, then the specified new alphaType is incompatible with the 134 * returned, then the specified new alphaType is incompatible with the
130 * Config, and the current alphaType is unchanged. 135 * Config, and the current alphaType is unchanged.
131 * 136 *
132 * Note: this changes the alphatype for the underlying pixels, which means 137 * Note: this changes the alphatype for the underlying pixels, which means
133 * that all bitmaps that might be sharing (subsets of) the pixels will 138 * that all bitmaps that might be sharing (subsets of) the pixels will
134 * be affected. 139 * be affected.
135 */ 140 */
136 bool setAlphaType(SkAlphaType); 141 bool setAlphaType(SkAlphaType);
137 142
138 /** Return the address of the pixels for this SkBitmap. 143 /** Return the address of the pixels for this SkBitmap.
139 */ 144 */
140 void* getPixels() const { return fPixels; } 145 void* getPixels() const { return fPixels; }
141 146
142 /** Return the byte size of the pixels, based on the height and rowBytes. 147 /** Return the byte size of the pixels, based on the height and rowBytes.
143 Note this truncates the result to 32bits. Call getSize64() to detect 148 Note this truncates the result to 32bits. Call getSize64() to detect
144 if the real size exceeds 32bits. 149 if the real size exceeds 32bits.
145 */ 150 */
146 size_t getSize() const { return fHeight * fRowBytes; } 151 size_t getSize() const { return fInfo.fHeight * fRowBytes; }
scroggo 2014/02/10 21:45:44 Is it okay that this will return zero for a new st
reed1 2014/02/10 21:59:51 Who knows what the future will bring.
147 152
148 /** Return the number of bytes from the pointer returned by getPixels() 153 /** Return the number of bytes from the pointer returned by getPixels()
149 to the end of the allocated space in the buffer. Required in 154 to the end of the allocated space in the buffer. Required in
150 cases where extractSubset has been called. 155 cases where extractSubset has been called.
151 */ 156 */
152 size_t getSafeSize() const ; 157 size_t getSafeSize() const { return fInfo.getSafeSize(fRowBytes); }
scroggo 2014/02/10 21:45:44 Same question.
reed1 2014/02/10 21:59:51 Always in motion is the future.
153 158
154 /** 159 /**
155 * Return the full size of the bitmap, in bytes. 160 * Return the full size of the bitmap, in bytes.
156 */ 161 */
157 int64_t computeSize64() const { 162 int64_t computeSize64() const {
158 return sk_64_mul(fHeight, fRowBytes); 163 return sk_64_mul(fInfo.fHeight, fRowBytes);
159 } 164 }
160 165
161 /** 166 /**
162 * Return the number of bytes from the pointer returned by getPixels() 167 * Return the number of bytes from the pointer returned by getPixels()
163 * to the end of the allocated space in the buffer. This may be smaller 168 * to the end of the allocated space in the buffer. This may be smaller
164 * than computeSize64() if there is any rowbytes padding beyond the width. 169 * than computeSize64() if there is any rowbytes padding beyond the width.
165 */ 170 */
166 int64_t computeSafeSize64() const { 171 int64_t computeSafeSize64() const {
167 return ComputeSafeSize64((Config)fConfig, fWidth, fHeight, fRowBytes); 172 return fInfo.getSafeSize64(fRowBytes);
168 } 173 }
169 174
170 /** Returns true if this bitmap is marked as immutable, meaning that the 175 /** Returns true if this bitmap is marked as immutable, meaning that the
171 contents of its pixels will not change for the lifetime of the bitmap. 176 contents of its pixels will not change for the lifetime of the bitmap.
172 */ 177 */
173 bool isImmutable() const; 178 bool isImmutable() const;
174 179
175 /** Marks this bitmap as immutable, meaning that the contents of its 180 /** Marks this bitmap as immutable, meaning that the contents of its
176 pixels will not change for the lifetime of the bitmap and of the 181 pixels will not change for the lifetime of the bitmap and of the
177 underlying pixelref. This state can be set, but it cannot be 182 underlying pixelref. This state can be set, but it cannot be
(...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after
291 * optional ReleaseProc and context. When the pixels are no longer 296 * optional ReleaseProc and context. When the pixels are no longer
292 * referenced, if ReleaseProc is not null, it will be called with the 297 * referenced, if ReleaseProc is not null, it will be called with the
293 * pixels and context as parameters. 298 * pixels and context as parameters.
294 * On failure, the bitmap will be set to empty and return false. 299 * On failure, the bitmap will be set to empty and return false.
295 */ 300 */
296 bool installPixels(const SkImageInfo&, void* pixels, size_t rowBytes, 301 bool installPixels(const SkImageInfo&, void* pixels, size_t rowBytes,
297 void (*ReleaseProc)(void* addr, void* context), 302 void (*ReleaseProc)(void* addr, void* context),
298 void* context); 303 void* context);
299 304
300 /** 305 /**
301 * If the bitmap's config can be represented as SkImageInfo, return true, 306 * DEPRECATED: call info().
302 * and if info is not-null, set it to the bitmap's info. If it cannot be
303 * represented as SkImageInfo, return false and ignore the info parameter.
304 */ 307 */
305 bool asImageInfo(SkImageInfo* info) const; 308 bool asImageInfo(SkImageInfo* info) const {
309 // compatibility: return false for kUnknown
310 if (kUnknown_SkColorType == this->colorType()) {
311 return false;
312 }
313 if (info) {
314 *info = this->info();
315 }
316 return true;
317 }
306 318
307 /** Use this to assign a new pixel address for an existing bitmap. This 319 /** Use this to assign a new pixel address for an existing bitmap. This
308 will automatically release any pixelref previously installed. Only call 320 will automatically release any pixelref previously installed. Only call
309 this if you are handling ownership/lifetime of the pixel memory. 321 this if you are handling ownership/lifetime of the pixel memory.
310 322
311 If the bitmap retains a reference to the colortable (assuming it is 323 If the bitmap retains a reference to the colortable (assuming it is
312 not null) it will take care of incrementing the reference count. 324 not null) it will take care of incrementing the reference count.
313 325
314 @param pixels Address for the pixels, managed by the caller. 326 @param pixels Address for the pixels, managed by the caller.
315 @param ctable ColorTable (or null) that matches the specified pixels 327 @param ctable ColorTable (or null) that matches the specified pixels
(...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after
437 */ 449 */
438 bool readyToDraw() const { 450 bool readyToDraw() const {
439 return this->getPixels() != NULL && 451 return this->getPixels() != NULL &&
440 (this->config() != kIndex8_Config || NULL != fColorTable); 452 (this->config() != kIndex8_Config || NULL != fColorTable);
441 } 453 }
442 454
443 /** Returns the pixelRef's texture, or NULL 455 /** Returns the pixelRef's texture, or NULL
444 */ 456 */
445 GrTexture* getTexture() const; 457 GrTexture* getTexture() const;
446 458
447 /** Return the bitmap's colortable, if it uses one (i.e. fConfig is 459 /** Return the bitmap's colortable, if it uses one (i.e. colorType is
448 kIndex8_Config) and the pixels are locked. 460 Index_8) and the pixels are locked.
449 Otherwise returns NULL. Does not affect the colortable's 461 Otherwise returns NULL. Does not affect the colortable's
450 reference count. 462 reference count.
451 */ 463 */
452 SkColorTable* getColorTable() const { return fColorTable; } 464 SkColorTable* getColorTable() const { return fColorTable; }
453 465
454 /** Returns a non-zero, unique value corresponding to the pixels in our 466 /** Returns a non-zero, unique value corresponding to the pixels in our
455 pixelref. Each time the pixels are changed (and notifyPixelsChanged 467 pixelref. Each time the pixels are changed (and notifyPixelsChanged
456 is called), a different generation ID will be returned. Finally, if 468 is called), a different generation ID will be returned. Finally, if
457 their is no pixelRef then zero is returned. 469 their is no pixelRef then zero is returned.
458 */ 470 */
(...skipping 270 matching lines...) Expand 10 before | Expand all | Expand 10 after
729 kImageIsImmutable_Flag = 0x04, 741 kImageIsImmutable_Flag = 0x04,
730 #ifdef SK_BUILD_FOR_ANDROID 742 #ifdef SK_BUILD_FOR_ANDROID
731 /* A hint for the renderer responsible for drawing this bitmap 743 /* A hint for the renderer responsible for drawing this bitmap
732 * indicating that it should attempt to use mipmaps when this bitmap 744 * indicating that it should attempt to use mipmaps when this bitmap
733 * is drawn scaled down. 745 * is drawn scaled down.
734 */ 746 */
735 kHasHardwareMipMap_Flag = 0x08, 747 kHasHardwareMipMap_Flag = 0x08,
736 #endif 748 #endif
737 }; 749 };
738 750
751 SkImageInfo fInfo;
752
739 uint32_t fRowBytes; 753 uint32_t fRowBytes;
740 uint32_t fWidth; 754
741 uint32_t fHeight;
742 uint8_t fConfig;
743 uint8_t fAlphaType;
744 uint8_t fFlags; 755 uint8_t fFlags;
745 uint8_t fBytesPerPixel; // based on config
746 756
747 void internalErase(const SkIRect&, U8CPU a, U8CPU r, U8CPU g, U8CPU b)const; 757 void internalErase(const SkIRect&, U8CPU a, U8CPU r, U8CPU g, U8CPU b)const;
748 758
749 /* Internal computations for safe size. 759 /* Internal computations for safe size.
750 */ 760 */
751 static int64_t ComputeSafeSize64(Config config, 761 static int64_t ComputeSafeSize64(Config config,
752 uint32_t width, 762 uint32_t width,
753 uint32_t height, 763 uint32_t height,
754 size_t rowBytes); 764 size_t rowBytes);
755 static size_t ComputeSafeSize(Config config, 765 static size_t ComputeSafeSize(Config config,
(...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after
847 private: 857 private:
848 SkColorTable* fCTable; 858 SkColorTable* fCTable;
849 const SkPMColor* fColors; 859 const SkPMColor* fColors;
850 }; 860 };
851 #define SkAutoLockColors(...) SK_REQUIRE_LOCAL_VAR(SkAutoLockColors) 861 #define SkAutoLockColors(...) SK_REQUIRE_LOCAL_VAR(SkAutoLockColors)
852 862
853 /////////////////////////////////////////////////////////////////////////////// 863 ///////////////////////////////////////////////////////////////////////////////
854 864
855 inline uint32_t* SkBitmap::getAddr32(int x, int y) const { 865 inline uint32_t* SkBitmap::getAddr32(int x, int y) const {
856 SkASSERT(fPixels); 866 SkASSERT(fPixels);
857 SkASSERT(fConfig == kARGB_8888_Config); 867 SkASSERT(this->config() == kARGB_8888_Config);
858 SkASSERT((unsigned)x < fWidth && (unsigned)y < fHeight); 868 SkASSERT((unsigned)x < (unsigned)this->width() && (unsigned)y < (unsigned)th is->height());
859 return (uint32_t*)((char*)fPixels + y * fRowBytes + (x << 2)); 869 return (uint32_t*)((char*)fPixels + y * fRowBytes + (x << 2));
860 } 870 }
861 871
862 inline uint16_t* SkBitmap::getAddr16(int x, int y) const { 872 inline uint16_t* SkBitmap::getAddr16(int x, int y) const {
863 SkASSERT(fPixels); 873 SkASSERT(fPixels);
864 SkASSERT(fConfig == kRGB_565_Config || fConfig == kARGB_4444_Config); 874 SkASSERT(this->config() == kRGB_565_Config || this->config() == kARGB_4444_C onfig);
865 SkASSERT((unsigned)x < fWidth && (unsigned)y < fHeight); 875 SkASSERT((unsigned)x < (unsigned)this->width() && (unsigned)y < (unsigned)th is->height());
866 return (uint16_t*)((char*)fPixels + y * fRowBytes + (x << 1)); 876 return (uint16_t*)((char*)fPixels + y * fRowBytes + (x << 1));
867 } 877 }
868 878
869 inline uint8_t* SkBitmap::getAddr8(int x, int y) const { 879 inline uint8_t* SkBitmap::getAddr8(int x, int y) const {
870 SkASSERT(fPixels); 880 SkASSERT(fPixels);
871 SkASSERT(fConfig == kA8_Config || fConfig == kIndex8_Config); 881 SkASSERT(this->config() == kA8_Config || this->config() == kIndex8_Config);
872 SkASSERT((unsigned)x < fWidth && (unsigned)y < fHeight); 882 SkASSERT((unsigned)x < (unsigned)this->width() && (unsigned)y < (unsigned)th is->height());
873 return (uint8_t*)fPixels + y * fRowBytes + x; 883 return (uint8_t*)fPixels + y * fRowBytes + x;
874 } 884 }
875 885
876 inline SkPMColor SkBitmap::getIndex8Color(int x, int y) const { 886 inline SkPMColor SkBitmap::getIndex8Color(int x, int y) const {
877 SkASSERT(fPixels); 887 SkASSERT(fPixels);
878 SkASSERT(fConfig == kIndex8_Config); 888 SkASSERT(this->config() == kIndex8_Config);
879 SkASSERT((unsigned)x < fWidth && (unsigned)y < fHeight); 889 SkASSERT((unsigned)x < (unsigned)this->width() && (unsigned)y < (unsigned)th is->height());
880 SkASSERT(fColorTable); 890 SkASSERT(fColorTable);
881 return (*fColorTable)[*((const uint8_t*)fPixels + y * fRowBytes + x)]; 891 return (*fColorTable)[*((const uint8_t*)fPixels + y * fRowBytes + x)];
882 } 892 }
883 893
884 #endif 894 #endif
OLDNEW
« no previous file with comments | « no previous file | include/core/SkImageInfo.h » ('j') | include/core/SkImageInfo.h » ('J')

Powered by Google App Engine
This is Rietveld 408576698