imagesource.cpp 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  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/SkFilterQuality.h"
  12. #include "include/core/SkImage.h"
  13. #include "include/core/SkImageFilter.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/SkSize.h"
  19. #include "include/core/SkString.h"
  20. #include "include/effects/SkImageSource.h"
  21. #include "tools/ToolUtils.h"
  22. #include <utility>
  23. // This GM exercises the SkImageSource ImageFilter class.
  24. static void fill_rect_filtered(SkCanvas* canvas,
  25. const SkRect& clipRect,
  26. sk_sp<SkImageFilter> filter) {
  27. SkPaint paint;
  28. paint.setImageFilter(std::move(filter));
  29. canvas->save();
  30. canvas->clipRect(clipRect);
  31. canvas->drawPaint(paint);
  32. canvas->restore();
  33. }
  34. class ImageSourceGM : public skiagm::GM {
  35. public:
  36. ImageSourceGM() { }
  37. protected:
  38. SkString onShortName() override {
  39. return SkString("imagesource");
  40. }
  41. SkISize onISize() override { return SkISize::Make(500, 150); }
  42. void onOnceBeforeDraw() override {
  43. SkBitmap bm = ToolUtils::create_string_bitmap(100, 100, 0xFFFFFFFF, 20, 70, 96, "e");
  44. fImage = SkImage::MakeFromBitmap(bm);
  45. }
  46. void onDraw(SkCanvas* canvas) override {
  47. canvas->clear(SK_ColorBLACK);
  48. const SkRect srcRect = SkRect::MakeXYWH(20, 20, 30, 30);
  49. const SkRect dstRect = SkRect::MakeXYWH(0, 10, 60, 60);
  50. const SkRect clipRect = SkRect::MakeXYWH(0, 0, 100, 100);
  51. const SkRect bounds = SkRect::MakeIWH(fImage->width(), fImage->height());
  52. {
  53. // Draw an unscaled bitmap.
  54. sk_sp<SkImageFilter> imageSource(SkImageSource::Make(fImage));
  55. fill_rect_filtered(canvas, clipRect, std::move(imageSource));
  56. canvas->translate(SkIntToScalar(100), 0);
  57. }
  58. {
  59. // Draw an unscaled subset of the source bitmap (srcRect -> srcRect).
  60. sk_sp<SkImageFilter> imageSourceSrcRect(
  61. SkImageSource::Make(fImage, srcRect, srcRect, kHigh_SkFilterQuality));
  62. fill_rect_filtered(canvas, clipRect, std::move(imageSourceSrcRect));
  63. canvas->translate(SkIntToScalar(100), 0);
  64. }
  65. {
  66. // Draw a subset of the bitmap scaled to a destination rect (srcRect -> dstRect).
  67. sk_sp<SkImageFilter> imageSourceSrcRectDstRect(
  68. SkImageSource::Make(fImage, srcRect, dstRect, kHigh_SkFilterQuality));
  69. fill_rect_filtered(canvas, clipRect, std::move(imageSourceSrcRectDstRect));
  70. canvas->translate(SkIntToScalar(100), 0);
  71. }
  72. {
  73. // Draw the entire bitmap scaled to a destination rect (bounds -> dstRect).
  74. sk_sp<SkImageFilter> imageSourceDstRectOnly(
  75. SkImageSource::Make(fImage, bounds, dstRect, kHigh_SkFilterQuality));
  76. fill_rect_filtered(canvas, clipRect, std::move(imageSourceDstRectOnly));
  77. canvas->translate(SkIntToScalar(100), 0);
  78. }
  79. }
  80. private:
  81. sk_sp<SkImage> fImage;
  82. typedef GM INHERITED;
  83. };
  84. ///////////////////////////////////////////////////////////////////////////////
  85. DEF_GM( return new ImageSourceGM; )