• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright 2011 Google Inc.
3  *
4  * Use of this source code is governed by a BSD-style license that can be
5  * found in the LICENSE file.
6  */
7 
8 #include "gm.h"
9 #include "SkCanvas.h"
10 #include "SkPath.h"
11 #include "SkGradientShader.h"
12 #include "SkTypeface.h"
13 
make_heatGradient(const SkPoint pts[2])14 static SkShader* make_heatGradient(const SkPoint pts[2]) {
15     const SkColor bw[] = { SK_ColorBLACK, SK_ColorWHITE };
16 
17     return SkGradientShader::CreateLinear(pts, bw, nullptr,
18                                           SK_ARRAY_COUNT(bw),
19                                           SkShader::kClamp_TileMode);
20 }
21 
setFont(SkPaint * paint,const char name[])22 static bool setFont(SkPaint* paint, const char name[]) {
23     SkTypeface* tf = SkTypeface::CreateFromName(name, SkTypeface::kNormal);
24     if (tf) {
25         paint->setTypeface(tf)->unref();
26         return true;
27     }
28     return false;
29 }
30 
31 /**
32    Test a set of clipping problems discovered while writing blitAntiRect,
33    and test all the code paths through the clipping blitters.
34    Each region should show as a blue center surrounded by a 2px green
35    border, with no red.
36 */
37 
38 #define HEIGHT 480
39 
40 class GammaTextGM : public skiagm::GM {
41 protected:
onShortName()42     SkString onShortName() override {
43         SkString name("gammatext");
44         name.append(sk_tool_utils::major_platform_os_name());
45         return name;
46     }
47 
onISize()48     SkISize onISize() override {
49         return SkISize::Make(1024, HEIGHT);
50     }
51 
drawGrad(SkCanvas * canvas)52     static void drawGrad(SkCanvas* canvas) {
53         SkPoint pts[] = { { 0, 0 }, { 0, SkIntToScalar(HEIGHT) } };
54         SkShader* s = make_heatGradient(pts);
55 
56         canvas->clear(SK_ColorRED);
57         SkPaint paint;
58         paint.setShader(s)->unref();
59         SkRect r = { 0, 0, SkIntToScalar(1024), SkIntToScalar(HEIGHT) };
60         canvas->drawRect(r, paint);
61     }
62 
onDraw(SkCanvas * canvas)63     void onDraw(SkCanvas* canvas) override {
64         drawGrad(canvas);
65 
66         const SkColor fg[] = {
67             0xFFFFFFFF,
68             0xFFFFFF00, 0xFFFF00FF, 0xFF00FFFF,
69             0xFFFF0000, 0xFF00FF00, 0xFF0000FF,
70             0xFF000000,
71         };
72 
73         const char* text = "Hamburgefons";
74         size_t len = strlen(text);
75 
76         SkPaint paint;
77         setFont(&paint, sk_tool_utils::platform_font_name("serif"));
78         paint.setTextSize(SkIntToScalar(16));
79         paint.setAntiAlias(true);
80         paint.setLCDRenderText(true);
81 
82         SkScalar x = SkIntToScalar(10);
83         for (size_t i = 0; i < SK_ARRAY_COUNT(fg); ++i) {
84             paint.setColor(fg[i]);
85 
86             SkScalar y = SkIntToScalar(40);
87             SkScalar stopy = SkIntToScalar(HEIGHT);
88             while (y < stopy) {
89                 canvas->drawText(text, len, x, y, paint);
90                 y += paint.getTextSize() * 2;
91             }
92             x += SkIntToScalar(1024) / SK_ARRAY_COUNT(fg);
93         }
94     }
95 
96 private:
97     typedef skiagm::GM INHERITED;
98 };
99 
DEF_GM(return new GammaTextGM;)100 DEF_GM( return new GammaTextGM; )
101 
102 //////////////////////////////////////////////////////////////////////////////
103 
104 static SkShader* make_gradient(SkColor c) {
105     const SkPoint pts[] = { { 0, 0 }, { 240, 0 } };
106     SkColor colors[2];
107     colors[0] = c;
108     colors[1] = SkColorSetA(c, 0);
109     return SkGradientShader::CreateLinear(pts, colors, nullptr, 2, SkShader::kClamp_TileMode);
110 }
111 
set_face(SkPaint * paint)112 static void set_face(SkPaint* paint) {
113     SkTypeface* face = SkTypeface::CreateFromName("serif", SkTypeface::kItalic);
114     SkSafeUnref(paint->setTypeface(face));
115 }
116 
draw_pair(SkCanvas * canvas,SkPaint * paint,SkShader * shader)117 static void draw_pair(SkCanvas* canvas, SkPaint* paint, SkShader* shader) {
118     const char text[] = "Now is the time for all good";
119     const size_t len = strlen(text);
120 
121     paint->setShader(nullptr);
122     canvas->drawText(text, len, 10, 20, *paint);
123     paint->setShader(SkShader::CreateColorShader(paint->getColor()))->unref();
124     canvas->drawText(text, len, 10, 40, *paint);
125     paint->setShader(shader);
126     canvas->drawText(text, len, 10, 60, *paint);
127 }
128 
129 class GammaShaderTextGM : public skiagm::GM {
130     SkShader* fShaders[3];
131     SkColor fColors[3];
132 
133 public:
GammaShaderTextGM()134     GammaShaderTextGM() {
135         const SkColor colors[] = { SK_ColorBLACK, SK_ColorRED, SK_ColorBLUE };
136         for (size_t i = 0; i < SK_ARRAY_COUNT(fShaders); ++i) {
137             fShaders[i] = nullptr;
138             fColors[i] = colors[i];
139         }
140     }
141 
~GammaShaderTextGM()142     ~GammaShaderTextGM() override {
143         for (size_t i = 0; i < SK_ARRAY_COUNT(fShaders); ++i) {
144             SkSafeUnref(fShaders[i]);
145         }
146     }
147 
148 protected:
onShortName()149     SkString onShortName() override {
150         return SkString("gammagradienttext");
151     }
152 
onISize()153     SkISize onISize() override {
154         return SkISize::Make(300, 300);
155     }
156 
onOnceBeforeDraw()157     void onOnceBeforeDraw() override {
158         for (size_t i = 0; i < SK_ARRAY_COUNT(fShaders); ++i) {
159             fShaders[i] = make_gradient(fColors[i]);
160         }
161     }
162 
onDraw(SkCanvas * canvas)163     void onDraw(SkCanvas* canvas) override {
164         SkPaint paint;
165         paint.setAntiAlias(true);
166         paint.setLCDRenderText(true);
167         paint.setTextSize(18);
168         set_face(&paint);
169 
170         for (size_t i = 0; i < SK_ARRAY_COUNT(fShaders); ++i) {
171             paint.setColor(fColors[i]);
172             draw_pair(canvas, &paint, fShaders[i]);
173             canvas->translate(0, 80);
174         }
175     }
176 
177 private:
178     typedef skiagm::GM INHERITED;
179 };
180 
181 DEF_GM( return new GammaShaderTextGM; )
182 
183