SkColorTable.cpp revision 025128811219dc45fd99b6c4d1d14f833cf7a26e
1 2/* 3 * Copyright 2009 The Android Open Source Project 4 * 5 * Use of this source code is governed by a BSD-style license that can be 6 * found in the LICENSE file. 7 */ 8 9 10#include "SkColorTable.h" 11#include "SkFlattenableBuffers.h" 12#include "SkStream.h" 13#include "SkTemplates.h" 14 15SK_DEFINE_INST_COUNT(SkColorTable) 16 17// As copy constructor is hidden in the class hierarchy, we need to call 18// default constructor explicitly to suppress a compiler warning. 19SkColorTable::SkColorTable(const SkColorTable& src) : INHERITED() { 20 f16BitCache = NULL; 21 fAlphaType = src.fAlphaType; 22 int count = src.count(); 23 fCount = SkToU16(count); 24 fColors = reinterpret_cast<SkPMColor*>( 25 sk_malloc_throw(count * sizeof(SkPMColor))); 26 memcpy(fColors, src.fColors, count * sizeof(SkPMColor)); 27 28 SkDEBUGCODE(fColorLockCount = 0;) 29 SkDEBUGCODE(f16BitCacheLockCount = 0;) 30} 31 32SkColorTable::SkColorTable(const SkPMColor colors[], int count, SkAlphaType at) 33 : f16BitCache(NULL), fAlphaType(SkToU8(at)) 34{ 35 SkASSERT(0 == count || NULL != colors); 36 37 if (count < 0) { 38 count = 0; 39 } else if (count > 256) { 40 count = 256; 41 } 42 43 fCount = SkToU16(count); 44 fColors = reinterpret_cast<SkPMColor*>( 45 sk_malloc_throw(count * sizeof(SkPMColor))); 46 47 memcpy(fColors, colors, count * sizeof(SkPMColor)); 48 49 SkDEBUGCODE(fColorLockCount = 0;) 50 SkDEBUGCODE(f16BitCacheLockCount = 0;) 51} 52 53SkColorTable::~SkColorTable() 54{ 55 SkASSERT(fColorLockCount == 0); 56 SkASSERT(f16BitCacheLockCount == 0); 57 58 sk_free(fColors); 59 sk_free(f16BitCache); 60} 61 62void SkColorTable::unlockColors() { 63 SkASSERT(fColorLockCount != 0); 64 SkDEBUGCODE(sk_atomic_dec(&fColorLockCount);) 65} 66 67#include "SkColorPriv.h" 68 69static inline void build_16bitcache(uint16_t dst[], const SkPMColor src[], 70 int count) { 71 while (--count >= 0) { 72 *dst++ = SkPixel32ToPixel16_ToU16(*src++); 73 } 74} 75 76const uint16_t* SkColorTable::lock16BitCache() { 77 if (this->isOpaque() && NULL == f16BitCache) { 78 f16BitCache = (uint16_t*)sk_malloc_throw(fCount * sizeof(uint16_t)); 79 build_16bitcache(f16BitCache, fColors, fCount); 80 } 81 82 SkDEBUGCODE(f16BitCacheLockCount += 1); 83 return f16BitCache; 84} 85 86/////////////////////////////////////////////////////////////////////////////// 87 88SkColorTable::SkColorTable(SkFlattenableReadBuffer& buffer) { 89 f16BitCache = NULL; 90 SkDEBUGCODE(fColorLockCount = 0;) 91 SkDEBUGCODE(f16BitCacheLockCount = 0;) 92 93 fAlphaType = SkToU8(buffer.readUInt()); 94 fCount = buffer.getArrayCount(); 95 fColors = (SkPMColor*)sk_malloc_throw(fCount * sizeof(SkPMColor)); 96 SkDEBUGCODE(bool success =) buffer.readColorArray(fColors, fCount); 97#ifdef SK_DEBUG 98 SkASSERT((unsigned)fCount <= 256); 99 SkASSERT(success); 100#endif 101} 102 103void SkColorTable::writeToBuffer(SkFlattenableWriteBuffer& buffer) const { 104 buffer.writeUInt(fAlphaType); 105 buffer.writeColorArray(fColors, fCount); 106} 107