1 /*
2 * Copyright 2014 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 "SkDashPathEffect.h"
11
test_nulldev(SkCanvas * canvas)12 static void test_nulldev(SkCanvas* canvas) {
13 SkBitmap bm;
14 bm.setInfo(SkImageInfo::MakeN32Premul(30, 30));
15 // notice: no pixels mom! be sure we don't crash
16 // https://code.google.com/p/chromium/issues/detail?id=352616
17 SkCanvas c(bm);
18
19 SkBitmap src;
20 src.allocN32Pixels(10, 10);
21 src.eraseColor(SK_ColorRED);
22
23 // ensure we don't crash
24 c.writePixels(src, 0, 0);
25 }
26
draw_text_stroked(SkCanvas * canvas,const SkPaint & paint,SkScalar strokeWidth)27 static void draw_text_stroked(SkCanvas* canvas, const SkPaint& paint, SkScalar strokeWidth) {
28 SkPaint p(paint);
29 SkPoint loc = { 20, 435 };
30
31 if (strokeWidth > 0) {
32 p.setStyle(SkPaint::kFill_Style);
33 canvas->drawText("P", 1, loc.fX, loc.fY - 225, p);
34 canvas->drawPosText("P", 1, &loc, p);
35 }
36
37 p.setColor(SK_ColorRED);
38 p.setStyle(SkPaint::kStroke_Style);
39 p.setStrokeWidth(strokeWidth);
40
41 canvas->drawText("P", 1, loc.fX, loc.fY - 225, p);
42 canvas->drawPosText("P", 1, &loc, p);
43 }
44
draw_text_set(SkCanvas * canvas,const SkPaint & paint)45 static void draw_text_set(SkCanvas* canvas, const SkPaint& paint) {
46 SkAutoCanvasRestore acr(canvas, true);
47
48 draw_text_stroked(canvas, paint, 10);
49
50 canvas->translate(200, 0);
51 draw_text_stroked(canvas, paint, 0);
52
53 const SkScalar intervals[] = { 20, 10, 5, 10 };
54 const SkScalar phase = 0;
55
56 canvas->translate(200, 0);
57 SkPaint p(paint);
58 p.setPathEffect(SkDashPathEffect::Create(intervals, SK_ARRAY_COUNT(intervals), phase))->unref();
59 draw_text_stroked(canvas, p, 10);
60 }
61
62 class StrokeTextGM : public skiagm::GM {
63 // Skia has a threshold above which it draws text via paths instead of using scalercontext
64 // and caching the glyph. This GM wants to ensure that we draw stroking correctly on both
65 // sides of this threshold.
66 enum {
67 kBelowThreshold_TextSize = 255,
68 kAboveThreshold_TextSize = 257
69 };
70 public:
StrokeTextGM()71 StrokeTextGM() {}
72
73 protected:
74
onShortName()75 SkString onShortName() override {
76 return SkString("stroketext");
77 }
78
onISize()79 SkISize onISize() override {
80 return SkISize::Make(1200, 480);
81 }
82
onDraw(SkCanvas * canvas)83 void onDraw(SkCanvas* canvas) override {
84 if (true) { test_nulldev(canvas); }
85 SkPaint paint;
86 paint.setAntiAlias(true);
87 sk_tool_utils::set_portable_typeface(&paint);
88
89 paint.setTextSize(kBelowThreshold_TextSize);
90 draw_text_set(canvas, paint);
91
92 canvas->translate(600, 0);
93 paint.setTextSize(kAboveThreshold_TextSize);
94 draw_text_set(canvas, paint);
95 }
96
97 private:
98 typedef skiagm::GM INHERITED;
99 };
100
101 DEF_GM( return SkNEW(StrokeTextGM); )
102