aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorGravatar commit-bot@chromium.org <commit-bot@chromium.org@2bbb7eff-a529-9590-31e7-b0007b416f81>2014-03-19 11:42:34 +0000
committerGravatar commit-bot@chromium.org <commit-bot@chromium.org@2bbb7eff-a529-9590-31e7-b0007b416f81>2014-03-19 11:42:34 +0000
commitfa4dc2c4cba94aec91142a24b4dc26c1dde56023 (patch)
tree2c069c95748b033349946195c3ddc17e44e67ee1
parent2002d881e80e0d56440ed2fc4da5f90bf2f0e0fb (diff)
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
-rw-r--r--include/core/SkPaint.h12
-rw-r--r--src/core/SkPaint.cpp35
-rw-r--r--tests/PaintTest.cpp31
3 files changed, 37 insertions, 41 deletions
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..c91ada9a3c 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 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) {