Move SkColorTable into its own header and reduce includes in SkFlattenable.h

Review URL: https://codereview.appspot.com/6299072

git-svn-id: http://skia.googlecode.com/svn/trunk@4236 2bbb7eff-a529-9590-31e7-b0007b416f81
This commit is contained in:
djsollen@google.com 2012-06-12 15:17:27 +00:00
parent 777442d52e
commit 64a0ec3655
9 changed files with 124 additions and 100 deletions

View File

@ -12,6 +12,7 @@
#include "Sk64.h" #include "Sk64.h"
#include "SkColor.h" #include "SkColor.h"
#include "SkColorTable.h"
#include "SkPoint.h" #include "SkPoint.h"
#include "SkRefCnt.h" #include "SkRefCnt.h"
@ -645,95 +646,6 @@ private:
static SkFixed ComputeMipLevel(SkFixed sx, SkFixed dy); static SkFixed ComputeMipLevel(SkFixed sx, SkFixed dy);
}; };
/** \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.
*/
class SkColorTable : public SkRefCnt {
public:
/** Makes a deep copy of colors.
*/
SkColorTable(const SkColorTable& src);
/** Preallocates the colortable to have 'count' colors, which
* are initially set to 0.
*/
explicit SkColorTable(int count);
explicit SkColorTable(SkFlattenableReadBuffer&);
SkColorTable(const SkPMColor colors[], int count);
virtual ~SkColorTable();
enum Flags {
kColorsAreOpaque_Flag = 0x01 //!< if set, all of the colors in the table are opaque (alpha==0xFF)
};
/** Returns the flag bits for the color table. These can be changed with setFlags().
*/
unsigned getFlags() const { return fFlags; }
/** Set the flags for the color table. See the Flags enum for possible values.
*/
void setFlags(unsigned flags);
bool isOpaque() const { return (fFlags & kColorsAreOpaque_Flag) != 0; }
void setIsOpaque(bool isOpaque);
/** 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 < fCount);
return fColors[index];
}
/** Specify the number of colors in the color table. This does not initialize the colors
to any value, just allocates memory for them. To initialize the values, either call
setColors(array, count), or follow setCount(count) with a call to
lockColors()/{set the values}/unlockColors(true).
*/
// void setColors(int count) { this->setColors(NULL, count); }
// void setColors(const SkPMColor[], int count);
/** Return the array of colors for reading and/or writing. This must be
balanced by a call to unlockColors(changed?), telling the colortable if
the colors were changed during the lock.
*/
SkPMColor* lockColors() {
SkDEBUGCODE(fColorLockCount += 1;)
return fColors;
}
/** Balancing call to lockColors(). If the colors have been changed, pass true.
*/
void unlockColors(bool changed);
/** Similar to lockColors(), lock16BitCache() returns the array of
RGB16 colors that mirror the 32bit colors. However, this function
will return null if kColorsAreOpaque_Flag is not set.
Also, unlike lockColors(), the returned array here cannot be modified.
*/
const uint16_t* lock16BitCache();
/** Balancing call to lock16BitCache().
*/
void unlock16BitCache() {
SkASSERT(f16BitCacheLockCount > 0);
SkDEBUGCODE(f16BitCacheLockCount -= 1);
}
void flatten(SkFlattenableWriteBuffer&) const;
private:
SkPMColor* fColors;
uint16_t* f16BitCache;
uint16_t fCount;
uint8_t fFlags;
SkDEBUGCODE(int fColorLockCount;)
SkDEBUGCODE(int f16BitCacheLockCount;)
void inval16BitCache();
};
class SkAutoLockPixels : public SkNoncopyable { class SkAutoLockPixels : public SkNoncopyable {
public: public:
SkAutoLockPixels(const SkBitmap& bm, bool doLock = true) : fBitmap(bm) { SkAutoLockPixels(const SkBitmap& bm, bool doLock = true) : fBitmap(bm) {

110
include/core/SkColorTable.h Normal file
View File

@ -0,0 +1,110 @@
/*
* 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 "SkColor.h"
#include "SkFlattenable.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.
*/
class SkColorTable : public SkFlattenable {
public:
/** Makes a deep copy of colors.
*/
SkColorTable(const SkColorTable& src);
/** Preallocates the colortable to have 'count' colors, which
* are initially set to 0.
*/
explicit SkColorTable(int count);
SkColorTable(const SkPMColor colors[], int count);
virtual ~SkColorTable();
enum Flags {
kColorsAreOpaque_Flag = 0x01 //!< if set, all of the colors in the table are opaque (alpha==0xFF)
};
/** Returns the flag bits for the color table. These can be changed with setFlags().
*/
unsigned getFlags() const { return fFlags; }
/** Set the flags for the color table. See the Flags enum for possible values.
*/
void setFlags(unsigned flags);
bool isOpaque() const { return (fFlags & kColorsAreOpaque_Flag) != 0; }
void setIsOpaque(bool isOpaque);
/** 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 < fCount);
return fColors[index];
}
/** Specify the number of colors in the color table. This does not initialize the colors
to any value, just allocates memory for them. To initialize the values, either call
setColors(array, count), or follow setCount(count) with a call to
lockColors()/{set the values}/unlockColors(true).
*/
// void setColors(int count) { this->setColors(NULL, count); }
// void setColors(const SkPMColor[], int count);
/** Return the array of colors for reading and/or writing. This must be
balanced by a call to unlockColors(changed?), telling the colortable if
the colors were changed during the lock.
*/
SkPMColor* lockColors() {
SkDEBUGCODE(fColorLockCount += 1;)
return fColors;
}
/** Balancing call to lockColors(). If the colors have been changed, pass true.
*/
void unlockColors(bool changed);
/** Similar to lockColors(), lock16BitCache() returns the array of
RGB16 colors that mirror the 32bit colors. However, this function
will return null if kColorsAreOpaque_Flag is not set.
Also, unlike lockColors(), the returned array here cannot be modified.
*/
const uint16_t* lock16BitCache();
/** Balancing call to lock16BitCache().
*/
void unlock16BitCache() {
SkASSERT(f16BitCacheLockCount > 0);
SkDEBUGCODE(f16BitCacheLockCount -= 1);
}
SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkColorTable)
protected:
explicit SkColorTable(SkFlattenableReadBuffer&);
void flatten(SkFlattenableWriteBuffer&) const;
private:
SkPMColor* fColors;
uint16_t* f16BitCache;
uint16_t fCount;
uint8_t fFlags;
SkDEBUGCODE(int fColorLockCount;)
SkDEBUGCODE(int f16BitCacheLockCount;)
void inval16BitCache();
typedef SkFlattenable INHERITED;
};
#endif

View File

@ -11,15 +11,15 @@
#define SkFlattenable_DEFINED #define SkFlattenable_DEFINED
#include "SkRefCnt.h" #include "SkRefCnt.h"
#include "SkBitmap.h"
#include "SkPath.h"
#include "SkPoint.h"
#include "SkReader32.h" #include "SkReader32.h"
#include "SkTDArray.h" #include "SkTDArray.h"
#include "SkWriter32.h" #include "SkWriter32.h"
class SkBitmap;
class SkFlattenableReadBuffer; class SkFlattenableReadBuffer;
class SkFlattenableWriteBuffer; class SkFlattenableWriteBuffer;
class SkPath;
class SkPoint;
class SkString; class SkString;
#if SK_ALLOW_STATIC_GLOBAL_INITIALIZERS #if SK_ALLOW_STATIC_GLOBAL_INITIALIZERS

View File

@ -9,6 +9,7 @@
#ifndef SkSfntUtils_DEFINED #ifndef SkSfntUtils_DEFINED
#define SkSfntUtils_DEFINED #define SkSfntUtils_DEFINED
#include "Sk64.h"
#include "SkFontHost.h" #include "SkFontHost.h"
struct SkSfntTable_head { struct SkSfntTable_head {

View File

@ -1429,7 +1429,7 @@ void SkBitmap::flatten(SkFlattenableWriteBuffer& buffer) const {
} else if (fPixels) { } else if (fPixels) {
if (fColorTable) { if (fColorTable) {
buffer.write8(SERIALIZE_PIXELTYPE_RAW_WITH_CTABLE); buffer.write8(SERIALIZE_PIXELTYPE_RAW_WITH_CTABLE);
fColorTable->flatten(buffer); buffer.writeFlattenable(fColorTable);
} else { } else {
buffer.write8(SERIALIZE_PIXELTYPE_RAW_NO_CTABLE); buffer.write8(SERIALIZE_PIXELTYPE_RAW_NO_CTABLE);
} }
@ -1475,7 +1475,7 @@ void SkBitmap::unflatten(SkFlattenableReadBuffer& buffer) {
case SERIALIZE_PIXELTYPE_RAW_NO_CTABLE: { case SERIALIZE_PIXELTYPE_RAW_NO_CTABLE: {
SkColorTable* ctable = NULL; SkColorTable* ctable = NULL;
if (SERIALIZE_PIXELTYPE_RAW_WITH_CTABLE == reftype) { if (SERIALIZE_PIXELTYPE_RAW_WITH_CTABLE == reftype) {
ctable = SkNEW_ARGS(SkColorTable, (buffer)); ctable = static_cast<SkColorTable*>(buffer.readFlattenable());
} }
size_t size = this->getSize(); size_t size = this->getSize();
if (this->allocPixels(ctable)) { if (this->allocPixels(ctable)) {

View File

@ -7,8 +7,7 @@
*/ */
#include "SkBitmap.h" #include "SkColorTable.h"
#include "SkFlattenable.h"
#include "SkStream.h" #include "SkStream.h"
#include "SkTemplates.h" #include "SkTemplates.h"
@ -28,8 +27,7 @@ SkColorTable::SkColorTable(int count)
SkDEBUGCODE(f16BitCacheLockCount = 0;) SkDEBUGCODE(f16BitCacheLockCount = 0;)
} }
// call SkRefCnt's constructor explicitly, to avoid warning SkColorTable::SkColorTable(const SkColorTable& src) : INHERITED() {
SkColorTable::SkColorTable(const SkColorTable& src) : SkRefCnt() {
f16BitCache = NULL; f16BitCache = NULL;
fFlags = src.fFlags; fFlags = src.fFlags;
int count = src.count(); int count = src.count();
@ -156,3 +154,4 @@ void SkColorTable::flatten(SkFlattenableWriteBuffer& buffer) const {
buffer.writeMul4(fColors, count * sizeof(SkPMColor)); buffer.writeMul4(fColors, count * sizeof(SkPMColor));
} }
SK_DEFINE_FLATTENABLE_REGISTRAR(SkColorTable)

View File

@ -43,7 +43,7 @@ void SkMallocPixelRef::flatten(SkFlattenableWriteBuffer& buffer) const {
buffer.writePad(fStorage, fSize); buffer.writePad(fStorage, fSize);
if (fCTable) { if (fCTable) {
buffer.writeBool(true); buffer.writeBool(true);
fCTable->flatten(buffer); buffer.writeFlattenable(fCTable);
} else { } else {
buffer.writeBool(false); buffer.writeBool(false);
} }
@ -55,7 +55,7 @@ SkMallocPixelRef::SkMallocPixelRef(SkFlattenableReadBuffer& buffer)
fStorage = sk_malloc_throw(fSize); fStorage = sk_malloc_throw(fSize);
buffer.read(fStorage, fSize); buffer.read(fStorage, fSize);
if (buffer.readBool()) { if (buffer.readBool()) {
fCTable = SkNEW_ARGS(SkColorTable, (buffer)); fCTable = static_cast<SkColorTable*>(buffer.readFlattenable());
} else { } else {
fCTable = NULL; fCTable = NULL;
} }

View File

@ -5,6 +5,7 @@
* found in the LICENSE file. * found in the LICENSE file.
*/ */
#include "SkBitmap.h"
#include "SkBlurImageFilter.h" #include "SkBlurImageFilter.h"
#include "SkColorPriv.h" #include "SkColorPriv.h"

View File

@ -6,6 +6,7 @@
*/ */
#include "SkMorphologyImageFilter.h" #include "SkMorphologyImageFilter.h"
#include "SkBitmap.h"
#include "SkColorPriv.h" #include "SkColorPriv.h"
SkMorphologyImageFilter::SkMorphologyImageFilter(SkFlattenableReadBuffer& buffer) SkMorphologyImageFilter::SkMorphologyImageFilter(SkFlattenableReadBuffer& buffer)