blob: 07dfd675b2c37b716ef3524005f4312f3ac607b3 [file] [log] [blame]
/*
* 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