SkPaint: eliminate some dead bytes in 64-bit build.
authorcommit-bot@chromium.org <commit-bot@chromium.org@2bbb7eff-a529-9590-31e7-b0007b416f81>
Thu, 20 Mar 2014 23:02:35 +0000 (23:02 +0000)
committercommit-bot@chromium.org <commit-bot@chromium.org@2bbb7eff-a529-9590-31e7-b0007b416f81>
Thu, 20 Mar 2014 23:02:35 +0000 (23:02 +0000)
+ memcpy-based copy constructor was hiding this gap -> manual copy constructor.
+ Split tests for finer-grained failures.

BUG=skia:

Committed: http://code.google.com/p/skia/source/detail?r=13856

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@13887 2bbb7eff-a529-9590-31e7-b0007b416f81

include/core/SkPaint.h
src/core/SkPaint.cpp
tests/PaintTest.cpp

index e86d01195c8e892d417c08b7d59b014af613e39e..7a647f0ea2aff89f998ac206656214099afeed32 100644 (file)
@@ -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;
index 2449ed6793c241fa55ce5c0dfccc77ec72a34a7a..bc8df2716b5ababef83402d2aefd04c3dd142641 100644 (file)
@@ -108,22 +108,35 @@ 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);
 
 #ifdef SK_BUILD_FOR_ANDROID
     new (&fPaintOptionsAndroid) SkPaintOptionsAndroid(src.fPaintOptionsAndroid);
+    COPY(fGenerationID);
 #endif
+
+#undef COPY
+#undef REF_COPY
 }
 
 SkPaint::~SkPaint() {
index e7954b913685aefa3b946a1e3e82d3a304e155db..f28dbe40e1661ce76c64db9400b4f429e757cd6f 100644 (file)
@@ -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) {