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/SkOncePtr.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 */ count()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 */ readColors()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 SkOncePtr<uint16_t[]> f16BitCache; 66 int fCount; 67 68 void init(const SkPMColor* colors, int count); 69 70 friend class SkImageGenerator; 71 // Only call if no other thread or cache has seen this table. dangerous_overwriteColors(const SkPMColor newColors[],int count)72 void dangerous_overwriteColors(const SkPMColor newColors[], int count) { 73 if (count < 0 || count > fCount) { 74 sk_throw(); 75 } 76 // assumes that f16BitCache nas NOT been initialized yet, so we don't try to update it 77 memcpy(fColors, newColors, count * sizeof(SkPMColor)); 78 fCount = count; // update fCount, in case count is smaller 79 } 80 81 typedef SkRefCnt INHERITED; 82 }; 83 84 #endif 85