OLD | NEW |
| (Empty) |
1 /* | |
2 * Copyright 2012 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 "SkPaint.h" | |
11 #include "SkGradientShader.h" | |
12 | |
13 static void intToScalars(SkScalar dst[], const int src[], int n) { | |
14 for (int i = 0; i < n; ++i) { | |
15 dst[i] = SkIntToScalar(src[i]); | |
16 } | |
17 } | |
18 | |
19 static void drawGrad(SkCanvas* canvas, const SkScalar d0[], const SkScalar d1[])
{ | |
20 const SkRect bounds = SkRect::MakeXYWH(SkIntToScalar(-50), | |
21 SkIntToScalar(-50), | |
22 SkIntToScalar(200), | |
23 SkIntToScalar(100)); | |
24 | |
25 SkPoint c0 = { d0[0], d0[1] }; | |
26 SkScalar r0 = d0[2]; | |
27 SkPoint c1 = { d1[0], d1[1] }; | |
28 SkScalar r1 = d1[2]; | |
29 | |
30 SkColor colors[] = { SK_ColorGREEN, SK_ColorRED }; | |
31 SkPaint paint; | |
32 paint.setAntiAlias(true); | |
33 sk_tool_utils::set_portable_typeface(&paint); | |
34 | |
35 SkString str; | |
36 str.printf("%g,%g,%g %g,%g,%g", | |
37 SkScalarToFloat(c0.fX), SkScalarToFloat(c0.fY), SkScalarToFloat(r
0), | |
38 SkScalarToFloat(c1.fX), SkScalarToFloat(c1.fY), SkScalarToFloat(r
1)); | |
39 canvas->drawText(str.c_str(), str.size(), | |
40 bounds.fLeft, bounds.fTop - paint.getTextSize()/2, paint); | |
41 | |
42 paint.setShader(SkGradientShader::CreateTwoPointConical(c0, r0, c1, r1, | |
43 colors, NULL, 2, | |
44 SkShader::kClamp_Til
eMode))->unref(); | |
45 canvas->drawRect(bounds, paint); | |
46 | |
47 paint.setShader(NULL); | |
48 paint.setColor(0x66000000); | |
49 paint.setStyle(SkPaint::kStroke_Style); | |
50 canvas->drawCircle(c0.fX, c0.fY, r0, paint); | |
51 canvas->drawCircle(c1.fX, c1.fY, r1, paint); | |
52 canvas->drawRect(bounds, paint); | |
53 } | |
54 | |
55 class TwoPointRadialGM : public skiagm::GM { | |
56 public: | |
57 TwoPointRadialGM() {} | |
58 | |
59 protected: | |
60 SkString onShortName() { | |
61 return SkString("twopointconical"); | |
62 } | |
63 | |
64 SkISize onISize() { return SkISize::Make(480, 780); } | |
65 | |
66 virtual void onDraw(SkCanvas* canvas) { | |
67 if (false) { | |
68 SkPaint paint; | |
69 paint.setColor(SK_ColorBLUE); | |
70 canvas->drawRect( | |
71 SkRect::MakeWH(SkIntToScalar(this->getISize().fWidth), | |
72 SkIntToScalar(this->getISize().fHeight)), | |
73 paint); | |
74 } | |
75 SkPaint paint; | |
76 const int R0 = 20; | |
77 const int R1 = 40; | |
78 | |
79 const SkScalar DX = SkIntToScalar(250); | |
80 const SkScalar DY = SkIntToScalar(130); | |
81 | |
82 canvas->translate(SkIntToScalar(60), SkIntToScalar(70)); | |
83 | |
84 static const int gData[] = { | |
85 0, 0, R0, 0, 0, R1, | |
86 0, 0, R0, 20, 0, R1, | |
87 0, 0, R0, 25, 0, R1, | |
88 0, 0, R0, 100, 0, R1, | |
89 0, 0, R0, 25, 0, R0, | |
90 0, 0, R0, 100, 0, R0, | |
91 }; | |
92 | |
93 int count = SK_ARRAY_COUNT(gData) / 6; | |
94 for (int i = 0; i < count; ++i) { | |
95 SkScalar data[6]; | |
96 intToScalars(data, &gData[i * 6], 6); | |
97 | |
98 int n = canvas->save(); | |
99 drawGrad(canvas, &data[0], &data[3]); | |
100 canvas->translate(DX, 0); | |
101 drawGrad(canvas, &data[3], &data[0]); | |
102 canvas->restoreToCount(n); | |
103 canvas->translate(0, DY); | |
104 } | |
105 } | |
106 }; | |
107 | |
108 ////////////////////////////////////////////////////////////////////////////// | |
109 | |
110 static skiagm::GM* F(void*) { return new TwoPointRadialGM; } | |
111 | |
112 static skiagm::GMRegistry gR(F); | |
OLD | NEW |