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
13 namespace skiagm {
14
15 class StrokeFillGM : public GM {
16 public:
StrokeFillGM()17 StrokeFillGM() {
18
19 }
20
21 protected:
onGetFlags() const22 virtual uint32_t onGetFlags() const SK_OVERRIDE {
23 return kSkipTiled_Flag;
24 }
25
onShortName()26 virtual SkString onShortName() {
27 return SkString("stroke-fill");
28 }
29
onISize()30 virtual SkISize onISize() {
31 return SkISize::Make(640, 480);
32 }
33
show_bold(SkCanvas * canvas,const void * text,int len,SkScalar x,SkScalar y,const SkPaint & paint)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
onDraw(SkCanvas * canvas)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
84 private:
85 typedef GM INHERITED;
86 };
87
88 //////////////////////////////////////////////////////////////////////////////
89
MyFactory(void *)90 static GM* MyFactory(void*) { return new StrokeFillGM; }
91 static GMRegistry reg(MyFactory);
92
93 }
94