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

Unified Diff: src/core/SkColorTable.cpp

Issue 26709002: Revert "change SkColorTable to be immutable" (Closed) Base URL: https://skia.googlecode.com/svn/trunk
Patch Set: Created 7 years, 2 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « src/core/SkBitmapProcState_procs.h ('k') | src/core/SkProcSpriteBlitter.cpp » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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);
}
« no previous file with comments | « src/core/SkBitmapProcState_procs.h ('k') | src/core/SkProcSpriteBlitter.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698