blob: 0d033ec2be9e87cbcc08e7de6209c7889d583b1e [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"
commit-bot@chromium.org8b0e8ac2014-01-30 18:58:24 +000011#include "SkReadBuffer.h"
12#include "SkWriteBuffer.h"
reed@android.com8a1c16f2008-12-17 15:59:43 +000013#include "SkStream.h"
14#include "SkTemplates.h"
15
reedc5e15a12014-09-29 12:10:27 -070016void SkColorTable::init(const SkPMColor colors[], int count) {
17 SkASSERT((unsigned)count <= 256);
weita@google.comf9ab99a2009-05-03 18:23:30 +000018
reedc5e15a12014-09-29 12:10:27 -070019 f16BitCache = NULL;
20 fCount = count;
21 fColors = reinterpret_cast<SkPMColor*>(sk_malloc_throw(count * sizeof(SkPMColor)));
22
23 memcpy(fColors, colors, count * sizeof(SkPMColor));
24
reed@android.com8a1c16f2008-12-17 15:59:43 +000025 SkDEBUGCODE(fColorLockCount = 0;)
26 SkDEBUGCODE(f16BitCacheLockCount = 0;)
27}
28
reedc5e15a12014-09-29 12:10:27 -070029// As copy constructor is hidden in the class hierarchy, we need to call
30// default constructor explicitly to suppress a compiler warning.
31SkColorTable::SkColorTable(const SkColorTable& src) : INHERITED() {
32 this->init(src.fColors, src.fCount);
33}
reed@google.com0a6151d2013-10-10 14:44:56 +000034
reedc5e15a12014-09-29 12:10:27 -070035SkColorTable::SkColorTable(const SkPMColor colors[], int count) {
36 SkASSERT(0 == count || colors);
reed@google.com0a6151d2013-10-10 14:44:56 +000037 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 }
reedc5e15a12014-09-29 12:10:27 -070042 this->init(colors, count);
reed@android.com8a1c16f2008-12-17 15:59:43 +000043}
44
reedc5e15a12014-09-29 12:10:27 -070045SkColorTable::~SkColorTable() {
reed@android.com8a1c16f2008-12-17 15:59:43 +000046 SkASSERT(fColorLockCount == 0);
47 SkASSERT(f16BitCacheLockCount == 0);
48
49 sk_free(fColors);
50 sk_free(f16BitCache);
51}
52
reed@google.com0a6151d2013-10-10 14:44:56 +000053void SkColorTable::unlockColors() {
reed@android.com8a1c16f2008-12-17 15:59:43 +000054 SkASSERT(fColorLockCount != 0);
djsollen@google.comc9ab9872012-08-29 18:52:07 +000055 SkDEBUGCODE(sk_atomic_dec(&fColorLockCount);)
reed@android.com8a1c16f2008-12-17 15:59:43 +000056}
57
58#include "SkColorPriv.h"
59
reed@google.com0a6151d2013-10-10 14:44:56 +000060static inline void build_16bitcache(uint16_t dst[], const SkPMColor src[],
61 int count) {
62 while (--count >= 0) {
reed@android.com8a1c16f2008-12-17 15:59:43 +000063 *dst++ = SkPixel32ToPixel16_ToU16(*src++);
reed@google.com0a6151d2013-10-10 14:44:56 +000064 }
reed@android.com8a1c16f2008-12-17 15:59:43 +000065}
66
reed@google.com0a6151d2013-10-10 14:44:56 +000067const uint16_t* SkColorTable::lock16BitCache() {
djsollen47c548a2014-09-29 08:57:49 -070068 if (NULL == f16BitCache) {
reed@google.com0a6151d2013-10-10 14:44:56 +000069 f16BitCache = (uint16_t*)sk_malloc_throw(fCount * sizeof(uint16_t));
70 build_16bitcache(f16BitCache, fColors, fCount);
reed@android.com8a1c16f2008-12-17 15:59:43 +000071 }
72
robertphillips5b693772014-11-21 06:19:36 -080073 SkDEBUGCODE(sk_atomic_inc(&f16BitCacheLockCount));
reed@android.com8a1c16f2008-12-17 15:59:43 +000074 return f16BitCache;
75}
76
reed@android.com8a1c16f2008-12-17 15:59:43 +000077///////////////////////////////////////////////////////////////////////////////
78
commit-bot@chromium.org8b0e8ac2014-01-30 18:58:24 +000079SkColorTable::SkColorTable(SkReadBuffer& buffer) {
reed@android.com8a1c16f2008-12-17 15:59:43 +000080 f16BitCache = NULL;
81 SkDEBUGCODE(fColorLockCount = 0;)
82 SkDEBUGCODE(f16BitCacheLockCount = 0;)
83
reedc5e15a12014-09-29 12:10:27 -070084 if (buffer.isVersionLT(SkReadBuffer::kRemoveColorTableAlpha_Version)) {
85 /*fAlphaType = */buffer.readUInt();
86 }
87
djsollen@google.comc73dd5c2012-08-07 15:54:32 +000088 fCount = buffer.getArrayCount();
commit-bot@chromium.orgef74fa12013-12-17 20:49:46 +000089 size_t allocSize = fCount * sizeof(SkPMColor);
90 SkDEBUGCODE(bool success = false;)
91 if (buffer.validateAvailable(allocSize)) {
92 fColors = (SkPMColor*)sk_malloc_throw(allocSize);
93 SkDEBUGCODE(success =) buffer.readColorArray(fColors, fCount);
94 } else {
95 fCount = 0;
96 fColors = NULL;
97 }
bsalomon@google.com57313f62013-01-07 17:35:10 +000098#ifdef SK_DEBUG
djsollen@google.comc73dd5c2012-08-07 15:54:32 +000099 SkASSERT((unsigned)fCount <= 256);
commit-bot@chromium.org02512882013-10-31 18:37:50 +0000100 SkASSERT(success);
bsalomon@google.com57313f62013-01-07 17:35:10 +0000101#endif
reed@android.com8a1c16f2008-12-17 15:59:43 +0000102}
103
commit-bot@chromium.org8b0e8ac2014-01-30 18:58:24 +0000104void SkColorTable::writeToBuffer(SkWriteBuffer& buffer) const {
djsollen@google.comc73dd5c2012-08-07 15:54:32 +0000105 buffer.writeColorArray(fColors, fCount);
reed@android.com8a1c16f2008-12-17 15:59:43 +0000106}