OLD | NEW |
1 | 1 |
2 /* | 2 /* |
3 * Copyright 2011 Google Inc. | 3 * Copyright 2011 Google Inc. |
4 * | 4 * |
5 * Use of this source code is governed by a BSD-style license that can be | 5 * Use of this source code is governed by a BSD-style license that can be |
6 * found in the LICENSE file. | 6 * found in the LICENSE file. |
7 */ | 7 */ |
8 #include "SkBenchmark.h" | 8 #include "SkBenchmark.h" |
9 #include "SkBitmap.h" | 9 #include "SkBitmap.h" |
10 #include "SkCanvas.h" | 10 #include "SkCanvas.h" |
11 #include "SkColorPriv.h" | 11 #include "SkColorPriv.h" |
12 #include "SkGradientShader.h" | 12 #include "SkGradientShader.h" |
13 #include "SkPaint.h" | 13 #include "SkPaint.h" |
14 #include "SkShader.h" | 14 #include "SkShader.h" |
15 #include "SkString.h" | 15 #include "SkString.h" |
16 #include "SkUnitMapper.h" | |
17 | 16 |
18 struct GradData { | 17 struct GradData { |
19 int fCount; | 18 int fCount; |
20 const SkColor* fColors; | 19 const SkColor* fColors; |
21 const SkScalar* fPos; | 20 const SkScalar* fPos; |
22 const char* fName; | 21 const char* fName; |
23 }; | 22 }; |
24 | 23 |
25 static const SkColor gColors[] = { | 24 static const SkColor gColors[] = { |
26 SK_ColorRED, SK_ColorGREEN, SK_ColorBLUE, SK_ColorWHITE, SK_ColorBLACK, | 25 SK_ColorRED, SK_ColorGREEN, SK_ColorBLUE, SK_ColorWHITE, SK_ColorBLACK, |
(...skipping 11 matching lines...) Expand all Loading... |
38 // We have several special-cases depending on the number (and spacing) of colors
, so | 37 // We have several special-cases depending on the number (and spacing) of colors
, so |
39 // try to exercise those here. | 38 // try to exercise those here. |
40 static const GradData gGradData[] = { | 39 static const GradData gGradData[] = { |
41 { 2, gColors, NULL, "" }, | 40 { 2, gColors, NULL, "" }, |
42 { 50, gColors, NULL, "_hicolor" }, // many color gradient | 41 { 50, gColors, NULL, "_hicolor" }, // many color gradient |
43 { 3, gColors, NULL, "_3color" }, | 42 { 3, gColors, NULL, "_3color" }, |
44 }; | 43 }; |
45 | 44 |
46 /// Ignores scale | 45 /// Ignores scale |
47 static SkShader* MakeLinear(const SkPoint pts[2], const GradData& data, | 46 static SkShader* MakeLinear(const SkPoint pts[2], const GradData& data, |
48 SkShader::TileMode tm, SkUnitMapper* mapper, | 47 SkShader::TileMode tm, float scale) { |
49 float scale) { | 48 return SkGradientShader::CreateLinear(pts, data.fColors, data.fPos, data.fCo
unt, tm); |
50 return SkGradientShader::CreateLinear(pts, data.fColors, data.fPos, | |
51 data.fCount, tm, mapper); | |
52 } | 49 } |
53 | 50 |
54 static SkShader* MakeRadial(const SkPoint pts[2], const GradData& data, | 51 static SkShader* MakeRadial(const SkPoint pts[2], const GradData& data, |
55 SkShader::TileMode tm, SkUnitMapper* mapper, | 52 SkShader::TileMode tm, float scale) { |
56 float scale) { | |
57 SkPoint center; | 53 SkPoint center; |
58 center.set(SkScalarAve(pts[0].fX, pts[1].fX), | 54 center.set(SkScalarAve(pts[0].fX, pts[1].fX), |
59 SkScalarAve(pts[0].fY, pts[1].fY)); | 55 SkScalarAve(pts[0].fY, pts[1].fY)); |
60 return SkGradientShader::CreateRadial(center, center.fX * scale, | 56 return SkGradientShader::CreateRadial(center, center.fX * scale, |
61 data.fColors, | 57 data.fColors, |
62 data.fPos, data.fCount, tm, mapper); | 58 data.fPos, data.fCount, tm); |
63 } | 59 } |
64 | 60 |
65 /// Ignores scale | 61 /// Ignores scale |
66 static SkShader* MakeSweep(const SkPoint pts[2], const GradData& data, | 62 static SkShader* MakeSweep(const SkPoint pts[2], const GradData& data, |
67 SkShader::TileMode tm, SkUnitMapper* mapper, | 63 SkShader::TileMode tm, float scale) { |
68 float scale) { | |
69 SkPoint center; | 64 SkPoint center; |
70 center.set(SkScalarAve(pts[0].fX, pts[1].fX), | 65 center.set(SkScalarAve(pts[0].fX, pts[1].fX), |
71 SkScalarAve(pts[0].fY, pts[1].fY)); | 66 SkScalarAve(pts[0].fY, pts[1].fY)); |
72 return SkGradientShader::CreateSweep(center.fX, center.fY, data.fColors, | 67 return SkGradientShader::CreateSweep(center.fX, center.fY, data.fColors, |
73 data.fPos, data.fCount, mapper); | 68 data.fPos, data.fCount); |
74 } | 69 } |
75 | 70 |
76 /// Ignores scale | 71 /// Ignores scale |
77 static SkShader* Make2Radial(const SkPoint pts[2], const GradData& data, | 72 static SkShader* Make2Radial(const SkPoint pts[2], const GradData& data, |
78 SkShader::TileMode tm, SkUnitMapper* mapper, | 73 SkShader::TileMode tm, float scale) { |
79 float scale) { | |
80 SkPoint center0, center1; | 74 SkPoint center0, center1; |
81 center0.set(SkScalarAve(pts[0].fX, pts[1].fX), | 75 center0.set(SkScalarAve(pts[0].fX, pts[1].fX), |
82 SkScalarAve(pts[0].fY, pts[1].fY)); | 76 SkScalarAve(pts[0].fY, pts[1].fY)); |
83 center1.set(SkScalarInterp(pts[0].fX, pts[1].fX, SkIntToScalar(3)/5), | 77 center1.set(SkScalarInterp(pts[0].fX, pts[1].fX, SkIntToScalar(3)/5), |
84 SkScalarInterp(pts[0].fY, pts[1].fY, SkIntToScalar(1)/4)); | 78 SkScalarInterp(pts[0].fY, pts[1].fY, SkIntToScalar(1)/4)); |
85 return SkGradientShader::CreateTwoPointRadial( | 79 return SkGradientShader::CreateTwoPointRadial( |
86 center1, (pts[1].fX - pts[0].f
X) / 7, | 80 center1, (pts[1].fX - pts[0].f
X) / 7, |
87 center0, (pts[1].fX - pts[0].f
X) / 2, | 81 center0, (pts[1].fX - pts[0].f
X) / 2, |
88 data.fColors, data.fPos, data.
fCount, tm, mapper); | 82 data.fColors, data.fPos, data.
fCount, tm); |
89 } | 83 } |
90 | 84 |
91 /// Ignores scale | 85 /// Ignores scale |
92 static SkShader* MakeConical(const SkPoint pts[2], const GradData& data, | 86 static SkShader* MakeConical(const SkPoint pts[2], const GradData& data, |
93 SkShader::TileMode tm, SkUnitMapper* mapper, | 87 SkShader::TileMode tm, float scale) { |
94 float scale) { | |
95 SkPoint center0, center1; | 88 SkPoint center0, center1; |
96 center0.set(SkScalarAve(pts[0].fX, pts[1].fX), | 89 center0.set(SkScalarAve(pts[0].fX, pts[1].fX), |
97 SkScalarAve(pts[0].fY, pts[1].fY)); | 90 SkScalarAve(pts[0].fY, pts[1].fY)); |
98 center1.set(SkScalarInterp(pts[0].fX, pts[1].fX, SkIntToScalar(3)/5), | 91 center1.set(SkScalarInterp(pts[0].fX, pts[1].fX, SkIntToScalar(3)/5), |
99 SkScalarInterp(pts[0].fY, pts[1].fY, SkIntToScalar(1)/4)); | 92 SkScalarInterp(pts[0].fY, pts[1].fY, SkIntToScalar(1)/4)); |
100 return SkGradientShader::CreateTwoPointConical(center1, (pts[1].fX - pts[0].
fX) / 7, | 93 return SkGradientShader::CreateTwoPointConical(center1, (pts[1].fX - pts[0].
fX) / 7, |
101 center0, (pts[1].fX - pts[0].
fX) / 2, | 94 center0, (pts[1].fX - pts[0].
fX) / 2, |
102 data.fColors, data.fPos, data
.fCount, tm, mapper); | 95 data.fColors, data.fPos, data
.fCount, tm); |
103 } | 96 } |
104 | 97 |
105 /// Ignores scale | 98 /// Ignores scale |
106 static SkShader* MakeConicalZeroRad(const SkPoint pts[2], const GradData& data, | 99 static SkShader* MakeConicalZeroRad(const SkPoint pts[2], const GradData& data, |
107 SkShader::TileMode tm, SkUnitMapper* mapper, | 100 SkShader::TileMode tm, float scale) { |
108 float scale) { | |
109 SkPoint center0, center1; | 101 SkPoint center0, center1; |
110 center0.set(SkScalarAve(pts[0].fX, pts[1].fX), | 102 center0.set(SkScalarAve(pts[0].fX, pts[1].fX), |
111 SkScalarAve(pts[0].fY, pts[1].fY)); | 103 SkScalarAve(pts[0].fY, pts[1].fY)); |
112 center1.set(SkScalarInterp(pts[0].fX, pts[1].fX, SkIntToScalar(3)/5), | 104 center1.set(SkScalarInterp(pts[0].fX, pts[1].fX, SkIntToScalar(3)/5), |
113 SkScalarInterp(pts[0].fY, pts[1].fY, SkIntToScalar(1)/4)); | 105 SkScalarInterp(pts[0].fY, pts[1].fY, SkIntToScalar(1)/4)); |
114 return SkGradientShader::CreateTwoPointConical(center1, 0.0, | 106 return SkGradientShader::CreateTwoPointConical(center1, 0.0, |
115 center0, (pts[1].fX - pts[0].
fX) / 2, | 107 center0, (pts[1].fX - pts[0].
fX) / 2, |
116 data.fColors, data.fPos, data
.fCount, tm, mapper); | 108 data.fColors, data.fPos, data
.fCount, tm); |
117 } | 109 } |
118 | 110 |
119 /// Ignores scale | 111 /// Ignores scale |
120 static SkShader* MakeConicalOutside(const SkPoint pts[2], const GradData& data, | 112 static SkShader* MakeConicalOutside(const SkPoint pts[2], const GradData& data, |
121 SkShader::TileMode tm, SkUnitMapper* mapper, | 113 SkShader::TileMode tm, float scale) { |
122 float scale) { | |
123 SkPoint center0, center1; | 114 SkPoint center0, center1; |
124 SkScalar radius0 = SkScalarDiv(pts[1].fX - pts[0].fX, 10); | 115 SkScalar radius0 = SkScalarDiv(pts[1].fX - pts[0].fX, 10); |
125 SkScalar radius1 = SkScalarDiv(pts[1].fX - pts[0].fX, 3); | 116 SkScalar radius1 = SkScalarDiv(pts[1].fX - pts[0].fX, 3); |
126 center0.set(pts[0].fX + radius0, pts[0].fY + radius0); | 117 center0.set(pts[0].fX + radius0, pts[0].fY + radius0); |
127 center1.set(pts[1].fX - radius1, pts[1].fY - radius1); | 118 center1.set(pts[1].fX - radius1, pts[1].fY - radius1); |
128 return SkGradientShader::CreateTwoPointConical(center0, radius0, | 119 return SkGradientShader::CreateTwoPointConical(center0, radius0, |
129 center1, radius1, | 120 center1, radius1, |
130 data.fColors, data.fPos, | 121 data.fColors, data.fPos, |
131 data.fCount, tm, mapper); | 122 data.fCount, tm); |
132 } | 123 } |
133 | 124 |
134 /// Ignores scale | 125 /// Ignores scale |
135 static SkShader* MakeConicalOutsideZeroRad(const SkPoint pts[2], const GradData&
data, | 126 static SkShader* MakeConicalOutsideZeroRad(const SkPoint pts[2], const GradData&
data, |
136 SkShader::TileMode tm, SkUnitMapper*
mapper, | 127 SkShader::TileMode tm, float scale) { |
137 float scale) { | |
138 SkPoint center0, center1; | 128 SkPoint center0, center1; |
139 SkScalar radius0 = SkScalarDiv(pts[1].fX - pts[0].fX, 10); | 129 SkScalar radius0 = SkScalarDiv(pts[1].fX - pts[0].fX, 10); |
140 SkScalar radius1 = SkScalarDiv(pts[1].fX - pts[0].fX, 3); | 130 SkScalar radius1 = SkScalarDiv(pts[1].fX - pts[0].fX, 3); |
141 center0.set(pts[0].fX + radius0, pts[0].fY + radius0); | 131 center0.set(pts[0].fX + radius0, pts[0].fY + radius0); |
142 center1.set(pts[1].fX - radius1, pts[1].fY - radius1); | 132 center1.set(pts[1].fX - radius1, pts[1].fY - radius1); |
143 return SkGradientShader::CreateTwoPointConical(center0, 0.0, | 133 return SkGradientShader::CreateTwoPointConical(center0, 0.0, |
144 center1, radius1, | 134 center1, radius1, |
145 data.fColors, data.fPos, | 135 data.fColors, data.fPos, |
146 data.fCount, tm, mapper); | 136 data.fCount, tm); |
147 } | 137 } |
148 | 138 |
149 typedef SkShader* (*GradMaker)(const SkPoint pts[2], const GradData& data, | 139 typedef SkShader* (*GradMaker)(const SkPoint pts[2], const GradData& data, |
150 SkShader::TileMode tm, SkUnitMapper* mapper, | 140 SkShader::TileMode tm, float scale); |
151 float scale); | |
152 | 141 |
153 static const struct { | 142 static const struct { |
154 GradMaker fMaker; | 143 GradMaker fMaker; |
155 const char* fName; | 144 const char* fName; |
156 } gGrads[] = { | 145 } gGrads[] = { |
157 { MakeLinear, "linear" }, | 146 { MakeLinear, "linear" }, |
158 { MakeRadial, "radial1" }, | 147 { MakeRadial, "radial1" }, |
159 { MakeSweep, "sweep" }, | 148 { MakeSweep, "sweep" }, |
160 { Make2Radial, "radial2" }, | 149 { Make2Radial, "radial2" }, |
161 { MakeConical, "conical" }, | 150 { MakeConical, "conical" }, |
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
233 fName.appendf("_scale_%g", scale); | 222 fName.appendf("_scale_%g", scale); |
234 } | 223 } |
235 | 224 |
236 fName.append(data.fName); | 225 fName.append(data.fName); |
237 | 226 |
238 const SkPoint pts[2] = { | 227 const SkPoint pts[2] = { |
239 { 0, 0 }, | 228 { 0, 0 }, |
240 { SkIntToScalar(W), SkIntToScalar(H) } | 229 { SkIntToScalar(W), SkIntToScalar(H) } |
241 }; | 230 }; |
242 | 231 |
243 fShader = gGrads[gradType].fMaker(pts, data, tm, NULL, scale); | 232 fShader = gGrads[gradType].fMaker(pts, data, tm, scale); |
244 fGeomType = geomType; | 233 fGeomType = geomType; |
245 } | 234 } |
246 | 235 |
247 virtual ~GradientBench() { | 236 virtual ~GradientBench() { |
248 fShader->unref(); | 237 fShader->unref(); |
249 } | 238 } |
250 | 239 |
251 protected: | 240 protected: |
252 virtual const char* onGetName() { | 241 virtual const char* onGetName() { |
253 return fName.c_str(); | 242 return fName.c_str(); |
(...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
356 canvas->drawRect(r, paint); | 345 canvas->drawRect(r, paint); |
357 } | 346 } |
358 } | 347 } |
359 | 348 |
360 private: | 349 private: |
361 typedef SkBenchmark INHERITED; | 350 typedef SkBenchmark INHERITED; |
362 }; | 351 }; |
363 | 352 |
364 DEF_BENCH( return new Gradient2Bench(false); ) | 353 DEF_BENCH( return new Gradient2Bench(false); ) |
365 DEF_BENCH( return new Gradient2Bench(true); ) | 354 DEF_BENCH( return new Gradient2Bench(true); ) |
OLD | NEW |