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