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
12static 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
27static 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
45static 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
62class 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    };
70public:
71    StrokeTextGM() {}
72
73protected:
74    virtual uint32_t onGetFlags() const SK_OVERRIDE {
75        return kSkipTiled_Flag;
76    }
77
78    virtual SkString onShortName() SK_OVERRIDE {
79        return SkString("stroketext");
80    }
81
82    virtual SkISize onISize() SK_OVERRIDE {
83        return SkISize::Make(1200, 480);
84    }
85
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
99private:
100    typedef skiagm::GM INHERITED;
101};
102
103DEF_GM( return SkNEW(StrokeTextGM); )
104