1e805535b19e0e3d5459b69ed53d6986a1fe6663dreed@google.com/*
2e805535b19e0e3d5459b69ed53d6986a1fe6663dreed@google.com * Copyright 2011 Google Inc.
3e805535b19e0e3d5459b69ed53d6986a1fe6663dreed@google.com *
4e805535b19e0e3d5459b69ed53d6986a1fe6663dreed@google.com * Use of this source code is governed by a BSD-style license that can be
5e805535b19e0e3d5459b69ed53d6986a1fe6663dreed@google.com * found in the LICENSE file.
6e805535b19e0e3d5459b69ed53d6986a1fe6663dreed@google.com */
7e805535b19e0e3d5459b69ed53d6986a1fe6663dreed@google.com
8e805535b19e0e3d5459b69ed53d6986a1fe6663dreed@google.com#include "gm.h"
9e805535b19e0e3d5459b69ed53d6986a1fe6663dreed@google.com#include "SkCanvas.h"
10e805535b19e0e3d5459b69ed53d6986a1fe6663dreed@google.com#include "SkGradientShader.h"
11cb325ceda16fab97fd3281785e6ae10fcb8dcf83tomhudson@google.com#include "SkTypeface.h"
12e805535b19e0e3d5459b69ed53d6986a1fe6663dreed@google.com
13fb82300d1b41f21d1d154847b6bf3fb73d5b6f81reed@google.com// test shader w/ transparency
14e805535b19e0e3d5459b69ed53d6986a1fe6663dreed@google.comstatic SkShader* make_grad(SkScalar width) {
15fb82300d1b41f21d1d154847b6bf3fb73d5b6f81reed@google.com    SkColor colors[] = { SK_ColorRED, 0x0000FF00, SK_ColorBLUE };
16e805535b19e0e3d5459b69ed53d6986a1fe6663dreed@google.com    SkPoint pts[] = { { 0, 0 }, { width, 0 } };
17fb82300d1b41f21d1d154847b6bf3fb73d5b6f81reed@google.com    return SkGradientShader::CreateLinear(pts, colors, NULL,
18e805535b19e0e3d5459b69ed53d6986a1fe6663dreed@google.com                                          SK_ARRAY_COUNT(colors),
19e805535b19e0e3d5459b69ed53d6986a1fe6663dreed@google.com                                          SkShader::kMirror_TileMode);
20e805535b19e0e3d5459b69ed53d6986a1fe6663dreed@google.com}
21e805535b19e0e3d5459b69ed53d6986a1fe6663dreed@google.com
22fb82300d1b41f21d1d154847b6bf3fb73d5b6f81reed@google.com// test opaque shader
23e805535b19e0e3d5459b69ed53d6986a1fe6663dreed@google.comstatic SkShader* make_grad2(SkScalar width) {
24e805535b19e0e3d5459b69ed53d6986a1fe6663dreed@google.com    SkColor colors[] = { SK_ColorRED, SK_ColorGREEN, SK_ColorBLUE };
25e805535b19e0e3d5459b69ed53d6986a1fe6663dreed@google.com    SkPoint pts[] = { { 0, 0 }, { width, 0 } };
26e805535b19e0e3d5459b69ed53d6986a1fe6663dreed@google.com    return SkGradientShader::CreateLinear(pts, colors, NULL,
27e805535b19e0e3d5459b69ed53d6986a1fe6663dreed@google.com                                          SK_ARRAY_COUNT(colors),
28e805535b19e0e3d5459b69ed53d6986a1fe6663dreed@google.com                                          SkShader::kMirror_TileMode);
29e805535b19e0e3d5459b69ed53d6986a1fe6663dreed@google.com}
30e805535b19e0e3d5459b69ed53d6986a1fe6663dreed@google.com
31cb325ceda16fab97fd3281785e6ae10fcb8dcf83tomhudson@google.comstatic SkShader* make_chrome_solid() {
32cb325ceda16fab97fd3281785e6ae10fcb8dcf83tomhudson@google.com    SkColor colors[] = { SK_ColorGREEN, SK_ColorGREEN };
33cb325ceda16fab97fd3281785e6ae10fcb8dcf83tomhudson@google.com    SkPoint pts[] = { { 0, 0 }, { 1, 0 } };
34cb325ceda16fab97fd3281785e6ae10fcb8dcf83tomhudson@google.com    return SkGradientShader::CreateLinear(pts, colors, NULL, 2,
35cb325ceda16fab97fd3281785e6ae10fcb8dcf83tomhudson@google.com                                          SkShader::kClamp_TileMode);
36cb325ceda16fab97fd3281785e6ae10fcb8dcf83tomhudson@google.com}
37cb325ceda16fab97fd3281785e6ae10fcb8dcf83tomhudson@google.com
38e805535b19e0e3d5459b69ed53d6986a1fe6663dreed@google.comnamespace skiagm {
39ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com
40cb325ceda16fab97fd3281785e6ae10fcb8dcf83tomhudson@google.com// Replicate chrome layout test - clipped pathed gradient-shaded text
41cb325ceda16fab97fd3281785e6ae10fcb8dcf83tomhudson@google.comclass ChromeGradTextGM1 : public GM {
42cb325ceda16fab97fd3281785e6ae10fcb8dcf83tomhudson@google.compublic:
43cb325ceda16fab97fd3281785e6ae10fcb8dcf83tomhudson@google.com    ChromeGradTextGM1() { }
44cb325ceda16fab97fd3281785e6ae10fcb8dcf83tomhudson@google.comprotected:
45cb325ceda16fab97fd3281785e6ae10fcb8dcf83tomhudson@google.com
46cb325ceda16fab97fd3281785e6ae10fcb8dcf83tomhudson@google.com    virtual SkString onShortName() { return SkString("chrome_gradtext1"); }
47f539318f0d3dba743ec1886d5d9df0fb1be628a1tfarina    virtual SkISize onISize() { return SkISize::Make(500, 480); }
48cb325ceda16fab97fd3281785e6ae10fcb8dcf83tomhudson@google.com    virtual void onDraw(SkCanvas* canvas) {
49cb325ceda16fab97fd3281785e6ae10fcb8dcf83tomhudson@google.com        SkPaint paint;
50992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark        sk_tool_utils::set_portable_typeface(&paint);
51cb325ceda16fab97fd3281785e6ae10fcb8dcf83tomhudson@google.com        SkRect r = SkRect::MakeWH(SkIntToScalar(100), SkIntToScalar(100));
52cb325ceda16fab97fd3281785e6ae10fcb8dcf83tomhudson@google.com
53cb325ceda16fab97fd3281785e6ae10fcb8dcf83tomhudson@google.com        canvas->clipRect(r);
54cb325ceda16fab97fd3281785e6ae10fcb8dcf83tomhudson@google.com
55cb325ceda16fab97fd3281785e6ae10fcb8dcf83tomhudson@google.com        paint.setColor(SK_ColorRED);
56cb325ceda16fab97fd3281785e6ae10fcb8dcf83tomhudson@google.com        canvas->drawRect(r, paint);
57cb325ceda16fab97fd3281785e6ae10fcb8dcf83tomhudson@google.com
58cb325ceda16fab97fd3281785e6ae10fcb8dcf83tomhudson@google.com        // Minimal repro doesn't require AA, LCD, or a nondefault typeface
59cb325ceda16fab97fd3281785e6ae10fcb8dcf83tomhudson@google.com        paint.setShader(make_chrome_solid())->unref();
60cb325ceda16fab97fd3281785e6ae10fcb8dcf83tomhudson@google.com        paint.setTextSize(SkIntToScalar(500));
61cb325ceda16fab97fd3281785e6ae10fcb8dcf83tomhudson@google.com
62cb325ceda16fab97fd3281785e6ae10fcb8dcf83tomhudson@google.com        canvas->drawText("I", 1, 0, 100, paint);
63cb325ceda16fab97fd3281785e6ae10fcb8dcf83tomhudson@google.com    }
64cb325ceda16fab97fd3281785e6ae10fcb8dcf83tomhudson@google.comprivate:
65cb325ceda16fab97fd3281785e6ae10fcb8dcf83tomhudson@google.com    typedef GM INHERITED;
66cb325ceda16fab97fd3281785e6ae10fcb8dcf83tomhudson@google.com};
67cb325ceda16fab97fd3281785e6ae10fcb8dcf83tomhudson@google.com
68cb325ceda16fab97fd3281785e6ae10fcb8dcf83tomhudson@google.com
69cb325ceda16fab97fd3281785e6ae10fcb8dcf83tomhudson@google.com// Replicate chrome layout test - switching between solid & gadient text
70cb325ceda16fab97fd3281785e6ae10fcb8dcf83tomhudson@google.comclass ChromeGradTextGM2 : public GM {
71cb325ceda16fab97fd3281785e6ae10fcb8dcf83tomhudson@google.compublic:
72cb325ceda16fab97fd3281785e6ae10fcb8dcf83tomhudson@google.com    ChromeGradTextGM2() { }
73cb325ceda16fab97fd3281785e6ae10fcb8dcf83tomhudson@google.comprotected:
74cb325ceda16fab97fd3281785e6ae10fcb8dcf83tomhudson@google.com
75cb325ceda16fab97fd3281785e6ae10fcb8dcf83tomhudson@google.com    virtual SkString onShortName() { return SkString("chrome_gradtext2"); }
76f539318f0d3dba743ec1886d5d9df0fb1be628a1tfarina    virtual SkISize onISize() { return SkISize::Make(500, 480); }
77cb325ceda16fab97fd3281785e6ae10fcb8dcf83tomhudson@google.com    virtual void onDraw(SkCanvas* canvas) {
78cb325ceda16fab97fd3281785e6ae10fcb8dcf83tomhudson@google.com        SkPaint paint;
79992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark        sk_tool_utils::set_portable_typeface(&paint);
80cb325ceda16fab97fd3281785e6ae10fcb8dcf83tomhudson@google.com
81cb325ceda16fab97fd3281785e6ae10fcb8dcf83tomhudson@google.com        paint.setStyle(SkPaint::kFill_Style);
82cb325ceda16fab97fd3281785e6ae10fcb8dcf83tomhudson@google.com        canvas->drawText("Normal Fill Text", 16, 0, 50, paint);
83cb325ceda16fab97fd3281785e6ae10fcb8dcf83tomhudson@google.com        paint.setStyle(SkPaint::kStroke_Style);
84cb325ceda16fab97fd3281785e6ae10fcb8dcf83tomhudson@google.com        canvas->drawText("Normal Stroke Text", 18, 0, 100, paint);
85cb325ceda16fab97fd3281785e6ae10fcb8dcf83tomhudson@google.com
86cb325ceda16fab97fd3281785e6ae10fcb8dcf83tomhudson@google.com        // Minimal repro doesn't require AA, LCD, or a nondefault typeface
87cb325ceda16fab97fd3281785e6ae10fcb8dcf83tomhudson@google.com        paint.setShader(make_chrome_solid())->unref();
88cb325ceda16fab97fd3281785e6ae10fcb8dcf83tomhudson@google.com
89cb325ceda16fab97fd3281785e6ae10fcb8dcf83tomhudson@google.com        paint.setStyle(SkPaint::kFill_Style);
90cb325ceda16fab97fd3281785e6ae10fcb8dcf83tomhudson@google.com        canvas->drawText("Gradient Fill Text", 18, 0, 150, paint);
91cb325ceda16fab97fd3281785e6ae10fcb8dcf83tomhudson@google.com        paint.setStyle(SkPaint::kStroke_Style);
92cb325ceda16fab97fd3281785e6ae10fcb8dcf83tomhudson@google.com        canvas->drawText("Gradient Stroke Text", 20, 0, 200, paint);
93cb325ceda16fab97fd3281785e6ae10fcb8dcf83tomhudson@google.com    }
94cb325ceda16fab97fd3281785e6ae10fcb8dcf83tomhudson@google.comprivate:
95cb325ceda16fab97fd3281785e6ae10fcb8dcf83tomhudson@google.com    typedef GM INHERITED;
96cb325ceda16fab97fd3281785e6ae10fcb8dcf83tomhudson@google.com};
97cb325ceda16fab97fd3281785e6ae10fcb8dcf83tomhudson@google.com
98cb325ceda16fab97fd3281785e6ae10fcb8dcf83tomhudson@google.com
99cb325ceda16fab97fd3281785e6ae10fcb8dcf83tomhudson@google.com
100e805535b19e0e3d5459b69ed53d6986a1fe6663dreed@google.comclass GradTextGM : public GM {
101e805535b19e0e3d5459b69ed53d6986a1fe6663dreed@google.compublic:
102e805535b19e0e3d5459b69ed53d6986a1fe6663dreed@google.com    GradTextGM () {}
103e805535b19e0e3d5459b69ed53d6986a1fe6663dreed@google.com
104e805535b19e0e3d5459b69ed53d6986a1fe6663dreed@google.comprotected:
105e805535b19e0e3d5459b69ed53d6986a1fe6663dreed@google.com    virtual SkString onShortName() {
106e805535b19e0e3d5459b69ed53d6986a1fe6663dreed@google.com        return SkString("gradtext");
107e805535b19e0e3d5459b69ed53d6986a1fe6663dreed@google.com    }
108e805535b19e0e3d5459b69ed53d6986a1fe6663dreed@google.com
109f539318f0d3dba743ec1886d5d9df0fb1be628a1tfarina    virtual SkISize onISize() { return SkISize::Make(500, 480); }
110e805535b19e0e3d5459b69ed53d6986a1fe6663dreed@google.com
111e805535b19e0e3d5459b69ed53d6986a1fe6663dreed@google.com    static void draw_text(SkCanvas* canvas, const SkPaint& paint) {
112e805535b19e0e3d5459b69ed53d6986a1fe6663dreed@google.com        const char* text = "When in the course of human events";
113e805535b19e0e3d5459b69ed53d6986a1fe6663dreed@google.com        size_t len = strlen(text);
114e805535b19e0e3d5459b69ed53d6986a1fe6663dreed@google.com        canvas->drawText(text, len, 0, 0, paint);
115e805535b19e0e3d5459b69ed53d6986a1fe6663dreed@google.com    }
116e805535b19e0e3d5459b69ed53d6986a1fe6663dreed@google.com
117e805535b19e0e3d5459b69ed53d6986a1fe6663dreed@google.com    static void draw_text3(SkCanvas* canvas, const SkPaint& paint) {
118e805535b19e0e3d5459b69ed53d6986a1fe6663dreed@google.com        SkPaint p(paint);
119e805535b19e0e3d5459b69ed53d6986a1fe6663dreed@google.com
120e805535b19e0e3d5459b69ed53d6986a1fe6663dreed@google.com        p.setAntiAlias(false);
121e805535b19e0e3d5459b69ed53d6986a1fe6663dreed@google.com        draw_text(canvas, p);
122e805535b19e0e3d5459b69ed53d6986a1fe6663dreed@google.com        p.setAntiAlias(true);
123fb82300d1b41f21d1d154847b6bf3fb73d5b6f81reed@google.com        canvas->translate(0, paint.getTextSize() * 4/3);
124e805535b19e0e3d5459b69ed53d6986a1fe6663dreed@google.com        draw_text(canvas, p);
125e805535b19e0e3d5459b69ed53d6986a1fe6663dreed@google.com        p.setLCDRenderText(true);
126fb82300d1b41f21d1d154847b6bf3fb73d5b6f81reed@google.com        canvas->translate(0, paint.getTextSize() * 4/3);
127e805535b19e0e3d5459b69ed53d6986a1fe6663dreed@google.com        draw_text(canvas, p);
128e805535b19e0e3d5459b69ed53d6986a1fe6663dreed@google.com    }
129e805535b19e0e3d5459b69ed53d6986a1fe6663dreed@google.com
130e805535b19e0e3d5459b69ed53d6986a1fe6663dreed@google.com    virtual void onDraw(SkCanvas* canvas) {
131fb82300d1b41f21d1d154847b6bf3fb73d5b6f81reed@google.com        SkPaint paint;
132992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark        sk_tool_utils::set_portable_typeface(&paint);
133fb82300d1b41f21d1d154847b6bf3fb73d5b6f81reed@google.com        paint.setTextSize(SkIntToScalar(26));
134e805535b19e0e3d5459b69ed53d6986a1fe6663dreed@google.com
135fb82300d1b41f21d1d154847b6bf3fb73d5b6f81reed@google.com        const SkISize& size = this->getISize();
136fb82300d1b41f21d1d154847b6bf3fb73d5b6f81reed@google.com        SkRect r = SkRect::MakeWH(SkIntToScalar(size.width()),
137fb82300d1b41f21d1d154847b6bf3fb73d5b6f81reed@google.com                                  SkIntToScalar(size.height()) / 2);
138fb82300d1b41f21d1d154847b6bf3fb73d5b6f81reed@google.com        canvas->drawRect(r, paint);
139e805535b19e0e3d5459b69ed53d6986a1fe6663dreed@google.com
140fb82300d1b41f21d1d154847b6bf3fb73d5b6f81reed@google.com        canvas->translate(SkIntToScalar(20), paint.getTextSize());
141fb82300d1b41f21d1d154847b6bf3fb73d5b6f81reed@google.com
142fb82300d1b41f21d1d154847b6bf3fb73d5b6f81reed@google.com        for (int i = 0; i < 2; ++i) {
143fb82300d1b41f21d1d154847b6bf3fb73d5b6f81reed@google.com            paint.setShader(make_grad(SkIntToScalar(80)))->unref();
144fb82300d1b41f21d1d154847b6bf3fb73d5b6f81reed@google.com            draw_text3(canvas, paint);
145fb82300d1b41f21d1d154847b6bf3fb73d5b6f81reed@google.com
146fb82300d1b41f21d1d154847b6bf3fb73d5b6f81reed@google.com            canvas->translate(0, paint.getTextSize() * 2);
147e805535b19e0e3d5459b69ed53d6986a1fe6663dreed@google.com
148fb82300d1b41f21d1d154847b6bf3fb73d5b6f81reed@google.com            paint.setShader(make_grad2(SkIntToScalar(80)))->unref();
149fb82300d1b41f21d1d154847b6bf3fb73d5b6f81reed@google.com            draw_text3(canvas, paint);
150ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com
151fb82300d1b41f21d1d154847b6bf3fb73d5b6f81reed@google.com            canvas->translate(0, paint.getTextSize() * 2);
152fb82300d1b41f21d1d154847b6bf3fb73d5b6f81reed@google.com        }
153e805535b19e0e3d5459b69ed53d6986a1fe6663dreed@google.com    }
154e805535b19e0e3d5459b69ed53d6986a1fe6663dreed@google.com
155e805535b19e0e3d5459b69ed53d6986a1fe6663dreed@google.comprivate:
156e805535b19e0e3d5459b69ed53d6986a1fe6663dreed@google.com    typedef GM INHERITED;
157e805535b19e0e3d5459b69ed53d6986a1fe6663dreed@google.com};
158e805535b19e0e3d5459b69ed53d6986a1fe6663dreed@google.com
159e805535b19e0e3d5459b69ed53d6986a1fe6663dreed@google.com//////////////////////////////////////////////////////////////////////////////
160e805535b19e0e3d5459b69ed53d6986a1fe6663dreed@google.com
161e805535b19e0e3d5459b69ed53d6986a1fe6663dreed@google.comstatic GM* MyFactory(void*) { return new GradTextGM; }
162cb325ceda16fab97fd3281785e6ae10fcb8dcf83tomhudson@google.comstatic GM* CMyFactory(void*) { return new ChromeGradTextGM1; }
163cb325ceda16fab97fd3281785e6ae10fcb8dcf83tomhudson@google.comstatic GM* CMyFactory2(void*) { return new ChromeGradTextGM2; }
164e805535b19e0e3d5459b69ed53d6986a1fe6663dreed@google.com
165cb325ceda16fab97fd3281785e6ae10fcb8dcf83tomhudson@google.comstatic GMRegistry reg(MyFactory);
166cb325ceda16fab97fd3281785e6ae10fcb8dcf83tomhudson@google.comstatic GMRegistry Creg(CMyFactory);
167cb325ceda16fab97fd3281785e6ae10fcb8dcf83tomhudson@google.comstatic GMRegistry Creg2(CMyFactory2);
168e805535b19e0e3d5459b69ed53d6986a1fe6663dreed@google.com}
169