2 * Copyright 2013 Google Inc.
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
8 #include "SkColorFilterImageFilter.h"
9 #include "SkColorMatrixFilter.h"
11 #include "SkImageSource.h"
12 #include "SkTileImageFilter.h"
14 #include "sk_tool_utils.h"
22 class TileImageFilterGM : public GM {
25 this->setBGColor(0xFF000000);
29 SkString onShortName() override {
30 return SkString("tileimagefilter");
33 SkISize onISize() override{
34 return SkISize::Make(WIDTH, HEIGHT);
37 void onOnceBeforeDraw() override {
38 fBitmap = SkImage::MakeFromBitmap(
39 sk_tool_utils::create_string_bitmap(50, 50, 0xD000D000, 10, 45, 50, "e"));
41 fCheckerboard = SkImage::MakeFromBitmap(
42 sk_tool_utils::create_checkerboard_bitmap(80, 80,
43 sk_tool_utils::color_to_565(0xFFA0A0A0),
44 sk_tool_utils::color_to_565(0xFF404040),
48 void onDraw(SkCanvas* canvas) override {
49 canvas->clear(SK_ColorBLACK);
51 red.setColor(SK_ColorRED);
52 red.setStyle(SkPaint::kStroke_Style);
54 blue.setColor(SK_ColorBLUE);
55 blue.setStyle(SkPaint::kStroke_Style);
58 for (size_t i = 0; i < 4; i++) {
59 sk_sp<SkImage> image = (i & 0x01) ? fCheckerboard : fBitmap;
60 SkRect srcRect = SkRect::MakeXYWH(SkIntToScalar(image->width()/4),
61 SkIntToScalar(image->height()/4),
62 SkIntToScalar(image->width()/(i+1)),
63 SkIntToScalar(image->height()/(i+1)));
64 SkRect dstRect = SkRect::MakeXYWH(SkIntToScalar(i * 8),
66 SkIntToScalar(image->width() - i * 12),
67 SkIntToScalar(image->height()) - i * 12);
68 sk_sp<SkImageFilter> tileInput(SkImageSource::Make(image));
69 sk_sp<SkImageFilter> filter(SkTileImageFilter::Make(srcRect,
71 std::move(tileInput)));
73 canvas->translate(SkIntToScalar(x), SkIntToScalar(y));
75 paint.setImageFilter(std::move(filter));
76 canvas->drawImage(fBitmap.get(), 0, 0, &paint);
77 canvas->drawRect(srcRect, red);
78 canvas->drawRect(dstRect, blue);
80 x += image->width() + MARGIN;
81 if (x + image->width() > WIDTH) {
83 y += image->height() + MARGIN;
87 SkScalar matrix[20] = { SK_Scalar1, 0, 0, 0, 0,
88 0, SK_Scalar1, 0, 0, 0,
89 0, 0, SK_Scalar1, 0, 0,
90 0, 0, 0, SK_Scalar1, 0 };
92 SkRect srcRect = SkRect::MakeWH(SkIntToScalar(fBitmap->width()),
93 SkIntToScalar(fBitmap->height()));
94 SkRect dstRect = SkRect::MakeWH(SkIntToScalar(fBitmap->width() * 2),
95 SkIntToScalar(fBitmap->height() * 2));
96 sk_sp<SkImageFilter> tile(SkTileImageFilter::Make(srcRect, dstRect, nullptr));
97 sk_sp<SkColorFilter> cf(SkColorFilter::MakeMatrixFilterRowMajor255(matrix));
100 paint.setImageFilter(SkColorFilterImageFilter::Make(std::move(cf), std::move(tile)));
102 canvas->translate(SkIntToScalar(x), SkIntToScalar(y));
103 canvas->clipRect(dstRect);
104 canvas->saveLayer(&dstRect, &paint);
105 canvas->drawImage(fBitmap.get(), 0, 0);
107 canvas->drawRect(srcRect, red);
108 canvas->drawRect(dstRect, blue);
111 canvas->translate(0, SkIntToScalar(100));
113 srcRect = SkRect::MakeXYWH(0, 0, 50, 50);
114 dstRect = SkRect::MakeXYWH(0, 0, 100, 100);
115 SkImageFilter::CropRect cropRect(SkRect::MakeXYWH(5, 5, 40, 40));
116 sk_sp<SkColorFilter> greenCF = SkColorFilter::MakeModeFilter(SK_ColorGREEN,
118 sk_sp<SkImageFilter> green(SkColorFilterImageFilter::Make(std::move(greenCF),
121 tile = SkTileImageFilter::Make(srcRect, dstRect, std::move(green));
122 paint.setColor(SK_ColorRED);
123 paint.setImageFilter(std::move(tile));
124 canvas->drawRect(dstRect, paint);
127 sk_sp<SkImage> fBitmap, fCheckerboard;
129 typedef GM INHERITED;
132 //////////////////////////////////////////////////////////////////////////////
134 DEF_GM(return new TileImageFilterGM;)