• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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