OLD | NEW |
---|---|
1 /* | 1 /* |
2 * Copyright 2011 Google Inc. | 2 * Copyright 2011 Google Inc. |
3 * | 3 * |
4 * Use of this source code is governed by a BSD-style license that can be | 4 * Use of this source code is governed by a BSD-style license that can be |
5 * found in the LICENSE file. | 5 * found in the LICENSE file. |
6 */ | 6 */ |
7 | 7 |
8 #include "gm.h" | 8 #include "gm.h" |
9 #include "SkGradientShader.h" | 9 #include "SkGradientShader.h" |
10 #include "SkLinearGradient.h" | 10 #include "SkLinearGradient.h" |
(...skipping 22 matching lines...) Expand all Loading... | |
33 | 33 |
34 static const GradData gGradData[] = { | 34 static const GradData gGradData[] = { |
35 { 2, gColors, nullptr }, | 35 { 2, gColors, nullptr }, |
36 { 2, gColors, gPos0 }, | 36 { 2, gColors, gPos0 }, |
37 { 2, gColors, gPos1 }, | 37 { 2, gColors, gPos1 }, |
38 { 5, gColors, nullptr }, | 38 { 5, gColors, nullptr }, |
39 { 5, gColors, gPos2 }, | 39 { 5, gColors, gPos2 }, |
40 { 4, gColorClamp, gPosClamp } | 40 { 4, gColorClamp, gPosClamp } |
41 }; | 41 }; |
42 | 42 |
43 static SkShader* MakeLinear(const SkPoint pts[2], const GradData& data, | 43 static sk_sp<SkShader> MakeLinear(const SkPoint pts[2], const GradData& data, |
44 SkShader::TileMode tm, const SkMatrix& localMatrix) { | 44 SkShader::TileMode tm, const SkMatrix& localMa trix) { |
45 return SkGradientShader::CreateLinear(pts, data.fColors, data.fPos, | 45 return SkGradientShader::MakeLinear(pts, data.fColors, data.fPos, data.fCoun t, tm, 0, |
46 data.fCount, tm, 0, &localMatrix); | 46 &localMatrix); |
47 } | 47 } |
48 | 48 |
49 static SkShader* MakeRadial(const SkPoint pts[2], const GradData& data, | 49 static sk_sp<SkShader> MakeRadial(const SkPoint pts[2], const GradData& data, |
50 SkShader::TileMode tm, const SkMatrix& localMatrix) { | 50 SkShader::TileMode tm, const SkMatrix& localMa trix) { |
51 SkPoint center; | 51 SkPoint center; |
52 center.set(SkScalarAve(pts[0].fX, pts[1].fX), | 52 center.set(SkScalarAve(pts[0].fX, pts[1].fX), |
53 SkScalarAve(pts[0].fY, pts[1].fY)); | 53 SkScalarAve(pts[0].fY, pts[1].fY)); |
54 return SkGradientShader::CreateRadial(center, center.fX, data.fColors, | 54 return SkGradientShader::MakeRadial(center, center.fX, data.fColors, data.fP os, data.fCount, |
55 data.fPos, data.fCount, tm, 0, &localM atrix); | 55 tm, 0, &localMatrix); |
56 } | 56 } |
57 | 57 |
58 static SkShader* MakeSweep(const SkPoint pts[2], const GradData& data, | 58 static sk_sp<SkShader> MakeSweep(const SkPoint pts[2], const GradData& data, |
59 SkShader::TileMode, const SkMatrix& localMatrix) { | 59 SkShader::TileMode, const SkMatrix& localMatrix ) { |
60 SkPoint center; | 60 SkPoint center; |
61 center.set(SkScalarAve(pts[0].fX, pts[1].fX), | 61 center.set(SkScalarAve(pts[0].fX, pts[1].fX), |
62 SkScalarAve(pts[0].fY, pts[1].fY)); | 62 SkScalarAve(pts[0].fY, pts[1].fY)); |
63 return SkGradientShader::CreateSweep(center.fX, center.fY, data.fColors, | 63 return SkGradientShader::MakeSweep(center.fX, center.fY, data.fColors, data. fPos, data.fCount, |
64 data.fPos, data.fCount, 0, &localMatrix ); | 64 0, &localMatrix); |
65 } | 65 } |
66 | 66 |
67 static SkShader* Make2Radial(const SkPoint pts[2], const GradData& data, | 67 static sk_sp<SkShader> Make2Radial(const SkPoint pts[2], const GradData& data, |
68 SkShader::TileMode tm, const SkMatrix& localMatrix) { | 68 SkShader::TileMode tm, const SkMatrix& localM atrix) { |
69 SkPoint center0, center1; | 69 SkPoint center0, center1; |
70 center0.set(SkScalarAve(pts[0].fX, pts[1].fX), | 70 center0.set(SkScalarAve(pts[0].fX, pts[1].fX), |
71 SkScalarAve(pts[0].fY, pts[1].fY)); | 71 SkScalarAve(pts[0].fY, pts[1].fY)); |
72 center1.set(SkScalarInterp(pts[0].fX, pts[1].fX, SkIntToScalar(3)/5), | 72 center1.set(SkScalarInterp(pts[0].fX, pts[1].fX, SkIntToScalar(3)/5), |
73 SkScalarInterp(pts[0].fY, pts[1].fY, SkIntToScalar(1)/4)); | 73 SkScalarInterp(pts[0].fY, pts[1].fY, SkIntToScalar(1)/4)); |
74 return SkGradientShader::CreateTwoPointConical( | 74 return SkGradientShader::MakeTwoPointConical(center1, (pts[1].fX - pts[0].fX ) / 7, |
75 center1, (pts[1].fX - pts[0]. fX) / 7, | 75 center0, (pts[1].fX - pts[0].fX ) / 2, |
76 center0, (pts[1].fX - pts[0]. fX) / 2, | 76 data.fColors, data.fPos, data.f Count, tm, |
77 data.fColors, data.fPos, data .fCount, tm, | 77 0, &localMatrix); |
78 0, &localMatrix); | |
79 } | 78 } |
80 | 79 |
81 static SkShader* Make2Conical(const SkPoint pts[2], const GradData& data, | 80 static sk_sp<SkShader> Make2Conical(const SkPoint pts[2], const GradData& data, |
82 SkShader::TileMode tm, const SkMatrix& localMatrix) { | 81 SkShader::TileMode tm, const SkMatrix& localMatrix) { |
83 SkPoint center0, center1; | 82 SkPoint center0, center1; |
84 SkScalar radius0 = (pts[1].fX - pts[0].fX) / 10; | 83 SkScalar radius0 = (pts[1].fX - pts[0].fX) / 10; |
85 SkScalar radius1 = (pts[1].fX - pts[0].fX) / 3; | 84 SkScalar radius1 = (pts[1].fX - pts[0].fX) / 3; |
86 center0.set(pts[0].fX + radius0, pts[0].fY + radius0); | 85 center0.set(pts[0].fX + radius0, pts[0].fY + radius0); |
87 center1.set(pts[1].fX - radius1, pts[1].fY - radius1); | 86 center1.set(pts[1].fX - radius1, pts[1].fY - radius1); |
88 return SkGradientShader::CreateTwoPointConical(center1, radius1, | 87 return SkGradientShader::MakeTwoPointConical(center1, radius1, center0, radi us0, |
89 center0, radius0, | 88 data.fColors, data.fPos, |
90 data.fColors, data.fPos, | 89 data.fCount, tm, 0, &localMatri x); |
91 data.fCount, tm, 0, &localMat rix); | |
92 } | 90 } |
93 | 91 |
94 typedef SkShader* (*GradMaker)(const SkPoint pts[2], const GradData& data, | 92 typedef sk_sp<SkShader> (*GradMaker)(const SkPoint pts[2], const GradData& data, |
95 SkShader::TileMode tm, const SkMatrix& localMatri x); | 93 SkShader::TileMode tm, const SkMatrix& loca lMatrix); |
96 static const GradMaker gGradMakers[] = { | 94 static const GradMaker gGradMakers[] = { |
97 MakeLinear, MakeRadial, MakeSweep, Make2Radial, Make2Conical | 95 MakeLinear, MakeRadial, MakeSweep, Make2Radial, Make2Conical |
98 }; | 96 }; |
99 | 97 |
100 /////////////////////////////////////////////////////////////////////////////// | 98 /////////////////////////////////////////////////////////////////////////////// |
101 | 99 |
102 class GradientsGM : public GM { | 100 class GradientsGM : public GM { |
103 public: | 101 public: |
104 GradientsGM(bool dither) : fDither(dither) { | 102 GradientsGM(bool dither) : fDither(dither) { |
105 this->setBGColor(sk_tool_utils::color_to_565(0xFFDDDDDD)); | 103 this->setBGColor(sk_tool_utils::color_to_565(0xFFDDDDDD)); |
(...skipping 23 matching lines...) Expand all Loading... | |
129 for (size_t i = 0; i < SK_ARRAY_COUNT(gGradData); i++) { | 127 for (size_t i = 0; i < SK_ARRAY_COUNT(gGradData); i++) { |
130 canvas->save(); | 128 canvas->save(); |
131 for (size_t j = 0; j < SK_ARRAY_COUNT(gGradMakers); j++) { | 129 for (size_t j = 0; j < SK_ARRAY_COUNT(gGradMakers); j++) { |
132 SkMatrix scale = SkMatrix::I(); | 130 SkMatrix scale = SkMatrix::I(); |
133 | 131 |
134 if (i == 5) { // if the clamp case | 132 if (i == 5) { // if the clamp case |
135 scale.setScale(0.5f, 0.5f); | 133 scale.setScale(0.5f, 0.5f); |
136 scale.postTranslate(25.f, 25.f); | 134 scale.postTranslate(25.f, 25.f); |
137 } | 135 } |
138 | 136 |
139 SkShader* shader = gGradMakers[j](pts, gGradData[i], tm, scale); | 137 paint.setShader(gGradMakers[j](pts, gGradData[i], tm, scale)); |
140 | |
141 paint.setShader(shader); | |
142 canvas->drawRect(r, paint); | 138 canvas->drawRect(r, paint); |
143 shader->unref(); | |
144 canvas->translate(0, SkIntToScalar(120)); | 139 canvas->translate(0, SkIntToScalar(120)); |
145 } | 140 } |
146 canvas->restore(); | 141 canvas->restore(); |
147 canvas->translate(SkIntToScalar(120), 0); | 142 canvas->translate(SkIntToScalar(120), 0); |
148 } | 143 } |
149 } | 144 } |
150 | 145 |
151 protected: | 146 protected: |
152 bool fDither; | 147 bool fDither; |
153 | 148 |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
189 canvas->translate(SkIntToScalar(20), SkIntToScalar(20)); | 184 canvas->translate(SkIntToScalar(20), SkIntToScalar(20)); |
190 for (size_t i = 0; i < SK_ARRAY_COUNT(gGradData); i++) { | 185 for (size_t i = 0; i < SK_ARRAY_COUNT(gGradData); i++) { |
191 canvas->save(); | 186 canvas->save(); |
192 for (size_t j = 0; j < SK_ARRAY_COUNT(gGradMakers); j++) { | 187 for (size_t j = 0; j < SK_ARRAY_COUNT(gGradMakers); j++) { |
193 // apply an increasing y perspective as we move to the right | 188 // apply an increasing y perspective as we move to the right |
194 SkMatrix perspective; | 189 SkMatrix perspective; |
195 perspective.setIdentity(); | 190 perspective.setIdentity(); |
196 perspective.setPerspY(SkIntToScalar(i+1) / 500); | 191 perspective.setPerspY(SkIntToScalar(i+1) / 500); |
197 perspective.setSkewX(SkIntToScalar(i+1) / 10); | 192 perspective.setSkewX(SkIntToScalar(i+1) / 10); |
198 | 193 |
199 SkShader* shader = gGradMakers[j](pts, gGradData[i], tm, perspec tive); | 194 paint.setShader(gGradMakers[j](pts, gGradData[i], tm, perspectiv e)); |
200 | |
201 paint.setShader(shader); | |
202 canvas->drawRect(r, paint); | 195 canvas->drawRect(r, paint); |
203 shader->unref(); | |
204 canvas->translate(0, SkIntToScalar(120)); | 196 canvas->translate(0, SkIntToScalar(120)); |
205 } | 197 } |
206 canvas->restore(); | 198 canvas->restore(); |
207 canvas->translate(SkIntToScalar(120), 0); | 199 canvas->translate(SkIntToScalar(120), 0); |
208 } | 200 } |
209 } | 201 } |
210 | 202 |
211 private: | 203 private: |
212 bool fDither; | 204 bool fDither; |
213 | 205 |
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
280 this->drawBG(canvas); | 272 this->drawBG(canvas); |
281 | 273 |
282 SkColor colors[] = { SK_ColorRED, SK_ColorGREEN, SK_ColorGREEN, SK_Color RED }; | 274 SkColor colors[] = { SK_ColorRED, SK_ColorGREEN, SK_ColorGREEN, SK_Color RED }; |
283 SkScalar pos[] = { 0, 0.01f, 0.99f, SK_Scalar1 }; | 275 SkScalar pos[] = { 0, 0.01f, 0.99f, SK_Scalar1 }; |
284 SkPoint c0; | 276 SkPoint c0; |
285 c0.iset(-80, 25); | 277 c0.iset(-80, 25); |
286 SkScalar r0 = SkIntToScalar(70); | 278 SkScalar r0 = SkIntToScalar(70); |
287 SkPoint c1; | 279 SkPoint c1; |
288 c1.iset(0, 25); | 280 c1.iset(0, 25); |
289 SkScalar r1 = SkIntToScalar(150); | 281 SkScalar r1 = SkIntToScalar(150); |
290 SkShader* s = SkGradientShader::CreateTwoPointConical(c0, r0, c1, r1, co lors, | 282 SkPaint paint; |
283 paint.setShader(SkGradientShader::MakeTwoPointConical(c0, r0, c1, r1, co lors, | |
291 pos, SK_ARRAY_COUN T(pos), | 284 pos, SK_ARRAY_COUN T(pos), |
292 SkShader::kClamp_T ileMode); | 285 SkShader::kClamp_T ileMode)); |
293 SkPaint paint; | |
294 paint.setDither(fDither); | 286 paint.setDither(fDither); |
295 paint.setShader(s)->unref(); | |
296 canvas->drawPaint(paint); | 287 canvas->drawPaint(paint); |
297 } | 288 } |
298 | 289 |
299 private: | 290 private: |
300 bool fDither; | 291 bool fDither; |
301 | 292 |
302 typedef GM INHERITED; | 293 typedef GM INHERITED; |
303 }; | 294 }; |
304 DEF_GM( return new GradientsDegenrate2PointGM(true); ) | 295 DEF_GM( return new GradientsDegenrate2PointGM(true); ) |
305 DEF_GM( return new GradientsDegenrate2PointGM(false); ) | 296 DEF_GM( return new GradientsDegenrate2PointGM(false); ) |
(...skipping 16 matching lines...) Expand all Loading... | |
322 */ | 313 */ |
323 | 314 |
324 // should draw only green | 315 // should draw only green |
325 DEF_SIMPLE_GM(small_color_stop, canvas, 100, 150) { | 316 DEF_SIMPLE_GM(small_color_stop, canvas, 100, 150) { |
326 SkColor colors[] = { SK_ColorGREEN, SK_ColorRED, SK_ColorYELLOW }; | 317 SkColor colors[] = { SK_ColorGREEN, SK_ColorRED, SK_ColorYELLOW }; |
327 SkScalar pos[] = { 0, 0.003f, SK_Scalar1 }; // 0.004f makes this work | 318 SkScalar pos[] = { 0, 0.003f, SK_Scalar1 }; // 0.004f makes this work |
328 SkPoint c0 = { 200, 25 }; | 319 SkPoint c0 = { 200, 25 }; |
329 SkScalar r0 = 20; | 320 SkScalar r0 = 20; |
330 SkPoint c1 = { 200, 25 }; | 321 SkPoint c1 = { 200, 25 }; |
331 SkScalar r1 = 10; | 322 SkScalar r1 = 10; |
332 SkShader* s = SkGradientShader::CreateTwoPointConical(c0, r0, c1, r1, colors , | 323 |
333 pos, SK_ARRAY_COUNT(po s), | |
334 SkShader::kClamp_TileM ode); | |
335 SkPaint paint; | 324 SkPaint paint; |
336 paint.setColor(SK_ColorYELLOW); | 325 paint.setColor(SK_ColorYELLOW); |
337 canvas->drawRect(SkRect::MakeWH(100, 150), paint); | 326 canvas->drawRect(SkRect::MakeWH(100, 150), paint); |
338 paint.setShader(s)->unref(); | 327 paint.setShader(SkGradientShader::MakeTwoPointConical(c0, r0, c1, r1, colors , pos, |
328 SK_ARRAY_COUNT(pos), | |
329 SkShader::kClamp_TileM ode)); | |
339 canvas->drawRect(SkRect::MakeWH(100, 150), paint); | 330 canvas->drawRect(SkRect::MakeWH(100, 150), paint); |
340 } | 331 } |
341 | 332 |
342 | 333 |
343 /// Tests correctness of *optimized* codepaths in gradients. | 334 /// Tests correctness of *optimized* codepaths in gradients. |
344 | 335 |
345 class ClampedGradientsGM : public GM { | 336 class ClampedGradientsGM : public GM { |
346 public: | 337 public: |
347 ClampedGradientsGM(bool dither) : fDither(dither) {} | 338 ClampedGradientsGM(bool dither) : fDither(dither) {} |
348 | 339 |
(...skipping 12 matching lines...) Expand all Loading... | |
361 this->drawBG(canvas); | 352 this->drawBG(canvas); |
362 | 353 |
363 SkRect r = { 0, 0, SkIntToScalar(100), SkIntToScalar(300) }; | 354 SkRect r = { 0, 0, SkIntToScalar(100), SkIntToScalar(300) }; |
364 SkPaint paint; | 355 SkPaint paint; |
365 paint.setDither(fDither); | 356 paint.setDither(fDither); |
366 paint.setAntiAlias(true); | 357 paint.setAntiAlias(true); |
367 | 358 |
368 SkPoint center; | 359 SkPoint center; |
369 center.iset(0, 300); | 360 center.iset(0, 300); |
370 canvas->translate(SkIntToScalar(20), SkIntToScalar(20)); | 361 canvas->translate(SkIntToScalar(20), SkIntToScalar(20)); |
371 SkShader* shader = SkGradientShader::CreateRadial( | 362 paint.setShader(SkGradientShader::MakeRadial( |
372 SkPoint(center), | 363 SkPoint(center), |
373 SkIntToScalar(200), gColors, nullptr, 5, | 364 SkIntToScalar(200), gColors, nullptr, 5, |
374 SkShader::kClamp_TileMode); | 365 SkShader::kClamp_TileMode)); |
375 paint.setShader(shader); | |
376 canvas->drawRect(r, paint); | 366 canvas->drawRect(r, paint); |
377 shader->unref(); | |
378 } | 367 } |
379 | 368 |
380 private: | 369 private: |
381 bool fDither; | 370 bool fDither; |
382 | 371 |
383 typedef GM INHERITED; | 372 typedef GM INHERITED; |
384 }; | 373 }; |
385 DEF_GM( return new ClampedGradientsGM(true); ) | 374 DEF_GM( return new ClampedGradientsGM(true); ) |
386 DEF_GM( return new ClampedGradientsGM(false); ) | 375 DEF_GM( return new ClampedGradientsGM(false); ) |
387 | 376 |
(...skipping 18 matching lines...) Expand all Loading... | |
406 | 395 |
407 SkPaint paint; | 396 SkPaint paint; |
408 paint.setDither(true); | 397 paint.setDither(true); |
409 SkPoint center; | 398 SkPoint center; |
410 center.set(SkIntToScalar(dim.width())/2, SkIntToScalar(dim.height())/2); | 399 center.set(SkIntToScalar(dim.width())/2, SkIntToScalar(dim.height())/2); |
411 SkScalar radius = SkIntToScalar(dim.width())/2; | 400 SkScalar radius = SkIntToScalar(dim.width())/2; |
412 const SkColor colors[] = { 0x7f7f7f7f, 0x7f7f7f7f, 0xb2000000 }; | 401 const SkColor colors[] = { 0x7f7f7f7f, 0x7f7f7f7f, 0xb2000000 }; |
413 const SkScalar pos[] = { 0.0f, | 402 const SkScalar pos[] = { 0.0f, |
414 0.35f, | 403 0.35f, |
415 1.0f }; | 404 1.0f }; |
416 SkShader* shader = | 405 paint.setShader(SkGradientShader::MakeRadial(center, radius, colors, pos , |
417 SkGradientShader::CreateRadial(center, radius, colors, | 406 SK_ARRAY_COUNT(pos), |
418 pos, SK_ARRAY_COUNT(pos), | 407 SkShader::kClamp_TileMode)) ; |
419 SkShader::kClamp_TileMode); | |
420 paint.setShader(shader)->unref(); | |
421 SkRect r = { | 408 SkRect r = { |
422 0, 0, SkIntToScalar(dim.width()), SkIntToScalar(dim.height()) | 409 0, 0, SkIntToScalar(dim.width()), SkIntToScalar(dim.height()) |
423 }; | 410 }; |
424 canvas->drawRect(r, paint); | 411 canvas->drawRect(r, paint); |
425 } | 412 } |
426 private: | 413 private: |
427 typedef GM INHERITED; | 414 typedef GM INHERITED; |
428 }; | 415 }; |
429 DEF_GM( return new RadialGradientGM; ) | 416 DEF_GM( return new RadialGradientGM; ) |
430 | 417 |
(...skipping 26 matching lines...) Expand all Loading... | |
457 | 444 |
458 const SkScalar cx = 200, cy = 200, radius = 150; | 445 const SkScalar cx = 200, cy = 200, radius = 150; |
459 SkPoint center; | 446 SkPoint center; |
460 center.set(cx, cy); | 447 center.set(cx, cy); |
461 | 448 |
462 // We can either interpolate endpoints and premultiply each point (defau lt, more precision), | 449 // We can either interpolate endpoints and premultiply each point (defau lt, more precision), |
463 // or premultiply the endpoints first, avoiding the need to premultiply each point (cheap). | 450 // or premultiply the endpoints first, avoiding the need to premultiply each point (cheap). |
464 const uint32_t flags[] = { 0, SkGradientShader::kInterpolateColorsInPrem ul_Flag }; | 451 const uint32_t flags[] = { 0, SkGradientShader::kInterpolateColorsInPrem ul_Flag }; |
465 | 452 |
466 for (size_t i = 0; i < SK_ARRAY_COUNT(flags); i++) { | 453 for (size_t i = 0; i < SK_ARRAY_COUNT(flags); i++) { |
467 SkAutoTUnref<SkShader> sweep( | 454 auto sweep = SkGradientShader::MakeSweep(cx, cy, sweep_colors, |
468 SkGradientShader::CreateSweep(cx, cy, sweep_colors, | 455 nullptr, SK_ARRAY_COUNT(swe ep_colors), |
469 nullptr, SK_ARRAY_COUNT(sweep_ colors), | 456 flags[i], nullptr); |
470 flags[i], nullptr)); | 457 auto radial1 = SkGradientShader::MakeRadial(center, radius, colors1, |
471 SkAutoTUnref<SkShader> radial1( | 458 nullptr, SK_ARRAY_COUNT( colors1), |
472 SkGradientShader::CreateRadial(center, radius, colors1, | 459 SkShader::kClamp_TileMod e, |
473 nullptr, SK_ARRAY_COUNT(color s1), | 460 flags[i], nullptr); |
474 SkShader::kClamp_TileMode, | 461 auto radial2 = SkGradientShader::MakeRadial(center, radius, colors2, |
475 flags[i], nullptr)); | 462 nullptr, SK_ARRAY_COUNT( colors2), |
476 SkAutoTUnref<SkShader> radial2( | 463 SkShader::kClamp_TileMod e, |
477 SkGradientShader::CreateRadial(center, radius, colors2, | 464 flags[i], nullptr); |
478 nullptr, SK_ARRAY_COUNT(color s2), | |
479 SkShader::kClamp_TileMode, | |
480 flags[i], nullptr)); | |
481 paint1.setShader(sweep); | 465 paint1.setShader(sweep); |
f(malita)
2016/03/13 16:18:01
nit: move
reed1
2016/03/13 18:25:24
Done.
| |
482 paint1.setDither(fDither); | 466 paint1.setDither(fDither); |
483 paint2.setShader(radial1); | 467 paint2.setShader(radial1); |
f(malita)
2016/03/13 16:18:01
ditto
reed1
2016/03/13 18:25:23
Done.
| |
484 paint2.setDither(fDither); | 468 paint2.setDither(fDither); |
485 paint3.setShader(radial2); | 469 paint3.setShader(radial2); |
f(malita)
2016/03/13 16:18:01
ditto
reed1
2016/03/13 18:25:23
Done.
| |
486 paint3.setDither(fDither); | 470 paint3.setDither(fDither); |
487 | 471 |
488 canvas->drawCircle(cx, cy, radius, paint1); | 472 canvas->drawCircle(cx, cy, radius, paint1); |
489 canvas->drawCircle(cx, cy, radius, paint3); | 473 canvas->drawCircle(cx, cy, radius, paint3); |
490 canvas->drawCircle(cx, cy, radius, paint2); | 474 canvas->drawCircle(cx, cy, radius, paint2); |
491 | 475 |
492 canvas->translate(400, 0); | 476 canvas->translate(400, 0); |
493 } | 477 } |
494 } | 478 } |
495 | 479 |
(...skipping 16 matching lines...) Expand all Loading... | |
512 } | 496 } |
513 | 497 |
514 SkISize onISize() override { return SkISize::Make(500, 500); } | 498 SkISize onISize() override { return SkISize::Make(500, 500); } |
515 | 499 |
516 bool runAsBench() const override { return true; } | 500 bool runAsBench() const override { return true; } |
517 | 501 |
518 void onOnceBeforeDraw() override { | 502 void onOnceBeforeDraw() override { |
519 const SkPoint center = { 0, 0 }; | 503 const SkPoint center = { 0, 0 }; |
520 const SkScalar kRadius = 3000; | 504 const SkScalar kRadius = 3000; |
521 const SkColor gColors[] = { 0xFFFFFFFF, 0xFF000000 }; | 505 const SkColor gColors[] = { 0xFFFFFFFF, 0xFF000000 }; |
522 fShader.reset(SkGradientShader::CreateRadial(center, kRadius, gColors, n ullptr, 2, | 506 fShader = SkGradientShader::MakeRadial(center, kRadius, gColors, nullptr , 2, |
523 SkShader::kClamp_TileMode)) ; | 507 SkShader::kClamp_TileMode); |
524 } | 508 } |
525 | 509 |
526 void onDraw(SkCanvas* canvas) override { | 510 void onDraw(SkCanvas* canvas) override { |
527 SkPaint paint; | 511 SkPaint paint; |
528 paint.setShader(fShader); | 512 paint.setShader(fShader); |
529 paint.setDither(fDither); | 513 paint.setDither(fDither); |
530 canvas->drawRect(SkRect::MakeWH(500, 500), paint); | 514 canvas->drawRect(SkRect::MakeWH(500, 500), paint); |
531 } | 515 } |
532 | 516 |
533 private: | 517 private: |
534 SkAutoTUnref<SkShader> fShader; | 518 sk_sp<SkShader> fShader; |
535 bool fDither; | 519 bool fDither; |
536 | 520 |
537 typedef GM INHERITED; | 521 typedef GM INHERITED; |
538 }; | 522 }; |
539 DEF_GM( return new RadialGradient3GM(true); ) | 523 DEF_GM( return new RadialGradient3GM(true); ) |
540 DEF_GM( return new RadialGradient3GM(false); ) | 524 DEF_GM( return new RadialGradient3GM(false); ) |
541 | 525 |
542 class RadialGradient4GM : public GM { | 526 class RadialGradient4GM : public GM { |
543 public: | 527 public: |
544 RadialGradient4GM(bool dither) : fDither(dither) { } | 528 RadialGradient4GM(bool dither) : fDither(dither) { } |
545 | 529 |
546 protected: | 530 protected: |
547 SkString onShortName() override { | 531 SkString onShortName() override { |
548 return SkString(fDither ? "radial_gradient4" : "radial_gradient4_nodithe r"); | 532 return SkString(fDither ? "radial_gradient4" : "radial_gradient4_nodithe r"); |
549 } | 533 } |
550 | 534 |
551 SkISize onISize() override { return SkISize::Make(500, 500); } | 535 SkISize onISize() override { return SkISize::Make(500, 500); } |
552 | 536 |
553 void onOnceBeforeDraw() override { | 537 void onOnceBeforeDraw() override { |
554 const SkPoint center = { 250, 250 }; | 538 const SkPoint center = { 250, 250 }; |
555 const SkScalar kRadius = 250; | 539 const SkScalar kRadius = 250; |
556 const SkColor colors[] = { SK_ColorRED, SK_ColorRED, SK_ColorWHITE, SK_C olorWHITE, | 540 const SkColor colors[] = { SK_ColorRED, SK_ColorRED, SK_ColorWHITE, SK_C olorWHITE, |
557 SK_ColorRED }; | 541 SK_ColorRED }; |
558 const SkScalar pos[] = { 0, .4f, .4f, .8f, .8f, 1 }; | 542 const SkScalar pos[] = { 0, .4f, .4f, .8f, .8f, 1 }; |
559 fShader.reset(SkGradientShader::CreateRadial(center, kRadius, colors, po s, | 543 fShader = SkGradientShader::MakeRadial(center, kRadius, colors, pos, |
560 SK_ARRAY_COUNT(gColors), SkShader::kClamp_TileMode)); | 544 SK_ARRAY_COUNT(gColors), SkShader ::kClamp_TileMode); |
561 } | 545 } |
562 | 546 |
563 void onDraw(SkCanvas* canvas) override { | 547 void onDraw(SkCanvas* canvas) override { |
564 SkPaint paint; | 548 SkPaint paint; |
565 paint.setAntiAlias(true); | 549 paint.setAntiAlias(true); |
566 paint.setDither(fDither); | 550 paint.setDither(fDither); |
567 paint.setShader(fShader); | 551 paint.setShader(fShader); |
568 canvas->drawRect(SkRect::MakeWH(500, 500), paint); | 552 canvas->drawRect(SkRect::MakeWH(500, 500), paint); |
569 } | 553 } |
570 | 554 |
571 private: | 555 private: |
572 SkAutoTUnref<SkShader> fShader; | 556 sk_sp<SkShader> fShader; |
573 bool fDither; | 557 bool fDither; |
574 | 558 |
575 typedef GM INHERITED; | 559 typedef GM INHERITED; |
576 }; | 560 }; |
577 DEF_GM( return new RadialGradient4GM(true); ) | 561 DEF_GM( return new RadialGradient4GM(true); ) |
578 DEF_GM( return new RadialGradient4GM(false); ) | 562 DEF_GM( return new RadialGradient4GM(false); ) |
579 | 563 |
580 class LinearGradientGM : public GM { | 564 class LinearGradientGM : public GM { |
581 public: | 565 public: |
582 LinearGradientGM(bool dither) : fDither(dither) { } | 566 LinearGradientGM(bool dither) : fDither(dither) { } |
(...skipping 14 matching lines...) Expand all Loading... | |
597 const SkColor colors[] = { SK_ColorWHITE, SK_ColorWHITE, 0xFF008200, 0xF F008200, | 581 const SkColor colors[] = { SK_ColorWHITE, SK_ColorWHITE, 0xFF008200, 0xF F008200, |
598 SK_ColorWHITE, SK_ColorWHITE }; | 582 SK_ColorWHITE, SK_ColorWHITE }; |
599 const SkScalar unitPos[] = { 0, 50, 70, 500, 540 }; | 583 const SkScalar unitPos[] = { 0, 50, 70, 500, 540 }; |
600 SkScalar pos[6]; | 584 SkScalar pos[6]; |
601 pos[5] = 1; | 585 pos[5] = 1; |
602 for (int index = 0; index < (int) SK_ARRAY_COUNT(fShader); ++index) { | 586 for (int index = 0; index < (int) SK_ARRAY_COUNT(fShader); ++index) { |
603 pts[1].fX = 500.f + index * kWidthBump; | 587 pts[1].fX = 500.f + index * kWidthBump; |
604 for (int inner = 0; inner < (int) SK_ARRAY_COUNT(unitPos); ++inner) { | 588 for (int inner = 0; inner < (int) SK_ARRAY_COUNT(unitPos); ++inner) { |
605 pos[inner] = unitPos[inner] / (kMinWidth + index * kWidthBump); | 589 pos[inner] = unitPos[inner] / (kMinWidth + index * kWidthBump); |
606 } | 590 } |
607 fShader[index].reset(SkGradientShader::CreateLinear(pts, colors, pos , | 591 fShader[index] = SkGradientShader::MakeLinear(pts, colors, pos, |
608 SK_ARRAY_COUNT(gColors), SkShader::kClamp_TileMode)); | 592 SK_ARRAY_COUNT(gColors), SkShader::kClamp_TileMode); |
609 } | 593 } |
610 } | 594 } |
611 | 595 |
612 void onDraw(SkCanvas* canvas) override { | 596 void onDraw(SkCanvas* canvas) override { |
613 SkPaint paint; | 597 SkPaint paint; |
614 paint.setAntiAlias(true); | 598 paint.setAntiAlias(true); |
615 paint.setDither(fDither); | 599 paint.setDither(fDither); |
616 for (int index = 0; index < (int) SK_ARRAY_COUNT(fShader); ++index) { | 600 for (int index = 0; index < (int) SK_ARRAY_COUNT(fShader); ++index) { |
617 paint.setShader(fShader[index]); | 601 paint.setShader(fShader[index]); |
618 canvas->drawRect(SkRect::MakeLTRB(0, index * kHeight, kMinWidth + in dex * kWidthBump, | 602 canvas->drawRect(SkRect::MakeLTRB(0, index * kHeight, kMinWidth + in dex * kWidthBump, |
619 (index + 1) * kHeight), paint); | 603 (index + 1) * kHeight), paint); |
620 } | 604 } |
621 } | 605 } |
622 | 606 |
623 private: | 607 private: |
624 SkAutoTUnref<SkShader> fShader[100]; | 608 sk_sp<SkShader> fShader[100]; |
625 bool fDither; | 609 bool fDither; |
626 | 610 |
627 typedef GM INHERITED; | 611 typedef GM INHERITED; |
628 }; | 612 }; |
629 DEF_GM( return new LinearGradientGM(true); ) | 613 DEF_GM( return new LinearGradientGM(true); ) |
630 DEF_GM( return new LinearGradientGM(false); ) | 614 DEF_GM( return new LinearGradientGM(false); ) |
631 | 615 |
632 class LinearGradientTinyGM : public GM { | 616 class LinearGradientTinyGM : public GM { |
633 public: | 617 public: |
634 LinearGradientTinyGM(uint32_t flags, const char* suffix = nullptr) | 618 LinearGradientTinyGM(uint32_t flags, const char* suffix = nullptr) |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
666 | 650 |
667 { { SkPoint::Make(0, 0), SkPoint::Make(0.00001f, 0) }, { 0, 0 .5f, 1 }}, | 651 { { SkPoint::Make(0, 0), SkPoint::Make(0.00001f, 0) }, { 0, 0 .5f, 1 }}, |
668 { { SkPoint::Make(9.99999f, 0), SkPoint::Make(10, 0) }, { 0, 0 .5f, 1 }}, | 652 { { SkPoint::Make(9.99999f, 0), SkPoint::Make(10, 0) }, { 0, 0 .5f, 1 }}, |
669 { { SkPoint::Make(0, 0), SkPoint::Make(0, 0.00001f) }, { 0, 0 .5f, 1 }}, | 653 { { SkPoint::Make(0, 0), SkPoint::Make(0, 0.00001f) }, { 0, 0 .5f, 1 }}, |
670 { { SkPoint::Make(0, 9.99999f), SkPoint::Make(0, 10) }, { 0, 0 .5f, 1 }}, | 654 { { SkPoint::Make(0, 9.99999f), SkPoint::Make(0, 10) }, { 0, 0 .5f, 1 }}, |
671 }; | 655 }; |
672 | 656 |
673 SkPaint paint; | 657 SkPaint paint; |
674 for (unsigned i = 0; i < SK_ARRAY_COUNT(configs); ++i) { | 658 for (unsigned i = 0; i < SK_ARRAY_COUNT(configs); ++i) { |
675 SkAutoCanvasRestore acr(canvas, true); | 659 SkAutoCanvasRestore acr(canvas, true); |
676 SkAutoTUnref<SkShader> gradient( | 660 paint.setShader(SkGradientShader::MakeLinear(configs[i].pts, colors, configs[i].pos, |
677 SkGradientShader::CreateLinear(configs[i].pts, colors, configs[i ].pos, kStopCount, | 661 kStopCount, SkShader::k Clamp_TileMode, |
678 SkShader::kClamp_TileMode, fFlags , nullptr)); | 662 fFlags, nullptr)); |
679 canvas->translate(kRectSize * ((i % 4) * 1.5f + 0.25f), | 663 canvas->translate(kRectSize * ((i % 4) * 1.5f + 0.25f), |
680 kRectSize * ((i / 4) * 1.5f + 0.25f)); | 664 kRectSize * ((i / 4) * 1.5f + 0.25f)); |
681 | 665 |
682 paint.setShader(gradient); | |
683 canvas->drawRect(SkRect::MakeWH(kRectSize, kRectSize), paint); | 666 canvas->drawRect(SkRect::MakeWH(kRectSize, kRectSize), paint); |
684 } | 667 } |
685 } | 668 } |
686 | 669 |
687 private: | 670 private: |
688 typedef GM INHERITED; | 671 typedef GM INHERITED; |
689 | 672 |
690 SkString fName; | 673 SkString fName; |
691 uint32_t fFlags; | 674 uint32_t fFlags; |
692 }; | 675 }; |
693 DEF_GM( return new LinearGradientTinyGM(0); ) | 676 DEF_GM( return new LinearGradientTinyGM(0); ) |
694 DEF_GM( return new LinearGradientTinyGM(SkLinearGradient::kForce4fContext_Privat eFlag, "_4f"); ) | 677 DEF_GM( return new LinearGradientTinyGM(SkLinearGradient::kForce4fContext_Privat eFlag, "_4f"); ) |
695 } | 678 } |
696 | 679 |
697 //////////////////////////////////////////////////////////////////////////////// /////////////////// | 680 //////////////////////////////////////////////////////////////////////////////// /////////////////// |
698 | 681 |
699 struct GradRun { | 682 struct GradRun { |
700 SkColor fColors[4]; | 683 SkColor fColors[4]; |
701 SkScalar fPos[4]; | 684 SkScalar fPos[4]; |
702 int fCount; | 685 int fCount; |
703 }; | 686 }; |
704 | 687 |
705 #define SIZE 121 | 688 #define SIZE 121 |
706 | 689 |
707 static SkShader* make_linear(const GradRun& run, SkShader::TileMode mode) { | 690 static sk_sp<SkShader> make_linear(const GradRun& run, SkShader::TileMode mode) { |
708 const SkPoint pts[] { { 30, 30 }, { SIZE - 30, SIZE - 30 } }; | 691 const SkPoint pts[] { { 30, 30 }, { SIZE - 30, SIZE - 30 } }; |
709 return SkGradientShader::CreateLinear(pts, run.fColors, run.fPos, run.fCount , mode); | 692 return SkGradientShader::MakeLinear(pts, run.fColors, run.fPos, run.fCount, mode); |
710 } | 693 } |
711 | 694 |
712 static SkShader* make_radial(const GradRun& run, SkShader::TileMode mode) { | 695 static sk_sp<SkShader> make_radial(const GradRun& run, SkShader::TileMode mode) { |
713 const SkScalar half = SIZE * 0.5f; | 696 const SkScalar half = SIZE * 0.5f; |
714 return SkGradientShader::CreateRadial({half,half}, half - 10, | 697 return SkGradientShader::MakeRadial({half,half}, half - 10, run.fColors, run .fPos, |
698 run.fCount, mode); | |
699 } | |
700 | |
701 static sk_sp<SkShader> make_conical(const GradRun& run, SkShader::TileMode mode) { | |
702 const SkScalar half = SIZE * 0.5f; | |
703 const SkPoint center { half, half }; | |
704 return SkGradientShader::MakeTwoPointConical(center, 20, center, half - 10, | |
715 run.fColors, run.fPos, run.fCount, mod e); | 705 run.fColors, run.fPos, run.fCount, mod e); |
f(malita)
2016/03/13 16:18:01
nit: indentation
reed1
2016/03/13 18:25:23
Done.
| |
716 } | 706 } |
717 | 707 |
718 static SkShader* make_conical(const GradRun& run, SkShader::TileMode mode) { | 708 static sk_sp<SkShader> make_sweep(const GradRun& run, SkShader::TileMode) { |
719 const SkScalar half = SIZE * 0.5f; | 709 const SkScalar half = SIZE * 0.5f; |
720 const SkPoint center { half, half }; | 710 return SkGradientShader::MakeSweep(half, half, run.fColors, run.fPos, run.fC ount); |
721 return SkGradientShader::CreateTwoPointConical(center, 20, center, half - 10 , | |
722 run.fColors, run.fPos, run.fCount, mod e); | |
723 } | |
724 | |
725 static SkShader* make_sweep(const GradRun& run, SkShader::TileMode) { | |
726 const SkScalar half = SIZE * 0.5f; | |
727 return SkGradientShader::CreateSweep(half, half, run.fColors, run.fPos, run. fCount); | |
728 } | 711 } |
729 | 712 |
730 /* | 713 /* |
731 * Exercise duplicate color-stops, at the ends, and in the middle | 714 * Exercise duplicate color-stops, at the ends, and in the middle |
732 * | 715 * |
733 * At the time of this writing, only Linear correctly deals with duplicates at the ends, | 716 * At the time of this writing, only Linear correctly deals with duplicates at the ends, |
734 * and then only correctly on CPU backend. | 717 * and then only correctly on CPU backend. |
735 */ | 718 */ |
736 DEF_SIMPLE_GM(gradients_dup_color_stops, canvas, 704, 564) { | 719 DEF_SIMPLE_GM(gradients_dup_color_stops, canvas, 704, 564) { |
737 const SkColor preColor = 0xFFFF0000; // clamp color before start | 720 const SkColor preColor = 0xFFFF0000; // clamp color before start |
(...skipping 17 matching lines...) Expand all Loading... | |
755 }, | 738 }, |
756 { { preColor, color0, color1, postColor }, | 739 { { preColor, color0, color1, postColor }, |
757 { 0, 0, 1, 1 }, | 740 { 0, 0, 1, 1 }, |
758 4, | 741 4, |
759 }, | 742 }, |
760 { { color0, color0, color1, color1 }, | 743 { { color0, color0, color1, color1 }, |
761 { 0, 0.5f, 0.5f, 1 }, | 744 { 0, 0.5f, 0.5f, 1 }, |
762 4, | 745 4, |
763 }, | 746 }, |
764 }; | 747 }; |
765 SkShader* (*factories[])(const GradRun&, SkShader::TileMode) { | 748 sk_sp<SkShader> (*factories[])(const GradRun&, SkShader::TileMode) { |
766 make_linear, make_radial, make_conical, make_sweep | 749 make_linear, make_radial, make_conical, make_sweep |
767 }; | 750 }; |
768 | 751 |
769 const SkRect rect = SkRect::MakeWH(SIZE, SIZE); | 752 const SkRect rect = SkRect::MakeWH(SIZE, SIZE); |
770 const SkScalar dx = SIZE + 20; | 753 const SkScalar dx = SIZE + 20; |
771 const SkScalar dy = SIZE + 20; | 754 const SkScalar dy = SIZE + 20; |
772 const SkShader::TileMode mode = SkShader::kClamp_TileMode; | 755 const SkShader::TileMode mode = SkShader::kClamp_TileMode; |
773 | 756 |
774 SkPaint paint; | 757 SkPaint paint; |
775 canvas->translate(10, 10 - dy); | 758 canvas->translate(10, 10 - dy); |
776 for (auto factory : factories) { | 759 for (auto factory : factories) { |
777 canvas->translate(0, dy); | 760 canvas->translate(0, dy); |
778 SkAutoCanvasRestore acr(canvas, true); | 761 SkAutoCanvasRestore acr(canvas, true); |
779 for (const auto& run : runs) { | 762 for (const auto& run : runs) { |
780 paint.setShader(factory(run, mode))->unref(); | 763 paint.setShader(factory(run, mode)); |
781 canvas->drawRect(rect, paint); | 764 canvas->drawRect(rect, paint); |
782 canvas->translate(dx, 0); | 765 canvas->translate(dx, 0); |
783 } | 766 } |
784 } | 767 } |
785 } | 768 } |
786 | 769 |
787 static void draw_many_stops(SkCanvas* canvas, uint32_t flags) { | 770 static void draw_many_stops(SkCanvas* canvas, uint32_t flags) { |
788 const unsigned kStopCount = 200; | 771 const unsigned kStopCount = 200; |
789 const SkPoint pts[] = { {50, 50}, {450, 465}}; | 772 const SkPoint pts[] = { {50, 50}, {450, 465}}; |
790 | 773 |
791 SkColor colors[kStopCount]; | 774 SkColor colors[kStopCount]; |
792 for (unsigned i = 0; i < kStopCount; i++) { | 775 for (unsigned i = 0; i < kStopCount; i++) { |
793 switch (i % 5) { | 776 switch (i % 5) { |
794 case 0: colors[i] = SK_ColorRED; break; | 777 case 0: colors[i] = SK_ColorRED; break; |
795 case 1: colors[i] = SK_ColorGREEN; break; | 778 case 1: colors[i] = SK_ColorGREEN; break; |
796 case 2: colors[i] = SK_ColorGREEN; break; | 779 case 2: colors[i] = SK_ColorGREEN; break; |
797 case 3: colors[i] = SK_ColorBLUE; break; | 780 case 3: colors[i] = SK_ColorBLUE; break; |
798 case 4: colors[i] = SK_ColorRED; break; | 781 case 4: colors[i] = SK_ColorRED; break; |
799 } | 782 } |
800 } | 783 } |
801 | 784 |
802 SkAutoTUnref<SkShader> shader(SkGradientShader::CreateLinear( | 785 SkPaint p; |
786 p.setShader(SkGradientShader::MakeLinear( | |
803 pts, colors, nullptr, SK_ARRAY_COUNT(colors), SkShader::kClamp_TileMode, flags, nullptr)); | 787 pts, colors, nullptr, SK_ARRAY_COUNT(colors), SkShader::kClamp_TileMode, flags, nullptr)); |
804 | 788 |
805 SkPaint p; | |
806 p.setShader(shader); | |
807 | |
808 canvas->drawRect(SkRect::MakeXYWH(0, 0, 500, 500), p); | 789 canvas->drawRect(SkRect::MakeXYWH(0, 0, 500, 500), p); |
809 } | 790 } |
810 | 791 |
811 DEF_SIMPLE_GM(gradient_many_stops, canvas, 500, 500) { | 792 DEF_SIMPLE_GM(gradient_many_stops, canvas, 500, 500) { |
812 draw_many_stops(canvas, 0); | 793 draw_many_stops(canvas, 0); |
813 } | 794 } |
814 | 795 |
815 DEF_SIMPLE_GM(gradient_many_stops_4f, canvas, 500, 500) { | 796 DEF_SIMPLE_GM(gradient_many_stops_4f, canvas, 500, 500) { |
816 draw_many_stops(canvas, SkLinearGradient::kForce4fContext_PrivateFlag); | 797 draw_many_stops(canvas, SkLinearGradient::kForce4fContext_PrivateFlag); |
817 } | 798 } |
OLD | NEW |