| |
| /* |
| * Copyright 2012 Google Inc. |
| * |
| * Use of this source code is governed by a BSD-style license that can be |
| * found in the LICENSE file. |
| */ |
| |
| |
| #ifndef SkColorTable_DEFINED |
| #define SkColorTable_DEFINED |
| |
| #include "../private/SkOnce.h" |
| #include "SkColor.h" |
| #include "SkFlattenable.h" |
| #include "SkImageInfo.h" |
| |
| /** \class SkColorTable |
| |
| SkColorTable holds an array SkPMColors (premultiplied 32-bit colors) used by |
| 8-bit bitmaps, where the bitmap bytes are interpreted as indices into the colortable. |
| |
| SkColorTable is thread-safe. |
| */ |
| class SK_API SkColorTable : public SkRefCnt { |
| public: |
| /** Copy up to 256 colors into a new SkColorTable. |
| */ |
| SkColorTable(const SkPMColor colors[], int count); |
| virtual ~SkColorTable(); |
| |
| /** Returns the number of colors in the table. |
| */ |
| int count() const { return fCount; } |
| |
| /** Returns the specified color from the table. In the debug build, this asserts that |
| * the index is in range (0 <= index < count). |
| */ |
| SkPMColor operator[](int index) const { |
| SkASSERT(fColors != NULL && (unsigned)index < (unsigned)fCount); |
| return fColors[index]; |
| } |
| |
| /** Return the array of colors for reading. |
| */ |
| const SkPMColor* readColors() const { return fColors; } |
| |
| /** read16BitCache() returns the array of RGB16 colors that mirror the 32bit colors. |
| */ |
| const uint16_t* read16BitCache() const; |
| |
| void writeToBuffer(SkWriteBuffer&) const; |
| |
| // may return null |
| static SkColorTable* Create(SkReadBuffer&); |
| |
| private: |
| enum AllocatedWithMalloc { |
| kAllocatedWithMalloc |
| }; |
| // assumes ownership of colors (assumes it was allocated w/ malloc) |
| SkColorTable(SkPMColor* colors, int count, AllocatedWithMalloc); |
| |
| SkPMColor* fColors; |
| mutable uint16_t* f16BitCache = nullptr; |
| mutable SkOnce f16BitCacheOnce; |
| int fCount; |
| |
| void init(const SkPMColor* colors, int count); |
| |
| friend class SkImageGenerator; |
| friend class SkBitmapRegionCodec; |
| // Only call if no other thread or cache has seen this table. |
| void dangerous_overwriteColors(const SkPMColor newColors[], int count) { |
| if (count < 0 || count > fCount) { |
| sk_throw(); |
| } |
| // assumes that f16BitCache nas NOT been initialized yet, so we don't try to update it |
| memcpy(fColors, newColors, count * sizeof(SkPMColor)); |
| fCount = count; // update fCount, in case count is smaller |
| } |
| |
| typedef SkRefCnt INHERITED; |
| }; |
| |
| #endif |