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