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 SkTypeface* face = SkTypeface::CreateFromName("Papyrus", SkTypeface::kNormal);
52 SkSafeUnref(paint.setTypeface(face));
53 show_bold(canvas, "Hello", 5, x, y, paint);
54
55 face = SkTypeface::CreateFromName("Hiragino Maru Gothic Pro", SkTypeface::kNormal);
56 SkSafeUnref(paint.setTypeface(face));
57 const unsigned char hyphen[] = { 0xE3, 0x83, 0xBC };
58 show_bold(canvas, hyphen, SK_ARRAY_COUNT(hyphen), x + SkIntToScalar(300), y, paint);
59
60 paint.setStyle(SkPaint::kStrokeAndFill_Style);
61
62 SkPath path;
63 path.setFillType(SkPath::kWinding_FillType);
64 path.addCircle(x, y + SkIntToScalar(200), SkIntToScalar(50), SkPath::kCW_Direction);
65 path.addCircle(x, y + SkIntToScalar(200), SkIntToScalar(40), SkPath::kCCW_Direction);
66 canvas->drawPath(path, paint);
67
68 SkPath path2;
69 path2.setFillType(SkPath::kWinding_FillType);
70 path2.addCircle(x + SkIntToScalar(120), y + SkIntToScalar(200), SkIntToScalar(50), SkPath::kCCW_Direction);
71 path2.addCircle(x + SkIntToScalar(120), y + SkIntToScalar(200), SkIntToScalar(40), SkPath::kCW_Direction);
72 canvas->drawPath(path2, paint);
73
74 path2.reset();
75 path2.addCircle(x + SkIntToScalar(240), y + SkIntToScalar(200), SkIntToScalar(50), SkPath::kCCW_Direction);
76 canvas->drawPath(path2, paint);
77 SkASSERT(path2.cheapIsDirection(SkPath::kCCW_Direction));
78
79 path2.reset();
80 SkASSERT(!path2.cheapComputeDirection(NULL));
81 path2.addCircle(x + SkIntToScalar(360), y + SkIntToScalar(200), SkIntToScalar(50), SkPath::kCW_Direction);
82 SkASSERT(path2.cheapIsDirection(SkPath::kCW_Direction));
83 canvas->drawPath(path2, paint);
84 }
85
86 private:
87 typedef GM INHERITED;
88 };
89
90 //////////////////////////////////////////////////////////////////////////////
91
MyFactory(void *)92 static GM* MyFactory(void*) { return new StrokeFillGM; }
93 static GMRegistry reg(MyFactory);
94
95 }
96