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/SkBlendMode.h" 11 #include "include/core/SkCanvas.h" 12 #include "include/core/SkColor.h" 13 #include "include/core/SkColorFilter.h" 14 #include "include/core/SkImage.h" 15 #include "include/core/SkImageFilter.h" 16 #include "include/core/SkPaint.h" 17 #include "include/core/SkRect.h" 18 #include "include/core/SkRefCnt.h" 19 #include "include/core/SkScalar.h" 20 #include "include/core/SkSize.h" 21 #include "include/core/SkString.h" 22 #include "include/effects/SkImageFilters.h" 23 #include "tools/ToolUtils.h" 24 #include "tools/fonts/FontToolUtils.h" 25 26 #include <stddef.h> 27 #include <utility> 28 29 #define WIDTH 400 30 #define HEIGHT 200 31 #define MARGIN 12 32 33 namespace skiagm { 34 35 class TileImageFilterGM : public GM { 36 public: TileImageFilterGM()37 TileImageFilterGM() { 38 this->setBGColor(0xFF000000); 39 } 40 41 protected: getName() const42 SkString getName() const override { return SkString("tileimagefilter"); } 43 getISize()44 SkISize getISize() override { return SkISize::Make(WIDTH, HEIGHT); } 45 onOnceBeforeDraw()46 void onOnceBeforeDraw() override { 47 fBitmap = ToolUtils::CreateStringImage(50, 50, 0xD000D000, 10, 45, 50, "e"); 48 49 fCheckerboard = ToolUtils::create_checkerboard_image(80, 80, 0xFFA0A0A0, 0xFF404040, 8); 50 } 51 onDraw(SkCanvas * canvas)52 void onDraw(SkCanvas* canvas) override { 53 canvas->clear(SK_ColorBLACK); 54 SkPaint red; 55 red.setColor(SK_ColorRED); 56 red.setStyle(SkPaint::kStroke_Style); 57 SkPaint blue; 58 blue.setColor(SK_ColorBLUE); 59 blue.setStyle(SkPaint::kStroke_Style); 60 61 int x = 0, y = 0; 62 63 { 64 for (size_t i = 0; i < 4; i++) { 65 sk_sp<SkImage> image = (i & 0x01) ? fCheckerboard : fBitmap; 66 SkRect srcRect = SkRect::MakeXYWH(SkIntToScalar(image->width()/4), 67 SkIntToScalar(image->height()/4), 68 SkIntToScalar(image->width()/(i+1)), 69 SkIntToScalar(image->height()/(i+1))); 70 SkRect dstRect = SkRect::MakeXYWH(SkIntToScalar(i * 8), 71 SkIntToScalar(i * 4), 72 SkIntToScalar(image->width() - i * 12), 73 SkIntToScalar(image->height()) - i * 12); 74 sk_sp<SkImageFilter> tileInput(SkImageFilters::Image(image, SkFilterMode::kLinear)); 75 sk_sp<SkImageFilter> filter(SkImageFilters::Tile(srcRect, dstRect, 76 std::move(tileInput))); 77 canvas->save(); 78 canvas->translate(SkIntToScalar(x), SkIntToScalar(y)); 79 SkPaint paint; 80 paint.setImageFilter(std::move(filter)); 81 canvas->drawImage(fBitmap.get(), 0, 0, SkSamplingOptions(), &paint); 82 canvas->drawRect(srcRect, red); 83 canvas->drawRect(dstRect, blue); 84 canvas->restore(); 85 x += image->width() + MARGIN; 86 if (x + image->width() > WIDTH) { 87 x = 0; 88 y += image->height() + MARGIN; 89 } 90 } 91 } 92 93 { 94 float matrix[20] = { 1, 0, 0, 0, 0, 95 0, 1, 0, 0, 0, 96 0, 0, 1, 0, 0, 97 0, 0, 0, 1, 0 }; 98 99 SkRect srcRect = SkRect::MakeWH(SkIntToScalar(fBitmap->width()), 100 SkIntToScalar(fBitmap->height())); 101 SkRect dstRect = SkRect::MakeWH(SkIntToScalar(fBitmap->width() * 2), 102 SkIntToScalar(fBitmap->height() * 2)); 103 sk_sp<SkImageFilter> tile(SkImageFilters::Tile(srcRect, dstRect, nullptr)); 104 sk_sp<SkColorFilter> cf(SkColorFilters::Matrix(matrix)); 105 106 SkPaint paint; 107 paint.setImageFilter(SkImageFilters::ColorFilter(std::move(cf), std::move(tile))); 108 canvas->save(); 109 canvas->translate(SkIntToScalar(x), SkIntToScalar(y)); 110 canvas->clipRect(dstRect); 111 canvas->saveLayer(&dstRect, &paint); 112 canvas->drawImage(fBitmap.get(), 0, 0); 113 canvas->restore(); 114 canvas->drawRect(srcRect, red); 115 canvas->drawRect(dstRect, blue); 116 canvas->restore(); 117 } 118 119 // test that the crop rect properly applies to the tile image filter 120 { 121 canvas->translate(0, SkIntToScalar(100)); 122 123 SkRect srcRect = SkRect::MakeXYWH(0, 0, 50, 50); 124 SkRect dstRect = SkRect::MakeXYWH(0, 0, 100, 100); 125 SkIRect cropRect = SkIRect::MakeXYWH(5, 5, 40, 40); 126 sk_sp<SkColorFilter> greenCF = SkColorFilters::Blend(SK_ColorGREEN, SkBlendMode::kSrc); 127 sk_sp<SkImageFilter> green(SkImageFilters::ColorFilter(std::move(greenCF), 128 nullptr, 129 &cropRect)); 130 SkPaint paint; 131 paint.setColor(SK_ColorRED); 132 paint.setImageFilter(SkImageFilters::Tile(srcRect, dstRect, std::move(green))); 133 canvas->drawRect(dstRect, paint); 134 } 135 } 136 private: 137 sk_sp<SkImage> fBitmap, fCheckerboard; 138 139 using INHERITED = GM; 140 }; 141 142 ////////////////////////////////////////////////////////////////////////////// 143 144 DEF_GM(return new TileImageFilterGM;) 145 } // namespace skiagm 146