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