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

Side by Side Diff: src/core/SkBitmap.cpp

Issue 159653004: 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 | « include/core/SkPathRef.h ('k') | src/image/SkImagePriv.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 1
2 /* 2 /*
3 * Copyright 2008 The Android Open Source Project 3 * Copyright 2008 The Android Open Source Project
4 * 4 *
5 * Use of this source code is governed by a BSD-style license that can be 5 * Use of this source code is governed by a BSD-style license that can be
6 * found in the LICENSE file. 6 * found in the LICENSE file.
7 */ 7 */
8 8
9 9
10 #include "SkBitmap.h" 10 #include "SkBitmap.h"
11 #include "SkColorPriv.h" 11 #include "SkColorPriv.h"
12 #include "SkDither.h" 12 #include "SkDither.h"
13 #include "SkFlattenable.h" 13 #include "SkFlattenable.h"
14 #include "SkImagePriv.h" 14 #include "SkImagePriv.h"
15 #include "SkMallocPixelRef.h" 15 #include "SkMallocPixelRef.h"
16 #include "SkMask.h" 16 #include "SkMask.h"
17 #include "SkReadBuffer.h" 17 #include "SkReadBuffer.h"
18 #include "SkWriteBuffer.h" 18 #include "SkWriteBuffer.h"
19 #include "SkPixelRef.h" 19 #include "SkPixelRef.h"
20 #include "SkThread.h" 20 #include "SkThread.h"
21 #include "SkUnPreMultiply.h" 21 #include "SkUnPreMultiply.h"
22 #include "SkUtils.h" 22 #include "SkUtils.h"
23 #include "SkValidationUtils.h" 23 #include "SkValidationUtils.h"
24 #include "SkPackBits.h" 24 #include "SkPackBits.h"
25 #include <new> 25 #include <new>
26 26
27 static bool reset_return_false(SkBitmap* bm) {
28 bm->reset();
29 return false;
30 }
31
27 struct MipLevel { 32 struct MipLevel {
28 void* fPixels; 33 void* fPixels;
29 uint32_t fRowBytes; 34 uint32_t fRowBytes;
30 uint32_t fWidth, fHeight; 35 uint32_t fWidth, fHeight;
31 }; 36 };
32 37
33 struct SkBitmap::MipMap : SkNoncopyable { 38 struct SkBitmap::MipMap : SkNoncopyable {
34 int32_t fRefCnt; 39 int32_t fRefCnt;
35 int fLevelCount; 40 int fLevelCount;
36 // MipLevel fLevel[fLevelCount]; 41 // MipLevel fLevel[fLevelCount];
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after
118 return *this; 123 return *this;
119 } 124 }
120 125
121 void SkBitmap::swap(SkBitmap& other) { 126 void SkBitmap::swap(SkBitmap& other) {
122 SkTSwap(fColorTable, other.fColorTable); 127 SkTSwap(fColorTable, other.fColorTable);
123 SkTSwap(fPixelRef, other.fPixelRef); 128 SkTSwap(fPixelRef, other.fPixelRef);
124 SkTSwap(fPixelRefOrigin, other.fPixelRefOrigin); 129 SkTSwap(fPixelRefOrigin, other.fPixelRefOrigin);
125 SkTSwap(fPixelLockCount, other.fPixelLockCount); 130 SkTSwap(fPixelLockCount, other.fPixelLockCount);
126 SkTSwap(fMipMap, other.fMipMap); 131 SkTSwap(fMipMap, other.fMipMap);
127 SkTSwap(fPixels, other.fPixels); 132 SkTSwap(fPixels, other.fPixels);
133 SkTSwap(fInfo, other.fInfo);
128 SkTSwap(fRowBytes, other.fRowBytes); 134 SkTSwap(fRowBytes, other.fRowBytes);
129 SkTSwap(fWidth, other.fWidth);
130 SkTSwap(fHeight, other.fHeight);
131 SkTSwap(fConfig, other.fConfig);
132 SkTSwap(fAlphaType, other.fAlphaType);
133 SkTSwap(fFlags, other.fFlags); 135 SkTSwap(fFlags, other.fFlags);
134 SkTSwap(fBytesPerPixel, other.fBytesPerPixel);
135 136
136 SkDEBUGCODE(this->validate();) 137 SkDEBUGCODE(this->validate();)
137 } 138 }
138 139
139 void SkBitmap::reset() { 140 void SkBitmap::reset() {
140 this->freePixels(); 141 this->freePixels();
141 sk_bzero(this, sizeof(*this)); 142 sk_bzero(this, sizeof(*this));
142 } 143 }
143 144
145 SkBitmap::Config SkBitmap::config() const {
146 return SkColorTypeToBitmapConfig(fInfo.colorType());
147 }
148
144 int SkBitmap::ComputeBytesPerPixel(SkBitmap::Config config) { 149 int SkBitmap::ComputeBytesPerPixel(SkBitmap::Config config) {
145 int bpp; 150 int bpp;
146 switch (config) { 151 switch (config) {
147 case kNo_Config: 152 case kNo_Config:
148 bpp = 0; // not applicable 153 bpp = 0; // not applicable
149 break; 154 break;
150 case kA8_Config: 155 case kA8_Config:
151 case kIndex8_Config: 156 case kIndex8_Config:
152 bpp = 1; 157 bpp = 1;
153 break; 158 break;
154 case kRGB_565_Config: 159 case kRGB_565_Config:
155 case kARGB_4444_Config: 160 case kARGB_4444_Config:
156 bpp = 2; 161 bpp = 2;
157 break; 162 break;
158 case kARGB_8888_Config: 163 case kARGB_8888_Config:
159 bpp = 4; 164 bpp = 4;
160 break; 165 break;
161 default: 166 default:
162 SkDEBUGFAIL("unknown config"); 167 SkDEBUGFAIL("unknown config");
163 bpp = 0; // error 168 bpp = 0; // error
164 break; 169 break;
165 } 170 }
166 return bpp; 171 return bpp;
167 } 172 }
168 173
169 size_t SkBitmap::ComputeRowBytes(Config c, int width) { 174 size_t SkBitmap::ComputeRowBytes(Config c, int width) {
170 if (width < 0) { 175 return SkColorTypeMinRowBytes(SkBitmapConfigToColorType(c), width);
171 return 0;
172 }
173
174 int64_t rowBytes = 0;
175
176 switch (c) {
177 case kNo_Config:
178 break;
179 case kA8_Config:
180 case kIndex8_Config:
181 rowBytes = width;
182 break;
183 case kRGB_565_Config:
184 case kARGB_4444_Config:
185 // assign and then shift, so we don't overflow int
186 rowBytes = width;
187 rowBytes <<= 1;
188 break;
189 case kARGB_8888_Config:
190 // assign and then shift, so we don't overflow int
191 rowBytes = width;
192 rowBytes <<= 2;
193 break;
194 default:
195 SkDEBUGFAIL("unknown config");
196 break;
197 }
198 return sk_64_isS32(rowBytes) ? sk_64_asS32(rowBytes) : 0;
199 } 176 }
200 177
201 int64_t SkBitmap::ComputeSize64(Config config, int width, int height) { 178 int64_t SkBitmap::ComputeSize64(Config config, int width, int height) {
202 int64_t rowBytes = sk_64_mul(ComputeBytesPerPixel(config), width); 179 SkColorType ct = SkBitmapConfigToColorType(config);
180 int64_t rowBytes = sk_64_mul(SkColorTypeBytesPerPixel(ct), width);
203 return rowBytes * height; 181 return rowBytes * height;
204 } 182 }
205 183
206 size_t SkBitmap::ComputeSize(Config c, int width, int height) { 184 size_t SkBitmap::ComputeSize(Config c, int width, int height) {
207 int64_t size = SkBitmap::ComputeSize64(c, width, height); 185 int64_t size = SkBitmap::ComputeSize64(c, width, height);
208 return sk_64_isS32(size) ? sk_64_asS32(size) : 0; 186 return sk_64_isS32(size) ? sk_64_asS32(size) : 0;
209 } 187 }
210 188
211 int64_t SkBitmap::ComputeSafeSize64(Config config, 189 int64_t SkBitmap::ComputeSafeSize64(Config config,
212 uint32_t width, 190 uint32_t width,
213 uint32_t height, 191 uint32_t height,
214 size_t rowBytes) { 192 size_t rowBytes) {
215 int64_t safeSize = 0; 193 SkImageInfo info = SkImageInfo::Make(width, height,
216 if (height > 0) { 194 SkBitmapConfigToColorType(config),
217 int64_t lastRow = sk_64_mul(ComputeBytesPerPixel(config), width); 195 kPremul_SkAlphaType);
218 safeSize = sk_64_mul(height - 1, rowBytes) + lastRow; 196 return info.getSafeSize64(rowBytes);
219 }
220 SkASSERT(safeSize >= 0);
221 return safeSize;
222 } 197 }
223 198
224 size_t SkBitmap::ComputeSafeSize(Config config, 199 size_t SkBitmap::ComputeSafeSize(Config config,
225 uint32_t width, 200 uint32_t width,
226 uint32_t height, 201 uint32_t height,
227 size_t rowBytes) { 202 size_t rowBytes) {
228 int64_t safeSize = ComputeSafeSize64(config, width, height, rowBytes); 203 int64_t safeSize = ComputeSafeSize64(config, width, height, rowBytes);
229 int32_t safeSize32 = (int32_t)safeSize; 204 int32_t safeSize32 = (int32_t)safeSize;
230 205
231 if (safeSize32 != safeSize) { 206 if (safeSize32 != safeSize) {
232 safeSize32 = 0; 207 safeSize32 = 0;
233 } 208 }
234 return safeSize32; 209 return safeSize32;
235 } 210 }
236 211
237 void SkBitmap::getBounds(SkRect* bounds) const { 212 void SkBitmap::getBounds(SkRect* bounds) const {
238 SkASSERT(bounds); 213 SkASSERT(bounds);
239 bounds->set(0, 0, 214 bounds->set(0, 0,
240 SkIntToScalar(fWidth), SkIntToScalar(fHeight)); 215 SkIntToScalar(fInfo.fWidth), SkIntToScalar(fInfo.fHeight));
241 } 216 }
242 217
243 void SkBitmap::getBounds(SkIRect* bounds) const { 218 void SkBitmap::getBounds(SkIRect* bounds) const {
244 SkASSERT(bounds); 219 SkASSERT(bounds);
245 bounds->set(0, 0, fWidth, fHeight); 220 bounds->set(0, 0, fInfo.fWidth, fInfo.fHeight);
246 } 221 }
247 222
248 /////////////////////////////////////////////////////////////////////////////// 223 ///////////////////////////////////////////////////////////////////////////////
249 224
250 static bool validate_alphaType(SkBitmap::Config config, SkAlphaType alphaType, 225 static bool validate_alphaType(SkColorType colorType, SkAlphaType alphaType,
251 SkAlphaType* canonical = NULL) { 226 SkAlphaType* canonical = NULL) {
252 switch (config) { 227 switch (colorType) {
253 case SkBitmap::kNo_Config: 228 case kUnknown_SkColorType:
254 alphaType = kIgnore_SkAlphaType; 229 alphaType = kIgnore_SkAlphaType;
255 break; 230 break;
256 case SkBitmap::kA8_Config: 231 case kAlpha_8_SkColorType:
257 if (kUnpremul_SkAlphaType == alphaType) { 232 if (kUnpremul_SkAlphaType == alphaType) {
258 alphaType = kPremul_SkAlphaType; 233 alphaType = kPremul_SkAlphaType;
259 } 234 }
260 // fall-through 235 // fall-through
261 case SkBitmap::kIndex8_Config: 236 case kIndex_8_SkColorType:
262 case SkBitmap::kARGB_4444_Config: 237 case kARGB_4444_SkColorType:
263 case SkBitmap::kARGB_8888_Config: 238 case kRGBA_8888_SkColorType:
239 case kBGRA_8888_SkColorType:
264 if (kIgnore_SkAlphaType == alphaType) { 240 if (kIgnore_SkAlphaType == alphaType) {
265 return false; 241 return false;
266 } 242 }
267 break; 243 break;
268 case SkBitmap::kRGB_565_Config: 244 case kRGB_565_SkColorType:
269 alphaType = kOpaque_SkAlphaType; 245 alphaType = kOpaque_SkAlphaType;
270 break; 246 break;
271 default: 247 default:
272 return false; 248 return false;
273 } 249 }
274 if (canonical) { 250 if (canonical) {
275 *canonical = alphaType; 251 *canonical = alphaType;
276 } 252 }
277 return true; 253 return true;
278 } 254 }
279 255
256 bool SkBitmap::setConfig(const SkImageInfo& info, size_t rowBytes) {
257 // require that rowBytes fit in 31bits
258 int64_t mrb = info.minRowBytes64();
259 if ((int32_t)mrb != mrb) {
260 return reset_return_false(this);
261 }
262 if ((int64_t)rowBytes != (int32_t)rowBytes) {
263 return reset_return_false(this);
264 }
265
266 if (info.width() < 0 || info.height() < 0) {
267 return reset_return_false(this);
268 }
269
270 if (kUnknown_SkColorType == info.colorType()) {
271 rowBytes = 0;
272 } else if (0 == rowBytes) {
273 rowBytes = (size_t)mrb;
274 } else if (rowBytes < info.minRowBytes()) {
275 return reset_return_false(this);
276 }
277
278 this->freePixels();
279
280 fInfo = info;
281 fRowBytes = SkToU32(rowBytes);
282 return true;
283 }
284
280 bool SkBitmap::setConfig(Config config, int width, int height, size_t rowBytes, 285 bool SkBitmap::setConfig(Config config, int width, int height, size_t rowBytes,
281 SkAlphaType alphaType) { 286 SkAlphaType alphaType) {
282 if ((width | height) < 0) { 287 SkColorType ct = SkBitmapConfigToColorType(config);
283 goto BAD_CONFIG; 288 return this->setConfig(SkImageInfo::Make(width, height, ct, alphaType),
284 } 289 rowBytes);
285 if (rowBytes == 0) {
286 rowBytes = SkBitmap::ComputeRowBytes(config, width);
287 if (0 == rowBytes && kNo_Config != config && width > 0) {
288 goto BAD_CONFIG;
289 }
290 }
291
292 if (!validate_alphaType(config, alphaType, &alphaType)) {
293 goto BAD_CONFIG;
294 }
295
296 this->freePixels();
297
298 fConfig = SkToU8(config);
299 fAlphaType = SkToU8(alphaType);
300 fWidth = width;
301 fHeight = height;
302 fRowBytes = SkToU32(rowBytes);
303
304 fBytesPerPixel = (uint8_t)ComputeBytesPerPixel(config);
305
306 SkDEBUGCODE(this->validate();)
307 return true;
308
309 // if we got here, we had an error, so we reset the bitmap to empty
310 BAD_CONFIG:
311 this->reset();
312 return false;
313 }
314
315 bool SkBitmap::setConfig(const SkImageInfo& info, size_t rowBytes) {
316 return this->setConfig(SkImageInfoToBitmapConfig(info), info.fWidth,
317 info.fHeight, rowBytes, info.fAlphaType);
318 } 290 }
319 291
320 bool SkBitmap::setAlphaType(SkAlphaType alphaType) { 292 bool SkBitmap::setAlphaType(SkAlphaType alphaType) {
321 if (!validate_alphaType(this->config(), alphaType, &alphaType)) { 293 if (!validate_alphaType(fInfo.fColorType, alphaType, &alphaType)) {
322 return false; 294 return false;
323 } 295 }
324 if (fAlphaType != alphaType) { 296 if (fInfo.fAlphaType != alphaType) {
325 fAlphaType = SkToU8(alphaType); 297 fInfo.fAlphaType = alphaType;
326 if (fPixelRef) { 298 if (fPixelRef) {
327 fPixelRef->changeAlphaType(alphaType); 299 fPixelRef->changeAlphaType(alphaType);
328 } 300 }
329 } 301 }
330 return true; 302 return true;
331 } 303 }
332 304
333 void SkBitmap::updatePixelsFromRef() const { 305 void SkBitmap::updatePixelsFromRef() const {
334 if (NULL != fPixelRef) { 306 if (NULL != fPixelRef) {
335 if (fPixelLockCount > 0) { 307 if (fPixelLockCount > 0) {
336 SkASSERT(fPixelRef->isLocked()); 308 SkASSERT(fPixelRef->isLocked());
337 309
338 void* p = fPixelRef->pixels(); 310 void* p = fPixelRef->pixels();
339 if (NULL != p) { 311 if (NULL != p) {
340 p = (char*)p 312 p = (char*)p
341 + fPixelRefOrigin.fY * fRowBytes 313 + fPixelRefOrigin.fY * fRowBytes
342 + fPixelRefOrigin.fX * fBytesPerPixel; 314 + fPixelRefOrigin.fX * fInfo.bytesPerPixel();
343 } 315 }
344 fPixels = p; 316 fPixels = p;
345 fColorTable = fPixelRef->colorTable(); 317 fColorTable = fPixelRef->colorTable();
346 } else { 318 } else {
347 SkASSERT(0 == fPixelLockCount); 319 SkASSERT(0 == fPixelLockCount);
348 fPixels = NULL; 320 fPixels = NULL;
349 fColorTable = NULL; 321 fColorTable = NULL;
350 } 322 }
351 } 323 }
352 } 324 }
(...skipping 19 matching lines...) Expand all
372 case SkBitmap::kNo_Config: 344 case SkBitmap::kNo_Config:
373 default: 345 default:
374 return false; 346 return false;
375 } 347 }
376 if (ctOut) { 348 if (ctOut) {
377 *ctOut = ct; 349 *ctOut = ct;
378 } 350 }
379 return true; 351 return true;
380 } 352 }
381 353
382 bool SkBitmap::asImageInfo(SkImageInfo* info) const {
383 SkColorType ct;
384 if (!config_to_colorType(this->config(), &ct)) {
385 return false;
386 }
387 if (info) {
388 info->fWidth = fWidth;
389 info->fHeight = fHeight;
390 info->fAlphaType = this->alphaType();
391 info->fColorType = ct;
392 }
393 return true;
394 }
395
396 SkPixelRef* SkBitmap::setPixelRef(SkPixelRef* pr, int dx, int dy) { 354 SkPixelRef* SkBitmap::setPixelRef(SkPixelRef* pr, int dx, int dy) {
397 #ifdef SK_DEBUG 355 #ifdef SK_DEBUG
398 if (pr) { 356 if (pr) {
399 SkImageInfo info; 357 SkImageInfo info;
400 if (this->asImageInfo(&info)) { 358 if (this->asImageInfo(&info)) {
401 const SkImageInfo& prInfo = pr->info(); 359 const SkImageInfo& prInfo = pr->info();
402 SkASSERT(info.fWidth <= prInfo.fWidth); 360 SkASSERT(info.fWidth <= prInfo.fWidth);
403 SkASSERT(info.fHeight <= prInfo.fHeight); 361 SkASSERT(info.fHeight <= prInfo.fHeight);
404 SkASSERT(info.fColorType == prInfo.fColorType); 362 SkASSERT(info.fColorType == prInfo.fColorType);
405 switch (prInfo.fAlphaType) { 363 switch (prInfo.fAlphaType) {
406 case kIgnore_SkAlphaType: 364 case kIgnore_SkAlphaType:
407 SkASSERT(fAlphaType == kIgnore_SkAlphaType); 365 SkASSERT(fInfo.fAlphaType == kIgnore_SkAlphaType);
408 break; 366 break;
409 case kOpaque_SkAlphaType: 367 case kOpaque_SkAlphaType:
410 case kPremul_SkAlphaType: 368 case kPremul_SkAlphaType:
411 SkASSERT(info.fAlphaType == kOpaque_SkAlphaType || 369 SkASSERT(info.fAlphaType == kOpaque_SkAlphaType ||
412 info.fAlphaType == kPremul_SkAlphaType); 370 info.fAlphaType == kPremul_SkAlphaType);
413 break; 371 break;
414 case kUnpremul_SkAlphaType: 372 case kUnpremul_SkAlphaType:
415 SkASSERT(info.fAlphaType == kOpaque_SkAlphaType || 373 SkASSERT(info.fAlphaType == kOpaque_SkAlphaType ||
416 info.fAlphaType == kUnpremul_SkAlphaType); 374 info.fAlphaType == kUnpremul_SkAlphaType);
417 break; 375 break;
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after
495 HeapAllocator stdalloc; 453 HeapAllocator stdalloc;
496 454
497 if (NULL == allocator) { 455 if (NULL == allocator) {
498 allocator = &stdalloc; 456 allocator = &stdalloc;
499 } 457 }
500 return allocator->allocPixelRef(this, ctable); 458 return allocator->allocPixelRef(this, ctable);
501 } 459 }
502 460
503 /////////////////////////////////////////////////////////////////////////////// 461 ///////////////////////////////////////////////////////////////////////////////
504 462
505 static bool reset_return_false(SkBitmap* bm) {
506 bm->reset();
507 return false;
508 }
509
510 bool SkBitmap::allocPixels(const SkImageInfo& info, SkPixelRefFactory* factory, 463 bool SkBitmap::allocPixels(const SkImageInfo& info, SkPixelRefFactory* factory,
511 SkColorTable* ctable) { 464 SkColorTable* ctable) {
512 if (kIndex_8_SkColorType == info.fColorType && NULL == ctable) { 465 if (kIndex_8_SkColorType == info.fColorType && NULL == ctable) {
513 return reset_return_false(this); 466 return reset_return_false(this);
514 } 467 }
515 if (!this->setConfig(info)) { 468 if (!this->setConfig(info)) {
516 return reset_return_false(this); 469 return reset_return_false(this);
517 } 470 }
518 471
519 SkMallocPixelRef::PRFactory defaultFactory; 472 SkMallocPixelRef::PRFactory defaultFactory;
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
555 } 508 }
556 509
557 bool SkBitmap::allocConfigPixels(Config config, int width, int height, 510 bool SkBitmap::allocConfigPixels(Config config, int width, int height,
558 bool isOpaque) { 511 bool isOpaque) {
559 SkColorType ct; 512 SkColorType ct;
560 if (!config_to_colorType(config, &ct)) { 513 if (!config_to_colorType(config, &ct)) {
561 return false; 514 return false;
562 } 515 }
563 516
564 SkAlphaType at = isOpaque ? kOpaque_SkAlphaType : kPremul_SkAlphaType; 517 SkAlphaType at = isOpaque ? kOpaque_SkAlphaType : kPremul_SkAlphaType;
565 if (!validate_alphaType(config, at, &at)) {
566 return false;
567 }
568
569 return this->allocPixels(SkImageInfo::Make(width, height, ct, at)); 518 return this->allocPixels(SkImageInfo::Make(width, height, ct, at));
570 } 519 }
571 520
572 /////////////////////////////////////////////////////////////////////////////// 521 ///////////////////////////////////////////////////////////////////////////////
573 522
574 void SkBitmap::freePixels() { 523 void SkBitmap::freePixels() {
575 // if we're gonna free the pixels, we certainly need to free the mipmap 524 // if we're gonna free the pixels, we certainly need to free the mipmap
576 this->freeMipMap(); 525 this->freeMipMap();
577 526
578 if (NULL != fPixelRef) { 527 if (NULL != fPixelRef) {
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
630 } 579 }
631 580
632 dst->setPixelRef(pr)->unref(); 581 dst->setPixelRef(pr)->unref();
633 // since we're already allocated, we lockPixels right away 582 // since we're already allocated, we lockPixels right away
634 dst->lockPixels(); 583 dst->lockPixels();
635 return true; 584 return true;
636 } 585 }
637 586
638 /////////////////////////////////////////////////////////////////////////////// 587 ///////////////////////////////////////////////////////////////////////////////
639 588
640 size_t SkBitmap::getSafeSize() const {
641 // This is intended to be a size_t version of ComputeSafeSize64(), just
642 // faster. The computation is meant to be identical.
643 return (fHeight ? ((fHeight - 1) * fRowBytes) +
644 ComputeRowBytes(this->config(), fWidth): 0);
645 }
646
647 bool SkBitmap::copyPixelsTo(void* const dst, size_t dstSize, 589 bool SkBitmap::copyPixelsTo(void* const dst, size_t dstSize,
648 size_t dstRowBytes, bool preserveDstPad) const { 590 size_t dstRowBytes, bool preserveDstPad) const {
649 591
650 if (0 == dstRowBytes) { 592 if (0 == dstRowBytes) {
651 dstRowBytes = fRowBytes; 593 dstRowBytes = fRowBytes;
652 } 594 }
653 595
654 if (dstRowBytes < ComputeRowBytes(this->config(), fWidth) || 596 if (dstRowBytes < fInfo.minRowBytes() ||
655 dst == NULL || (getPixels() == NULL && pixelRef() == NULL)) 597 dst == NULL || (getPixels() == NULL && pixelRef() == NULL)) {
656 return false; 598 return false;
599 }
657 600
658 if (!preserveDstPad && static_cast<uint32_t>(dstRowBytes) == fRowBytes) { 601 if (!preserveDstPad && static_cast<uint32_t>(dstRowBytes) == fRowBytes) {
659 size_t safeSize = this->getSafeSize(); 602 size_t safeSize = this->getSafeSize();
660 if (safeSize > dstSize || safeSize == 0) 603 if (safeSize > dstSize || safeSize == 0)
661 return false; 604 return false;
662 else { 605 else {
663 SkAutoLockPixels lock(*this); 606 SkAutoLockPixels lock(*this);
664 // This implementation will write bytes beyond the end of each row, 607 // This implementation will write bytes beyond the end of each row,
665 // excluding the last row, if the bitmap's stride is greater than 608 // excluding the last row, if the bitmap's stride is greater than
666 // strictly required by the current config. 609 // strictly required by the current config.
667 memcpy(dst, getPixels(), safeSize); 610 memcpy(dst, getPixels(), safeSize);
668 611
669 return true; 612 return true;
670 } 613 }
671 } else { 614 } else {
672 // If destination has different stride than us, then copy line by line. 615 // If destination has different stride than us, then copy line by line.
673 if (ComputeSafeSize(this->config(), fWidth, fHeight, dstRowBytes) > 616 if (fInfo.getSafeSize(dstRowBytes) > dstSize) {
674 dstSize)
675 return false; 617 return false;
676 else { 618 } else {
677 // Just copy what we need on each line. 619 // Just copy what we need on each line.
678 size_t rowBytes = ComputeRowBytes(this->config(), fWidth); 620 size_t rowBytes = fInfo.minRowBytes();
679 SkAutoLockPixels lock(*this); 621 SkAutoLockPixels lock(*this);
680 const uint8_t* srcP = reinterpret_cast<const uint8_t*>(getPixels()); 622 const uint8_t* srcP = reinterpret_cast<const uint8_t*>(getPixels());
681 uint8_t* dstP = reinterpret_cast<uint8_t*>(dst); 623 uint8_t* dstP = reinterpret_cast<uint8_t*>(dst);
682 for (uint32_t row = 0; row < fHeight; 624 for (int row = 0; row < fInfo.fHeight;
683 row++, srcP += fRowBytes, dstP += dstRowBytes) { 625 row++, srcP += fRowBytes, dstP += dstRowBytes) {
684 memcpy(dstP, srcP, rowBytes); 626 memcpy(dstP, srcP, rowBytes);
685 } 627 }
686 628
687 return true; 629 return true;
688 } 630 }
689 } 631 }
690 } 632 }
691 633
692 /////////////////////////////////////////////////////////////////////////////// 634 ///////////////////////////////////////////////////////////////////////////////
(...skipping 23 matching lines...) Expand all
716 } 658 }
717 } 659 }
718 660
719 void* SkBitmap::getAddr(int x, int y) const { 661 void* SkBitmap::getAddr(int x, int y) const {
720 SkASSERT((unsigned)x < (unsigned)this->width()); 662 SkASSERT((unsigned)x < (unsigned)this->width());
721 SkASSERT((unsigned)y < (unsigned)this->height()); 663 SkASSERT((unsigned)y < (unsigned)this->height());
722 664
723 char* base = (char*)this->getPixels(); 665 char* base = (char*)this->getPixels();
724 if (base) { 666 if (base) {
725 base += y * this->rowBytes(); 667 base += y * this->rowBytes();
726 switch (this->config()) { 668 switch (this->colorType()) {
727 case SkBitmap::kARGB_8888_Config: 669 case kRGBA_8888_SkColorType:
670 case kBGRA_8888_SkColorType:
728 base += x << 2; 671 base += x << 2;
729 break; 672 break;
730 case SkBitmap::kARGB_4444_Config: 673 case kARGB_4444_SkColorType:
731 case SkBitmap::kRGB_565_Config: 674 case kRGB_565_SkColorType:
732 base += x << 1; 675 base += x << 1;
733 break; 676 break;
734 case SkBitmap::kA8_Config: 677 case kAlpha_8_SkColorType:
735 case SkBitmap::kIndex8_Config: 678 case kIndex_8_SkColorType:
736 base += x; 679 base += x;
737 break; 680 break;
738 break;
739 default: 681 default:
740 SkDEBUGFAIL("Can't return addr for config"); 682 SkDEBUGFAIL("Can't return addr for config");
741 base = NULL; 683 base = NULL;
742 break; 684 break;
743 } 685 }
744 } 686 }
745 return base; 687 return base;
746 } 688 }
747 689
748 SkColor SkBitmap::getColor(int x, int y) const { 690 SkColor SkBitmap::getColor(int x, int y) const {
(...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after
866 U8CPU a, U8CPU r, U8CPU g, U8CPU b) const { 808 U8CPU a, U8CPU r, U8CPU g, U8CPU b) const {
867 #ifdef SK_DEBUG 809 #ifdef SK_DEBUG
868 SkDEBUGCODE(this->validate();) 810 SkDEBUGCODE(this->validate();)
869 SkASSERT(!area.isEmpty()); 811 SkASSERT(!area.isEmpty());
870 { 812 {
871 SkIRect total = { 0, 0, this->width(), this->height() }; 813 SkIRect total = { 0, 0, this->width(), this->height() };
872 SkASSERT(total.contains(area)); 814 SkASSERT(total.contains(area));
873 } 815 }
874 #endif 816 #endif
875 817
876 if (kNo_Config == fConfig || kIndex8_Config == fConfig) { 818 switch (fInfo.colorType()) {
877 return; 819 case kUnknown_SkColorType:
820 case kIndex_8_SkColorType:
821 return; // can't erase
822 default:
823 break;
878 } 824 }
879 825
880 SkAutoLockPixels alp(*this); 826 SkAutoLockPixels alp(*this);
881 // perform this check after the lock call 827 // perform this check after the lock call
882 if (!this->readyToDraw()) { 828 if (!this->readyToDraw()) {
883 return; 829 return;
884 } 830 }
885 831
886 int height = area.height(); 832 int height = area.height();
887 const int width = area.width(); 833 const int width = area.width();
888 const int rowBytes = fRowBytes; 834 const int rowBytes = fRowBytes;
889 835
890 // make rgb premultiplied 836 // make rgb premultiplied
891 if (255 != a) { 837 if (255 != a) {
892 r = SkAlphaMul(r, a); 838 r = SkAlphaMul(r, a);
893 g = SkAlphaMul(g, a); 839 g = SkAlphaMul(g, a);
894 b = SkAlphaMul(b, a); 840 b = SkAlphaMul(b, a);
895 } 841 }
896 842
897 switch (fConfig) { 843 switch (this->colorType()) {
898 case kA8_Config: { 844 case kAlpha_8_SkColorType: {
899 uint8_t* p = this->getAddr8(area.fLeft, area.fTop); 845 uint8_t* p = this->getAddr8(area.fLeft, area.fTop);
900 while (--height >= 0) { 846 while (--height >= 0) {
901 memset(p, a, width); 847 memset(p, a, width);
902 p += rowBytes; 848 p += rowBytes;
903 } 849 }
904 break; 850 break;
905 } 851 }
906 case kARGB_4444_Config: 852 case kARGB_4444_SkColorType:
907 case kRGB_565_Config: { 853 case kRGB_565_SkColorType: {
908 uint16_t* p = this->getAddr16(area.fLeft, area.fTop);; 854 uint16_t* p = this->getAddr16(area.fLeft, area.fTop);;
909 uint16_t v; 855 uint16_t v;
910 856
911 if (kARGB_4444_Config == fConfig) { 857 if (kARGB_4444_SkColorType == this->colorType()) {
912 v = pack_8888_to_4444(a, r, g, b); 858 v = pack_8888_to_4444(a, r, g, b);
913 } else { 859 } else {
914 v = SkPackRGB16(r >> (8 - SK_R16_BITS), 860 v = SkPackRGB16(r >> (8 - SK_R16_BITS),
915 g >> (8 - SK_G16_BITS), 861 g >> (8 - SK_G16_BITS),
916 b >> (8 - SK_B16_BITS)); 862 b >> (8 - SK_B16_BITS));
917 } 863 }
918 while (--height >= 0) { 864 while (--height >= 0) {
919 sk_memset16(p, v, width); 865 sk_memset16(p, v, width);
920 p = (uint16_t*)((char*)p + rowBytes); 866 p = (uint16_t*)((char*)p + rowBytes);
921 } 867 }
922 break; 868 break;
923 } 869 }
924 case kARGB_8888_Config: { 870 case kPMColor_SkColorType: {
871 // what to do about BGRA or RGBA (which ever is != PMColor ?
872 // for now we don't support them.
925 uint32_t* p = this->getAddr32(area.fLeft, area.fTop); 873 uint32_t* p = this->getAddr32(area.fLeft, area.fTop);
926 uint32_t v = SkPackARGB32(a, r, g, b); 874 uint32_t v = SkPackARGB32(a, r, g, b);
927 875
928 while (--height >= 0) { 876 while (--height >= 0) {
929 sk_memset32(p, v, width); 877 sk_memset32(p, v, width);
930 p = (uint32_t*)((char*)p + rowBytes); 878 p = (uint32_t*)((char*)p + rowBytes);
931 } 879 }
932 break; 880 break;
933 } 881 }
882 default:
883 return; // no change, so don't call notifyPixelsChanged()
934 } 884 }
935 885
936 this->notifyPixelsChanged(); 886 this->notifyPixelsChanged();
937 } 887 }
938 888
939 void SkBitmap::eraseARGB(U8CPU a, U8CPU r, U8CPU g, U8CPU b) const { 889 void SkBitmap::eraseARGB(U8CPU a, U8CPU r, U8CPU g, U8CPU b) const {
940 SkIRect area = { 0, 0, this->width(), this->height() }; 890 SkIRect area = { 0, 0, this->width(), this->height() };
941 if (!area.isEmpty()) { 891 if (!area.isEmpty()) {
942 this->internalErase(area, a, r, g, b); 892 this->internalErase(area, a, r, g, b);
943 } 893 }
(...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after
1039 if (!this->canCopyTo(dstConfig)) { 989 if (!this->canCopyTo(dstConfig)) {
1040 return false; 990 return false;
1041 } 991 }
1042 992
1043 // if we have a texture, first get those pixels 993 // if we have a texture, first get those pixels
1044 SkBitmap tmpSrc; 994 SkBitmap tmpSrc;
1045 const SkBitmap* src = this; 995 const SkBitmap* src = this;
1046 996
1047 if (fPixelRef) { 997 if (fPixelRef) {
1048 SkIRect subset; 998 SkIRect subset;
1049 subset.setXYWH(fPixelRefOrigin.fX, fPixelRefOrigin.fY, fWidth, fHeight); 999 subset.setXYWH(fPixelRefOrigin.fX, fPixelRefOrigin.fY,
1000 fInfo.width(), fInfo.height());
1050 if (fPixelRef->readPixels(&tmpSrc, &subset)) { 1001 if (fPixelRef->readPixels(&tmpSrc, &subset)) {
1051 SkASSERT(tmpSrc.width() == this->width()); 1002 SkASSERT(tmpSrc.width() == this->width());
1052 SkASSERT(tmpSrc.height() == this->height()); 1003 SkASSERT(tmpSrc.height() == this->height());
1053 1004
1054 // did we get lucky and we can just return tmpSrc? 1005 // did we get lucky and we can just return tmpSrc?
1055 if (tmpSrc.config() == dstConfig && NULL == alloc) { 1006 if (tmpSrc.config() == dstConfig && NULL == alloc) {
1056 dst->swap(tmpSrc); 1007 dst->swap(tmpSrc);
1057 // If the result is an exact copy, clone the gen ID. 1008 // If the result is an exact copy, clone the gen ID.
1058 if (dst->pixelRef() && dst->pixelRef()->info() == fPixelRef->inf o()) { 1009 if (dst->pixelRef() && dst->pixelRef()->info() == fPixelRef->inf o()) {
1059 dst->pixelRef()->cloneGenID(*fPixelRef); 1010 dst->pixelRef()->cloneGenID(*fPixelRef);
(...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after
1153 1104
1154 paint.setDither(true); 1105 paint.setDither(true);
1155 canvas.drawBitmap(*src, 0, 0, &paint); 1106 canvas.drawBitmap(*src, 0, 0, &paint);
1156 } 1107 }
1157 1108
1158 dst->swap(tmpDst); 1109 dst->swap(tmpDst);
1159 return true; 1110 return true;
1160 } 1111 }
1161 1112
1162 bool SkBitmap::deepCopyTo(SkBitmap* dst, Config dstConfig) const { 1113 bool SkBitmap::deepCopyTo(SkBitmap* dst, Config dstConfig) const {
1114 const SkColorType dstCT = SkBitmapConfigToColorType(dstConfig);
1115
1163 if (!this->canCopyTo(dstConfig)) { 1116 if (!this->canCopyTo(dstConfig)) {
1164 return false; 1117 return false;
1165 } 1118 }
1166 1119
1167 // If we have a PixelRef, and it supports deep copy, use it. 1120 // If we have a PixelRef, and it supports deep copy, use it.
1168 // Currently supported only by texture-backed bitmaps. 1121 // Currently supported only by texture-backed bitmaps.
1169 if (fPixelRef) { 1122 if (fPixelRef) {
1170 SkPixelRef* pixelRef = fPixelRef->deepCopy(dstConfig); 1123 SkPixelRef* pixelRef = fPixelRef->deepCopy(dstConfig);
1171 if (pixelRef) { 1124 if (pixelRef) {
1172 uint32_t rowBytes; 1125 uint32_t rowBytes;
1173 if (dstConfig == fConfig) { 1126 if (this->colorType() == dstCT) {
1174 // Since there is no subset to pass to deepCopy, and deepCopy 1127 // Since there is no subset to pass to deepCopy, and deepCopy
1175 // succeeded, the new pixel ref must be identical. 1128 // succeeded, the new pixel ref must be identical.
1176 SkASSERT(fPixelRef->info() == pixelRef->info()); 1129 SkASSERT(fPixelRef->info() == pixelRef->info());
1177 pixelRef->cloneGenID(*fPixelRef); 1130 pixelRef->cloneGenID(*fPixelRef);
1178 // Use the same rowBytes as the original. 1131 // Use the same rowBytes as the original.
1179 rowBytes = fRowBytes; 1132 rowBytes = fRowBytes;
1180 } else { 1133 } else {
1181 // With the new config, an appropriate fRowBytes will be compute d by setConfig. 1134 // With the new config, an appropriate fRowBytes will be compute d by setConfig.
1182 rowBytes = 0; 1135 rowBytes = 0;
1183 } 1136 }
1184 dst->setConfig(dstConfig, fWidth, fHeight, rowBytes); 1137
1138 SkImageInfo info = fInfo;
1139 info.fColorType = dstCT;
1140 if (!dst->setConfig(info, rowBytes)) {
1141 return false;
1142 }
1185 dst->setPixelRef(pixelRef, fPixelRefOrigin)->unref(); 1143 dst->setPixelRef(pixelRef, fPixelRefOrigin)->unref();
1186 return true; 1144 return true;
1187 } 1145 }
1188 } 1146 }
1189 1147
1190 if (this->getTexture()) { 1148 if (this->getTexture()) {
1191 return false; 1149 return false;
1192 } else { 1150 } else {
1193 return this->copyTo(dst, dstConfig, NULL); 1151 return this->copyTo(dst, dstConfig, NULL);
1194 } 1152 }
(...skipping 382 matching lines...) Expand 10 before | Expand all | Expand 10 after
1577 } 1535 }
1578 1536
1579 /////////////////////////////////////////////////////////////////////////////// 1537 ///////////////////////////////////////////////////////////////////////////////
1580 1538
1581 enum { 1539 enum {
1582 SERIALIZE_PIXELTYPE_NONE, 1540 SERIALIZE_PIXELTYPE_NONE,
1583 SERIALIZE_PIXELTYPE_REF_DATA 1541 SERIALIZE_PIXELTYPE_REF_DATA
1584 }; 1542 };
1585 1543
1586 void SkBitmap::flatten(SkWriteBuffer& buffer) const { 1544 void SkBitmap::flatten(SkWriteBuffer& buffer) const {
1587 buffer.writeInt(fWidth); 1545 fInfo.flatten(buffer);
1588 buffer.writeInt(fHeight);
1589 buffer.writeInt(fRowBytes); 1546 buffer.writeInt(fRowBytes);
1590 buffer.writeInt(fConfig);
1591 buffer.writeInt(fAlphaType);
1592 1547
1593 if (fPixelRef) { 1548 if (fPixelRef) {
1594 if (fPixelRef->getFactory()) { 1549 if (fPixelRef->getFactory()) {
1595 buffer.writeInt(SERIALIZE_PIXELTYPE_REF_DATA); 1550 buffer.writeInt(SERIALIZE_PIXELTYPE_REF_DATA);
1596 buffer.writeInt(fPixelRefOrigin.fX); 1551 buffer.writeInt(fPixelRefOrigin.fX);
1597 buffer.writeInt(fPixelRefOrigin.fY); 1552 buffer.writeInt(fPixelRefOrigin.fY);
1598 buffer.writeFlattenable(fPixelRef); 1553 buffer.writeFlattenable(fPixelRef);
1599 return; 1554 return;
1600 } 1555 }
1601 // if we get here, we can't record the pixels 1556 // if we get here, we can't record the pixels
1602 buffer.writeInt(SERIALIZE_PIXELTYPE_NONE); 1557 buffer.writeInt(SERIALIZE_PIXELTYPE_NONE);
1603 } else { 1558 } else {
1604 buffer.writeInt(SERIALIZE_PIXELTYPE_NONE); 1559 buffer.writeInt(SERIALIZE_PIXELTYPE_NONE);
1605 } 1560 }
1606 } 1561 }
1607 1562
1608 void SkBitmap::unflatten(SkReadBuffer& buffer) { 1563 void SkBitmap::unflatten(SkReadBuffer& buffer) {
1609 this->reset(); 1564 this->reset();
1610 1565
1611 int width = buffer.readInt(); 1566 SkImageInfo info;
1612 int height = buffer.readInt(); 1567 info.unflatten(buffer);
1613 int rowBytes = buffer.readInt(); 1568 size_t rowBytes = buffer.readInt();
1614 Config config = (Config)buffer.readInt(); 1569 buffer.validate((info.width() >= 0) && (info.height() >= 0) &&
1615 SkAlphaType alphaType = (SkAlphaType)buffer.readInt(); 1570 SkColorTypeIsValid(info.fColorType) &&
1616 buffer.validate((width >= 0) && (height >= 0) && (rowBytes >= 0) && 1571 SkAlphaTypeIsValid(info.fAlphaType) &&
1617 SkIsValidConfig(config) && validate_alphaType(config, alphaT ype)); 1572 validate_alphaType(info.fColorType, info.fAlphaType) &&
1573 info.validRowBytes(rowBytes));
1618 1574
1619 bool configIsValid = this->setConfig(config, width, height, rowBytes, alphaT ype); 1575 bool configIsValid = this->setConfig(info, rowBytes);
1620 // Note : Using (fRowBytes >= (fWidth * fBytesPerPixel)) in the following te st can create false 1576 buffer.validate(configIsValid);
1621 // positives if the multiplication causes an integer overflow. Use th e division instead.
1622 buffer.validate(configIsValid && (fBytesPerPixel > 0) &&
1623 ((fRowBytes / fBytesPerPixel) >= fWidth));
1624 1577
1625 int reftype = buffer.readInt(); 1578 int reftype = buffer.readInt();
1626 if (buffer.validate((SERIALIZE_PIXELTYPE_REF_DATA == reftype) || 1579 if (buffer.validate((SERIALIZE_PIXELTYPE_REF_DATA == reftype) ||
1627 (SERIALIZE_PIXELTYPE_NONE == reftype))) { 1580 (SERIALIZE_PIXELTYPE_NONE == reftype))) {
1628 switch (reftype) { 1581 switch (reftype) {
1629 case SERIALIZE_PIXELTYPE_REF_DATA: { 1582 case SERIALIZE_PIXELTYPE_REF_DATA: {
1630 SkIPoint origin; 1583 SkIPoint origin;
1631 origin.fX = buffer.readInt(); 1584 origin.fX = buffer.readInt();
1632 origin.fY = buffer.readInt(); 1585 origin.fY = buffer.readInt();
1633 size_t offset = origin.fY * rowBytes + origin.fX * fBytesPerPixe l; 1586 size_t offset = origin.fY * rowBytes + origin.fX * info.bytesPer Pixel();
1634 SkPixelRef* pr = buffer.readPixelRef(); 1587 SkPixelRef* pr = buffer.readPixelRef();
1635 if (!buffer.validate((NULL == pr) || 1588 if (!buffer.validate((NULL == pr) ||
1636 (pr->getAllocatedSizeInBytes() >= (offset + this->getSafe Size())))) { 1589 (pr->getAllocatedSizeInBytes() >= (offset + this->getSafe Size())))) {
1637 origin.setZero(); 1590 origin.setZero();
1638 } 1591 }
1639 SkSafeUnref(this->setPixelRef(pr, origin)); 1592 SkSafeUnref(this->setPixelRef(pr, origin));
1640 break; 1593 break;
1641 } 1594 }
1642 case SERIALIZE_PIXELTYPE_NONE: 1595 case SERIALIZE_PIXELTYPE_NONE:
1643 break; 1596 break;
(...skipping 12 matching lines...) Expand all
1656 } 1609 }
1657 1610
1658 SkBitmap::RLEPixels::~RLEPixels() { 1611 SkBitmap::RLEPixels::~RLEPixels() {
1659 sk_free(fYPtrs); 1612 sk_free(fYPtrs);
1660 } 1613 }
1661 1614
1662 /////////////////////////////////////////////////////////////////////////////// 1615 ///////////////////////////////////////////////////////////////////////////////
1663 1616
1664 #ifdef SK_DEBUG 1617 #ifdef SK_DEBUG
1665 void SkBitmap::validate() const { 1618 void SkBitmap::validate() const {
1666 SkASSERT(fConfig < kConfigCount); 1619 fInfo.validate();
1667 SkASSERT(fRowBytes >= (unsigned)ComputeRowBytes((Config)fConfig, fWidth)); 1620 SkASSERT(fInfo.validRowBytes(fRowBytes));
1668 uint8_t allFlags = kImageIsOpaque_Flag | kImageIsVolatile_Flag | kImageIsImm utable_Flag; 1621 uint8_t allFlags = kImageIsOpaque_Flag | kImageIsVolatile_Flag | kImageIsImm utable_Flag;
1669 #ifdef SK_BUILD_FOR_ANDROID 1622 #ifdef SK_BUILD_FOR_ANDROID
1670 allFlags |= kHasHardwareMipMap_Flag; 1623 allFlags |= kHasHardwareMipMap_Flag;
1671 #endif 1624 #endif
1672 SkASSERT(fFlags <= allFlags); 1625 SkASSERT(fFlags <= allFlags);
1673 SkASSERT(fPixelLockCount >= 0); 1626 SkASSERT(fPixelLockCount >= 0);
1674 SkASSERT((uint8_t)ComputeBytesPerPixel((Config)fConfig) == fBytesPerPixel);
1675 1627
1676 if (fPixels) { 1628 if (fPixels) {
1677 SkASSERT(fPixelRef); 1629 SkASSERT(fPixelRef);
1678 SkASSERT(fPixelLockCount > 0); 1630 SkASSERT(fPixelLockCount > 0);
1679 SkASSERT(fPixelRef->isLocked()); 1631 SkASSERT(fPixelRef->isLocked());
1680 SkASSERT(fPixelRef->rowBytes() == fRowBytes); 1632 SkASSERT(fPixelRef->rowBytes() == fRowBytes);
1681 SkASSERT(fPixelRefOrigin.fX >= 0); 1633 SkASSERT(fPixelRefOrigin.fX >= 0);
1682 SkASSERT(fPixelRefOrigin.fY >= 0); 1634 SkASSERT(fPixelRefOrigin.fY >= 0);
1683 SkASSERT(fPixelRef->info().fWidth >= (int)fWidth + fPixelRefOrigin.fX); 1635 SkASSERT(fPixelRef->info().width() >= (int)this->width() + fPixelRefOrig in.fX);
1684 SkASSERT(fPixelRef->info().fHeight >= (int)fHeight + fPixelRefOrigin.fY) ; 1636 SkASSERT(fPixelRef->info().fHeight >= (int)this->height() + fPixelRefOri gin.fY);
1685 SkASSERT(fPixelRef->rowBytes() >= fWidth * fBytesPerPixel); 1637 SkASSERT(fPixelRef->rowBytes() >= fInfo.minRowBytes());
1686 } else { 1638 } else {
1687 SkASSERT(NULL == fColorTable); 1639 SkASSERT(NULL == fColorTable);
1688 } 1640 }
1689 } 1641 }
1690 #endif 1642 #endif
1691 1643
1692 #ifdef SK_DEVELOPER 1644 #ifdef SK_DEVELOPER
1693 void SkBitmap::toString(SkString* str) const { 1645 void SkBitmap::toString(SkString* str) const {
1694 1646
1695 static const char* gConfigNames[kConfigCount] = { 1647 static const char* gConfigNames[kConfigCount] = {
(...skipping 25 matching lines...) Expand all
1721 if (NULL != uri) { 1673 if (NULL != uri) {
1722 str->appendf(" uri:\"%s\"", uri); 1674 str->appendf(" uri:\"%s\"", uri);
1723 } else { 1675 } else {
1724 str->appendf(" pixelref:%p", pr); 1676 str->appendf(" pixelref:%p", pr);
1725 } 1677 }
1726 } 1678 }
1727 1679
1728 str->append(")"); 1680 str->append(")");
1729 } 1681 }
1730 #endif 1682 #endif
1683
1684 ///////////////////////////////////////////////////////////////////////////////
1685
1686 #ifdef SK_DEBUG
1687 void SkImageInfo::validate() const {
1688 SkASSERT(fWidth >= 0);
1689 SkASSERT(fHeight >= 0);
1690 SkASSERT(SkColorTypeIsValid(fColorType));
1691 SkASSERT(SkAlphaTypeIsValid(fAlphaType));
1692 }
1693 #endif
OLDNEW
« no previous file with comments | « include/core/SkPathRef.h ('k') | src/image/SkImagePriv.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698