blob: c117443954f5d532cef4bf40372d7e37aaae8d08 [file] [log] [blame]
epoger@google.comec3ed6a2011-07-28 14:26:00 +00001
reed@android.coma6260ff2009-05-04 18:52:54 +00002/*
epoger@google.comec3ed6a2011-07-28 14:26:00 +00003 * Copyright 2009 The Android Open Source Project
reed@android.coma6260ff2009-05-04 18:52:54 +00004 *
epoger@google.comec3ed6a2011-07-28 14:26:00 +00005 * Use of this source code is governed by a BSD-style license that can be
6 * found in the LICENSE file.
reed@android.coma6260ff2009-05-04 18:52:54 +00007 */
reed@android.com8a1c16f2008-12-17 15:59:43 +00008
epoger@google.comec3ed6a2011-07-28 14:26:00 +00009
djsollen@google.com64a0ec32012-06-12 15:17:27 +000010#include "SkColorTable.h"
djsollen@google.comc73dd5c2012-08-07 15:54:32 +000011#include "SkFlattenableBuffers.h"
reed@android.com8a1c16f2008-12-17 15:59:43 +000012#include "SkStream.h"
13#include "SkTemplates.h"
14
robertphillips@google.com0456e0b2012-06-27 14:03:26 +000015SK_DEFINE_INST_COUNT(SkColorTable)
16
reed@google.com2999f782012-06-19 15:27:46 +000017// 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() {
weita@google.comf9ab99a2009-05-03 18:23:30 +000020 f16BitCache = NULL;
reed@google.com0a6151d2013-10-10 14:44:56 +000021 fAlphaType = src.fAlphaType;
weita@google.comf9ab99a2009-05-03 18:23:30 +000022 int count = src.count();
23 fCount = SkToU16(count);
reed@android.coma6260ff2009-05-04 18:52:54 +000024 fColors = reinterpret_cast<SkPMColor*>(
25 sk_malloc_throw(count * sizeof(SkPMColor)));
weita@google.comf9ab99a2009-05-03 18:23:30 +000026 memcpy(fColors, src.fColors, count * sizeof(SkPMColor));
27
reed@android.com8a1c16f2008-12-17 15:59:43 +000028 SkDEBUGCODE(fColorLockCount = 0;)
29 SkDEBUGCODE(f16BitCacheLockCount = 0;)
30}
31
reed@google.com0a6151d2013-10-10 14:44:56 +000032SkColorTable::SkColorTable(const SkPMColor colors[], int count, SkAlphaType at)
33 : f16BitCache(NULL), fAlphaType(SkToU8(at))
reed@android.com8a1c16f2008-12-17 15:59:43 +000034{
reed@google.com0a6151d2013-10-10 14:44:56 +000035 SkASSERT(0 == count || NULL != colors);
36
37 if (count < 0) {
reed@android.com8a1c16f2008-12-17 15:59:43 +000038 count = 0;
reed@google.com0a6151d2013-10-10 14:44:56 +000039 } else if (count > 256) {
reed@android.com8a1c16f2008-12-17 15:59:43 +000040 count = 256;
reed@google.com0a6151d2013-10-10 14:44:56 +000041 }
weita@google.comf9ab99a2009-05-03 18:23:30 +000042
reed@android.com8a1c16f2008-12-17 15:59:43 +000043 fCount = SkToU16(count);
reed@android.coma6260ff2009-05-04 18:52:54 +000044 fColors = reinterpret_cast<SkPMColor*>(
45 sk_malloc_throw(count * sizeof(SkPMColor)));
weita@google.comf9ab99a2009-05-03 18:23:30 +000046
reed@google.com0a6151d2013-10-10 14:44:56 +000047 memcpy(fColors, colors, count * sizeof(SkPMColor));
weita@google.comf9ab99a2009-05-03 18:23:30 +000048
reed@android.com8a1c16f2008-12-17 15:59:43 +000049 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
reed@google.com0a6151d2013-10-10 14:44:56 +000062void SkColorTable::unlockColors() {
reed@android.com8a1c16f2008-12-17 15:59:43 +000063 SkASSERT(fColorLockCount != 0);
djsollen@google.comc9ab9872012-08-29 18:52:07 +000064 SkDEBUGCODE(sk_atomic_dec(&fColorLockCount);)
reed@android.com8a1c16f2008-12-17 15:59:43 +000065}
66
67#include "SkColorPriv.h"
68
reed@google.com0a6151d2013-10-10 14:44:56 +000069static inline void build_16bitcache(uint16_t dst[], const SkPMColor src[],
70 int count) {
71 while (--count >= 0) {
reed@android.com8a1c16f2008-12-17 15:59:43 +000072 *dst++ = SkPixel32ToPixel16_ToU16(*src++);
reed@google.com0a6151d2013-10-10 14:44:56 +000073 }
reed@android.com8a1c16f2008-12-17 15:59:43 +000074}
75
reed@google.com0a6151d2013-10-10 14:44:56 +000076const 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);
reed@android.com8a1c16f2008-12-17 15:59:43 +000080 }
81
82 SkDEBUGCODE(f16BitCacheLockCount += 1);
83 return f16BitCache;
84}
85
reed@android.com8a1c16f2008-12-17 15:59:43 +000086///////////////////////////////////////////////////////////////////////////////
87
88SkColorTable::SkColorTable(SkFlattenableReadBuffer& buffer) {
89 f16BitCache = NULL;
90 SkDEBUGCODE(fColorLockCount = 0;)
91 SkDEBUGCODE(f16BitCacheLockCount = 0;)
92
reed@google.com0a6151d2013-10-10 14:44:56 +000093 fAlphaType = SkToU8(buffer.readUInt());
djsollen@google.comc73dd5c2012-08-07 15:54:32 +000094 fCount = buffer.getArrayCount();
reed@android.com8a1c16f2008-12-17 15:59:43 +000095 fColors = (SkPMColor*)sk_malloc_throw(fCount * sizeof(SkPMColor));
bsalomon@google.com57313f62013-01-07 17:35:10 +000096 SkDEBUGCODE(const uint32_t countRead =) buffer.readColorArray(fColors);
97#ifdef SK_DEBUG
djsollen@google.comc73dd5c2012-08-07 15:54:32 +000098 SkASSERT((unsigned)fCount <= 256);
99 SkASSERT(countRead == fCount);
bsalomon@google.com57313f62013-01-07 17:35:10 +0000100#endif
reed@android.com8a1c16f2008-12-17 15:59:43 +0000101}
102
103void SkColorTable::flatten(SkFlattenableWriteBuffer& buffer) const {
reed@google.com0a6151d2013-10-10 14:44:56 +0000104 buffer.writeUInt(fAlphaType);
djsollen@google.comc73dd5c2012-08-07 15:54:32 +0000105 buffer.writeColorArray(fColors, fCount);
reed@android.com8a1c16f2008-12-17 15:59:43 +0000106}