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

Unified Diff: src/core/SkColorTable.cpp

Issue 769323002: Make SkColorTable explicitly thread-safe. (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: Created 6 years 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
« include/core/SkColorTable.h ('K') | « src/core/SkBitmap.cpp ('k') | no next file » | 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 cb9f00cd0edb2ed40c20e975bca7da90bbe527ac..84469c2b06fdc0944f579b60395e80b250d95876 100644
--- a/src/core/SkColorTable.cpp
+++ b/src/core/SkColorTable.cpp
@@ -16,19 +16,12 @@
void SkColorTable::init(const SkPMColor colors[], int count) {
SkASSERT((unsigned)count <= 256);
- f16BitCache = NULL;
fCount = count;
fColors = reinterpret_cast<SkPMColor*>(sk_malloc_throw(count * sizeof(SkPMColor)));
memcpy(fColors, colors, count * sizeof(SkPMColor));
}
-// 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() {
- this->init(src.fColors, src.fCount);
-}
-
SkColorTable::SkColorTable(const SkPMColor colors[], int count) {
SkASSERT(0 == count || colors);
if (count < 0) {
@@ -41,30 +34,34 @@ SkColorTable::SkColorTable(const SkPMColor colors[], int count) {
SkColorTable::~SkColorTable() {
sk_free(fColors);
- sk_free(f16BitCache);
+ // f16BitCache frees itself
}
#include "SkColorPriv.h"
-static inline void build_16bitcache(uint16_t dst[], const SkPMColor src[],
- int count) {
- while (--count >= 0) {
- *dst++ = SkPixel32ToPixel16_ToU16(*src++);
+namespace {
+struct Build16BitCache {
+ const SkPMColor* fColors;
+ int fCount;
+
+ uint16_t* operator()() const {
+ uint16_t* cache = (uint16_t*)sk_malloc_throw(fCount * sizeof(uint16_t));
+ for (int i = 0; i < fCount; i++) {
+ cache[i] = SkPixel32ToPixel16_ToU16(fColors[i]);
+ }
+ return cache;
}
-}
+};
+}//namespace
-const uint16_t* SkColorTable::read16BitCache() {
- if (NULL == f16BitCache) {
- f16BitCache = (uint16_t*)sk_malloc_throw(fCount * sizeof(uint16_t));
- build_16bitcache(f16BitCache, fColors, fCount);
- }
- return f16BitCache;
+const uint16_t* SkColorTable::read16BitCache() const {
+ const Build16BitCache create = { fColors, fCount };
+ return f16BitCache.get(create);
}
///////////////////////////////////////////////////////////////////////////////
SkColorTable::SkColorTable(SkReadBuffer& buffer) {
- f16BitCache = NULL;
if (buffer.isVersionLT(SkReadBuffer::kRemoveColorTableAlpha_Version)) {
/*fAlphaType = */buffer.readUInt();
}
« include/core/SkColorTable.h ('K') | « src/core/SkBitmap.cpp ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698