localmatrixshader.cpp 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. /*
  2. * Copyright 2018 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. #include "gm/gm.h"
  8. #include "include/core/SkBlendMode.h"
  9. #include "include/core/SkCanvas.h"
  10. #include "include/core/SkColor.h"
  11. #include "include/core/SkImage.h"
  12. #include "include/core/SkImageInfo.h"
  13. #include "include/core/SkMatrix.h"
  14. #include "include/core/SkPaint.h"
  15. #include "include/core/SkRect.h"
  16. #include "include/core/SkRefCnt.h"
  17. #include "include/core/SkScalar.h"
  18. #include "include/core/SkShader.h"
  19. #include "include/core/SkSurface.h"
  20. #include "include/core/SkTypes.h"
  21. #include "tools/ToolUtils.h"
  22. static sk_sp<SkImage> make_image(SkCanvas* rootCanvas) {
  23. static constexpr SkScalar kSize = 50;
  24. SkImageInfo info = SkImageInfo::MakeN32Premul(kSize, kSize);
  25. auto surface = ToolUtils::makeSurface(rootCanvas, info);
  26. SkPaint p;
  27. p.setAntiAlias(true);
  28. p.setColor(SK_ColorGREEN);
  29. surface->getCanvas()->drawCircle(kSize / 2, kSize / 2, kSize / 2, p);
  30. p.setStyle(SkPaint::kStroke_Style);
  31. p.setColor(SK_ColorRED);
  32. surface->getCanvas()->drawLine(kSize * .25f, kSize * .50f, kSize * .75f, kSize * .50f, p);
  33. surface->getCanvas()->drawLine(kSize * .50f, kSize * .25f, kSize * .50f, kSize * .75f, p);
  34. return surface->makeImageSnapshot();
  35. }
  36. DEF_SIMPLE_GM(localmatrixshader_nested, canvas, 450, 1200) {
  37. auto image = make_image(canvas);
  38. using FactoryT = sk_sp<SkShader> (*)(const sk_sp<SkImage>&,
  39. const SkMatrix& inner,
  40. const SkMatrix& outer);
  41. static const FactoryT gFactories[] = {
  42. // SkLocalMatrixShader(SkImageShader(inner), outer)
  43. [](const sk_sp<SkImage>& img, const SkMatrix& inner, const SkMatrix& outer) {
  44. return img->makeShader(&inner)->makeWithLocalMatrix(outer);
  45. },
  46. // SkLocalMatrixShader(SkLocalMatrixShader(SkImageShader(I), inner), outer)
  47. [](const sk_sp<SkImage>& img, const SkMatrix& inner, const SkMatrix& outer) {
  48. return img->makeShader()->makeWithLocalMatrix(inner)->makeWithLocalMatrix(outer);
  49. },
  50. // SkLocalMatrixShader(SkComposeShader(SkImageShader(inner)), outer)
  51. [](const sk_sp<SkImage>& img, const SkMatrix& inner, const SkMatrix& outer) {
  52. return SkShaders::Blend(SkBlendMode::kSrcOver,
  53. SkShaders::Color(SK_ColorTRANSPARENT),
  54. img->makeShader(&inner))
  55. ->makeWithLocalMatrix(outer);
  56. },
  57. // SkLocalMatrixShader(SkComposeShader(SkLocalMatrixShader(SkImageShader(I), inner)), outer)
  58. [](const sk_sp<SkImage>& img, const SkMatrix& inner, const SkMatrix& outer) {
  59. return SkShaders::Blend(SkBlendMode::kSrcOver,
  60. SkShaders::Color(SK_ColorTRANSPARENT),
  61. img->makeShader()->makeWithLocalMatrix(inner))
  62. ->makeWithLocalMatrix(outer);
  63. },
  64. };
  65. static const auto inner = SkMatrix::MakeScale(2, 2),
  66. outer = SkMatrix::MakeTrans(20, 20);
  67. SkPaint border;
  68. border.setAntiAlias(true);
  69. border.setStyle(SkPaint::kStroke_Style);
  70. auto rect = SkRect::Make(image->bounds());
  71. SkAssertResult(SkMatrix::Concat(inner, outer).mapRect(&rect));
  72. const auto drawColumn = [&]() {
  73. SkAutoCanvasRestore acr(canvas, true);
  74. for (const auto& f : gFactories) {
  75. SkPaint p;
  76. p.setShader(f(image, inner, outer));
  77. canvas->drawRect(rect, p);
  78. canvas->drawRect(rect, border);
  79. canvas->translate(0, rect.height() * 1.5f);
  80. }
  81. };
  82. drawColumn();
  83. {
  84. SkAutoCanvasRestore acr(canvas, true);
  85. canvas->translate(0, rect.height() * SK_ARRAY_COUNT(gFactories) * 1.5f);
  86. drawColumn();
  87. }
  88. canvas->translate(rect.width() * 1.5f, 0);
  89. canvas->scale(2, 2);
  90. drawColumn();
  91. }