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
62namespace {
63    enum {
64        kBelowThreshold_TextSize = 255,
65        kAboveThreshold_TextSize = 257
66    };
67}
68
69DEF_SIMPLE_GM(stroketext, canvas, 1200, 480) {
70        if (true) { test_nulldev(canvas); }
71        SkPaint paint;
72        paint.setAntiAlias(true);
73        sk_tool_utils::set_portable_typeface(&paint);
74
75        paint.setTextSize(kBelowThreshold_TextSize);
76        draw_text_set(canvas, paint);
77
78        canvas->translate(600, 0);
79        paint.setTextSize(kAboveThreshold_TextSize);
80        draw_text_set(canvas, paint);
81}
82