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 static sk_sp<SkColorTable> Make(const SkPMColor colors[], int count); 28 29 /** Copy up to 256 colors into a new SkColorTable. 30 */ 31 SkColorTable(const SkPMColor colors[], int count); 32 ~SkColorTable() override; 33 34 /** Returns the number of colors in the table. 35 */ count()36 int count() const { return fCount; } 37 38 /** Returns the specified color from the table. In the debug build, this asserts that 39 * the index is in range (0 <= index < count). 40 */ 41 SkPMColor operator[](int index) const { 42 SkASSERT(fColors != NULL && (unsigned)index < (unsigned)fCount); 43 return fColors[index]; 44 } 45 46 /** Return the array of colors for reading. 47 */ readColors()48 const SkPMColor* readColors() const { return fColors; } 49 50 /** read16BitCache() returns the array of RGB16 colors that mirror the 32bit colors. 51 */ 52 const uint16_t* read16BitCache() const; 53 54 void writeToBuffer(SkWriteBuffer&) const; 55 56 // may return null 57 static sk_sp<SkColorTable> Create(SkReadBuffer&); 58 59 private: 60 enum AllocatedWithMalloc { 61 kAllocatedWithMalloc 62 }; 63 // assumes ownership of colors (assumes it was allocated w/ malloc) 64 SkColorTable(SkPMColor* colors, int count, AllocatedWithMalloc); 65 66 SkPMColor* fColors; 67 mutable uint16_t* f16BitCache = nullptr; 68 mutable SkOnce f16BitCacheOnce; 69 int fCount; 70 71 void init(const SkPMColor* colors, int count); 72 73 friend class SkImageGenerator; 74 75 typedef SkRefCnt INHERITED; 76 }; 77 78 #endif 79