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:
onGetFlags() const74 virtual uint32_t onGetFlags() const SK_OVERRIDE {
75 return kSkipTiled_Flag;
76 }
77
onShortName()78 virtual SkString onShortName() SK_OVERRIDE {
79 return SkString("stroketext");
80 }
81
onISize()82 virtual SkISize onISize() SK_OVERRIDE {
83 return SkISize::Make(1200, 480);
84 }
85
onDraw(SkCanvas * canvas)86 virtual void onDraw(SkCanvas* canvas) SK_OVERRIDE {
87 if (true) { test_nulldev(canvas); }
88 SkPaint paint;
89 paint.setAntiAlias(true);
90
91 paint.setTextSize(kBelowThreshold_TextSize);
92 draw_text_set(canvas, paint);
93
94 canvas->translate(600, 0);
95 paint.setTextSize(kAboveThreshold_TextSize);
96 draw_text_set(canvas, paint);
97 }
98
99 private:
100 typedef skiagm::GM INHERITED;
101 };
102
103 DEF_GM( return SkNEW(StrokeTextGM); )
104