diff --git a/include/core/SkPaint.h b/include/core/SkPaint.h index e86d01195c..7a647f0ea2 100644 --- a/include/core/SkPaint.h +++ b/include/core/SkPaint.h @@ -1046,10 +1046,6 @@ public: private: SkTypeface* fTypeface; - SkScalar fTextSize; - SkScalar fTextScaleX; - SkScalar fTextSkewX; - SkPathEffect* fPathEffect; SkShader* fShader; SkXfermode* fXfermode; @@ -1060,10 +1056,12 @@ private: SkImageFilter* fImageFilter; SkAnnotation* fAnnotation; + SkScalar fTextSize; + SkScalar fTextScaleX; + SkScalar fTextSkewX; SkColor fColor; SkScalar fWidth; SkScalar fMiterLimit; - union { struct { // all of these bitfields should add up to 32 @@ -1078,11 +1076,11 @@ private: }; uint32_t fBitfields; }; + uint32_t fDirtyBits; + uint32_t getBitfields() const { return fBitfields; } void setBitfields(uint32_t bitfields); - uint32_t fDirtyBits; - SkDrawCacheProc getDrawCacheProc() const; SkMeasureCacheProc getMeasureCacheProc(TextBufferDirection dir, bool needFullMetrics) const; diff --git a/src/core/SkPaint.cpp b/src/core/SkPaint.cpp index 2449ed6793..bc8df2716b 100644 --- a/src/core/SkPaint.cpp +++ b/src/core/SkPaint.cpp @@ -108,22 +108,35 @@ SkPaint::SkPaint() { } SkPaint::SkPaint(const SkPaint& src) { - memcpy(this, &src, sizeof(src)); +#define COPY(field) field = src.field +#define REF_COPY(field) field = SkSafeRef(src.field) + REF_COPY(fTypeface); + REF_COPY(fPathEffect); + REF_COPY(fShader); + REF_COPY(fXfermode); + REF_COPY(fMaskFilter); + REF_COPY(fColorFilter); + REF_COPY(fRasterizer); + REF_COPY(fLooper); + REF_COPY(fImageFilter); + REF_COPY(fAnnotation); - SkSafeRef(fTypeface); - SkSafeRef(fPathEffect); - SkSafeRef(fShader); - SkSafeRef(fXfermode); - SkSafeRef(fMaskFilter); - SkSafeRef(fColorFilter); - SkSafeRef(fRasterizer); - SkSafeRef(fLooper); - SkSafeRef(fImageFilter); - SkSafeRef(fAnnotation); + COPY(fTextSize); + COPY(fTextScaleX); + COPY(fTextSkewX); + COPY(fColor); + COPY(fWidth); + COPY(fMiterLimit); + COPY(fBitfields); + COPY(fDirtyBits); #ifdef SK_BUILD_FOR_ANDROID new (&fPaintOptionsAndroid) SkPaintOptionsAndroid(src.fPaintOptionsAndroid); + COPY(fGenerationID); #endif + +#undef COPY +#undef REF_COPY } SkPaint::~SkPaint() { diff --git a/tests/PaintTest.cpp b/tests/PaintTest.cpp index e7954b9136..f28dbe40e1 100644 --- a/tests/PaintTest.cpp +++ b/tests/PaintTest.cpp @@ -59,7 +59,11 @@ static int find_first_zero(const uint16_t glyphs[], int count) { return count; } -static void test_cmap(skiatest::Reporter* reporter) { +DEF_TEST(Paint_cmap, reporter) { + // need to implement charsToGlyphs on other backends (e.g. linux, win) + // before we can run this tests everywhere + return; + static const int NGLYPHS = 64; SkUnichar src[NGLYPHS]; @@ -113,7 +117,7 @@ static void test_cmap(skiatest::Reporter* reporter) { } // temparary api for bicubic, just be sure we can set/clear it -static void test_filterlevel(skiatest::Reporter* reporter) { +DEF_TEST(Paint_filterlevel, reporter) { SkPaint p0, p1; REPORTER_ASSERT(reporter, @@ -137,7 +141,7 @@ static void test_filterlevel(skiatest::Reporter* reporter) { } } -static void test_copy(skiatest::Reporter* reporter) { +DEF_TEST(Paint_copy, reporter) { SkPaint paint; // set a few member variables paint.setStyle(SkPaint::kStrokeAndFill_Style); @@ -192,7 +196,7 @@ static void test_copy(skiatest::Reporter* reporter) { // found and fixed for webkit: mishandling when we hit recursion limit on // mostly degenerate cubic flatness test -static void regression_cubic(skiatest::Reporter* reporter) { +DEF_TEST(Paint_regression_cubic, reporter) { SkPath path, stroke; SkPaint paint; @@ -225,7 +229,7 @@ static void regression_cubic(skiatest::Reporter* reporter) { } // found and fixed for android: not initializing rect for string's of length 0 -static void regression_measureText(skiatest::Reporter* reporter) { +DEF_TEST(Paint_regression_measureText, reporter) { SkPaint paint; paint.setTextSize(12.0f); @@ -238,23 +242,6 @@ static void regression_measureText(skiatest::Reporter* reporter) { REPORTER_ASSERT(reporter, r.isEmpty()); } -DEF_TEST(Paint, reporter) { - // TODO add general paint tests - test_copy(reporter); - - // regression tests - regression_cubic(reporter); - regression_measureText(reporter); - - test_filterlevel(reporter); - - // need to implement charsToGlyphs on other backends (e.g. linux, win) - // before we can run this tests everywhere - if (false) { - test_cmap(reporter); - } -} - #define ASSERT(expr) REPORTER_ASSERT(r, expr) DEF_TEST(Paint_FlatteningTraits, r) {