displacement.cpp 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217
  1. /*
  2. * Copyright 2013 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/SkBitmap.h"
  9. #include "include/core/SkCanvas.h"
  10. #include "include/core/SkColor.h"
  11. #include "include/core/SkImage.h"
  12. #include "include/core/SkImageFilter.h"
  13. #include "include/core/SkPaint.h"
  14. #include "include/core/SkRect.h"
  15. #include "include/core/SkRefCnt.h"
  16. #include "include/core/SkScalar.h"
  17. #include "include/core/SkSize.h"
  18. #include "include/core/SkString.h"
  19. #include "include/effects/SkDisplacementMapEffect.h"
  20. #include "include/effects/SkImageSource.h"
  21. #include "tools/ToolUtils.h"
  22. #include <utility>
  23. namespace skiagm {
  24. class DisplacementMapGM : public GM {
  25. public:
  26. DisplacementMapGM() {
  27. this->setBGColor(0xFF000000);
  28. }
  29. protected:
  30. SkString onShortName() override {
  31. return SkString("displacement");
  32. }
  33. void onOnceBeforeDraw() override {
  34. fBitmap = ToolUtils::create_string_bitmap(80, 80, 0xFF884422, 15, 55, 96, "g");
  35. SkColor c1 = ToolUtils::color_to_565(0xFF244484);
  36. SkColor c2 = ToolUtils::color_to_565(0xFF804020);
  37. fCheckerboard =
  38. SkImage::MakeFromBitmap(ToolUtils::create_checkerboard_bitmap(80, 80, c1, c2, 8));
  39. fSmall = SkImage::MakeFromBitmap(ToolUtils::create_checkerboard_bitmap(64, 64, c1, c2, 8));
  40. fLarge = SkImage::MakeFromBitmap(ToolUtils::create_checkerboard_bitmap(96, 96, c1, c2, 8));
  41. fLargeW = SkImage::MakeFromBitmap(ToolUtils::create_checkerboard_bitmap(96, 64, c1, c2, 8));
  42. fLargeH = SkImage::MakeFromBitmap(ToolUtils::create_checkerboard_bitmap(64, 96, c1, c2, 8));
  43. }
  44. SkISize onISize() override {
  45. return SkISize::Make(600, 500);
  46. }
  47. void drawClippedBitmap(SkCanvas* canvas, int x, int y, const SkPaint& paint) const {
  48. canvas->save();
  49. canvas->translate(SkIntToScalar(x), SkIntToScalar(y));
  50. canvas->clipRect(SkRect::MakeWH(SkIntToScalar(fBitmap.width()), SkIntToScalar(fBitmap.height())));
  51. canvas->drawBitmap(fBitmap, 0, 0, &paint);
  52. canvas->restore();
  53. }
  54. void onDraw(SkCanvas* canvas) override {
  55. canvas->clear(SK_ColorBLACK);
  56. SkPaint paint;
  57. sk_sp<SkImageFilter> displ(SkImageSource::Make(fCheckerboard));
  58. paint.setImageFilter(SkDisplacementMapEffect::Make(
  59. SkDisplacementMapEffect::kR_ChannelSelectorType,
  60. SkDisplacementMapEffect::kG_ChannelSelectorType, 0.0f, displ, nullptr));
  61. this->drawClippedBitmap(canvas, 0, 0, paint);
  62. paint.setImageFilter(SkDisplacementMapEffect::Make(
  63. SkDisplacementMapEffect::kB_ChannelSelectorType,
  64. SkDisplacementMapEffect::kA_ChannelSelectorType, 16.0f, displ, nullptr));
  65. this->drawClippedBitmap(canvas, 100, 0, paint);
  66. paint.setImageFilter(SkDisplacementMapEffect::Make(
  67. SkDisplacementMapEffect::kR_ChannelSelectorType,
  68. SkDisplacementMapEffect::kB_ChannelSelectorType, 32.0f, displ, nullptr));
  69. this->drawClippedBitmap(canvas, 200, 0, paint);
  70. paint.setImageFilter(SkDisplacementMapEffect::Make(
  71. SkDisplacementMapEffect::kG_ChannelSelectorType,
  72. SkDisplacementMapEffect::kA_ChannelSelectorType, 48.0f, displ, nullptr));
  73. this->drawClippedBitmap(canvas, 300, 0, paint);
  74. paint.setImageFilter(SkDisplacementMapEffect::Make(
  75. SkDisplacementMapEffect::kR_ChannelSelectorType,
  76. SkDisplacementMapEffect::kA_ChannelSelectorType, 64.0f, displ, nullptr));
  77. this->drawClippedBitmap(canvas, 400, 0, paint);
  78. paint.setImageFilter(SkDisplacementMapEffect::Make(
  79. SkDisplacementMapEffect::kR_ChannelSelectorType,
  80. SkDisplacementMapEffect::kG_ChannelSelectorType, 40.0f, displ, nullptr));
  81. this->drawClippedBitmap(canvas, 0, 100, paint);
  82. paint.setImageFilter(SkDisplacementMapEffect::Make(
  83. SkDisplacementMapEffect::kB_ChannelSelectorType,
  84. SkDisplacementMapEffect::kA_ChannelSelectorType, 40.0f, displ, nullptr));
  85. this->drawClippedBitmap(canvas, 100, 100, paint);
  86. paint.setImageFilter(SkDisplacementMapEffect::Make(
  87. SkDisplacementMapEffect::kR_ChannelSelectorType,
  88. SkDisplacementMapEffect::kB_ChannelSelectorType, 40.0f, displ, nullptr));
  89. this->drawClippedBitmap(canvas, 200, 100, paint);
  90. paint.setImageFilter(SkDisplacementMapEffect::Make(
  91. SkDisplacementMapEffect::kG_ChannelSelectorType,
  92. SkDisplacementMapEffect::kA_ChannelSelectorType, 40.0f, displ, nullptr));
  93. this->drawClippedBitmap(canvas, 300, 100, paint);
  94. paint.setImageFilter(SkDisplacementMapEffect::Make(
  95. SkDisplacementMapEffect::kR_ChannelSelectorType,
  96. SkDisplacementMapEffect::kA_ChannelSelectorType, 40.0f, displ, nullptr));
  97. this->drawClippedBitmap(canvas, 400, 100, paint);
  98. SkImageFilter::CropRect cropRect(SkRect::MakeXYWH(30, 30, 40, 40));
  99. paint.setImageFilter(SkDisplacementMapEffect::Make(
  100. SkDisplacementMapEffect::kR_ChannelSelectorType,
  101. SkDisplacementMapEffect::kG_ChannelSelectorType,
  102. 0.0f, displ, nullptr, &cropRect));
  103. this->drawClippedBitmap(canvas, 0, 200, paint);
  104. paint.setImageFilter(SkDisplacementMapEffect::Make(
  105. SkDisplacementMapEffect::kB_ChannelSelectorType,
  106. SkDisplacementMapEffect::kA_ChannelSelectorType,
  107. 16.0f, displ, nullptr, &cropRect));
  108. this->drawClippedBitmap(canvas, 100, 200, paint);
  109. paint.setImageFilter(SkDisplacementMapEffect::Make(
  110. SkDisplacementMapEffect::kR_ChannelSelectorType,
  111. SkDisplacementMapEffect::kB_ChannelSelectorType,
  112. 32.0f, displ, nullptr, &cropRect));
  113. this->drawClippedBitmap(canvas, 200, 200, paint);
  114. paint.setImageFilter(SkDisplacementMapEffect::Make(
  115. SkDisplacementMapEffect::kG_ChannelSelectorType,
  116. SkDisplacementMapEffect::kA_ChannelSelectorType,
  117. 48.0f, displ, nullptr, &cropRect));
  118. this->drawClippedBitmap(canvas, 300, 200, paint);
  119. paint.setImageFilter(SkDisplacementMapEffect::Make(
  120. SkDisplacementMapEffect::kR_ChannelSelectorType,
  121. SkDisplacementMapEffect::kA_ChannelSelectorType,
  122. 64.0f, displ, nullptr, &cropRect));
  123. this->drawClippedBitmap(canvas, 400, 200, paint);
  124. paint.setImageFilter(SkDisplacementMapEffect::Make(
  125. SkDisplacementMapEffect::kR_ChannelSelectorType,
  126. SkDisplacementMapEffect::kG_ChannelSelectorType,
  127. 40.0f, displ, nullptr, &cropRect));
  128. this->drawClippedBitmap(canvas, 0, 300, paint);
  129. paint.setImageFilter(SkDisplacementMapEffect::Make(
  130. SkDisplacementMapEffect::kB_ChannelSelectorType,
  131. SkDisplacementMapEffect::kA_ChannelSelectorType,
  132. 40.0f, displ, nullptr, &cropRect));
  133. this->drawClippedBitmap(canvas, 100, 300, paint);
  134. paint.setImageFilter(SkDisplacementMapEffect::Make(
  135. SkDisplacementMapEffect::kR_ChannelSelectorType,
  136. SkDisplacementMapEffect::kB_ChannelSelectorType,
  137. 40.0f, displ, nullptr, &cropRect));
  138. this->drawClippedBitmap(canvas, 200, 300, paint);
  139. paint.setImageFilter(SkDisplacementMapEffect::Make(
  140. SkDisplacementMapEffect::kG_ChannelSelectorType,
  141. SkDisplacementMapEffect::kA_ChannelSelectorType,
  142. 40.0f, displ, nullptr, &cropRect));
  143. this->drawClippedBitmap(canvas, 300, 300, paint);
  144. paint.setImageFilter(SkDisplacementMapEffect::Make(
  145. SkDisplacementMapEffect::kR_ChannelSelectorType,
  146. SkDisplacementMapEffect::kA_ChannelSelectorType,
  147. 40.0f, displ, nullptr, &cropRect));
  148. this->drawClippedBitmap(canvas, 400, 300, paint);
  149. // Test for negative scale.
  150. paint.setImageFilter(SkDisplacementMapEffect::Make(
  151. SkDisplacementMapEffect::kG_ChannelSelectorType,
  152. SkDisplacementMapEffect::kA_ChannelSelectorType,
  153. -40.0f, displ, nullptr));
  154. this->drawClippedBitmap(canvas, 500, 0, paint);
  155. // Tests for images of different sizes
  156. displ = SkImageSource::Make(fSmall);
  157. paint.setImageFilter(SkDisplacementMapEffect::Make(
  158. SkDisplacementMapEffect::kR_ChannelSelectorType,
  159. SkDisplacementMapEffect::kG_ChannelSelectorType,
  160. 40.0f, std::move(displ), nullptr));
  161. this->drawClippedBitmap(canvas, 0, 400, paint);
  162. displ = SkImageSource::Make(fLarge);
  163. paint.setImageFilter(SkDisplacementMapEffect::Make(
  164. SkDisplacementMapEffect::kB_ChannelSelectorType,
  165. SkDisplacementMapEffect::kA_ChannelSelectorType,
  166. 40.0f, std::move(displ), nullptr));
  167. this->drawClippedBitmap(canvas, 100, 400, paint);
  168. displ = SkImageSource::Make(fLargeW);
  169. paint.setImageFilter(SkDisplacementMapEffect::Make(
  170. SkDisplacementMapEffect::kR_ChannelSelectorType,
  171. SkDisplacementMapEffect::kB_ChannelSelectorType,
  172. 40.0f, std::move(displ), nullptr));
  173. this->drawClippedBitmap(canvas, 200, 400, paint);
  174. displ = SkImageSource::Make(fLargeH);
  175. paint.setImageFilter(SkDisplacementMapEffect::Make(
  176. SkDisplacementMapEffect::kG_ChannelSelectorType,
  177. SkDisplacementMapEffect::kA_ChannelSelectorType,
  178. 40.0f, std::move(displ), nullptr));
  179. this->drawClippedBitmap(canvas, 300, 400, paint);
  180. // Test for no given displacement input. In this case, both displacement
  181. // and color should use the same bitmap, given to SkCanvas::drawBitmap()
  182. // as an input argument.
  183. paint.setImageFilter(SkDisplacementMapEffect::Make(
  184. SkDisplacementMapEffect::kG_ChannelSelectorType,
  185. SkDisplacementMapEffect::kA_ChannelSelectorType,
  186. 40.0f, nullptr, nullptr));
  187. this->drawClippedBitmap(canvas, 400, 400, paint);
  188. }
  189. private:
  190. SkBitmap fBitmap;
  191. sk_sp<SkImage> fCheckerboard, fSmall, fLarge, fLargeW, fLargeH;
  192. typedef GM INHERITED;
  193. };
  194. //////////////////////////////////////////////////////////////////////////////
  195. DEF_GM(return new DisplacementMapGM;)
  196. }