OLD | NEW |
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" |
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
94 this->freePixels(); | 94 this->freePixels(); |
95 memcpy(this, &src, sizeof(src)); | 95 memcpy(this, &src, sizeof(src)); |
96 | 96 |
97 // inc src reference counts | 97 // inc src reference counts |
98 SkSafeRef(src.fPixelRef); | 98 SkSafeRef(src.fPixelRef); |
99 SkSafeRef(src.fMipMap); | 99 SkSafeRef(src.fMipMap); |
100 | 100 |
101 // we reset our locks if we get blown away | 101 // we reset our locks if we get blown away |
102 fPixelLockCount = 0; | 102 fPixelLockCount = 0; |
103 | 103 |
104 /* The src could be in 3 states | 104 if (fPixelRef) { |
105 1. no pixelref, in which case we just copy/ref the pixels/ctable | |
106 2. unlocked pixelref, pixels/ctable should be null | |
107 3. locked pixelref, we should lock the ref again ourselves | |
108 */ | |
109 if (NULL == fPixelRef) { | |
110 // leave fPixels as it is | |
111 SkSafeRef(fColorTable); // ref the user's ctable if present | |
112 } else { // we have a pixelref, so pixels/ctable reflect it | |
113 // ignore the values from the memcpy | 105 // ignore the values from the memcpy |
114 fPixels = NULL; | 106 fPixels = NULL; |
115 fColorTable = NULL; | 107 fColorTable = NULL; |
116 // Note that what to for genID is somewhat arbitrary. We have no | 108 // Note that what to for genID is somewhat arbitrary. We have no |
117 // way to track changes to raw pixels across multiple SkBitmaps. | 109 // way to track changes to raw pixels across multiple SkBitmaps. |
118 // Would benefit from an SkRawPixelRef type created by | 110 // Would benefit from an SkRawPixelRef type created by |
119 // setPixels. | 111 // setPixels. |
120 // Just leave the memcpy'ed one but they'll get out of sync | 112 // Just leave the memcpy'ed one but they'll get out of sync |
121 // as soon either is modified. | 113 // as soon either is modified. |
122 } | 114 } |
(...skipping 215 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
338 if (fPixelLockCount > 0) { | 330 if (fPixelLockCount > 0) { |
339 SkASSERT(fPixelRef->isLocked()); | 331 SkASSERT(fPixelRef->isLocked()); |
340 | 332 |
341 void* p = fPixelRef->pixels(); | 333 void* p = fPixelRef->pixels(); |
342 if (NULL != p) { | 334 if (NULL != p) { |
343 p = (char*)p | 335 p = (char*)p |
344 + fPixelRefOrigin.fY * fRowBytes | 336 + fPixelRefOrigin.fY * fRowBytes |
345 + fPixelRefOrigin.fX * fBytesPerPixel; | 337 + fPixelRefOrigin.fX * fBytesPerPixel; |
346 } | 338 } |
347 fPixels = p; | 339 fPixels = p; |
348 SkRefCnt_SafeAssign(fColorTable, fPixelRef->colorTable()); | 340 fColorTable = fPixelRef->colorTable(); |
349 } else { | 341 } else { |
350 SkASSERT(0 == fPixelLockCount); | 342 SkASSERT(0 == fPixelLockCount); |
351 fPixels = NULL; | 343 fPixels = NULL; |
352 if (fColorTable) { | 344 fColorTable = NULL; |
353 fColorTable->unref(); | |
354 fColorTable = NULL; | |
355 } | |
356 } | 345 } |
357 } | 346 } |
358 } | 347 } |
359 | 348 |
360 static bool config_to_colorType(SkBitmap::Config config, SkColorType* ctOut) { | 349 static bool config_to_colorType(SkBitmap::Config config, SkColorType* ctOut) { |
361 SkColorType ct; | 350 SkColorType ct; |
362 switch (config) { | 351 switch (config) { |
363 case SkBitmap::kA8_Config: | 352 case SkBitmap::kA8_Config: |
364 ct = kAlpha_8_SkColorType; | 353 ct = kAlpha_8_SkColorType; |
365 break; | 354 break; |
(...skipping 137 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
503 if (NULL == allocator) { | 492 if (NULL == allocator) { |
504 allocator = &stdalloc; | 493 allocator = &stdalloc; |
505 } | 494 } |
506 return allocator->allocPixelRef(this, ctable); | 495 return allocator->allocPixelRef(this, ctable); |
507 } | 496 } |
508 | 497 |
509 void SkBitmap::freePixels() { | 498 void SkBitmap::freePixels() { |
510 // if we're gonna free the pixels, we certainly need to free the mipmap | 499 // if we're gonna free the pixels, we certainly need to free the mipmap |
511 this->freeMipMap(); | 500 this->freeMipMap(); |
512 | 501 |
513 if (fColorTable) { | |
514 fColorTable->unref(); | |
515 fColorTable = NULL; | |
516 } | |
517 | |
518 if (NULL != fPixelRef) { | 502 if (NULL != fPixelRef) { |
519 if (fPixelLockCount > 0) { | 503 if (fPixelLockCount > 0) { |
520 fPixelRef->unlockPixels(); | 504 fPixelRef->unlockPixels(); |
521 } | 505 } |
522 fPixelRef->unref(); | 506 fPixelRef->unref(); |
523 fPixelRef = NULL; | 507 fPixelRef = NULL; |
524 fPixelRefOrigin.setZero(); | 508 fPixelRefOrigin.setZero(); |
525 } | 509 } |
526 fPixelLockCount = 0; | 510 fPixelLockCount = 0; |
527 fPixels = NULL; | 511 fPixels = NULL; |
| 512 fColorTable = NULL; |
528 } | 513 } |
529 | 514 |
530 void SkBitmap::freeMipMap() { | 515 void SkBitmap::freeMipMap() { |
531 if (fMipMap) { | 516 if (fMipMap) { |
532 fMipMap->unref(); | 517 fMipMap->unref(); |
533 fMipMap = NULL; | 518 fMipMap = NULL; |
534 } | 519 } |
535 } | 520 } |
536 | 521 |
537 uint32_t SkBitmap::getGenerationID() const { | 522 uint32_t SkBitmap::getGenerationID() const { |
(...skipping 1065 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1603 #ifdef SK_DEBUG | 1588 #ifdef SK_DEBUG |
1604 void SkBitmap::validate() const { | 1589 void SkBitmap::validate() const { |
1605 SkASSERT(fConfig < kConfigCount); | 1590 SkASSERT(fConfig < kConfigCount); |
1606 SkASSERT(fRowBytes >= (unsigned)ComputeRowBytes((Config)fConfig, fWidth)); | 1591 SkASSERT(fRowBytes >= (unsigned)ComputeRowBytes((Config)fConfig, fWidth)); |
1607 uint8_t allFlags = kImageIsOpaque_Flag | kImageIsVolatile_Flag | kImageIsImm
utable_Flag; | 1592 uint8_t allFlags = kImageIsOpaque_Flag | kImageIsVolatile_Flag | kImageIsImm
utable_Flag; |
1608 #ifdef SK_BUILD_FOR_ANDROID | 1593 #ifdef SK_BUILD_FOR_ANDROID |
1609 allFlags |= kHasHardwareMipMap_Flag; | 1594 allFlags |= kHasHardwareMipMap_Flag; |
1610 #endif | 1595 #endif |
1611 SkASSERT(fFlags <= allFlags); | 1596 SkASSERT(fFlags <= allFlags); |
1612 SkASSERT(fPixelLockCount >= 0); | 1597 SkASSERT(fPixelLockCount >= 0); |
1613 SkASSERT(NULL == fColorTable || (unsigned)fColorTable->getRefCnt() < 10000); | |
1614 SkASSERT((uint8_t)ComputeBytesPerPixel((Config)fConfig) == fBytesPerPixel); | 1598 SkASSERT((uint8_t)ComputeBytesPerPixel((Config)fConfig) == fBytesPerPixel); |
1615 | 1599 |
1616 if (fPixels) { | 1600 if (fPixels) { |
1617 SkASSERT(fPixelRef); | 1601 SkASSERT(fPixelRef); |
1618 SkASSERT(fPixelLockCount > 0); | 1602 SkASSERT(fPixelLockCount > 0); |
1619 SkASSERT(fPixelRef->isLocked()); | 1603 SkASSERT(fPixelRef->isLocked()); |
1620 SkASSERT(fPixelRef->rowBytes() == fRowBytes); | 1604 SkASSERT(fPixelRef->rowBytes() == fRowBytes); |
1621 SkASSERT(fPixelRefOrigin.fX >= 0); | 1605 SkASSERT(fPixelRefOrigin.fX >= 0); |
1622 SkASSERT(fPixelRefOrigin.fY >= 0); | 1606 SkASSERT(fPixelRefOrigin.fY >= 0); |
1623 SkASSERT(fPixelRef->info().fWidth >= (int)fWidth + fPixelRefOrigin.fX); | 1607 SkASSERT(fPixelRef->info().fWidth >= (int)fWidth + fPixelRefOrigin.fX); |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1661 if (NULL != uri) { | 1645 if (NULL != uri) { |
1662 str->appendf(" uri:\"%s\"", uri); | 1646 str->appendf(" uri:\"%s\"", uri); |
1663 } else { | 1647 } else { |
1664 str->appendf(" pixelref:%p", pr); | 1648 str->appendf(" pixelref:%p", pr); |
1665 } | 1649 } |
1666 } | 1650 } |
1667 | 1651 |
1668 str->append(")"); | 1652 str->append(")"); |
1669 } | 1653 } |
1670 #endif | 1654 #endif |
OLD | NEW |