PaintTest.cpp revision b7061176c7f414616fe2e79e832b3e0abe326af6
1ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com/*
2ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Copyright 2011 Google Inc.
3ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com *
4ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Use of this source code is governed by a BSD-style license that can be
5ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * found in the LICENSE file.
6ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com */
7bcb42aecf1bdb9ae80d766d203b4f636b954cf03reed@google.com
8a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com#include "Test.h"
9b7061176c7f414616fe2e79e832b3e0abe326af6robertphillips@google.com#include "SkBlurMask.h"
10b7061176c7f414616fe2e79e832b3e0abe326af6robertphillips@google.com#include "SkBlurMaskFilter.h"
11b7061176c7f414616fe2e79e832b3e0abe326af6robertphillips@google.com#include "SkLayerDrawLooper.h"
12a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com#include "SkPath.h"
13a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com#include "SkPaint.h"
14bcb42aecf1bdb9ae80d766d203b4f636b954cf03reed@google.com#include "SkRandom.h"
15bcb42aecf1bdb9ae80d766d203b4f636b954cf03reed@google.com#include "SkTypeface.h"
16bcb42aecf1bdb9ae80d766d203b4f636b954cf03reed@google.com#include "SkUtils.h"
17bcb42aecf1bdb9ae80d766d203b4f636b954cf03reed@google.com
18bcb42aecf1bdb9ae80d766d203b4f636b954cf03reed@google.comstatic size_t uni_to_utf8(const SkUnichar src[], void* dst, int count) {
19bcb42aecf1bdb9ae80d766d203b4f636b954cf03reed@google.com    char* u8 = (char*)dst;
20bcb42aecf1bdb9ae80d766d203b4f636b954cf03reed@google.com    for (int i = 0; i < count; ++i) {
21bcb42aecf1bdb9ae80d766d203b4f636b954cf03reed@google.com        int n = SkUTF8_FromUnichar(src[i], u8);
22bcb42aecf1bdb9ae80d766d203b4f636b954cf03reed@google.com        u8 += n;
23bcb42aecf1bdb9ae80d766d203b4f636b954cf03reed@google.com    }
24bcb42aecf1bdb9ae80d766d203b4f636b954cf03reed@google.com    return u8 - (char*)dst;
25bcb42aecf1bdb9ae80d766d203b4f636b954cf03reed@google.com}
26bcb42aecf1bdb9ae80d766d203b4f636b954cf03reed@google.com
27bcb42aecf1bdb9ae80d766d203b4f636b954cf03reed@google.comstatic size_t uni_to_utf16(const SkUnichar src[], void* dst, int count) {
28bcb42aecf1bdb9ae80d766d203b4f636b954cf03reed@google.com    uint16_t* u16 = (uint16_t*)dst;
29bcb42aecf1bdb9ae80d766d203b4f636b954cf03reed@google.com    for (int i = 0; i < count; ++i) {
30bcb42aecf1bdb9ae80d766d203b4f636b954cf03reed@google.com        int n = SkUTF16_FromUnichar(src[i], u16);
31bcb42aecf1bdb9ae80d766d203b4f636b954cf03reed@google.com        u16 += n;
32bcb42aecf1bdb9ae80d766d203b4f636b954cf03reed@google.com    }
33bcb42aecf1bdb9ae80d766d203b4f636b954cf03reed@google.com    return (char*)u16 - (char*)dst;
34bcb42aecf1bdb9ae80d766d203b4f636b954cf03reed@google.com}
35bcb42aecf1bdb9ae80d766d203b4f636b954cf03reed@google.com
36bcb42aecf1bdb9ae80d766d203b4f636b954cf03reed@google.comstatic size_t uni_to_utf32(const SkUnichar src[], void* dst, int count) {
37bcb42aecf1bdb9ae80d766d203b4f636b954cf03reed@google.com    SkUnichar* u32 = (SkUnichar*)dst;
38bcb42aecf1bdb9ae80d766d203b4f636b954cf03reed@google.com    if (src != u32) {
39bcb42aecf1bdb9ae80d766d203b4f636b954cf03reed@google.com        memcpy(u32, src, count * sizeof(SkUnichar));
40bcb42aecf1bdb9ae80d766d203b4f636b954cf03reed@google.com    }
41bcb42aecf1bdb9ae80d766d203b4f636b954cf03reed@google.com    return count * sizeof(SkUnichar);
42bcb42aecf1bdb9ae80d766d203b4f636b954cf03reed@google.com}
43bcb42aecf1bdb9ae80d766d203b4f636b954cf03reed@google.com
44bcb42aecf1bdb9ae80d766d203b4f636b954cf03reed@google.comstatic SkTypeface::Encoding paint2encoding(const SkPaint& paint) {
45bcb42aecf1bdb9ae80d766d203b4f636b954cf03reed@google.com    SkPaint::TextEncoding enc = paint.getTextEncoding();
46bcb42aecf1bdb9ae80d766d203b4f636b954cf03reed@google.com    SkASSERT(SkPaint::kGlyphID_TextEncoding != enc);
47bcb42aecf1bdb9ae80d766d203b4f636b954cf03reed@google.com    return (SkTypeface::Encoding)enc;
48bcb42aecf1bdb9ae80d766d203b4f636b954cf03reed@google.com}
49bcb42aecf1bdb9ae80d766d203b4f636b954cf03reed@google.com
50bcb42aecf1bdb9ae80d766d203b4f636b954cf03reed@google.comstatic int find_first_zero(const uint16_t glyphs[], int count) {
51bcb42aecf1bdb9ae80d766d203b4f636b954cf03reed@google.com    for (int i = 0; i < count; ++i) {
52bcb42aecf1bdb9ae80d766d203b4f636b954cf03reed@google.com        if (0 == glyphs[i]) {
53bcb42aecf1bdb9ae80d766d203b4f636b954cf03reed@google.com            return i;
54bcb42aecf1bdb9ae80d766d203b4f636b954cf03reed@google.com        }
55bcb42aecf1bdb9ae80d766d203b4f636b954cf03reed@google.com    }
56bcb42aecf1bdb9ae80d766d203b4f636b954cf03reed@google.com    return count;
57bcb42aecf1bdb9ae80d766d203b4f636b954cf03reed@google.com}
58bcb42aecf1bdb9ae80d766d203b4f636b954cf03reed@google.com
59bcb42aecf1bdb9ae80d766d203b4f636b954cf03reed@google.comstatic void test_cmap(skiatest::Reporter* reporter) {
60bcb42aecf1bdb9ae80d766d203b4f636b954cf03reed@google.com    static const int NGLYPHS = 64;
61bcb42aecf1bdb9ae80d766d203b4f636b954cf03reed@google.com
62bcb42aecf1bdb9ae80d766d203b4f636b954cf03reed@google.com    SkUnichar src[NGLYPHS];
63bcb42aecf1bdb9ae80d766d203b4f636b954cf03reed@google.com    SkUnichar dst[NGLYPHS]; // used for utf8, utf16, utf32 storage
64bcb42aecf1bdb9ae80d766d203b4f636b954cf03reed@google.com
65bcb42aecf1bdb9ae80d766d203b4f636b954cf03reed@google.com    static const struct {
66bcb42aecf1bdb9ae80d766d203b4f636b954cf03reed@google.com        size_t (*fSeedTextProc)(const SkUnichar[], void* dst, int count);
67bcb42aecf1bdb9ae80d766d203b4f636b954cf03reed@google.com        SkPaint::TextEncoding   fEncoding;
68bcb42aecf1bdb9ae80d766d203b4f636b954cf03reed@google.com    } gRec[] = {
69bcb42aecf1bdb9ae80d766d203b4f636b954cf03reed@google.com        { uni_to_utf8,  SkPaint::kUTF8_TextEncoding },
70bcb42aecf1bdb9ae80d766d203b4f636b954cf03reed@google.com        { uni_to_utf16, SkPaint::kUTF16_TextEncoding },
71bcb42aecf1bdb9ae80d766d203b4f636b954cf03reed@google.com        { uni_to_utf32, SkPaint::kUTF32_TextEncoding },
72bcb42aecf1bdb9ae80d766d203b4f636b954cf03reed@google.com    };
73bcb42aecf1bdb9ae80d766d203b4f636b954cf03reed@google.com
74bcb42aecf1bdb9ae80d766d203b4f636b954cf03reed@google.com    SkRandom rand;
75bcb42aecf1bdb9ae80d766d203b4f636b954cf03reed@google.com    SkPaint paint;
76bcb42aecf1bdb9ae80d766d203b4f636b954cf03reed@google.com    paint.setTypeface(SkTypeface::RefDefault())->unref();
77bcb42aecf1bdb9ae80d766d203b4f636b954cf03reed@google.com    SkTypeface* face = paint.getTypeface();
78bcb42aecf1bdb9ae80d766d203b4f636b954cf03reed@google.com
79bcb42aecf1bdb9ae80d766d203b4f636b954cf03reed@google.com    for (int i = 0; i < 1000; ++i) {
80bcb42aecf1bdb9ae80d766d203b4f636b954cf03reed@google.com        // generate some random text
81bcb42aecf1bdb9ae80d766d203b4f636b954cf03reed@google.com        for (int j = 0; j < NGLYPHS; ++j) {
82bcb42aecf1bdb9ae80d766d203b4f636b954cf03reed@google.com            src[j] = ' ' + j;
83bcb42aecf1bdb9ae80d766d203b4f636b954cf03reed@google.com        }
84bcb42aecf1bdb9ae80d766d203b4f636b954cf03reed@google.com        // inject some random chars, to sometimes abort early
85bcb42aecf1bdb9ae80d766d203b4f636b954cf03reed@google.com        src[rand.nextU() & 63] = rand.nextU() & 0xFFF;
8698a196770cc7b9914ad68367c5b06829a5e0b440skia.committer@gmail.com
87bcb42aecf1bdb9ae80d766d203b4f636b954cf03reed@google.com        for (size_t k = 0; k < SK_ARRAY_COUNT(gRec); ++k) {
88bcb42aecf1bdb9ae80d766d203b4f636b954cf03reed@google.com            paint.setTextEncoding(gRec[k].fEncoding);
89bcb42aecf1bdb9ae80d766d203b4f636b954cf03reed@google.com
90bcb42aecf1bdb9ae80d766d203b4f636b954cf03reed@google.com            size_t len = gRec[k].fSeedTextProc(src, dst, NGLYPHS);
9198a196770cc7b9914ad68367c5b06829a5e0b440skia.committer@gmail.com
92bcb42aecf1bdb9ae80d766d203b4f636b954cf03reed@google.com            uint16_t    glyphs0[NGLYPHS], glyphs1[NGLYPHS];
9398a196770cc7b9914ad68367c5b06829a5e0b440skia.committer@gmail.com
94bcb42aecf1bdb9ae80d766d203b4f636b954cf03reed@google.com            bool contains = paint.containsText(dst, len);
95bcb42aecf1bdb9ae80d766d203b4f636b954cf03reed@google.com            int nglyphs = paint.textToGlyphs(dst, len, glyphs0);
96bcb42aecf1bdb9ae80d766d203b4f636b954cf03reed@google.com            int first = face->charsToGlyphs(dst, paint2encoding(paint), glyphs1, NGLYPHS);
97bcb42aecf1bdb9ae80d766d203b4f636b954cf03reed@google.com            int index = find_first_zero(glyphs1, NGLYPHS);
98bcb42aecf1bdb9ae80d766d203b4f636b954cf03reed@google.com
99bcb42aecf1bdb9ae80d766d203b4f636b954cf03reed@google.com            REPORTER_ASSERT(reporter, NGLYPHS == nglyphs);
100bcb42aecf1bdb9ae80d766d203b4f636b954cf03reed@google.com            REPORTER_ASSERT(reporter, index == first);
101bcb42aecf1bdb9ae80d766d203b4f636b954cf03reed@google.com            REPORTER_ASSERT(reporter,
102bcb42aecf1bdb9ae80d766d203b4f636b954cf03reed@google.com                        !memcmp(glyphs0, glyphs1, NGLYPHS * sizeof(uint16_t)));
103bcb42aecf1bdb9ae80d766d203b4f636b954cf03reed@google.com            if (contains) {
104bcb42aecf1bdb9ae80d766d203b4f636b954cf03reed@google.com                REPORTER_ASSERT(reporter, NGLYPHS == first);
105bcb42aecf1bdb9ae80d766d203b4f636b954cf03reed@google.com            } else {
106bcb42aecf1bdb9ae80d766d203b4f636b954cf03reed@google.com                REPORTER_ASSERT(reporter, NGLYPHS > first);
107bcb42aecf1bdb9ae80d766d203b4f636b954cf03reed@google.com            }
108bcb42aecf1bdb9ae80d766d203b4f636b954cf03reed@google.com        }
109bcb42aecf1bdb9ae80d766d203b4f636b954cf03reed@google.com    }
110bcb42aecf1bdb9ae80d766d203b4f636b954cf03reed@google.com}
111b44cd65a53fa016a238e2bd3d01b5434dbc05da3djsollen@google.com
11225b3bd58dfaf0d1704c48ed3a50e1482fd336e62reed@google.com// temparary api for bicubic, just be sure we can set/clear it
1139cfc83cc8ac2ee50a7ce889e65a707941f48bdeareed@google.comstatic void test_filterlevel(skiatest::Reporter* reporter) {
1149cfc83cc8ac2ee50a7ce889e65a707941f48bdeareed@google.com    SkPaint p0, p1;
1155c561cb8d8151d38c69128345106cbf225033a1askia.committer@gmail.com
1169cfc83cc8ac2ee50a7ce889e65a707941f48bdeareed@google.com    REPORTER_ASSERT(reporter,
1179cfc83cc8ac2ee50a7ce889e65a707941f48bdeareed@google.com                    SkPaint::kNone_FilterLevel == p0.getFilterLevel());
1185c561cb8d8151d38c69128345106cbf225033a1askia.committer@gmail.com
1199cfc83cc8ac2ee50a7ce889e65a707941f48bdeareed@google.com    static const SkPaint::FilterLevel gLevels[] = {
1209cfc83cc8ac2ee50a7ce889e65a707941f48bdeareed@google.com        SkPaint::kNone_FilterLevel,
1219cfc83cc8ac2ee50a7ce889e65a707941f48bdeareed@google.com        SkPaint::kLow_FilterLevel,
1229cfc83cc8ac2ee50a7ce889e65a707941f48bdeareed@google.com        SkPaint::kMedium_FilterLevel,
1239cfc83cc8ac2ee50a7ce889e65a707941f48bdeareed@google.com        SkPaint::kHigh_FilterLevel
1249cfc83cc8ac2ee50a7ce889e65a707941f48bdeareed@google.com    };
1259cfc83cc8ac2ee50a7ce889e65a707941f48bdeareed@google.com    for (size_t i = 0; i < SK_ARRAY_COUNT(gLevels); ++i) {
1269cfc83cc8ac2ee50a7ce889e65a707941f48bdeareed@google.com        p0.setFilterLevel(gLevels[i]);
1279cfc83cc8ac2ee50a7ce889e65a707941f48bdeareed@google.com        REPORTER_ASSERT(reporter, gLevels[i] == p0.getFilterLevel());
1289cfc83cc8ac2ee50a7ce889e65a707941f48bdeareed@google.com        p1 = p0;
1299cfc83cc8ac2ee50a7ce889e65a707941f48bdeareed@google.com        REPORTER_ASSERT(reporter, gLevels[i] == p1.getFilterLevel());
1309cfc83cc8ac2ee50a7ce889e65a707941f48bdeareed@google.com
1319cfc83cc8ac2ee50a7ce889e65a707941f48bdeareed@google.com        p0.reset();
1329cfc83cc8ac2ee50a7ce889e65a707941f48bdeareed@google.com        REPORTER_ASSERT(reporter,
1339cfc83cc8ac2ee50a7ce889e65a707941f48bdeareed@google.com                        SkPaint::kNone_FilterLevel == p0.getFilterLevel());
1349cfc83cc8ac2ee50a7ce889e65a707941f48bdeareed@google.com    }
13525b3bd58dfaf0d1704c48ed3a50e1482fd336e62reed@google.com}
13625b3bd58dfaf0d1704c48ed3a50e1482fd336e62reed@google.com
137b44cd65a53fa016a238e2bd3d01b5434dbc05da3djsollen@google.comstatic void test_copy(skiatest::Reporter* reporter) {
138b44cd65a53fa016a238e2bd3d01b5434dbc05da3djsollen@google.com    SkPaint paint;
139b44cd65a53fa016a238e2bd3d01b5434dbc05da3djsollen@google.com    // set a few member variables
140b44cd65a53fa016a238e2bd3d01b5434dbc05da3djsollen@google.com    paint.setStyle(SkPaint::kStrokeAndFill_Style);
141b44cd65a53fa016a238e2bd3d01b5434dbc05da3djsollen@google.com    paint.setTextAlign(SkPaint::kLeft_Align);
142b44cd65a53fa016a238e2bd3d01b5434dbc05da3djsollen@google.com    paint.setStrokeWidth(SkIntToScalar(2));
143b44cd65a53fa016a238e2bd3d01b5434dbc05da3djsollen@google.com    // set a few pointers
144b44cd65a53fa016a238e2bd3d01b5434dbc05da3djsollen@google.com    SkLayerDrawLooper* looper = new SkLayerDrawLooper();
145b44cd65a53fa016a238e2bd3d01b5434dbc05da3djsollen@google.com    paint.setLooper(looper)->unref();
146b7061176c7f414616fe2e79e832b3e0abe326af6robertphillips@google.com    SkMaskFilter* mask = SkBlurMaskFilter::Create(SkBlurMaskFilter::kNormal_BlurStyle,
147b7061176c7f414616fe2e79e832b3e0abe326af6robertphillips@google.com                                      SkBlurMask::ConvertRadiusToSigma(SkIntToScalar(1)));
148b44cd65a53fa016a238e2bd3d01b5434dbc05da3djsollen@google.com    paint.setMaskFilter(mask)->unref();
149b44cd65a53fa016a238e2bd3d01b5434dbc05da3djsollen@google.com
150b44cd65a53fa016a238e2bd3d01b5434dbc05da3djsollen@google.com    // copy the paint using the copy constructor and check they are the same
151b44cd65a53fa016a238e2bd3d01b5434dbc05da3djsollen@google.com    SkPaint copiedPaint = paint;
152b265741cc17f897b349caacdb890119e4111a415robertphillips@google.com    REPORTER_ASSERT(reporter, paint == copiedPaint);
153b44cd65a53fa016a238e2bd3d01b5434dbc05da3djsollen@google.com
154b44cd65a53fa016a238e2bd3d01b5434dbc05da3djsollen@google.com#ifdef SK_BUILD_FOR_ANDROID
155b44cd65a53fa016a238e2bd3d01b5434dbc05da3djsollen@google.com    // the copy constructor should preserve the Generation ID
156efbe8e9bedda21a3e061ebf3d96431a0f250a654djsollen@google.com    uint32_t paintGenID = paint.getGenerationID();
157efbe8e9bedda21a3e061ebf3d96431a0f250a654djsollen@google.com    uint32_t copiedPaintGenID = copiedPaint.getGenerationID();
158b44cd65a53fa016a238e2bd3d01b5434dbc05da3djsollen@google.com    REPORTER_ASSERT(reporter, paintGenID == copiedPaintGenID);
159b265741cc17f897b349caacdb890119e4111a415robertphillips@google.com    REPORTER_ASSERT(reporter, !memcmp(&paint, &copiedPaint, sizeof(paint)));
160b44cd65a53fa016a238e2bd3d01b5434dbc05da3djsollen@google.com#endif
161b44cd65a53fa016a238e2bd3d01b5434dbc05da3djsollen@google.com
162b44cd65a53fa016a238e2bd3d01b5434dbc05da3djsollen@google.com    // copy the paint using the equal operator and check they are the same
163b44cd65a53fa016a238e2bd3d01b5434dbc05da3djsollen@google.com    copiedPaint = paint;
164b265741cc17f897b349caacdb890119e4111a415robertphillips@google.com    REPORTER_ASSERT(reporter, paint == copiedPaint);
165b44cd65a53fa016a238e2bd3d01b5434dbc05da3djsollen@google.com
166b44cd65a53fa016a238e2bd3d01b5434dbc05da3djsollen@google.com#ifdef SK_BUILD_FOR_ANDROID
167b44cd65a53fa016a238e2bd3d01b5434dbc05da3djsollen@google.com    // the equals operator should increment the Generation ID
168b44cd65a53fa016a238e2bd3d01b5434dbc05da3djsollen@google.com    REPORTER_ASSERT(reporter, paint.getGenerationID() == paintGenID);
169b44cd65a53fa016a238e2bd3d01b5434dbc05da3djsollen@google.com    REPORTER_ASSERT(reporter, copiedPaint.getGenerationID() != copiedPaintGenID);
170b44cd65a53fa016a238e2bd3d01b5434dbc05da3djsollen@google.com    copiedPaintGenID = copiedPaint.getGenerationID(); // reset to the new value
171b44cd65a53fa016a238e2bd3d01b5434dbc05da3djsollen@google.com    REPORTER_ASSERT(reporter, memcmp(&paint, &copiedPaint, sizeof(paint)));
172b44cd65a53fa016a238e2bd3d01b5434dbc05da3djsollen@google.com#endif
173b44cd65a53fa016a238e2bd3d01b5434dbc05da3djsollen@google.com
174b44cd65a53fa016a238e2bd3d01b5434dbc05da3djsollen@google.com    // clean the paint and check they are back to their initial states
175b44cd65a53fa016a238e2bd3d01b5434dbc05da3djsollen@google.com    SkPaint cleanPaint;
176b44cd65a53fa016a238e2bd3d01b5434dbc05da3djsollen@google.com    paint.reset();
177b44cd65a53fa016a238e2bd3d01b5434dbc05da3djsollen@google.com    copiedPaint.reset();
178b265741cc17f897b349caacdb890119e4111a415robertphillips@google.com    REPORTER_ASSERT(reporter, cleanPaint == paint);
179b265741cc17f897b349caacdb890119e4111a415robertphillips@google.com    REPORTER_ASSERT(reporter, cleanPaint == copiedPaint);
180b44cd65a53fa016a238e2bd3d01b5434dbc05da3djsollen@google.com
181b44cd65a53fa016a238e2bd3d01b5434dbc05da3djsollen@google.com#ifdef SK_BUILD_FOR_ANDROID
182b44cd65a53fa016a238e2bd3d01b5434dbc05da3djsollen@google.com    // the reset function should increment the Generation ID
183b44cd65a53fa016a238e2bd3d01b5434dbc05da3djsollen@google.com    REPORTER_ASSERT(reporter, paint.getGenerationID() != paintGenID);
184b44cd65a53fa016a238e2bd3d01b5434dbc05da3djsollen@google.com    REPORTER_ASSERT(reporter, copiedPaint.getGenerationID() != copiedPaintGenID);
185b44cd65a53fa016a238e2bd3d01b5434dbc05da3djsollen@google.com    REPORTER_ASSERT(reporter, memcmp(&cleanPaint, &paint, sizeof(cleanPaint)));
186b44cd65a53fa016a238e2bd3d01b5434dbc05da3djsollen@google.com    REPORTER_ASSERT(reporter, memcmp(&cleanPaint, &copiedPaint, sizeof(cleanPaint)));
187b44cd65a53fa016a238e2bd3d01b5434dbc05da3djsollen@google.com#endif
188b44cd65a53fa016a238e2bd3d01b5434dbc05da3djsollen@google.com}
189a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com
190a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com// found and fixed for webkit: mishandling when we hit recursion limit on
191a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com// mostly degenerate cubic flatness test
192a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.comstatic void regression_cubic(skiatest::Reporter* reporter) {
193a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com    SkPath path, stroke;
194a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com    SkPaint paint;
195a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com
1966853e808a464ca75ff1328338d1eb55ff27c4337robertphillips@google.com    path.moveTo(SkFloatToScalar(460.2881309415525f),
1976853e808a464ca75ff1328338d1eb55ff27c4337robertphillips@google.com                SkFloatToScalar(303.250847066498f));
1986853e808a464ca75ff1328338d1eb55ff27c4337robertphillips@google.com    path.cubicTo(SkFloatToScalar(463.36378422175284f),
1996853e808a464ca75ff1328338d1eb55ff27c4337robertphillips@google.com                 SkFloatToScalar(302.1169735073363f),
2006853e808a464ca75ff1328338d1eb55ff27c4337robertphillips@google.com                 SkFloatToScalar(456.32239330810046f),
2016853e808a464ca75ff1328338d1eb55ff27c4337robertphillips@google.com                 SkFloatToScalar(304.720354932878f),
2026853e808a464ca75ff1328338d1eb55ff27c4337robertphillips@google.com                 SkFloatToScalar(453.15255460013304f),
2036853e808a464ca75ff1328338d1eb55ff27c4337robertphillips@google.com                 SkFloatToScalar(305.788586869862f));
204d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com
205a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com    SkRect fillR, strokeR;
206a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com    fillR = path.getBounds();
207a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com
208a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com    paint.setStyle(SkPaint::kStroke_Style);
209a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com    paint.setStrokeWidth(SkIntToScalar(2));
210a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com    paint.getFillPath(path, &stroke);
211a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com    strokeR = stroke.getBounds();
212a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com
213a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com    SkRect maxR = fillR;
214a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com    SkScalar miter = SkMaxScalar(SK_Scalar1, paint.getStrokeMiter());
215a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com    SkScalar inset = paint.getStrokeJoin() == SkPaint::kMiter_Join ?
216a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com                            SkScalarMul(paint.getStrokeWidth(), miter) :
217a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com                            paint.getStrokeWidth();
218a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com    maxR.inset(-inset, -inset);
219a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com
220a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com    // test that our stroke didn't explode
221a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com    REPORTER_ASSERT(reporter, maxR.contains(strokeR));
222a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com}
223a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com
22446348e21732e64e1a4dcfb5d859e6edafba471ffdjsollen@google.com// found and fixed for android: not initializing rect for string's of length 0
22546348e21732e64e1a4dcfb5d859e6edafba471ffdjsollen@google.comstatic void regression_measureText(skiatest::Reporter* reporter) {
22646348e21732e64e1a4dcfb5d859e6edafba471ffdjsollen@google.com
22746348e21732e64e1a4dcfb5d859e6edafba471ffdjsollen@google.com    SkPaint paint;
22846348e21732e64e1a4dcfb5d859e6edafba471ffdjsollen@google.com    paint.setTextSize(SkFloatToScalar(12.0f));
22946348e21732e64e1a4dcfb5d859e6edafba471ffdjsollen@google.com
23046348e21732e64e1a4dcfb5d859e6edafba471ffdjsollen@google.com    SkRect r;
23146348e21732e64e1a4dcfb5d859e6edafba471ffdjsollen@google.com    r.setLTRB(SK_ScalarNaN, SK_ScalarNaN, SK_ScalarNaN, SK_ScalarNaN);
23246348e21732e64e1a4dcfb5d859e6edafba471ffdjsollen@google.com
23346348e21732e64e1a4dcfb5d859e6edafba471ffdjsollen@google.com    // test that the rect was reset
23446348e21732e64e1a4dcfb5d859e6edafba471ffdjsollen@google.com    paint.measureText("", 0, &r, SkFloatToScalar(1.0f));
23546348e21732e64e1a4dcfb5d859e6edafba471ffdjsollen@google.com    REPORTER_ASSERT(reporter, r.isEmpty());
23646348e21732e64e1a4dcfb5d859e6edafba471ffdjsollen@google.com}
23746348e21732e64e1a4dcfb5d859e6edafba471ffdjsollen@google.com
238a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.comstatic void TestPaint(skiatest::Reporter* reporter) {
239a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com    // TODO add general paint tests
240b44cd65a53fa016a238e2bd3d01b5434dbc05da3djsollen@google.com    test_copy(reporter);
241a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com
242a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com    // regression tests
243a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com    regression_cubic(reporter);
24446348e21732e64e1a4dcfb5d859e6edafba471ffdjsollen@google.com    regression_measureText(reporter);
24525b3bd58dfaf0d1704c48ed3a50e1482fd336e62reed@google.com
2469cfc83cc8ac2ee50a7ce889e65a707941f48bdeareed@google.com    test_filterlevel(reporter);
24798a196770cc7b9914ad68367c5b06829a5e0b440skia.committer@gmail.com
248bcb42aecf1bdb9ae80d766d203b4f636b954cf03reed@google.com    // need to implement charsToGlyphs on other backends (e.g. linux, win)
249c3eb56db6b88255be79d2daa210da1a6aba64051reed@google.com    // before we can run this tests everywhere
250c3eb56db6b88255be79d2daa210da1a6aba64051reed@google.com    if (false) {
251c3eb56db6b88255be79d2daa210da1a6aba64051reed@google.com       test_cmap(reporter);
252c3eb56db6b88255be79d2daa210da1a6aba64051reed@google.com    }
253a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com}
254a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com
255a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com#include "TestClassDef.h"
256a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.comDEFINE_TESTCLASS("Paint", TestPaintClass, TestPaint)
257