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