| Index: src/core/SkPaint.cpp
|
| diff --git a/src/core/SkPaint.cpp b/src/core/SkPaint.cpp
|
| index 241175e4e08f044cf7e65410c05e581775dab07a..21ba47109488d50cb3f2e2c3c7332e70fbb111e6 100644
|
| --- a/src/core/SkPaint.cpp
|
| +++ b/src/core/SkPaint.cpp
|
| @@ -35,6 +35,34 @@
|
| #include "SkTypeface.h"
|
| #include "SkXfermode.h"
|
|
|
| +#define SkPaintParts_SafeAssign(field, value) SkRefCnt_SafeAssign(fParts.field, value)
|
| +
|
| +bool SkPaintParts::operator==(const SkPaintParts& other) const {
|
| +#define EQUAL(field) (this->field == other.field)
|
| + return EQUAL(fTypeface)
|
| + && EQUAL(fPathEffect)
|
| + && EQUAL(fShader)
|
| + && EQUAL(fXfermode)
|
| + && EQUAL(fMaskFilter)
|
| + && EQUAL(fColorFilter)
|
| + && EQUAL(fRasterizer)
|
| + && EQUAL(fLooper)
|
| + && EQUAL(fImageFilter)
|
| + && EQUAL(fAnnotation)
|
| + && EQUAL(fTextSize)
|
| + && EQUAL(fTextScaleX)
|
| + && EQUAL(fTextSkewX)
|
| + && EQUAL(fColor)
|
| + && EQUAL(fWidth)
|
| + && EQUAL(fMiterLimit)
|
| + && EQUAL(fBitfields)
|
| + ;
|
| +#undef EQUAL
|
| +}
|
| +
|
| +///////////
|
| +
|
| +
|
| enum {
|
| kColor_DirtyBit = 1 << 0,
|
| kTextSize_DirtyBit = 1 << 1,
|
| @@ -71,33 +99,20 @@ enum {
|
| #endif
|
|
|
| SkPaint::SkPaint() {
|
| - fTypeface = NULL;
|
| - fPathEffect = NULL;
|
| - fShader = NULL;
|
| - fXfermode = NULL;
|
| - fMaskFilter = NULL;
|
| - fColorFilter = NULL;
|
| - fRasterizer = NULL;
|
| - fLooper = NULL;
|
| - fImageFilter = NULL;
|
| - fAnnotation = NULL;
|
| -
|
| - fTextSize = SkPaintDefaults_TextSize;
|
| - fTextScaleX = SK_Scalar1;
|
| - fTextSkewX = 0;
|
| - fColor = SK_ColorBLACK;
|
| - fWidth = 0;
|
| - fMiterLimit = SkPaintDefaults_MiterLimit;
|
| -
|
| - // Zero all bitfields, then set some non-zero defaults.
|
| - fBitfields = 0;
|
| - fFlags = SkPaintDefaults_Flags;
|
| - fCapType = kDefault_Cap;
|
| - fJoinType = kDefault_Join;
|
| - fTextAlign = kLeft_Align;
|
| - fStyle = kFill_Style;
|
| - fTextEncoding = kUTF8_TextEncoding;
|
| - fHinting = SkPaintDefaults_Hinting;
|
| + // set any non-zero values in fParts
|
| +
|
| + fParts.fTextSize = SkPaintDefaults_TextSize;
|
| + fParts.fTextScaleX = SK_Scalar1;
|
| + fParts.fColor = SK_ColorBLACK;
|
| + fParts.fMiterLimit = SkPaintDefaults_MiterLimit;
|
| +
|
| + fParts.fFlags = SkPaintDefaults_Flags;
|
| + fParts.fCapType = SkPaintParts::kDefault_Cap;
|
| + fParts.fJoinType = SkPaintParts::kDefault_Join;
|
| + fParts.fTextAlign = SkPaintParts::kLeft_Align;
|
| + fParts.fStyle = SkPaintParts::kFill_Style;
|
| + fParts.fTextEncoding = kUTF8_TextEncoding;
|
| + fParts.fHinting = SkPaintDefaults_Hinting;
|
|
|
| fDirtyBits = 0;
|
| #ifdef SK_BUILD_FOR_ANDROID
|
| @@ -107,8 +122,8 @@ SkPaint::SkPaint() {
|
| }
|
|
|
| SkPaint::SkPaint(const SkPaint& src) {
|
| -#define COPY(field) field = src.field
|
| -#define REF_COPY(field) field = SkSafeRef(src.field)
|
| +#define COPY(field) fParts.field = src.fParts.field
|
| +#define REF_COPY(field) fParts.field = SkSafeRef(src.fParts.field)
|
|
|
| REF_COPY(fTypeface);
|
| REF_COPY(fPathEffect);
|
| @@ -128,7 +143,8 @@ SkPaint::SkPaint(const SkPaint& src) {
|
| COPY(fWidth);
|
| COPY(fMiterLimit);
|
| COPY(fBitfields);
|
| - COPY(fDirtyBits);
|
| +
|
| + fDirtyBits = src.fDirtyBits;
|
|
|
| #ifdef SK_BUILD_FOR_ANDROID
|
| new (&fPaintOptionsAndroid) SkPaintOptionsAndroid(src.fPaintOptionsAndroid);
|
| @@ -140,21 +156,21 @@ SkPaint::SkPaint(const SkPaint& src) {
|
| }
|
|
|
| SkPaint::~SkPaint() {
|
| - SkSafeUnref(fTypeface);
|
| - SkSafeUnref(fPathEffect);
|
| - SkSafeUnref(fShader);
|
| - SkSafeUnref(fXfermode);
|
| - SkSafeUnref(fMaskFilter);
|
| - SkSafeUnref(fColorFilter);
|
| - SkSafeUnref(fRasterizer);
|
| - SkSafeUnref(fLooper);
|
| - SkSafeUnref(fImageFilter);
|
| - SkSafeUnref(fAnnotation);
|
| + SkSafeUnref(fParts.fTypeface);
|
| + SkSafeUnref(fParts.fPathEffect);
|
| + SkSafeUnref(fParts.fShader);
|
| + SkSafeUnref(fParts.fXfermode);
|
| + SkSafeUnref(fParts.fMaskFilter);
|
| + SkSafeUnref(fParts.fColorFilter);
|
| + SkSafeUnref(fParts.fRasterizer);
|
| + SkSafeUnref(fParts.fLooper);
|
| + SkSafeUnref(fParts.fImageFilter);
|
| + SkSafeUnref(fParts.fAnnotation);
|
| }
|
|
|
| SkPaint& SkPaint::operator=(const SkPaint& src) {
|
| -#define COPY(field) field = src.field
|
| -#define REF_COPY(field) SkSafeUnref(field); field = SkSafeRef(src.field)
|
| +#define COPY(field) fParts.field = src.fParts.field
|
| +#define REF_COPY(field) SkSafeUnref(fParts.field); fParts.field = SkSafeRef(src.fParts.field)
|
|
|
| SkASSERT(&src);
|
|
|
| @@ -176,7 +192,8 @@ SkPaint& SkPaint::operator=(const SkPaint& src) {
|
| COPY(fWidth);
|
| COPY(fMiterLimit);
|
| COPY(fBitfields);
|
| - COPY(fDirtyBits);
|
| +
|
| + fDirtyBits = src.fDirtyBits;
|
|
|
| #ifdef SK_BUILD_FOR_ANDROID
|
| fPaintOptionsAndroid.~SkPaintOptionsAndroid();
|
| @@ -191,30 +208,15 @@ 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 or fDirtyBits, which can be different for logically equal paints.
|
| - return EQUAL(fTypeface)
|
| - && EQUAL(fPathEffect)
|
| - && EQUAL(fShader)
|
| - && EQUAL(fXfermode)
|
| - && EQUAL(fMaskFilter)
|
| - && EQUAL(fColorFilter)
|
| - && EQUAL(fRasterizer)
|
| - && EQUAL(fLooper)
|
| - && EQUAL(fImageFilter)
|
| - && EQUAL(fAnnotation)
|
| - && EQUAL(fTextSize)
|
| - && EQUAL(fTextScaleX)
|
| - && EQUAL(fTextSkewX)
|
| - && EQUAL(fColor)
|
| - && EQUAL(fWidth)
|
| - && EQUAL(fMiterLimit)
|
| - && EQUAL(fBitfields)
|
| + if (a.fParts != b.fParts) {
|
| + return false;
|
| + }
|
| #ifdef SK_BUILD_FOR_ANDROID
|
| - && EQUAL(fPaintOptionsAndroid)
|
| + if (fPaintOptionsAndroid != b.fPaintOptionsAndroid) {
|
| + return false;
|
| + }
|
| #endif
|
| - ;
|
| -#undef EQUAL
|
| + return true;
|
| }
|
|
|
| void SkPaint::reset() {
|
| @@ -255,75 +257,75 @@ void SkPaint::setPaintOptionsAndroid(const SkPaintOptionsAndroid& options) {
|
|
|
| void SkPaint::setFilterLevel(FilterLevel level) {
|
| GEN_ID_INC_EVAL((unsigned) level != fFilterLevel);
|
| - fFilterLevel = level;
|
| + fParts.setFilterLevel(static_cast<SkPaintParts::FilterLevel>(level));
|
| }
|
|
|
| void SkPaint::setHinting(Hinting hintingLevel) {
|
| GEN_ID_INC_EVAL((unsigned) hintingLevel != fHinting);
|
| - fHinting = hintingLevel;
|
| + fParts.setHinting(static_cast<SkPaintParts::Hinting>(hintingLevel));
|
| }
|
|
|
| void SkPaint::setFlags(uint32_t flags) {
|
| GEN_ID_INC_EVAL(fFlags != flags);
|
| - fFlags = flags;
|
| + fParts.setFlags(flags);
|
| }
|
|
|
| void SkPaint::setAntiAlias(bool doAA) {
|
| - this->setFlags(SkSetClearMask(fFlags, doAA, kAntiAlias_Flag));
|
| + this->setFlags(SkSetClearMask(fParts.getFlags(), doAA, kAntiAlias_Flag));
|
| }
|
|
|
| void SkPaint::setDither(bool doDither) {
|
| - this->setFlags(SkSetClearMask(fFlags, doDither, kDither_Flag));
|
| + this->setFlags(SkSetClearMask(fParts.getFlags(), doDither, kDither_Flag));
|
| }
|
|
|
| void SkPaint::setSubpixelText(bool doSubpixel) {
|
| - this->setFlags(SkSetClearMask(fFlags, doSubpixel, kSubpixelText_Flag));
|
| + this->setFlags(SkSetClearMask(fParts.getFlags(), doSubpixel, kSubpixelText_Flag));
|
| }
|
|
|
| void SkPaint::setLCDRenderText(bool doLCDRender) {
|
| - this->setFlags(SkSetClearMask(fFlags, doLCDRender, kLCDRenderText_Flag));
|
| + this->setFlags(SkSetClearMask(fParts.getFlags(), doLCDRender, kLCDRenderText_Flag));
|
| }
|
|
|
| void SkPaint::setEmbeddedBitmapText(bool doEmbeddedBitmapText) {
|
| - this->setFlags(SkSetClearMask(fFlags, doEmbeddedBitmapText, kEmbeddedBitmapText_Flag));
|
| + this->setFlags(SkSetClearMask(fParts.getFlags(), doEmbeddedBitmapText, kEmbeddedBitmapText_Flag));
|
| }
|
|
|
| void SkPaint::setAutohinted(bool useAutohinter) {
|
| - this->setFlags(SkSetClearMask(fFlags, useAutohinter, kAutoHinting_Flag));
|
| + this->setFlags(SkSetClearMask(fParts.getFlags(), useAutohinter, kAutoHinting_Flag));
|
| }
|
|
|
| void SkPaint::setLinearText(bool doLinearText) {
|
| - this->setFlags(SkSetClearMask(fFlags, doLinearText, kLinearText_Flag));
|
| + this->setFlags(SkSetClearMask(fParts.getFlags(), doLinearText, kLinearText_Flag));
|
| }
|
|
|
| void SkPaint::setVerticalText(bool doVertical) {
|
| - this->setFlags(SkSetClearMask(fFlags, doVertical, kVerticalText_Flag));
|
| + this->setFlags(SkSetClearMask(fParts.getFlags(), doVertical, kVerticalText_Flag));
|
| }
|
|
|
| void SkPaint::setUnderlineText(bool doUnderline) {
|
| - this->setFlags(SkSetClearMask(fFlags, doUnderline, kUnderlineText_Flag));
|
| + this->setFlags(SkSetClearMask(fParts.getFlags(), doUnderline, kUnderlineText_Flag));
|
| }
|
|
|
| void SkPaint::setStrikeThruText(bool doStrikeThru) {
|
| - this->setFlags(SkSetClearMask(fFlags, doStrikeThru, kStrikeThruText_Flag));
|
| + this->setFlags(SkSetClearMask(fParts.getFlags(), doStrikeThru, kStrikeThruText_Flag));
|
| }
|
|
|
| void SkPaint::setFakeBoldText(bool doFakeBold) {
|
| - this->setFlags(SkSetClearMask(fFlags, doFakeBold, kFakeBoldText_Flag));
|
| + this->setFlags(SkSetClearMask(fParts.getFlags(), doFakeBold, kFakeBoldText_Flag));
|
| }
|
|
|
| void SkPaint::setDevKernText(bool doDevKern) {
|
| - this->setFlags(SkSetClearMask(fFlags, doDevKern, kDevKernText_Flag));
|
| + this->setFlags(SkSetClearMask(fParts.getFlags(), doDevKern, kDevKernText_Flag));
|
| }
|
|
|
| void SkPaint::setDistanceFieldTextTEMP(bool doDistanceFieldText) {
|
| - this->setFlags(SkSetClearMask(fFlags, doDistanceFieldText, kDistanceFieldTextTEMP_Flag));
|
| + this->setFlags(SkSetClearMask(fParts.getFlags(), doDistanceFieldText, kDistanceFieldTextTEMP_Flag));
|
| }
|
|
|
| void SkPaint::setStyle(Style style) {
|
| if ((unsigned)style < kStyleCount) {
|
| GEN_ID_INC_EVAL((unsigned)style != fStyle);
|
| - fStyle = style;
|
| + fParts.setStyle(static_cast<SkPaintParts::Style>(style));
|
| } else {
|
| #ifdef SK_REPORT_API_RANGE_CHECK
|
| SkDebugf("SkPaint::setStyle(%d) out of range\n", style);
|
| @@ -333,13 +335,13 @@ void SkPaint::setStyle(Style style) {
|
|
|
| void SkPaint::setColor(SkColor color) {
|
| GEN_ID_INC_EVAL(color != fColor);
|
| - fColor = color;
|
| + fParts.setColor(color);
|
| fDirtyBits |= kColor_DirtyBit;
|
| }
|
|
|
| void SkPaint::setAlpha(U8CPU a) {
|
| - this->setColor(SkColorSetARGB(a, SkColorGetR(fColor),
|
| - SkColorGetG(fColor), SkColorGetB(fColor)));
|
| + const SkColor c = fParts.getColor();
|
| + this->setColor(SkColorSetARGB(a, SkColorGetR(c), SkColorGetG(c), SkColorGetB(c)));
|
| }
|
|
|
| void SkPaint::setARGB(U8CPU a, U8CPU r, U8CPU g, U8CPU b) {
|
| @@ -349,7 +351,7 @@ void SkPaint::setARGB(U8CPU a, U8CPU r, U8CPU g, U8CPU b) {
|
| void SkPaint::setStrokeWidth(SkScalar width) {
|
| if (width >= 0) {
|
| GEN_ID_INC_EVAL(width != fWidth);
|
| - fWidth = width;
|
| + fParts.setStrokeWidth(width);
|
| fDirtyBits |= kStrokeWidth_DirtyBit;
|
| } else {
|
| #ifdef SK_REPORT_API_RANGE_CHECK
|
| @@ -361,7 +363,7 @@ void SkPaint::setStrokeWidth(SkScalar width) {
|
| void SkPaint::setStrokeMiter(SkScalar limit) {
|
| if (limit >= 0) {
|
| GEN_ID_INC_EVAL(limit != fMiterLimit);
|
| - fMiterLimit = limit;
|
| + fParts.setStrokeMiter(limit);
|
| fDirtyBits |= kStrokeMiter_DirtyBit;
|
| } else {
|
| #ifdef SK_REPORT_API_RANGE_CHECK
|
| @@ -373,7 +375,7 @@ void SkPaint::setStrokeMiter(SkScalar limit) {
|
| void SkPaint::setStrokeCap(Cap ct) {
|
| if ((unsigned)ct < kCapCount) {
|
| GEN_ID_INC_EVAL((unsigned)ct != fCapType);
|
| - fCapType = SkToU8(ct);
|
| + fParts.setStrokeCap(static_cast<SkPaintParts::Cap>(ct));
|
| } else {
|
| #ifdef SK_REPORT_API_RANGE_CHECK
|
| SkDebugf("SkPaint::setStrokeCap(%d) out of range\n", ct);
|
| @@ -384,7 +386,7 @@ void SkPaint::setStrokeCap(Cap ct) {
|
| void SkPaint::setStrokeJoin(Join jt) {
|
| if ((unsigned)jt < kJoinCount) {
|
| GEN_ID_INC_EVAL((unsigned)jt != fJoinType);
|
| - fJoinType = SkToU8(jt);
|
| + fParts.setStrokeJoin(static_cast<SkPaintParts::Join>(jt));
|
| } else {
|
| #ifdef SK_REPORT_API_RANGE_CHECK
|
| SkDebugf("SkPaint::setStrokeJoin(%d) out of range\n", jt);
|
| @@ -397,7 +399,7 @@ void SkPaint::setStrokeJoin(Join jt) {
|
| void SkPaint::setTextAlign(Align align) {
|
| if ((unsigned)align < kAlignCount) {
|
| GEN_ID_INC_EVAL((unsigned)align != fTextAlign);
|
| - fTextAlign = SkToU8(align);
|
| + fParts.setTextAlign(static_cast<SkPaintParts::Align>(align));
|
| } else {
|
| #ifdef SK_REPORT_API_RANGE_CHECK
|
| SkDebugf("SkPaint::setTextAlign(%d) out of range\n", align);
|
| @@ -408,7 +410,7 @@ void SkPaint::setTextAlign(Align align) {
|
| void SkPaint::setTextSize(SkScalar ts) {
|
| if (ts >= 0) {
|
| GEN_ID_INC_EVAL(ts != fTextSize);
|
| - fTextSize = ts;
|
| + fParts.setTextSize(ts);
|
| fDirtyBits |= kTextSize_DirtyBit;
|
| } else {
|
| #ifdef SK_REPORT_API_RANGE_CHECK
|
| @@ -419,20 +421,20 @@ void SkPaint::setTextSize(SkScalar ts) {
|
|
|
| void SkPaint::setTextScaleX(SkScalar scaleX) {
|
| GEN_ID_INC_EVAL(scaleX != fTextScaleX);
|
| - fTextScaleX = scaleX;
|
| + fParts.setTextScaleX(scaleX);
|
| fDirtyBits |= kTextScaleX_DirtyBit;
|
| }
|
|
|
| void SkPaint::setTextSkewX(SkScalar skewX) {
|
| GEN_ID_INC_EVAL(skewX != fTextSkewX);
|
| - fTextSkewX = skewX;
|
| + fParts.setTextSkewX(skewX);
|
| fDirtyBits |= kTextSkewX_DirtyBit;
|
| }
|
|
|
| void SkPaint::setTextEncoding(TextEncoding encoding) {
|
| if ((unsigned)encoding <= kGlyphID_TextEncoding) {
|
| GEN_ID_INC_EVAL((unsigned)encoding != fTextEncoding);
|
| - fTextEncoding = encoding;
|
| + fParts.setTextEncoding(static_cast<SkPaintParts::TextEncoding>(encoding));
|
| } else {
|
| #ifdef SK_REPORT_API_RANGE_CHECK
|
| SkDebugf("SkPaint::setTextEncoding(%d) out of range\n", encoding);
|
| @@ -448,36 +450,36 @@ inline static uint32_t set_mask(uint32_t dst, uint32_t bitmask, bool value) {
|
| }
|
|
|
| SkTypeface* SkPaint::setTypeface(SkTypeface* font) {
|
| - SkRefCnt_SafeAssign(fTypeface, font);
|
| GEN_ID_INC;
|
| + SkPaintParts_SafeAssign(fTypeface, font);
|
| fDirtyBits = set_mask(fDirtyBits, kTypeface_DirtyBit, font != NULL);
|
| return font;
|
| }
|
|
|
| SkRasterizer* SkPaint::setRasterizer(SkRasterizer* r) {
|
| - SkRefCnt_SafeAssign(fRasterizer, r);
|
| GEN_ID_INC;
|
| + SkPaintParts_SafeAssign(fRasterizer, r);
|
| fDirtyBits = set_mask(fDirtyBits, kRasterizer_DirtyBit, r != NULL);
|
| return r;
|
| }
|
|
|
| SkDrawLooper* SkPaint::setLooper(SkDrawLooper* looper) {
|
| - SkRefCnt_SafeAssign(fLooper, looper);
|
| GEN_ID_INC;
|
| + SkPaintParts_SafeAssign(fLooper, looper);
|
| fDirtyBits = set_mask(fDirtyBits, kLooper_DirtyBit, looper != NULL);
|
| return looper;
|
| }
|
|
|
| SkImageFilter* SkPaint::setImageFilter(SkImageFilter* imageFilter) {
|
| - SkRefCnt_SafeAssign(fImageFilter, imageFilter);
|
| GEN_ID_INC;
|
| + SkPaintParts_SafeAssign(fImageFilter, imageFilter);
|
| fDirtyBits = set_mask(fDirtyBits, kImageFilter_DirtyBit, imageFilter != NULL);
|
| return imageFilter;
|
| }
|
|
|
| SkAnnotation* SkPaint::setAnnotation(SkAnnotation* annotation) {
|
| - SkRefCnt_SafeAssign(fAnnotation, annotation);
|
| GEN_ID_INC;
|
| + SkPaintParts_SafeAssign(fAnnotation, annotation);
|
| fDirtyBits = set_mask(fDirtyBits, kAnnotation_DirtyBit, annotation != NULL);
|
| return annotation;
|
| }
|
| @@ -959,7 +961,7 @@ SkDrawCacheProc SkPaint::getDrawCacheProc() const {
|
| };
|
|
|
| unsigned index = this->getTextEncoding();
|
| - if (fFlags & kSubpixelText_Flag) {
|
| + if (this->getFlags() & kSubpixelText_Flag) {
|
| index += 4;
|
| }
|
|
|
| @@ -987,7 +989,7 @@ SkScalar SkPaint::setupForAsPaths() {
|
| this->setFlags(flags);
|
| this->setHinting(SkPaint::kNo_Hinting);
|
|
|
| - SkScalar textSize = fTextSize;
|
| + SkScalar textSize = this->getTextSize();
|
| this->setTextSize(kCanonicalTextSizeForPaths);
|
| return textSize / kCanonicalTextSizeForPaths;
|
| }
|
| @@ -1203,7 +1205,7 @@ size_t SkPaint::breakText(const void* textD, size_t length, SkScalar maxWidth,
|
| return 0;
|
| }
|
|
|
| - if (0 == fTextSize) {
|
| + if (0 == this->getTextSize()) {
|
| if (measuredWidth) {
|
| *measuredWidth = 0;
|
| }
|
| @@ -1945,7 +1947,7 @@ void SkPaint::descriptorProc(const SkDeviceProperties* deviceProperties,
|
| }
|
| #endif
|
|
|
| - proc(fTypeface, desc, context);
|
| + proc(this->getTypeface(), desc, context);
|
| }
|
|
|
| SkGlyphCache* SkPaint::detachCache(const SkDeviceProperties* deviceProperties,
|
| @@ -2147,9 +2149,9 @@ void SkPaint::flatten(SkWriteBuffer& buffer) const {
|
| buffer.writeFlattenable(this->getLooper());
|
| buffer.writeFlattenable(this->getImageFilter());
|
|
|
| - if (fAnnotation) {
|
| + if (this->getAnnotation()) {
|
| buffer.writeBool(true);
|
| - fAnnotation->writeToBuffer(buffer);
|
| + this->getAnnotation()->writeToBuffer(buffer);
|
| } else {
|
| buffer.writeBool(false);
|
| }
|
| @@ -2234,43 +2236,43 @@ void SkPaint::unflatten(SkReadBuffer& buffer) {
|
|
|
| SkShader* SkPaint::setShader(SkShader* shader) {
|
| GEN_ID_INC_EVAL(shader != fShader);
|
| - SkRefCnt_SafeAssign(fShader, shader);
|
| + SkPaintParts_SafeAssign(fShader, shader);
|
| fDirtyBits = set_mask(fDirtyBits, kShader_DirtyBit, shader != NULL);
|
| return shader;
|
| }
|
|
|
| SkColorFilter* SkPaint::setColorFilter(SkColorFilter* filter) {
|
| GEN_ID_INC_EVAL(filter != fColorFilter);
|
| - SkRefCnt_SafeAssign(fColorFilter, filter);
|
| + SkPaintParts_SafeAssign(fColorFilter, filter);
|
| fDirtyBits = set_mask(fDirtyBits, kColorFilter_DirtyBit, filter != NULL);
|
| return filter;
|
| }
|
|
|
| SkXfermode* SkPaint::setXfermode(SkXfermode* mode) {
|
| GEN_ID_INC_EVAL(mode != fXfermode);
|
| - SkRefCnt_SafeAssign(fXfermode, mode);
|
| + SkPaintParts_SafeAssign(fXfermode, mode);
|
| fDirtyBits = set_mask(fDirtyBits, kXfermode_DirtyBit, mode != NULL);
|
| return mode;
|
| }
|
|
|
| SkXfermode* SkPaint::setXfermodeMode(SkXfermode::Mode mode) {
|
| - SkSafeUnref(fXfermode);
|
| - fXfermode = SkXfermode::Create(mode);
|
| + SkSafeUnref(fParts.fXfermode);
|
| + fParts.fXfermode = SkXfermode::Create(mode);
|
| GEN_ID_INC;
|
| - fDirtyBits = set_mask(fDirtyBits, kXfermode_DirtyBit, fXfermode != NULL);
|
| - return fXfermode;
|
| + fDirtyBits = set_mask(fDirtyBits, kXfermode_DirtyBit, fParts.fXfermode != NULL);
|
| + return fParts.fXfermode;
|
| }
|
|
|
| SkPathEffect* SkPaint::setPathEffect(SkPathEffect* effect) {
|
| GEN_ID_INC_EVAL(effect != fPathEffect);
|
| - SkRefCnt_SafeAssign(fPathEffect, effect);
|
| + SkPaintParts_SafeAssign(fPathEffect, effect);
|
| fDirtyBits = set_mask(fDirtyBits, kPathEffect_DirtyBit, effect != NULL);
|
| return effect;
|
| }
|
|
|
| SkMaskFilter* SkPaint::setMaskFilter(SkMaskFilter* filter) {
|
| GEN_ID_INC_EVAL(filter != fMaskFilter);
|
| - SkRefCnt_SafeAssign(fMaskFilter, filter);
|
| + SkPaintParts_SafeAssign(fMaskFilter, filter);
|
| fDirtyBits = set_mask(fDirtyBits, kMaskFilter_DirtyBit, filter != NULL);
|
| return filter;
|
| }
|
| @@ -2284,7 +2286,8 @@ bool SkPaint::getFillPath(const SkPath& src, SkPath* dst,
|
| const SkPath* srcPtr = &src;
|
| SkPath tmpPath;
|
|
|
| - if (fPathEffect && fPathEffect->filterPath(&tmpPath, src, &rec, cullRect)) {
|
| + SkPathEffect* pe = this->getPathEffect();
|
| + if (pe && pe->filterPath(&tmpPath, src, &rec, cullRect)) {
|
| srcPtr = &tmpPath;
|
| }
|
|
|
| @@ -2621,11 +2624,11 @@ bool SkTextToPathIter::next(const SkPath** path, SkScalar* xpos) {
|
| ///////////////////////////////////////////////////////////////////////////////
|
|
|
| bool SkPaint::nothingToDraw() const {
|
| - if (fLooper) {
|
| + if (this->getLooper()) {
|
| return false;
|
| }
|
| SkXfermode::Mode mode;
|
| - if (SkXfermode::AsMode(fXfermode, &mode)) {
|
| + if (SkXfermode::AsMode(this->getXfermode(), &mode)) {
|
| switch (mode) {
|
| case SkXfermode::kSrcOver_Mode:
|
| case SkXfermode::kSrcATop_Mode:
|
| @@ -2643,7 +2646,7 @@ bool SkPaint::nothingToDraw() const {
|
| }
|
|
|
| void SkPaint::setBitfields(uint32_t bitfields) {
|
| - fBitfields = bitfields;
|
| + fParts.fBitfields = bitfields;
|
| }
|
|
|
| inline static unsigned popcount(uint8_t x) {
|
|
|