PaintTest.cpp revision b44cd65a53fa016a238e2bd3d01b5434dbc05da3
1ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com
2ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com/*
3ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Copyright 2011 Google Inc.
4ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com *
5ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Use of this source code is governed by a BSD-style license that can be
6ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * found in the LICENSE file.
7ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com */
8a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com#include "Test.h"
9a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com#include "SkPath.h"
10a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com#include "SkPaint.h"
11b44cd65a53fa016a238e2bd3d01b5434dbc05da3djsollen@google.com#include "SkLayerDrawLooper.h"
12b44cd65a53fa016a238e2bd3d01b5434dbc05da3djsollen@google.com#include "SkBlurMaskFilter.h"
13b44cd65a53fa016a238e2bd3d01b5434dbc05da3djsollen@google.com
14b44cd65a53fa016a238e2bd3d01b5434dbc05da3djsollen@google.comstatic void test_copy(skiatest::Reporter* reporter) {
15b44cd65a53fa016a238e2bd3d01b5434dbc05da3djsollen@google.com    SkPaint paint;
16b44cd65a53fa016a238e2bd3d01b5434dbc05da3djsollen@google.com    // set a few member variables
17b44cd65a53fa016a238e2bd3d01b5434dbc05da3djsollen@google.com    paint.setStyle(SkPaint::kStrokeAndFill_Style);
18b44cd65a53fa016a238e2bd3d01b5434dbc05da3djsollen@google.com    paint.setTextAlign(SkPaint::kLeft_Align);
19b44cd65a53fa016a238e2bd3d01b5434dbc05da3djsollen@google.com    paint.setStrokeWidth(SkIntToScalar(2));
20b44cd65a53fa016a238e2bd3d01b5434dbc05da3djsollen@google.com    // set a few pointers
21b44cd65a53fa016a238e2bd3d01b5434dbc05da3djsollen@google.com    SkLayerDrawLooper* looper = new SkLayerDrawLooper();
22b44cd65a53fa016a238e2bd3d01b5434dbc05da3djsollen@google.com    paint.setLooper(looper)->unref();
23b44cd65a53fa016a238e2bd3d01b5434dbc05da3djsollen@google.com    SkMaskFilter* mask = SkBlurMaskFilter::Create(1, SkBlurMaskFilter::kNormal_BlurStyle);
24b44cd65a53fa016a238e2bd3d01b5434dbc05da3djsollen@google.com    paint.setMaskFilter(mask)->unref();
25b44cd65a53fa016a238e2bd3d01b5434dbc05da3djsollen@google.com
26b44cd65a53fa016a238e2bd3d01b5434dbc05da3djsollen@google.com    // copy the paint using the copy constructor and check they are the same
27b44cd65a53fa016a238e2bd3d01b5434dbc05da3djsollen@google.com    SkPaint copiedPaint = paint;
28b44cd65a53fa016a238e2bd3d01b5434dbc05da3djsollen@google.com    REPORTER_ASSERT(reporter, paint == copiedPaint);
29b44cd65a53fa016a238e2bd3d01b5434dbc05da3djsollen@google.com
30b44cd65a53fa016a238e2bd3d01b5434dbc05da3djsollen@google.com#ifdef SK_BUILD_FOR_ANDROID
31b44cd65a53fa016a238e2bd3d01b5434dbc05da3djsollen@google.com    // the copy constructor should preserve the Generation ID
32b44cd65a53fa016a238e2bd3d01b5434dbc05da3djsollen@google.com    int32_t paintGenID = paint.getGenerationID();
33b44cd65a53fa016a238e2bd3d01b5434dbc05da3djsollen@google.com    int32_t copiedPaintGenID = copiedPaint.getGenerationID();
34b44cd65a53fa016a238e2bd3d01b5434dbc05da3djsollen@google.com    REPORTER_ASSERT(reporter, paintGenID == copiedPaintGenID);
35b44cd65a53fa016a238e2bd3d01b5434dbc05da3djsollen@google.com    REPORTER_ASSERT(reporter, !memcmp(&paint, &copiedPaint, sizeof(paint)));
36b44cd65a53fa016a238e2bd3d01b5434dbc05da3djsollen@google.com#endif
37b44cd65a53fa016a238e2bd3d01b5434dbc05da3djsollen@google.com
38b44cd65a53fa016a238e2bd3d01b5434dbc05da3djsollen@google.com    // copy the paint using the equal operator and check they are the same
39b44cd65a53fa016a238e2bd3d01b5434dbc05da3djsollen@google.com    copiedPaint = paint;
40b44cd65a53fa016a238e2bd3d01b5434dbc05da3djsollen@google.com    REPORTER_ASSERT(reporter, paint == copiedPaint);
41b44cd65a53fa016a238e2bd3d01b5434dbc05da3djsollen@google.com
42b44cd65a53fa016a238e2bd3d01b5434dbc05da3djsollen@google.com#ifdef SK_BUILD_FOR_ANDROID
43b44cd65a53fa016a238e2bd3d01b5434dbc05da3djsollen@google.com    // the equals operator should increment the Generation ID
44b44cd65a53fa016a238e2bd3d01b5434dbc05da3djsollen@google.com    REPORTER_ASSERT(reporter, paint.getGenerationID() == paintGenID);
45b44cd65a53fa016a238e2bd3d01b5434dbc05da3djsollen@google.com    REPORTER_ASSERT(reporter, copiedPaint.getGenerationID() != copiedPaintGenID);
46b44cd65a53fa016a238e2bd3d01b5434dbc05da3djsollen@google.com    copiedPaintGenID = copiedPaint.getGenerationID(); // reset to the new value
47b44cd65a53fa016a238e2bd3d01b5434dbc05da3djsollen@google.com    REPORTER_ASSERT(reporter, memcmp(&paint, &copiedPaint, sizeof(paint)));
48b44cd65a53fa016a238e2bd3d01b5434dbc05da3djsollen@google.com#endif
49b44cd65a53fa016a238e2bd3d01b5434dbc05da3djsollen@google.com
50b44cd65a53fa016a238e2bd3d01b5434dbc05da3djsollen@google.com    // clean the paint and check they are back to their initial states
51b44cd65a53fa016a238e2bd3d01b5434dbc05da3djsollen@google.com    SkPaint cleanPaint;
52b44cd65a53fa016a238e2bd3d01b5434dbc05da3djsollen@google.com    paint.reset();
53b44cd65a53fa016a238e2bd3d01b5434dbc05da3djsollen@google.com    copiedPaint.reset();
54b44cd65a53fa016a238e2bd3d01b5434dbc05da3djsollen@google.com    REPORTER_ASSERT(reporter, cleanPaint == paint);
55b44cd65a53fa016a238e2bd3d01b5434dbc05da3djsollen@google.com    REPORTER_ASSERT(reporter, cleanPaint == copiedPaint);
56b44cd65a53fa016a238e2bd3d01b5434dbc05da3djsollen@google.com
57b44cd65a53fa016a238e2bd3d01b5434dbc05da3djsollen@google.com#ifdef SK_BUILD_FOR_ANDROID
58b44cd65a53fa016a238e2bd3d01b5434dbc05da3djsollen@google.com    // the reset function should increment the Generation ID
59b44cd65a53fa016a238e2bd3d01b5434dbc05da3djsollen@google.com    REPORTER_ASSERT(reporter, paint.getGenerationID() != paintGenID);
60b44cd65a53fa016a238e2bd3d01b5434dbc05da3djsollen@google.com    REPORTER_ASSERT(reporter, copiedPaint.getGenerationID() != copiedPaintGenID);
61b44cd65a53fa016a238e2bd3d01b5434dbc05da3djsollen@google.com    REPORTER_ASSERT(reporter, memcmp(&cleanPaint, &paint, sizeof(cleanPaint)));
62b44cd65a53fa016a238e2bd3d01b5434dbc05da3djsollen@google.com    REPORTER_ASSERT(reporter, memcmp(&cleanPaint, &copiedPaint, sizeof(cleanPaint)));
63b44cd65a53fa016a238e2bd3d01b5434dbc05da3djsollen@google.com#endif
64b44cd65a53fa016a238e2bd3d01b5434dbc05da3djsollen@google.com}
65a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com
66a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com// found and fixed for webkit: mishandling when we hit recursion limit on
67a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com// mostly degenerate cubic flatness test
68a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.comstatic void regression_cubic(skiatest::Reporter* reporter) {
69a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com    SkPath path, stroke;
70a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com    SkPaint paint;
71a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com
72d41344553163085bfcfaf7d5882c6028934f8e3breed@android.com    path.moveTo(SkFloatToFixed(460.2881309415525f),
73d41344553163085bfcfaf7d5882c6028934f8e3breed@android.com                SkFloatToFixed(303.250847066498));
74d41344553163085bfcfaf7d5882c6028934f8e3breed@android.com    path.cubicTo(SkFloatToFixed(463.36378422175284),
75d41344553163085bfcfaf7d5882c6028934f8e3breed@android.com                 SkFloatToFixed(302.1169735073363),
76d41344553163085bfcfaf7d5882c6028934f8e3breed@android.com                 SkFloatToFixed(456.32239330810046),
77d41344553163085bfcfaf7d5882c6028934f8e3breed@android.com                 SkFloatToFixed(304.720354932878),
78d41344553163085bfcfaf7d5882c6028934f8e3breed@android.com                 SkFloatToFixed(453.15255460013304),
79d41344553163085bfcfaf7d5882c6028934f8e3breed@android.com                 SkFloatToFixed(305.788586869862));
80a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com
81a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com    SkRect fillR, strokeR;
82a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com    fillR = path.getBounds();
83a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com
84a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com    paint.setStyle(SkPaint::kStroke_Style);
85a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com    paint.setStrokeWidth(SkIntToScalar(2));
86a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com    paint.getFillPath(path, &stroke);
87a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com    strokeR = stroke.getBounds();
88a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com
89a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com    SkRect maxR = fillR;
90a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com    SkScalar miter = SkMaxScalar(SK_Scalar1, paint.getStrokeMiter());
91a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com    SkScalar inset = paint.getStrokeJoin() == SkPaint::kMiter_Join ?
92a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com                            SkScalarMul(paint.getStrokeWidth(), miter) :
93a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com                            paint.getStrokeWidth();
94a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com    maxR.inset(-inset, -inset);
95a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com
96a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com    // test that our stroke didn't explode
97a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com    REPORTER_ASSERT(reporter, maxR.contains(strokeR));
98a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com}
99a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com
100a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.comstatic void TestPaint(skiatest::Reporter* reporter) {
101a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com    // TODO add general paint tests
102b44cd65a53fa016a238e2bd3d01b5434dbc05da3djsollen@google.com    test_copy(reporter);
103a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com
104a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com    // regression tests
105a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com    regression_cubic(reporter);
106a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com}
107a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com
108a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com#include "TestClassDef.h"
109a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.comDEFINE_TESTCLASS("Paint", TestPaintClass, TestPaint)
110