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;
50cb325ceda16fab97fd3281785e6ae10fcb8dcf83tomhudson@google.com        SkRect r = SkRect::MakeWH(SkIntToScalar(100), SkIntToScalar(100));
51cb325ceda16fab97fd3281785e6ae10fcb8dcf83tomhudson@google.com
52cb325ceda16fab97fd3281785e6ae10fcb8dcf83tomhudson@google.com        canvas->clipRect(r);
53cb325ceda16fab97fd3281785e6ae10fcb8dcf83tomhudson@google.com
54cb325ceda16fab97fd3281785e6ae10fcb8dcf83tomhudson@google.com        paint.setColor(SK_ColorRED);
55cb325ceda16fab97fd3281785e6ae10fcb8dcf83tomhudson@google.com        canvas->drawRect(r, paint);
56cb325ceda16fab97fd3281785e6ae10fcb8dcf83tomhudson@google.com
57cb325ceda16fab97fd3281785e6ae10fcb8dcf83tomhudson@google.com        // Minimal repro doesn't require AA, LCD, or a nondefault typeface
58cb325ceda16fab97fd3281785e6ae10fcb8dcf83tomhudson@google.com        paint.setShader(make_chrome_solid())->unref();
59cb325ceda16fab97fd3281785e6ae10fcb8dcf83tomhudson@google.com        paint.setTextSize(SkIntToScalar(500));
60cb325ceda16fab97fd3281785e6ae10fcb8dcf83tomhudson@google.com
61cb325ceda16fab97fd3281785e6ae10fcb8dcf83tomhudson@google.com        canvas->drawText("I", 1, 0, 100, paint);
62cb325ceda16fab97fd3281785e6ae10fcb8dcf83tomhudson@google.com    }
63cb325ceda16fab97fd3281785e6ae10fcb8dcf83tomhudson@google.comprivate:
64cb325ceda16fab97fd3281785e6ae10fcb8dcf83tomhudson@google.com    typedef GM INHERITED;
65cb325ceda16fab97fd3281785e6ae10fcb8dcf83tomhudson@google.com};
66cb325ceda16fab97fd3281785e6ae10fcb8dcf83tomhudson@google.com
67cb325ceda16fab97fd3281785e6ae10fcb8dcf83tomhudson@google.com
68cb325ceda16fab97fd3281785e6ae10fcb8dcf83tomhudson@google.com// Replicate chrome layout test - switching between solid & gadient text
69cb325ceda16fab97fd3281785e6ae10fcb8dcf83tomhudson@google.comclass ChromeGradTextGM2 : public GM {
70cb325ceda16fab97fd3281785e6ae10fcb8dcf83tomhudson@google.compublic:
71cb325ceda16fab97fd3281785e6ae10fcb8dcf83tomhudson@google.com    ChromeGradTextGM2() { }
72cb325ceda16fab97fd3281785e6ae10fcb8dcf83tomhudson@google.comprotected:
73cb325ceda16fab97fd3281785e6ae10fcb8dcf83tomhudson@google.com
74cb325ceda16fab97fd3281785e6ae10fcb8dcf83tomhudson@google.com    virtual SkString onShortName() { return SkString("chrome_gradtext2"); }
75f539318f0d3dba743ec1886d5d9df0fb1be628a1tfarina    virtual SkISize onISize() { return SkISize::Make(500, 480); }
76cb325ceda16fab97fd3281785e6ae10fcb8dcf83tomhudson@google.com    virtual void onDraw(SkCanvas* canvas) {
77cb325ceda16fab97fd3281785e6ae10fcb8dcf83tomhudson@google.com        SkPaint paint;
78cb325ceda16fab97fd3281785e6ae10fcb8dcf83tomhudson@google.com
79cb325ceda16fab97fd3281785e6ae10fcb8dcf83tomhudson@google.com        paint.setStyle(SkPaint::kFill_Style);
80cb325ceda16fab97fd3281785e6ae10fcb8dcf83tomhudson@google.com        canvas->drawText("Normal Fill Text", 16, 0, 50, paint);
81cb325ceda16fab97fd3281785e6ae10fcb8dcf83tomhudson@google.com        paint.setStyle(SkPaint::kStroke_Style);
82cb325ceda16fab97fd3281785e6ae10fcb8dcf83tomhudson@google.com        canvas->drawText("Normal Stroke Text", 18, 0, 100, paint);
83cb325ceda16fab97fd3281785e6ae10fcb8dcf83tomhudson@google.com
84cb325ceda16fab97fd3281785e6ae10fcb8dcf83tomhudson@google.com        // Minimal repro doesn't require AA, LCD, or a nondefault typeface
85cb325ceda16fab97fd3281785e6ae10fcb8dcf83tomhudson@google.com        paint.setShader(make_chrome_solid())->unref();
86cb325ceda16fab97fd3281785e6ae10fcb8dcf83tomhudson@google.com
87cb325ceda16fab97fd3281785e6ae10fcb8dcf83tomhudson@google.com        paint.setStyle(SkPaint::kFill_Style);
88cb325ceda16fab97fd3281785e6ae10fcb8dcf83tomhudson@google.com        canvas->drawText("Gradient Fill Text", 18, 0, 150, paint);
89cb325ceda16fab97fd3281785e6ae10fcb8dcf83tomhudson@google.com        paint.setStyle(SkPaint::kStroke_Style);
90cb325ceda16fab97fd3281785e6ae10fcb8dcf83tomhudson@google.com        canvas->drawText("Gradient Stroke Text", 20, 0, 200, paint);
91cb325ceda16fab97fd3281785e6ae10fcb8dcf83tomhudson@google.com    }
92cb325ceda16fab97fd3281785e6ae10fcb8dcf83tomhudson@google.comprivate:
93cb325ceda16fab97fd3281785e6ae10fcb8dcf83tomhudson@google.com    typedef GM INHERITED;
94cb325ceda16fab97fd3281785e6ae10fcb8dcf83tomhudson@google.com};
95cb325ceda16fab97fd3281785e6ae10fcb8dcf83tomhudson@google.com
96cb325ceda16fab97fd3281785e6ae10fcb8dcf83tomhudson@google.com
97cb325ceda16fab97fd3281785e6ae10fcb8dcf83tomhudson@google.com
98e805535b19e0e3d5459b69ed53d6986a1fe6663dreed@google.comclass GradTextGM : public GM {
99e805535b19e0e3d5459b69ed53d6986a1fe6663dreed@google.compublic:
100e805535b19e0e3d5459b69ed53d6986a1fe6663dreed@google.com    GradTextGM () {}
101e805535b19e0e3d5459b69ed53d6986a1fe6663dreed@google.com
102e805535b19e0e3d5459b69ed53d6986a1fe6663dreed@google.comprotected:
103a90c6803865766d28e92091f56f718f5e41fe80fcommit-bot@chromium.org    virtual uint32_t onGetFlags() const SK_OVERRIDE {
104a90c6803865766d28e92091f56f718f5e41fe80fcommit-bot@chromium.org        return kSkipTiled_Flag;
105a90c6803865766d28e92091f56f718f5e41fe80fcommit-bot@chromium.org    }
106a90c6803865766d28e92091f56f718f5e41fe80fcommit-bot@chromium.org
107e805535b19e0e3d5459b69ed53d6986a1fe6663dreed@google.com
108e805535b19e0e3d5459b69ed53d6986a1fe6663dreed@google.com    virtual SkString onShortName() {
109e805535b19e0e3d5459b69ed53d6986a1fe6663dreed@google.com        return SkString("gradtext");
110e805535b19e0e3d5459b69ed53d6986a1fe6663dreed@google.com    }
111e805535b19e0e3d5459b69ed53d6986a1fe6663dreed@google.com
112f539318f0d3dba743ec1886d5d9df0fb1be628a1tfarina    virtual SkISize onISize() { return SkISize::Make(500, 480); }
113e805535b19e0e3d5459b69ed53d6986a1fe6663dreed@google.com
114e805535b19e0e3d5459b69ed53d6986a1fe6663dreed@google.com    static void draw_text(SkCanvas* canvas, const SkPaint& paint) {
115e805535b19e0e3d5459b69ed53d6986a1fe6663dreed@google.com        const char* text = "When in the course of human events";
116e805535b19e0e3d5459b69ed53d6986a1fe6663dreed@google.com        size_t len = strlen(text);
117e805535b19e0e3d5459b69ed53d6986a1fe6663dreed@google.com        canvas->drawText(text, len, 0, 0, paint);
118e805535b19e0e3d5459b69ed53d6986a1fe6663dreed@google.com    }
119e805535b19e0e3d5459b69ed53d6986a1fe6663dreed@google.com
120e805535b19e0e3d5459b69ed53d6986a1fe6663dreed@google.com    static void draw_text3(SkCanvas* canvas, const SkPaint& paint) {
121e805535b19e0e3d5459b69ed53d6986a1fe6663dreed@google.com        SkPaint p(paint);
122e805535b19e0e3d5459b69ed53d6986a1fe6663dreed@google.com
123e805535b19e0e3d5459b69ed53d6986a1fe6663dreed@google.com        p.setAntiAlias(false);
124e805535b19e0e3d5459b69ed53d6986a1fe6663dreed@google.com        draw_text(canvas, p);
125e805535b19e0e3d5459b69ed53d6986a1fe6663dreed@google.com        p.setAntiAlias(true);
126fb82300d1b41f21d1d154847b6bf3fb73d5b6f81reed@google.com        canvas->translate(0, paint.getTextSize() * 4/3);
127e805535b19e0e3d5459b69ed53d6986a1fe6663dreed@google.com        draw_text(canvas, p);
128e805535b19e0e3d5459b69ed53d6986a1fe6663dreed@google.com        p.setLCDRenderText(true);
129fb82300d1b41f21d1d154847b6bf3fb73d5b6f81reed@google.com        canvas->translate(0, paint.getTextSize() * 4/3);
130e805535b19e0e3d5459b69ed53d6986a1fe6663dreed@google.com        draw_text(canvas, p);
131e805535b19e0e3d5459b69ed53d6986a1fe6663dreed@google.com    }
132e805535b19e0e3d5459b69ed53d6986a1fe6663dreed@google.com
133e805535b19e0e3d5459b69ed53d6986a1fe6663dreed@google.com    virtual void onDraw(SkCanvas* canvas) {
134fb82300d1b41f21d1d154847b6bf3fb73d5b6f81reed@google.com        SkPaint paint;
135fb82300d1b41f21d1d154847b6bf3fb73d5b6f81reed@google.com        paint.setTextSize(SkIntToScalar(26));
136e805535b19e0e3d5459b69ed53d6986a1fe6663dreed@google.com
137fb82300d1b41f21d1d154847b6bf3fb73d5b6f81reed@google.com        const SkISize& size = this->getISize();
138fb82300d1b41f21d1d154847b6bf3fb73d5b6f81reed@google.com        SkRect r = SkRect::MakeWH(SkIntToScalar(size.width()),
139fb82300d1b41f21d1d154847b6bf3fb73d5b6f81reed@google.com                                  SkIntToScalar(size.height()) / 2);
140fb82300d1b41f21d1d154847b6bf3fb73d5b6f81reed@google.com        canvas->drawRect(r, paint);
141e805535b19e0e3d5459b69ed53d6986a1fe6663dreed@google.com
142fb82300d1b41f21d1d154847b6bf3fb73d5b6f81reed@google.com        canvas->translate(SkIntToScalar(20), paint.getTextSize());
143fb82300d1b41f21d1d154847b6bf3fb73d5b6f81reed@google.com
144fb82300d1b41f21d1d154847b6bf3fb73d5b6f81reed@google.com        for (int i = 0; i < 2; ++i) {
145fb82300d1b41f21d1d154847b6bf3fb73d5b6f81reed@google.com            paint.setShader(make_grad(SkIntToScalar(80)))->unref();
146fb82300d1b41f21d1d154847b6bf3fb73d5b6f81reed@google.com            draw_text3(canvas, paint);
147fb82300d1b41f21d1d154847b6bf3fb73d5b6f81reed@google.com
148fb82300d1b41f21d1d154847b6bf3fb73d5b6f81reed@google.com            canvas->translate(0, paint.getTextSize() * 2);
149e805535b19e0e3d5459b69ed53d6986a1fe6663dreed@google.com
150fb82300d1b41f21d1d154847b6bf3fb73d5b6f81reed@google.com            paint.setShader(make_grad2(SkIntToScalar(80)))->unref();
151fb82300d1b41f21d1d154847b6bf3fb73d5b6f81reed@google.com            draw_text3(canvas, paint);
152ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com
153fb82300d1b41f21d1d154847b6bf3fb73d5b6f81reed@google.com            canvas->translate(0, paint.getTextSize() * 2);
154fb82300d1b41f21d1d154847b6bf3fb73d5b6f81reed@google.com        }
155e805535b19e0e3d5459b69ed53d6986a1fe6663dreed@google.com    }
156e805535b19e0e3d5459b69ed53d6986a1fe6663dreed@google.com
157e805535b19e0e3d5459b69ed53d6986a1fe6663dreed@google.comprivate:
158e805535b19e0e3d5459b69ed53d6986a1fe6663dreed@google.com    typedef GM INHERITED;
159e805535b19e0e3d5459b69ed53d6986a1fe6663dreed@google.com};
160e805535b19e0e3d5459b69ed53d6986a1fe6663dreed@google.com
161e805535b19e0e3d5459b69ed53d6986a1fe6663dreed@google.com//////////////////////////////////////////////////////////////////////////////
162e805535b19e0e3d5459b69ed53d6986a1fe6663dreed@google.com
163e805535b19e0e3d5459b69ed53d6986a1fe6663dreed@google.comstatic GM* MyFactory(void*) { return new GradTextGM; }
164cb325ceda16fab97fd3281785e6ae10fcb8dcf83tomhudson@google.comstatic GM* CMyFactory(void*) { return new ChromeGradTextGM1; }
165cb325ceda16fab97fd3281785e6ae10fcb8dcf83tomhudson@google.comstatic GM* CMyFactory2(void*) { return new ChromeGradTextGM2; }
166e805535b19e0e3d5459b69ed53d6986a1fe6663dreed@google.com
167cb325ceda16fab97fd3281785e6ae10fcb8dcf83tomhudson@google.comstatic GMRegistry reg(MyFactory);
168cb325ceda16fab97fd3281785e6ae10fcb8dcf83tomhudson@google.comstatic GMRegistry Creg(CMyFactory);
169cb325ceda16fab97fd3281785e6ae10fcb8dcf83tomhudson@google.comstatic GMRegistry Creg2(CMyFactory2);
170e805535b19e0e3d5459b69ed53d6986a1fe6663dreed@google.com}
171