pictureimagefilter.cpp 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163
  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/SkCanvas.h"
  9. #include "include/core/SkColor.h"
  10. #include "include/core/SkColorSpace.h"
  11. #include "include/core/SkFilterQuality.h"
  12. #include "include/core/SkFont.h"
  13. #include "include/core/SkImage.h"
  14. #include "include/core/SkImageFilter.h"
  15. #include "include/core/SkPaint.h"
  16. #include "include/core/SkPicture.h"
  17. #include "include/core/SkPictureRecorder.h"
  18. #include "include/core/SkRect.h"
  19. #include "include/core/SkRefCnt.h"
  20. #include "include/core/SkScalar.h"
  21. #include "include/core/SkSize.h"
  22. #include "include/core/SkString.h"
  23. #include "include/core/SkTypeface.h"
  24. #include "include/effects/SkImageSource.h"
  25. #include "include/effects/SkPictureImageFilter.h"
  26. #include "tools/ToolUtils.h"
  27. // This GM exercises the SkPictureImageFilter ImageFilter class.
  28. static void fill_rect_filtered(SkCanvas* canvas,
  29. const SkRect& clipRect,
  30. sk_sp<SkImageFilter> filter) {
  31. SkPaint paint;
  32. paint.setImageFilter(filter);
  33. canvas->save();
  34. canvas->clipRect(clipRect);
  35. canvas->drawPaint(paint);
  36. canvas->restore();
  37. }
  38. static sk_sp<SkPicture> make_picture() {
  39. SkPictureRecorder recorder;
  40. SkCanvas* canvas = recorder.beginRecording(100, 100, nullptr, 0);
  41. SkPaint paint;
  42. paint.setColor(0xFFFFFFFF);
  43. SkFont font(ToolUtils::create_portable_typeface(), 96.0f);
  44. canvas->drawString("e", 20.0f, 70.0f, font, paint);
  45. return recorder.finishRecordingAsPicture();
  46. }
  47. // Create a picture that will draw LCD text
  48. static sk_sp<SkPicture> make_LCD_picture() {
  49. SkPictureRecorder recorder;
  50. SkCanvas* canvas = recorder.beginRecording(100, 100, nullptr, 0);
  51. canvas->clear(SK_ColorTRANSPARENT);
  52. SkPaint paint;
  53. paint.setColor(0xFFFFFFFF);
  54. // this has to be small enough that it doesn't become a path
  55. SkFont font(ToolUtils::create_portable_typeface(), 36.0f);
  56. font.setEdging(SkFont::Edging::kSubpixelAntiAlias);
  57. canvas->drawString("e", 20.0f, 70.0f, font, paint);
  58. return recorder.finishRecordingAsPicture();
  59. }
  60. class PictureImageFilterGM : public skiagm::GM {
  61. public:
  62. PictureImageFilterGM() { }
  63. protected:
  64. SkString onShortName() override {
  65. return SkString("pictureimagefilter");
  66. }
  67. SkISize onISize() override { return SkISize::Make(600, 300); }
  68. void onOnceBeforeDraw() override {
  69. fPicture = make_picture();
  70. fLCDPicture = make_LCD_picture();
  71. }
  72. sk_sp<SkImageFilter> make(sk_sp<SkPicture> pic, SkRect r, SkFilterQuality fq) {
  73. SkISize dim = { SkScalarRoundToInt(r.width()), SkScalarRoundToInt(r.height()) };
  74. auto img = SkImage::MakeFromPicture(pic, dim, nullptr, nullptr,
  75. SkImage::BitDepth::kU8, SkColorSpace::MakeSRGB());
  76. return SkImageSource::Make(img, r, r, fq);
  77. }
  78. sk_sp<SkImageFilter> make(SkFilterQuality fq) {
  79. return make(fPicture, fPicture->cullRect(), fq);
  80. }
  81. void onDraw(SkCanvas* canvas) override {
  82. canvas->clear(SK_ColorGRAY);
  83. {
  84. SkRect srcRect = SkRect::MakeXYWH(20, 20, 30, 30);
  85. SkRect emptyRect = SkRect::MakeXYWH(20, 20, 0, 0);
  86. SkRect bounds = SkRect::MakeXYWH(0, 0, 100, 100);
  87. sk_sp<SkImageFilter> pictureSource(SkPictureImageFilter::Make(fPicture));
  88. sk_sp<SkImageFilter> pictureSourceSrcRect(SkPictureImageFilter::Make(fPicture,
  89. srcRect));
  90. sk_sp<SkImageFilter> pictureSourceEmptyRect(SkPictureImageFilter::Make(fPicture,
  91. emptyRect));
  92. sk_sp<SkImageFilter> pictureSourceResampled = make(kLow_SkFilterQuality);
  93. sk_sp<SkImageFilter> pictureSourcePixelated = make(kNone_SkFilterQuality);
  94. canvas->save();
  95. // Draw the picture unscaled.
  96. fill_rect_filtered(canvas, bounds, pictureSource);
  97. canvas->translate(SkIntToScalar(100), 0);
  98. // Draw an unscaled subset of the source picture.
  99. fill_rect_filtered(canvas, bounds, pictureSourceSrcRect);
  100. canvas->translate(SkIntToScalar(100), 0);
  101. // Draw the picture to an empty rect (should draw nothing).
  102. fill_rect_filtered(canvas, bounds, pictureSourceEmptyRect);
  103. canvas->translate(SkIntToScalar(100), 0);
  104. // Draw the LCD picture to a layer
  105. {
  106. SkPaint stroke;
  107. stroke.setStyle(SkPaint::kStroke_Style);
  108. canvas->drawRect(bounds, stroke);
  109. SkPaint paint;
  110. paint.setImageFilter(make(fLCDPicture, fPicture->cullRect(), kNone_SkFilterQuality));
  111. canvas->scale(4, 4);
  112. canvas->translate(-0.9f*srcRect.fLeft, -2.45f*srcRect.fTop);
  113. canvas->saveLayer(&bounds, &paint);
  114. canvas->restore();
  115. }
  116. canvas->restore();
  117. // Draw the picture scaled
  118. canvas->translate(0, SkIntToScalar(100));
  119. canvas->scale(200 / srcRect.width(), 200 / srcRect.height());
  120. canvas->translate(-srcRect.fLeft, -srcRect.fTop);
  121. fill_rect_filtered(canvas, srcRect, pictureSource);
  122. // Draw the picture scaled, but rasterized at original resolution
  123. canvas->translate(srcRect.width(), 0);
  124. fill_rect_filtered(canvas, srcRect, pictureSourceResampled);
  125. // Draw the picture scaled, pixelated
  126. canvas->translate(srcRect.width(), 0);
  127. fill_rect_filtered(canvas, srcRect, pictureSourcePixelated);
  128. }
  129. }
  130. private:
  131. sk_sp<SkPicture> fPicture;
  132. sk_sp<SkPicture> fLCDPicture;
  133. typedef GM INHERITED;
  134. };
  135. ///////////////////////////////////////////////////////////////////////////////
  136. DEF_GM( return new PictureImageFilterGM; )