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