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