Index: src/core/SkPaint.cpp |
diff --git a/src/core/SkPaint.cpp b/src/core/SkPaint.cpp |
index ff1cb7eb372f9a4744f1ec8231fee8c77921fc2f..34fdf45bc4093c35352fcc0708554028aa78f6c2 100644 |
--- a/src/core/SkPaint.cpp |
+++ b/src/core/SkPaint.cpp |
@@ -34,28 +34,6 @@ |
#include "SkTypeface.h" |
#include "SkXfermode.h" |
-enum { |
- kColor_DirtyBit = 1 << 0, |
- kTextSize_DirtyBit = 1 << 1, |
- kTextScaleX_DirtyBit = 1 << 2, |
- kTextSkewX_DirtyBit = 1 << 3, |
- kStrokeWidth_DirtyBit = 1 << 4, |
- kStrokeMiter_DirtyBit = 1 << 5, |
- |
- kPOD_DirtyBitMask = 63, |
- |
- kPathEffect_DirtyBit = 1 << 6, |
- kShader_DirtyBit = 1 << 7, |
- kXfermode_DirtyBit = 1 << 8, |
- kMaskFilter_DirtyBit = 1 << 9, |
- kColorFilter_DirtyBit = 1 << 10, |
- kRasterizer_DirtyBit = 1 << 11, |
- kLooper_DirtyBit = 1 << 12, |
- kImageFilter_DirtyBit = 1 << 13, |
- kTypeface_DirtyBit = 1 << 14, |
- kAnnotation_DirtyBit = 1 << 15, |
-}; |
- |
// define this to get a printf for out-of-range parameter in setters |
// e.g. setTextSize(-1) |
//#define SK_REPORT_API_RANGE_CHECK |
@@ -97,7 +75,6 @@ SkPaint::SkPaint() { |
fBitfields.fTextEncoding = kUTF8_TextEncoding; |
fBitfields.fHinting = SkPaintDefaults_Hinting; |
- fDirtyBits = 0; |
#ifdef SK_BUILD_FOR_ANDROID |
fGenerationID = 0; |
#endif |
@@ -125,7 +102,6 @@ SkPaint::SkPaint(const SkPaint& src) { |
COPY(fWidth); |
COPY(fMiterLimit); |
COPY(fBitfields); |
- COPY(fDirtyBits); |
#ifdef SK_BUILD_FOR_ANDROID |
COPY(fGenerationID); |
@@ -176,8 +152,6 @@ SkPaint& SkPaint::operator=(const SkPaint& src) { |
COPY(fWidth); |
COPY(fMiterLimit); |
COPY(fBitfields); |
- COPY(fDirtyBits); |
- |
#ifdef SK_BUILD_FOR_ANDROID |
++fGenerationID; |
#endif |
@@ -191,9 +165,7 @@ SkPaint& SkPaint::operator=(const SkPaint& src) { |
bool operator==(const SkPaint& a, const SkPaint& b) { |
#define EQUAL(field) (a.field == b.field) |
// Don't check fGenerationID, which can be different for logically equal paints. |
- // fDirtyBits is a very quick check for non-equality, so check it first. |
- return EQUAL(fDirtyBits) |
- && EQUAL(fTypeface) |
+ return EQUAL(fTypeface) |
&& EQUAL(fPathEffect) |
&& EQUAL(fShader) |
&& EQUAL(fXfermode) |
@@ -317,7 +289,6 @@ void SkPaint::setStyle(Style style) { |
void SkPaint::setColor(SkColor color) { |
GEN_ID_INC_EVAL(color != fColor); |
fColor = color; |
- fDirtyBits = SkSetClearMask(fDirtyBits, color != SK_ColorBLACK, kColor_DirtyBit); |
} |
void SkPaint::setAlpha(U8CPU a) { |
@@ -333,7 +304,6 @@ void SkPaint::setStrokeWidth(SkScalar width) { |
if (width >= 0) { |
GEN_ID_INC_EVAL(width != fWidth); |
fWidth = width; |
- fDirtyBits = SkSetClearMask(fDirtyBits, width != 0, kStrokeWidth_DirtyBit); |
} else { |
#ifdef SK_REPORT_API_RANGE_CHECK |
SkDebugf("SkPaint::setStrokeWidth() called with negative value\n"); |
@@ -345,9 +315,6 @@ void SkPaint::setStrokeMiter(SkScalar limit) { |
if (limit >= 0) { |
GEN_ID_INC_EVAL(limit != fMiterLimit); |
fMiterLimit = limit; |
- fDirtyBits = SkSetClearMask(fDirtyBits, |
- limit != SkPaintDefaults_MiterLimit, |
- kStrokeMiter_DirtyBit); |
} else { |
#ifdef SK_REPORT_API_RANGE_CHECK |
SkDebugf("SkPaint::setStrokeMiter() called with negative value\n"); |
@@ -394,7 +361,6 @@ void SkPaint::setTextSize(SkScalar ts) { |
if (ts >= 0) { |
GEN_ID_INC_EVAL(ts != fTextSize); |
fTextSize = ts; |
- fDirtyBits = SkSetClearMask(fDirtyBits, ts != SkPaintDefaults_TextSize, kTextSize_DirtyBit); |
} else { |
#ifdef SK_REPORT_API_RANGE_CHECK |
SkDebugf("SkPaint::setTextSize() called with negative value\n"); |
@@ -405,13 +371,11 @@ void SkPaint::setTextSize(SkScalar ts) { |
void SkPaint::setTextScaleX(SkScalar scaleX) { |
GEN_ID_INC_EVAL(scaleX != fTextScaleX); |
fTextScaleX = scaleX; |
- fDirtyBits = SkSetClearMask(fDirtyBits, scaleX != SK_Scalar1, kTextScaleX_DirtyBit); |
} |
void SkPaint::setTextSkewX(SkScalar skewX) { |
GEN_ID_INC_EVAL(skewX != fTextSkewX); |
fTextSkewX = skewX; |
- fDirtyBits = SkSetClearMask(fDirtyBits, skewX != 0, kTextSkewX_DirtyBit); |
} |
void SkPaint::setTextEncoding(TextEncoding encoding) { |
@@ -430,35 +394,30 @@ void SkPaint::setTextEncoding(TextEncoding encoding) { |
SkTypeface* SkPaint::setTypeface(SkTypeface* font) { |
SkRefCnt_SafeAssign(fTypeface, font); |
GEN_ID_INC; |
- fDirtyBits = SkSetClearMask(fDirtyBits, font != NULL, kTypeface_DirtyBit); |
return font; |
} |
SkRasterizer* SkPaint::setRasterizer(SkRasterizer* r) { |
SkRefCnt_SafeAssign(fRasterizer, r); |
GEN_ID_INC; |
- fDirtyBits = SkSetClearMask(fDirtyBits, r != NULL, kRasterizer_DirtyBit); |
return r; |
} |
SkDrawLooper* SkPaint::setLooper(SkDrawLooper* looper) { |
SkRefCnt_SafeAssign(fLooper, looper); |
GEN_ID_INC; |
- fDirtyBits = SkSetClearMask(fDirtyBits, looper != NULL, kLooper_DirtyBit); |
return looper; |
} |
SkImageFilter* SkPaint::setImageFilter(SkImageFilter* imageFilter) { |
SkRefCnt_SafeAssign(fImageFilter, imageFilter); |
GEN_ID_INC; |
- fDirtyBits = SkSetClearMask(fDirtyBits, imageFilter != NULL, kImageFilter_DirtyBit); |
return imageFilter; |
} |
SkAnnotation* SkPaint::setAnnotation(SkAnnotation* annotation) { |
SkRefCnt_SafeAssign(fAnnotation, annotation); |
GEN_ID_INC; |
- fDirtyBits = SkSetClearMask(fDirtyBits, annotation != NULL, kAnnotation_DirtyBit); |
return annotation; |
} |
@@ -2205,21 +2164,18 @@ void SkPaint::unflatten(SkReadBuffer& buffer) { |
SkShader* SkPaint::setShader(SkShader* shader) { |
GEN_ID_INC_EVAL(shader != fShader); |
SkRefCnt_SafeAssign(fShader, shader); |
- fDirtyBits = SkSetClearMask(fDirtyBits, shader != NULL, kShader_DirtyBit); |
return shader; |
} |
SkColorFilter* SkPaint::setColorFilter(SkColorFilter* filter) { |
GEN_ID_INC_EVAL(filter != fColorFilter); |
SkRefCnt_SafeAssign(fColorFilter, filter); |
- fDirtyBits = SkSetClearMask(fDirtyBits, filter != NULL, kColorFilter_DirtyBit); |
return filter; |
} |
SkXfermode* SkPaint::setXfermode(SkXfermode* mode) { |
GEN_ID_INC_EVAL(mode != fXfermode); |
SkRefCnt_SafeAssign(fXfermode, mode); |
- fDirtyBits = SkSetClearMask(fDirtyBits, mode != NULL, kXfermode_DirtyBit); |
return mode; |
} |
@@ -2227,21 +2183,18 @@ SkXfermode* SkPaint::setXfermodeMode(SkXfermode::Mode mode) { |
SkSafeUnref(fXfermode); |
fXfermode = SkXfermode::Create(mode); |
GEN_ID_INC; |
- fDirtyBits = SkSetClearMask(fDirtyBits, fXfermode != NULL, kXfermode_DirtyBit); |
return fXfermode; |
} |
SkPathEffect* SkPaint::setPathEffect(SkPathEffect* effect) { |
GEN_ID_INC_EVAL(effect != fPathEffect); |
SkRefCnt_SafeAssign(fPathEffect, effect); |
- fDirtyBits = SkSetClearMask(fDirtyBits, effect != NULL, kPathEffect_DirtyBit); |
return effect; |
} |
SkMaskFilter* SkPaint::setMaskFilter(SkMaskFilter* filter) { |
GEN_ID_INC_EVAL(filter != fMaskFilter); |
SkRefCnt_SafeAssign(fMaskFilter, filter); |
- fDirtyBits = SkSetClearMask(fDirtyBits, filter != NULL, kMaskFilter_DirtyBit); |
return filter; |
} |
@@ -2611,82 +2564,3 @@ bool SkPaint::nothingToDraw() const { |
return false; |
} |
-inline static unsigned popcount(uint8_t x) { |
- // As in Hacker's delight, adapted for just 8 bits. |
- x = (x & 0x55) + ((x >> 1) & 0x55); // a b c d w x y z -> a+b c+d w+x y+z |
- x = (x & 0x33) + ((x >> 2) & 0x33); // a+b c+d w+x y+z -> a+b+c+d w+x+y+z |
- x = (x & 0x0F) + ((x >> 4) & 0x0F); // a+b+c+d w+x+y+z -> a+b+c+d+w+x+y+z |
- return x; |
-} |
- |
-void SkPaint::FlatteningTraits::Flatten(SkWriteBuffer& buffer, const SkPaint& paint) { |
- const uint32_t dirty = paint.fDirtyBits; |
- |
- // Each of the low 7 dirty bits corresponds to a 4-byte flat value, |
- // plus one for the dirty bits and one for the bitfields |
- const size_t flatBytes = 4 * (popcount(dirty & kPOD_DirtyBitMask) + 2); |
- SkASSERT(flatBytes <= 32); |
- uint32_t* u32 = buffer.reserve(flatBytes); |
- *u32++ = dirty; |
- *u32++ = paint.fBitfieldsUInt; |
- if (0 == dirty) { |
- return; |
- } |
- |
-#define F(dst, field) if (dirty & k##field##_DirtyBit) *dst++ = paint.get##field() |
- F(u32, Color); |
- SkScalar* f32 = reinterpret_cast<SkScalar*>(u32); |
- F(f32, TextSize); |
- F(f32, TextScaleX); |
- F(f32, TextSkewX); |
- F(f32, StrokeWidth); |
- F(f32, StrokeMiter); |
-#undef F |
-#define F(field) if (dirty & k##field##_DirtyBit) buffer.writeFlattenable(paint.get##field()) |
- F(PathEffect); |
- F(Shader); |
- F(Xfermode); |
- F(MaskFilter); |
- F(ColorFilter); |
- F(Rasterizer); |
- F(Looper); |
- F(ImageFilter); |
-#undef F |
- if (dirty & kTypeface_DirtyBit) buffer.writeTypeface(paint.getTypeface()); |
- if (dirty & kAnnotation_DirtyBit) paint.getAnnotation()->writeToBuffer(buffer); |
-} |
- |
-void SkPaint::FlatteningTraits::Unflatten(SkReadBuffer& buffer, SkPaint* paint) { |
- const uint32_t dirty = buffer.readUInt(); |
- paint->fBitfieldsUInt = buffer.readUInt(); |
- if (dirty == 0) { |
- return; |
- } |
-#define F(field, reader) if (dirty & k##field##_DirtyBit) paint->set##field(buffer.reader()) |
-// Same function, except it unrefs the object newly set on the paint: |
-#define F_UNREF(field, reader) \ |
- if (dirty & k##field##_DirtyBit) \ |
- paint->set##field(buffer.reader())->unref() |
- |
- F(Color, readUInt); |
- F(TextSize, readScalar); |
- F(TextScaleX, readScalar); |
- F(TextSkewX, readScalar); |
- F(StrokeWidth, readScalar); |
- F(StrokeMiter, readScalar); |
- F_UNREF(PathEffect, readPathEffect); |
- F_UNREF(Shader, readShader); |
- F_UNREF(Xfermode, readXfermode); |
- F_UNREF(MaskFilter, readMaskFilter); |
- F_UNREF(ColorFilter, readColorFilter); |
- F_UNREF(Rasterizer, readRasterizer); |
- F_UNREF(Looper, readDrawLooper); |
- F_UNREF(ImageFilter, readImageFilter); |
- F(Typeface, readTypeface); |
-#undef F |
-#undef F_UNREF |
- if (dirty & kAnnotation_DirtyBit) { |
- paint->setAnnotation(SkAnnotation::Create(buffer))->unref(); |
- } |
- SkASSERT(dirty == paint->fDirtyBits); |
-} |