| 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 |