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