3 * Copyright 2009 The Android Open Source Project
5 * Use of this source code is governed by a BSD-style license that can be
6 * found in the LICENSE file.
10 #include "SkColorTable.h"
11 #include "SkFlattenableBuffers.h"
13 #include "SkTemplates.h"
15 // As copy constructor is hidden in the class hierarchy, we need to call
16 // default constructor explicitly to suppress a compiler warning.
17 SkColorTable::SkColorTable(const SkColorTable& src) : INHERITED() {
19 fAlphaType = src.fAlphaType;
20 int count = src.count();
21 fCount = SkToU16(count);
22 fColors = reinterpret_cast<SkPMColor*>(
23 sk_malloc_throw(count * sizeof(SkPMColor)));
24 memcpy(fColors, src.fColors, count * sizeof(SkPMColor));
26 SkDEBUGCODE(fColorLockCount = 0;)
27 SkDEBUGCODE(f16BitCacheLockCount = 0;)
30 SkColorTable::SkColorTable(const SkPMColor colors[], int count, SkAlphaType at)
31 : f16BitCache(NULL), fAlphaType(SkToU8(at))
33 SkASSERT(0 == count || NULL != colors);
37 } else if (count > 256) {
41 fCount = SkToU16(count);
42 fColors = reinterpret_cast<SkPMColor*>(
43 sk_malloc_throw(count * sizeof(SkPMColor)));
45 memcpy(fColors, colors, count * sizeof(SkPMColor));
47 SkDEBUGCODE(fColorLockCount = 0;)
48 SkDEBUGCODE(f16BitCacheLockCount = 0;)
51 SkColorTable::~SkColorTable()
53 SkASSERT(fColorLockCount == 0);
54 SkASSERT(f16BitCacheLockCount == 0);
60 void SkColorTable::unlockColors() {
61 SkASSERT(fColorLockCount != 0);
62 SkDEBUGCODE(sk_atomic_dec(&fColorLockCount);)
65 #include "SkColorPriv.h"
67 static inline void build_16bitcache(uint16_t dst[], const SkPMColor src[],
69 while (--count >= 0) {
70 *dst++ = SkPixel32ToPixel16_ToU16(*src++);
74 const uint16_t* SkColorTable::lock16BitCache() {
75 if (this->isOpaque() && NULL == f16BitCache) {
76 f16BitCache = (uint16_t*)sk_malloc_throw(fCount * sizeof(uint16_t));
77 build_16bitcache(f16BitCache, fColors, fCount);
80 SkDEBUGCODE(f16BitCacheLockCount += 1);
84 ///////////////////////////////////////////////////////////////////////////////
86 SkColorTable::SkColorTable(SkFlattenableReadBuffer& buffer) {
88 SkDEBUGCODE(fColorLockCount = 0;)
89 SkDEBUGCODE(f16BitCacheLockCount = 0;)
91 fAlphaType = SkToU8(buffer.readUInt());
92 fCount = buffer.getArrayCount();
93 size_t allocSize = fCount * sizeof(SkPMColor);
94 SkDEBUGCODE(bool success = false;)
95 if (buffer.validateAvailable(allocSize)) {
96 fColors = (SkPMColor*)sk_malloc_throw(allocSize);
97 SkDEBUGCODE(success =) buffer.readColorArray(fColors, fCount);
103 SkASSERT((unsigned)fCount <= 256);
108 void SkColorTable::writeToBuffer(SkFlattenableWriteBuffer& buffer) const {
109 buffer.writeUInt(fAlphaType);
110 buffer.writeColorArray(fColors, fCount);