blob: faff79b0848df537a7855ca305619d8b1944515b [file] [log] [blame]
fmalitacd56f812015-09-14 13:31:18 -07001/*
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
Mike Kleinc0bd9f92019-04-23 12:05:21 -05008#include "gm/gm.h"
Ben Wagner7fde8e12019-05-01 17:28:53 -04009#include "include/core/SkBitmap.h"
10#include "include/core/SkCanvas.h"
11#include "include/core/SkColor.h"
Ben Wagner7fde8e12019-05-01 17:28:53 -040012#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"
Michael Ludwig898bbfa2019-08-02 15:21:23 -040020#include "include/effects/SkImageFilters.h"
Mike Kleinc0bd9f92019-04-23 12:05:21 -050021#include "tools/ToolUtils.h"
Kevin Lubicke836c3a2023-10-20 06:55:35 -040022#include "tools/fonts/FontToolUtils.h"
fmalitacd56f812015-09-14 13:31:18 -070023
Ben Wagner7fde8e12019-05-01 17:28:53 -040024#include <utility>
fmalitacd56f812015-09-14 13:31:18 -070025
26// This GM exercises the SkImageSource ImageFilter class.
27
robertphillips549c8992016-04-01 09:28:51 -070028static 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
fmalitacd56f812015-09-14 13:31:18 -070039class ImageSourceGM : public skiagm::GM {
40public:
41 ImageSourceGM() { }
42
43protected:
Leandro Lovisolo24fa2112023-08-15 19:05:17 +000044 SkString getName() const override { return SkString("imagesource"); }
fmalitacd56f812015-09-14 13:31:18 -070045
Leandro Lovisolo8f023882023-08-15 21:13:52 +000046 SkISize getISize() override { return SkISize::Make(500, 150); }
fmalitacd56f812015-09-14 13:31:18 -070047
48 void onOnceBeforeDraw() override {
Kevin Lubicke836c3a2023-10-20 06:55:35 -040049 fImage = ToolUtils::CreateStringImage(100, 100, 0xFFFFFFFF, 20, 70, 96, "e");
fmalitacd56f812015-09-14 13:31:18 -070050 }
51
fmalitacd56f812015-09-14 13:31:18 -070052 void onDraw(SkCanvas* canvas) override {
53 canvas->clear(SK_ColorBLACK);
robertphillips549c8992016-04-01 09:28:51 -070054
55 const SkRect srcRect = SkRect::MakeXYWH(20, 20, 30, 30);
56 const SkRect dstRect = SkRect::MakeXYWH(0, 10, 60, 60);
57 const SkRect clipRect = SkRect::MakeXYWH(0, 0, 100, 100);
58 const SkRect bounds = SkRect::MakeIWH(fImage->width(), fImage->height());
Mike Reed708dc4f2021-02-13 21:04:58 -050059 const SkSamplingOptions sampling({1/3.0f, 1/3.0f});
robertphillips549c8992016-04-01 09:28:51 -070060
fmalitacd56f812015-09-14 13:31:18 -070061 {
fmalitacd56f812015-09-14 13:31:18 -070062 // Draw an unscaled bitmap.
Michael Ludwig642f2182023-05-30 20:57:39 -040063 sk_sp<SkImageFilter> imageSource(SkImageFilters::Image(fImage, SkFilterMode::kNearest));
robertphillips549c8992016-04-01 09:28:51 -070064 fill_rect_filtered(canvas, clipRect, std::move(imageSource));
fmalitacd56f812015-09-14 13:31:18 -070065 canvas->translate(SkIntToScalar(100), 0);
robertphillips549c8992016-04-01 09:28:51 -070066 }
67 {
fmalitacd56f812015-09-14 13:31:18 -070068 // Draw an unscaled subset of the source bitmap (srcRect -> srcRect).
robertphillips549c8992016-04-01 09:28:51 -070069 sk_sp<SkImageFilter> imageSourceSrcRect(
Mike Reed708dc4f2021-02-13 21:04:58 -050070 SkImageFilters::Image(fImage, srcRect, srcRect, sampling));
robertphillips549c8992016-04-01 09:28:51 -070071 fill_rect_filtered(canvas, clipRect, std::move(imageSourceSrcRect));
fmalitacd56f812015-09-14 13:31:18 -070072 canvas->translate(SkIntToScalar(100), 0);
robertphillips549c8992016-04-01 09:28:51 -070073 }
74 {
fmalitacd56f812015-09-14 13:31:18 -070075 // Draw a subset of the bitmap scaled to a destination rect (srcRect -> dstRect).
robertphillips549c8992016-04-01 09:28:51 -070076 sk_sp<SkImageFilter> imageSourceSrcRectDstRect(
Mike Reed708dc4f2021-02-13 21:04:58 -050077 SkImageFilters::Image(fImage, srcRect, dstRect, sampling));
robertphillips549c8992016-04-01 09:28:51 -070078 fill_rect_filtered(canvas, clipRect, std::move(imageSourceSrcRectDstRect));
fmalitacd56f812015-09-14 13:31:18 -070079 canvas->translate(SkIntToScalar(100), 0);
robertphillips549c8992016-04-01 09:28:51 -070080 }
81 {
fmalitacd56f812015-09-14 13:31:18 -070082 // Draw the entire bitmap scaled to a destination rect (bounds -> dstRect).
robertphillips549c8992016-04-01 09:28:51 -070083 sk_sp<SkImageFilter> imageSourceDstRectOnly(
Mike Reed708dc4f2021-02-13 21:04:58 -050084 SkImageFilters::Image(fImage, bounds, dstRect, sampling));
robertphillips549c8992016-04-01 09:28:51 -070085 fill_rect_filtered(canvas, clipRect, std::move(imageSourceDstRectOnly));
fmalitacd56f812015-09-14 13:31:18 -070086 canvas->translate(SkIntToScalar(100), 0);
87 }
88 }
89
90private:
reed9ce9d672016-03-17 10:51:11 -070091 sk_sp<SkImage> fImage;
John Stiles7571f9e2020-09-02 22:42:33 -040092 using INHERITED = GM;
fmalitacd56f812015-09-14 13:31:18 -070093};
94
95///////////////////////////////////////////////////////////////////////////////
96
97DEF_GM( return new ImageSourceGM; )