1 2 /* 3 * Copyright 2012 Google Inc. 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 #ifndef SkColorTable_DEFINED 11 #define SkColorTable_DEFINED 12 13 #include "../private/SkOnce.h" 14 #include "SkColor.h" 15 #include "SkFlattenable.h" 16 #include "SkImageInfo.h" 17 18 /** \class SkColorTable 19 20 SkColorTable holds an array SkPMColors (premultiplied 32-bit colors) used by 21 8-bit bitmaps, where the bitmap bytes are interpreted as indices into the colortable. 22 23 SkColorTable is thread-safe. 24 */ 25 class SK_API SkColorTable : public SkRefCnt { 26 public: 27 /** Copy up to 256 colors into a new SkColorTable. 28 */ 29 SkColorTable(const SkPMColor colors[], int count); 30 virtual ~SkColorTable(); 31 32 /** Returns the number of colors in the table. 33 */ 34 int count() const { return fCount; } 35 36 /** Returns the specified color from the table. In the debug build, this asserts that 37 * the index is in range (0 <= index < count). 38 */ 39 SkPMColor operator[](int index) const { 40 SkASSERT(fColors != NULL && (unsigned)index < (unsigned)fCount); 41 return fColors[index]; 42 } 43 44 /** Return the array of colors for reading. 45 */ 46 const SkPMColor* readColors() const { return fColors; } 47 48 /** read16BitCache() returns the array of RGB16 colors that mirror the 32bit colors. 49 */ 50 const uint16_t* read16BitCache() const; 51 52 void writeToBuffer(SkWriteBuffer&) const; 53 54 // may return null 55 static SkColorTable* Create(SkReadBuffer&); 56 57 private: 58 enum AllocatedWithMalloc { 59 kAllocatedWithMalloc 60 }; 61 // assumes ownership of colors (assumes it was allocated w/ malloc) 62 SkColorTable(SkPMColor* colors, int count, AllocatedWithMalloc); 63 64 SkPMColor* fColors; 65 mutable uint16_t* f16BitCache = nullptr; 66 mutable SkOnce f16BitCacheOnce; 67 int fCount; 68 69 void init(const SkPMColor* colors, int count); 70 71 friend class SkImageGenerator; 72 friend class SkBitmapRegionCodec; 73 // Only call if no other thread or cache has seen this table. 74 void dangerous_overwriteColors(const SkPMColor newColors[], int count) { 75 if (count < 0 || count > fCount) { 76 sk_throw(); 77 } 78 // assumes that f16BitCache nas NOT been initialized yet, so we don't try to update it 79 memcpy(fColors, newColors, count * sizeof(SkPMColor)); 80 fCount = count; // update fCount, in case count is smaller 81 } 82 83 typedef SkRefCnt INHERITED; 84 }; 85 86 #endif 87