epoger@google.com | ec3ed6a | 2011-07-28 14:26:00 +0000 | [diff] [blame] | 1 | |
reed@android.com | a6260ff | 2009-05-04 18:52:54 +0000 | [diff] [blame] | 2 | /* |
epoger@google.com | ec3ed6a | 2011-07-28 14:26:00 +0000 | [diff] [blame] | 3 | * Copyright 2009 The Android Open Source Project |
reed@android.com | a6260ff | 2009-05-04 18:52:54 +0000 | [diff] [blame] | 4 | * |
epoger@google.com | ec3ed6a | 2011-07-28 14:26:00 +0000 | [diff] [blame] | 5 | * Use of this source code is governed by a BSD-style license that can be |
| 6 | * found in the LICENSE file. |
reed@android.com | a6260ff | 2009-05-04 18:52:54 +0000 | [diff] [blame] | 7 | */ |
reed@android.com | 8a1c16f | 2008-12-17 15:59:43 +0000 | [diff] [blame] | 8 | |
epoger@google.com | ec3ed6a | 2011-07-28 14:26:00 +0000 | [diff] [blame] | 9 | |
djsollen@google.com | 64a0ec3 | 2012-06-12 15:17:27 +0000 | [diff] [blame] | 10 | #include "SkColorTable.h" |
djsollen@google.com | c73dd5c | 2012-08-07 15:54:32 +0000 | [diff] [blame] | 11 | #include "SkFlattenableBuffers.h" |
reed@android.com | 8a1c16f | 2008-12-17 15:59:43 +0000 | [diff] [blame] | 12 | #include "SkStream.h" |
| 13 | #include "SkTemplates.h" |
| 14 | |
reed@google.com | 2999f78 | 2012-06-19 15:27:46 +0000 | [diff] [blame] | 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() { |
weita@google.com | f9ab99a | 2009-05-03 18:23:30 +0000 | [diff] [blame] | 18 | f16BitCache = NULL; |
reed@google.com | 0a6151d | 2013-10-10 14:44:56 +0000 | [diff] [blame] | 19 | fAlphaType = src.fAlphaType; |
weita@google.com | f9ab99a | 2009-05-03 18:23:30 +0000 | [diff] [blame] | 20 | int count = src.count(); |
| 21 | fCount = SkToU16(count); |
reed@android.com | a6260ff | 2009-05-04 18:52:54 +0000 | [diff] [blame] | 22 | fColors = reinterpret_cast<SkPMColor*>( |
| 23 | sk_malloc_throw(count * sizeof(SkPMColor))); |
weita@google.com | f9ab99a | 2009-05-03 18:23:30 +0000 | [diff] [blame] | 24 | memcpy(fColors, src.fColors, count * sizeof(SkPMColor)); |
| 25 | |
reed@android.com | 8a1c16f | 2008-12-17 15:59:43 +0000 | [diff] [blame] | 26 | SkDEBUGCODE(fColorLockCount = 0;) |
| 27 | SkDEBUGCODE(f16BitCacheLockCount = 0;) |
| 28 | } |
| 29 | |
reed@google.com | 0a6151d | 2013-10-10 14:44:56 +0000 | [diff] [blame] | 30 | SkColorTable::SkColorTable(const SkPMColor colors[], int count, SkAlphaType at) |
| 31 | : f16BitCache(NULL), fAlphaType(SkToU8(at)) |
reed@android.com | 8a1c16f | 2008-12-17 15:59:43 +0000 | [diff] [blame] | 32 | { |
reed@google.com | 0a6151d | 2013-10-10 14:44:56 +0000 | [diff] [blame] | 33 | SkASSERT(0 == count || NULL != colors); |
| 34 | |
| 35 | if (count < 0) { |
reed@android.com | 8a1c16f | 2008-12-17 15:59:43 +0000 | [diff] [blame] | 36 | count = 0; |
reed@google.com | 0a6151d | 2013-10-10 14:44:56 +0000 | [diff] [blame] | 37 | } else if (count > 256) { |
reed@android.com | 8a1c16f | 2008-12-17 15:59:43 +0000 | [diff] [blame] | 38 | count = 256; |
reed@google.com | 0a6151d | 2013-10-10 14:44:56 +0000 | [diff] [blame] | 39 | } |
weita@google.com | f9ab99a | 2009-05-03 18:23:30 +0000 | [diff] [blame] | 40 | |
reed@android.com | 8a1c16f | 2008-12-17 15:59:43 +0000 | [diff] [blame] | 41 | fCount = SkToU16(count); |
reed@android.com | a6260ff | 2009-05-04 18:52:54 +0000 | [diff] [blame] | 42 | fColors = reinterpret_cast<SkPMColor*>( |
| 43 | sk_malloc_throw(count * sizeof(SkPMColor))); |
weita@google.com | f9ab99a | 2009-05-03 18:23:30 +0000 | [diff] [blame] | 44 | |
reed@google.com | 0a6151d | 2013-10-10 14:44:56 +0000 | [diff] [blame] | 45 | memcpy(fColors, colors, count * sizeof(SkPMColor)); |
weita@google.com | f9ab99a | 2009-05-03 18:23:30 +0000 | [diff] [blame] | 46 | |
reed@android.com | 8a1c16f | 2008-12-17 15:59:43 +0000 | [diff] [blame] | 47 | SkDEBUGCODE(fColorLockCount = 0;) |
| 48 | SkDEBUGCODE(f16BitCacheLockCount = 0;) |
| 49 | } |
| 50 | |
| 51 | SkColorTable::~SkColorTable() |
| 52 | { |
| 53 | SkASSERT(fColorLockCount == 0); |
| 54 | SkASSERT(f16BitCacheLockCount == 0); |
| 55 | |
| 56 | sk_free(fColors); |
| 57 | sk_free(f16BitCache); |
| 58 | } |
| 59 | |
reed@google.com | 0a6151d | 2013-10-10 14:44:56 +0000 | [diff] [blame] | 60 | void SkColorTable::unlockColors() { |
reed@android.com | 8a1c16f | 2008-12-17 15:59:43 +0000 | [diff] [blame] | 61 | SkASSERT(fColorLockCount != 0); |
djsollen@google.com | c9ab987 | 2012-08-29 18:52:07 +0000 | [diff] [blame] | 62 | SkDEBUGCODE(sk_atomic_dec(&fColorLockCount);) |
reed@android.com | 8a1c16f | 2008-12-17 15:59:43 +0000 | [diff] [blame] | 63 | } |
| 64 | |
| 65 | #include "SkColorPriv.h" |
| 66 | |
reed@google.com | 0a6151d | 2013-10-10 14:44:56 +0000 | [diff] [blame] | 67 | static inline void build_16bitcache(uint16_t dst[], const SkPMColor src[], |
| 68 | int count) { |
| 69 | while (--count >= 0) { |
reed@android.com | 8a1c16f | 2008-12-17 15:59:43 +0000 | [diff] [blame] | 70 | *dst++ = SkPixel32ToPixel16_ToU16(*src++); |
reed@google.com | 0a6151d | 2013-10-10 14:44:56 +0000 | [diff] [blame] | 71 | } |
reed@android.com | 8a1c16f | 2008-12-17 15:59:43 +0000 | [diff] [blame] | 72 | } |
| 73 | |
reed@google.com | 0a6151d | 2013-10-10 14:44:56 +0000 | [diff] [blame] | 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); |
reed@android.com | 8a1c16f | 2008-12-17 15:59:43 +0000 | [diff] [blame] | 78 | } |
| 79 | |
| 80 | SkDEBUGCODE(f16BitCacheLockCount += 1); |
| 81 | return f16BitCache; |
| 82 | } |
| 83 | |
reed@android.com | 8a1c16f | 2008-12-17 15:59:43 +0000 | [diff] [blame] | 84 | /////////////////////////////////////////////////////////////////////////////// |
| 85 | |
| 86 | SkColorTable::SkColorTable(SkFlattenableReadBuffer& buffer) { |
| 87 | f16BitCache = NULL; |
| 88 | SkDEBUGCODE(fColorLockCount = 0;) |
| 89 | SkDEBUGCODE(f16BitCacheLockCount = 0;) |
| 90 | |
reed@google.com | 0a6151d | 2013-10-10 14:44:56 +0000 | [diff] [blame] | 91 | fAlphaType = SkToU8(buffer.readUInt()); |
djsollen@google.com | c73dd5c | 2012-08-07 15:54:32 +0000 | [diff] [blame] | 92 | fCount = buffer.getArrayCount(); |
reed@android.com | 8a1c16f | 2008-12-17 15:59:43 +0000 | [diff] [blame] | 93 | fColors = (SkPMColor*)sk_malloc_throw(fCount * sizeof(SkPMColor)); |
commit-bot@chromium.org | 0251288 | 2013-10-31 18:37:50 +0000 | [diff] [blame] | 94 | SkDEBUGCODE(bool success =) buffer.readColorArray(fColors, fCount); |
bsalomon@google.com | 57313f6 | 2013-01-07 17:35:10 +0000 | [diff] [blame] | 95 | #ifdef SK_DEBUG |
djsollen@google.com | c73dd5c | 2012-08-07 15:54:32 +0000 | [diff] [blame] | 96 | SkASSERT((unsigned)fCount <= 256); |
commit-bot@chromium.org | 0251288 | 2013-10-31 18:37:50 +0000 | [diff] [blame] | 97 | SkASSERT(success); |
bsalomon@google.com | 57313f6 | 2013-01-07 17:35:10 +0000 | [diff] [blame] | 98 | #endif |
reed@android.com | 8a1c16f | 2008-12-17 15:59:43 +0000 | [diff] [blame] | 99 | } |
| 100 | |
commit-bot@chromium.org | e0e1da3 | 2013-10-15 20:36:16 +0000 | [diff] [blame] | 101 | void SkColorTable::writeToBuffer(SkFlattenableWriteBuffer& buffer) const { |
reed@google.com | 0a6151d | 2013-10-10 14:44:56 +0000 | [diff] [blame] | 102 | buffer.writeUInt(fAlphaType); |
djsollen@google.com | c73dd5c | 2012-08-07 15:54:32 +0000 | [diff] [blame] | 103 | buffer.writeColorArray(fColors, fCount); |
reed@android.com | 8a1c16f | 2008-12-17 15:59:43 +0000 | [diff] [blame] | 104 | } |