12ec43ec98013f9e1f87510ff1714914572c8f52
[platform/framework/web/crosswalk.git] / src / third_party / skia / src / core / SkColorTable.cpp
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
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() {
18     f16BitCache = NULL;
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));
25
26     SkDEBUGCODE(fColorLockCount = 0;)
27     SkDEBUGCODE(f16BitCacheLockCount = 0;)
28 }
29
30 SkColorTable::SkColorTable(const SkPMColor colors[], int count, SkAlphaType at)
31     : f16BitCache(NULL), fAlphaType(SkToU8(at))
32 {
33     SkASSERT(0 == count || NULL != colors);
34
35     if (count < 0) {
36         count = 0;
37     } else if (count > 256) {
38         count = 256;
39     }
40
41     fCount = SkToU16(count);
42     fColors = reinterpret_cast<SkPMColor*>(
43                                     sk_malloc_throw(count * sizeof(SkPMColor)));
44
45     memcpy(fColors, colors, count * sizeof(SkPMColor));
46
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
60 void SkColorTable::unlockColors() {
61     SkASSERT(fColorLockCount != 0);
62     SkDEBUGCODE(sk_atomic_dec(&fColorLockCount);)
63 }
64
65 #include "SkColorPriv.h"
66
67 static inline void build_16bitcache(uint16_t dst[], const SkPMColor src[],
68                                     int count) {
69     while (--count >= 0) {
70         *dst++ = SkPixel32ToPixel16_ToU16(*src++);
71     }
72 }
73
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);
78     }
79
80     SkDEBUGCODE(f16BitCacheLockCount += 1);
81     return f16BitCache;
82 }
83
84 ///////////////////////////////////////////////////////////////////////////////
85
86 SkColorTable::SkColorTable(SkFlattenableReadBuffer& buffer) {
87     f16BitCache = NULL;
88     SkDEBUGCODE(fColorLockCount = 0;)
89     SkDEBUGCODE(f16BitCacheLockCount = 0;)
90
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);
98     } else {
99         fCount = 0;
100         fColors = NULL;
101     }
102 #ifdef SK_DEBUG
103     SkASSERT((unsigned)fCount <= 256);
104     SkASSERT(success);
105 #endif
106 }
107
108 void SkColorTable::writeToBuffer(SkFlattenableWriteBuffer& buffer) const {
109     buffer.writeUInt(fAlphaType);
110     buffer.writeColorArray(fColors, fCount);
111 }