From fa4dc2c4cba94aec91142a24b4dc26c1dde56023 Mon Sep 17 00:00:00 2001 From: "commit-bot@chromium.org" Date: Wed, 19 Mar 2014 11:42:34 +0000 Subject: [PATCH] SkPaint: eliminate some dead bytes in 64-bit build. + memcpy-based copy constructor was hiding this gap -> manual copy constructor. + Split tests for finer-grained failures. BUG=skia: R=reed@google.com, mtklein@google.com Author: mtklein@chromium.org Review URL: https://codereview.chromium.org/203203003 git-svn-id: http://skia.googlecode.com/svn/trunk@13856 2bbb7eff-a529-9590-31e7-b0007b416f81 --- include/core/SkPaint.h | 12 +++++------- src/core/SkPaint.cpp | 35 +++++++++++++++++++++++------------ tests/PaintTest.cpp | 31 +++++++++---------------------- 3 files changed, 37 insertions(+), 41 deletions(-) diff --git a/include/core/SkPaint.h b/include/core/SkPaint.h index e86d011..7a647f0 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 2449ed6..c91ada9 100644 --- a/src/core/SkPaint.cpp +++ b/src/core/SkPaint.cpp @@ -108,18 +108,29 @@ SkPaint::SkPaint() { } SkPaint::SkPaint(const SkPaint& src) { - memcpy(this, &src, sizeof(src)); - - SkSafeRef(fTypeface); - SkSafeRef(fPathEffect); - SkSafeRef(fShader); - SkSafeRef(fXfermode); - SkSafeRef(fMaskFilter); - SkSafeRef(fColorFilter); - SkSafeRef(fRasterizer); - SkSafeRef(fLooper); - SkSafeRef(fImageFilter); - SkSafeRef(fAnnotation); +#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); + + COPY(fTextSize); + COPY(fTextScaleX); + COPY(fTextSkewX); + COPY(fColor); + COPY(fWidth); + COPY(fMiterLimit); + COPY(fBitfields); + COPY(fDirtyBits); +#undef COPY +#undef REF_COPY #ifdef SK_BUILD_FOR_ANDROID new (&fPaintOptionsAndroid) SkPaintOptionsAndroid(src.fPaintOptionsAndroid); diff --git a/tests/PaintTest.cpp b/tests/PaintTest.cpp index e7954b9..f28dbe4 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) { -- 2.7.4