| Index: src/core/SkColorTable.cpp
|
| diff --git a/src/core/SkColorTable.cpp b/src/core/SkColorTable.cpp
|
| index c117443954f5d532cef4bf40372d7e37aaae8d08..e1ebf9202dc33f51e07c9c98024fff8f41a2c960 100644
|
| --- a/src/core/SkColorTable.cpp
|
| +++ b/src/core/SkColorTable.cpp
|
| @@ -14,11 +14,27 @@
|
|
|
| SK_DEFINE_INST_COUNT(SkColorTable)
|
|
|
| +SkColorTable::SkColorTable(int count)
|
| + : f16BitCache(NULL), fFlags(0)
|
| +{
|
| + if (count < 0)
|
| + count = 0;
|
| + else if (count > 256)
|
| + count = 256;
|
| +
|
| + fCount = SkToU16(count);
|
| + fColors = (SkPMColor*)sk_malloc_throw(count * sizeof(SkPMColor));
|
| + memset(fColors, 0, count * sizeof(SkPMColor));
|
| +
|
| + SkDEBUGCODE(fColorLockCount = 0;)
|
| + SkDEBUGCODE(f16BitCacheLockCount = 0;)
|
| +}
|
| +
|
| // As copy constructor is hidden in the class hierarchy, we need to call
|
| // default constructor explicitly to suppress a compiler warning.
|
| SkColorTable::SkColorTable(const SkColorTable& src) : INHERITED() {
|
| f16BitCache = NULL;
|
| - fAlphaType = src.fAlphaType;
|
| + fFlags = src.fFlags;
|
| int count = src.count();
|
| fCount = SkToU16(count);
|
| fColors = reinterpret_cast<SkPMColor*>(
|
| @@ -29,22 +45,20 @@ SkColorTable::SkColorTable(const SkColorTable& src) : INHERITED() {
|
| SkDEBUGCODE(f16BitCacheLockCount = 0;)
|
| }
|
|
|
| -SkColorTable::SkColorTable(const SkPMColor colors[], int count, SkAlphaType at)
|
| - : f16BitCache(NULL), fAlphaType(SkToU8(at))
|
| +SkColorTable::SkColorTable(const SkPMColor colors[], int count)
|
| + : f16BitCache(NULL), fFlags(0)
|
| {
|
| - SkASSERT(0 == count || NULL != colors);
|
| -
|
| - if (count < 0) {
|
| + if (count < 0)
|
| count = 0;
|
| - } else if (count > 256) {
|
| + else if (count > 256)
|
| count = 256;
|
| - }
|
|
|
| fCount = SkToU16(count);
|
| fColors = reinterpret_cast<SkPMColor*>(
|
| sk_malloc_throw(count * sizeof(SkPMColor)));
|
|
|
| - memcpy(fColors, colors, count * sizeof(SkPMColor));
|
| + if (colors)
|
| + memcpy(fColors, colors, count * sizeof(SkPMColor));
|
|
|
| SkDEBUGCODE(fColorLockCount = 0;)
|
| SkDEBUGCODE(f16BitCacheLockCount = 0;)
|
| @@ -59,30 +73,69 @@ SkColorTable::~SkColorTable()
|
| sk_free(f16BitCache);
|
| }
|
|
|
| -void SkColorTable::unlockColors() {
|
| +void SkColorTable::setFlags(unsigned flags)
|
| +{
|
| + fFlags = SkToU8(flags);
|
| +}
|
| +
|
| +void SkColorTable::unlockColors(bool changed)
|
| +{
|
| SkASSERT(fColorLockCount != 0);
|
| SkDEBUGCODE(sk_atomic_dec(&fColorLockCount);)
|
| + if (changed)
|
| + this->inval16BitCache();
|
| +}
|
| +
|
| +void SkColorTable::inval16BitCache()
|
| +{
|
| + SkASSERT(f16BitCacheLockCount == 0);
|
| + if (f16BitCache)
|
| + {
|
| + sk_free(f16BitCache);
|
| + f16BitCache = NULL;
|
| + }
|
| }
|
|
|
| #include "SkColorPriv.h"
|
|
|
| -static inline void build_16bitcache(uint16_t dst[], const SkPMColor src[],
|
| - int count) {
|
| - while (--count >= 0) {
|
| +static inline void build_16bitcache(uint16_t dst[], const SkPMColor src[], int count)
|
| +{
|
| + while (--count >= 0)
|
| *dst++ = SkPixel32ToPixel16_ToU16(*src++);
|
| - }
|
| }
|
|
|
| -const uint16_t* SkColorTable::lock16BitCache() {
|
| - if (this->isOpaque() && NULL == f16BitCache) {
|
| - f16BitCache = (uint16_t*)sk_malloc_throw(fCount * sizeof(uint16_t));
|
| - build_16bitcache(f16BitCache, fColors, fCount);
|
| +const uint16_t* SkColorTable::lock16BitCache()
|
| +{
|
| + if (fFlags & kColorsAreOpaque_Flag)
|
| + {
|
| + if (f16BitCache == NULL) // build the cache
|
| + {
|
| + f16BitCache = (uint16_t*)sk_malloc_throw(fCount * sizeof(uint16_t));
|
| + build_16bitcache(f16BitCache, fColors, fCount);
|
| + }
|
| + }
|
| + else // our colors have alpha, so no cache
|
| + {
|
| + this->inval16BitCache();
|
| + if (f16BitCache)
|
| + {
|
| + sk_free(f16BitCache);
|
| + f16BitCache = NULL;
|
| + }
|
| }
|
|
|
| SkDEBUGCODE(f16BitCacheLockCount += 1);
|
| return f16BitCache;
|
| }
|
|
|
| +void SkColorTable::setIsOpaque(bool isOpaque) {
|
| + if (isOpaque) {
|
| + fFlags |= kColorsAreOpaque_Flag;
|
| + } else {
|
| + fFlags &= ~kColorsAreOpaque_Flag;
|
| + }
|
| +}
|
| +
|
| ///////////////////////////////////////////////////////////////////////////////
|
|
|
| SkColorTable::SkColorTable(SkFlattenableReadBuffer& buffer) {
|
| @@ -90,7 +143,7 @@ SkColorTable::SkColorTable(SkFlattenableReadBuffer& buffer) {
|
| SkDEBUGCODE(fColorLockCount = 0;)
|
| SkDEBUGCODE(f16BitCacheLockCount = 0;)
|
|
|
| - fAlphaType = SkToU8(buffer.readUInt());
|
| + fFlags = buffer.readUInt();
|
| fCount = buffer.getArrayCount();
|
| fColors = (SkPMColor*)sk_malloc_throw(fCount * sizeof(SkPMColor));
|
| SkDEBUGCODE(const uint32_t countRead =) buffer.readColorArray(fColors);
|
| @@ -101,6 +154,6 @@ SkColorTable::SkColorTable(SkFlattenableReadBuffer& buffer) {
|
| }
|
|
|
| void SkColorTable::flatten(SkFlattenableWriteBuffer& buffer) const {
|
| - buffer.writeUInt(fAlphaType);
|
| + buffer.writeUInt(fFlags);
|
| buffer.writeColorArray(fColors, fCount);
|
| }
|
|
|