SampleLayers.cpp 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238
  1. /*
  2. * Copyright 2011 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 "include/core/SkCanvas.h"
  8. #include "include/core/SkColorFilter.h"
  9. #include "include/core/SkColorPriv.h"
  10. #include "include/core/SkImage.h"
  11. #include "include/core/SkMaskFilter.h"
  12. #include "include/core/SkPath.h"
  13. #include "include/core/SkRegion.h"
  14. #include "include/core/SkShader.h"
  15. #include "include/core/SkTime.h"
  16. #include "include/core/SkTypeface.h"
  17. #include "include/effects/SkBlurMaskFilter.h"
  18. #include "include/effects/SkGradientShader.h"
  19. #include "include/utils/SkCamera.h"
  20. #include "include/utils/SkInterpolator.h"
  21. #include "samplecode/Sample.h"
  22. #include "src/core/SkClipOpPriv.h"
  23. #include "src/utils/SkUTF.h"
  24. static void make_paint(SkPaint* paint, const SkMatrix& localMatrix) {
  25. SkColor colors[] = { 0, SK_ColorWHITE };
  26. SkPoint pts[] = { { 0, 0 }, { 0, SK_Scalar1*20 } };
  27. paint->setShader(SkGradientShader::MakeLinear(pts, colors, nullptr, 2,
  28. SkTileMode::kClamp, 0, &localMatrix));
  29. paint->setBlendMode(SkBlendMode::kDstIn);
  30. }
  31. // test drawing with strips of fading gradient above and below
  32. static void test_fade(SkCanvas* canvas) {
  33. SkAutoCanvasRestore ar(canvas, true);
  34. SkRect r;
  35. SkPaint p;
  36. p.setAlpha(0x88);
  37. SkAutoCanvasRestore ar2(canvas, false);
  38. // create the layers
  39. r.set(0, 0, SkIntToScalar(100), SkIntToScalar(100));
  40. canvas->clipRect(r);
  41. r.fBottom = SkIntToScalar(20);
  42. canvas->saveLayer(&r, nullptr);
  43. r.fTop = SkIntToScalar(80);
  44. r.fBottom = SkIntToScalar(100);
  45. canvas->saveLayer(&r, nullptr);
  46. // now draw the "content"
  47. if (true) {
  48. r.set(0, 0, SkIntToScalar(100), SkIntToScalar(100));
  49. canvas->saveLayerAlpha(&r, 0x80);
  50. SkPaint p;
  51. p.setColor(SK_ColorRED);
  52. p.setAntiAlias(true);
  53. canvas->drawOval(r, p);
  54. canvas->restore();
  55. } else {
  56. r.set(0, 0, SkIntToScalar(100), SkIntToScalar(100));
  57. SkPaint p;
  58. p.setColor(SK_ColorRED);
  59. p.setAntiAlias(true);
  60. canvas->drawOval(r, p);
  61. }
  62. // return;
  63. // now apply an effect
  64. SkMatrix m;
  65. m.setScale(SK_Scalar1, -SK_Scalar1);
  66. m.postTranslate(0, SkIntToScalar(100));
  67. SkPaint paint;
  68. make_paint(&paint, m);
  69. r.set(0, 0, SkIntToScalar(100), SkIntToScalar(20));
  70. // SkDebugf("--------- draw top grad\n");
  71. canvas->drawRect(r, paint);
  72. r.fTop = SkIntToScalar(80);
  73. r.fBottom = SkIntToScalar(100);
  74. // SkDebugf("--------- draw bot grad\n");
  75. canvas->drawRect(r, paint);
  76. }
  77. class LayersView : public Sample {
  78. public:
  79. LayersView() {}
  80. protected:
  81. SkString name() override { return SkString("Layers"); }
  82. void drawBG(SkCanvas* canvas) {
  83. canvas->drawColor(SK_ColorGRAY);
  84. }
  85. void onDrawContent(SkCanvas* canvas) override {
  86. this->drawBG(canvas);
  87. if (true) {
  88. SkRect r;
  89. r.set(SkIntToScalar(0), SkIntToScalar(0),
  90. SkIntToScalar(220), SkIntToScalar(120));
  91. SkPaint p;
  92. canvas->saveLayer(&r, &p);
  93. canvas->drawColor(0xFFFF0000);
  94. p.setAlpha(0); // or 0
  95. p.setBlendMode(SkBlendMode::kSrc);
  96. canvas->drawOval(r, p);
  97. canvas->restore();
  98. return;
  99. }
  100. if (false) {
  101. SkRect r;
  102. r.set(SkIntToScalar(0), SkIntToScalar(0),
  103. SkIntToScalar(220), SkIntToScalar(120));
  104. SkPaint p;
  105. p.setAlpha(0x88);
  106. p.setAntiAlias(true);
  107. if (true) {
  108. canvas->saveLayer(&r, &p);
  109. p.setColor(0xFFFF0000);
  110. canvas->drawOval(r, p);
  111. canvas->restore();
  112. }
  113. p.setColor(0xFF0000FF);
  114. r.offset(SkIntToScalar(20), SkIntToScalar(50));
  115. canvas->drawOval(r, p);
  116. }
  117. if (false) {
  118. SkPaint p;
  119. p.setAlpha(0x88);
  120. p.setAntiAlias(true);
  121. canvas->translate(SkIntToScalar(300), 0);
  122. SkRect r;
  123. r.set(SkIntToScalar(0), SkIntToScalar(0),
  124. SkIntToScalar(220), SkIntToScalar(60));
  125. canvas->saveLayer(&r, &p);
  126. r.set(SkIntToScalar(0), SkIntToScalar(0),
  127. SkIntToScalar(220), SkIntToScalar(120));
  128. p.setColor(SK_ColorBLUE);
  129. canvas->drawOval(r, p);
  130. canvas->restore();
  131. return;
  132. }
  133. test_fade(canvas);
  134. }
  135. private:
  136. typedef Sample INHERITED;
  137. };
  138. DEF_SAMPLE( return new LayersView; )
  139. //////////////////////////////////////////////////////////////////////////////
  140. #include "include/effects/SkBlurImageFilter.h"
  141. #include "include/effects/SkMatrixConvolutionImageFilter.h"
  142. #include "include/effects/SkMorphologyImageFilter.h"
  143. #include "tools/Resources.h"
  144. class BackdropView : public Sample {
  145. SkPoint fCenter;
  146. SkScalar fAngle;
  147. sk_sp<SkImage> fImage;
  148. sk_sp<SkImageFilter> fFilter;
  149. public:
  150. BackdropView() {
  151. fCenter.set(200, 150);
  152. fAngle = 0;
  153. fImage = GetResourceAsImage("images/mandrill_512.png");
  154. fFilter = SkDilateImageFilter::Make(8, 8, nullptr);
  155. }
  156. protected:
  157. SkString name() override { return SkString("Backdrop"); }
  158. void onDrawContent(SkCanvas* canvas) override {
  159. canvas->drawImage(fImage.get(), 0, 0, nullptr);
  160. const SkScalar w = 250;
  161. const SkScalar h = 150;
  162. SkPath path;
  163. path.addOval(SkRect::MakeXYWH(-w/2, -h/2, w, h));
  164. SkMatrix m;
  165. m.setRotate(fAngle);
  166. m.postTranslate(fCenter.x(), fCenter.y());
  167. path.transform(m);
  168. canvas->clipPath(path, kIntersect_SkClipOp, true);
  169. const SkRect bounds = path.getBounds();
  170. SkPaint paint;
  171. paint.setAlpha(0xCC);
  172. canvas->saveLayer({ &bounds, &paint, fFilter.get(), nullptr, nullptr, 0 });
  173. canvas->restore();
  174. }
  175. bool onAnimate(double nanos) override {
  176. fAngle = SkDoubleToScalar(fmod(1e-9 * nanos * 360 / 5, 360));
  177. return true;
  178. }
  179. Sample::Click* onFindClickHandler(SkScalar x, SkScalar y, ModifierKey modi) override {
  180. return new Click();
  181. }
  182. bool onClick(Click* click) override {
  183. fCenter = click->fCurr;
  184. return true;
  185. }
  186. private:
  187. typedef Sample INHERITED;
  188. };
  189. DEF_SAMPLE( return new BackdropView; )