1/*
2 * Copyright 2011 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 "SkPath.h"
11#include "SkTypeface.h"
12
13namespace skiagm {
14
15class StrokeFillGM : public GM {
16public:
17    StrokeFillGM() {
18
19    }
20
21protected:
22    virtual uint32_t onGetFlags() const SK_OVERRIDE {
23        return kSkipTiled_Flag;
24    }
25
26    virtual SkString onShortName() {
27        return SkString("stroke-fill");
28    }
29
30    virtual SkISize onISize() {
31        return SkISize::Make(640, 480);
32    }
33
34    static void show_bold(SkCanvas* canvas, const void* text, int len,
35                          SkScalar x, SkScalar y, const SkPaint& paint) {
36        SkPaint p(paint);
37        canvas->drawText(text, len, x, y, p);
38        p.setFakeBoldText(true);
39        canvas->drawText(text, len, x, y + SkIntToScalar(120), p);
40    }
41
42    virtual void onDraw(SkCanvas* canvas) {
43        SkScalar x = SkIntToScalar(100);
44        SkScalar y = SkIntToScalar(88);
45
46        SkPaint paint;
47        paint.setAntiAlias(true);
48        paint.setTextSize(SkIntToScalar(100));
49        paint.setStrokeWidth(SkIntToScalar(5));
50
51        sk_tool_utils::set_portable_typeface(&paint, "Papyrus");
52        show_bold(canvas, "Hello", 5, x, y, paint);
53
54        sk_tool_utils::set_portable_typeface(&paint, "Hiragino Maru Gothic Pro");
55        const unsigned char hyphen[] = { 0xE3, 0x83, 0xBC };
56        show_bold(canvas, hyphen, SK_ARRAY_COUNT(hyphen), x + SkIntToScalar(300), y, paint);
57
58        paint.setStyle(SkPaint::kStrokeAndFill_Style);
59
60        SkPath path;
61        path.setFillType(SkPath::kWinding_FillType);
62        path.addCircle(x, y + SkIntToScalar(200), SkIntToScalar(50), SkPath::kCW_Direction);
63        path.addCircle(x, y + SkIntToScalar(200), SkIntToScalar(40), SkPath::kCCW_Direction);
64        canvas->drawPath(path, paint);
65
66        SkPath path2;
67        path2.setFillType(SkPath::kWinding_FillType);
68        path2.addCircle(x + SkIntToScalar(120), y + SkIntToScalar(200), SkIntToScalar(50), SkPath::kCCW_Direction);
69        path2.addCircle(x + SkIntToScalar(120), y + SkIntToScalar(200), SkIntToScalar(40), SkPath::kCW_Direction);
70        canvas->drawPath(path2, paint);
71
72        path2.reset();
73        path2.addCircle(x + SkIntToScalar(240), y + SkIntToScalar(200), SkIntToScalar(50), SkPath::kCCW_Direction);
74        canvas->drawPath(path2, paint);
75        SkASSERT(path2.cheapIsDirection(SkPath::kCCW_Direction));
76
77        path2.reset();
78        SkASSERT(!path2.cheapComputeDirection(NULL));
79        path2.addCircle(x + SkIntToScalar(360), y + SkIntToScalar(200), SkIntToScalar(50), SkPath::kCW_Direction);
80        SkASSERT(path2.cheapIsDirection(SkPath::kCW_Direction));
81        canvas->drawPath(path2, paint);
82    }
83
84private:
85    typedef GM INHERITED;
86};
87
88//////////////////////////////////////////////////////////////////////////////
89
90static GM* MyFactory(void*) { return new StrokeFillGM; }
91static GMRegistry reg(MyFactory);
92
93}
94