1 /* 2 * Copyright 2011 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.h" 9 #include "SkCanvas.h" 10 #include "SkColorFilter.h" 11 #include "SkColorPriv.h" 12 #include "SkShader.h" 13 14 #include "SkBlurImageFilter.h" 15 #include "SkColorFilterImageFilter.h" 16 #include "SkMergeImageFilter.h" 17 #include "SkOffsetImageFilter.h" 18 #include "SkTestImageFilters.h" 19 20 #define FILTER_WIDTH SkIntToScalar(150) 21 #define FILTER_HEIGHT SkIntToScalar(200) 22 23 static SkImageFilter* make0() { return new SkDownSampleImageFilter(SK_Scalar1 / 5); } 24 static SkImageFilter* make1() { return new SkOffsetImageFilter(SkIntToScalar(16), SkIntToScalar(16)); } 25 static SkImageFilter* make2() { 26 SkColorFilter* cf = SkColorFilter::CreateModeFilter(SK_ColorBLUE, 27 SkXfermode::kSrcIn_Mode); 28 SkAutoUnref aur(cf); 29 return SkColorFilterImageFilter::Create(cf); 30 } 31 static SkImageFilter* make3() { 32 return new SkBlurImageFilter(8, 0); 33 } 34 35 static SkImageFilter* make4() { 36 SkImageFilter* outer = new SkOffsetImageFilter(SkIntToScalar(16), SkIntToScalar(16)); 37 SkImageFilter* inner = new SkDownSampleImageFilter(SK_Scalar1 / 5); 38 SkAutoUnref aur0(outer); 39 SkAutoUnref aur1(inner); 40 return new SkComposeImageFilter(outer, inner); 41 } 42 static SkImageFilter* make5() { 43 SkImageFilter* first = new SkOffsetImageFilter(SkIntToScalar(16), SkIntToScalar(16)); 44 SkImageFilter* second = new SkDownSampleImageFilter(SK_Scalar1 / 5); 45 SkAutoUnref aur0(first); 46 SkAutoUnref aur1(second); 47 return new SkMergeImageFilter(first, second); 48 } 49 50 static SkImageFilter* make6() { 51 SkImageFilter* outer = new SkOffsetImageFilter(SkIntToScalar(16), SkIntToScalar(16)); 52 SkImageFilter* inner = new SkDownSampleImageFilter(SK_Scalar1 / 5); 53 SkAutoUnref aur0(outer); 54 SkAutoUnref aur1(inner); 55 SkImageFilter* compose = new SkComposeImageFilter(outer, inner); 56 SkAutoUnref aur2(compose); 57 58 SkColorFilter* cf = SkColorFilter::CreateModeFilter(0x880000FF, 59 SkXfermode::kSrcIn_Mode); 60 SkAutoUnref aur3(cf); 61 SkImageFilter* blue = SkColorFilterImageFilter::Create(cf); 62 SkAutoUnref aur4(blue); 63 64 return new SkMergeImageFilter(compose, blue); 65 } 66 67 static SkImageFilter* make7() { 68 SkImageFilter* outer = new SkOffsetImageFilter(SkIntToScalar(16), SkIntToScalar(16)); 69 SkImageFilter* inner = make3(); 70 SkAutoUnref aur0(outer); 71 SkAutoUnref aur1(inner); 72 SkImageFilter* compose = new SkComposeImageFilter(outer, inner); 73 SkAutoUnref aur2(compose); 74 75 SkColorFilter* cf = SkColorFilter::CreateModeFilter(0x880000FF, 76 SkXfermode::kSrcIn_Mode); 77 SkAutoUnref aur3(cf); 78 SkImageFilter* blue = SkColorFilterImageFilter::Create(cf); 79 SkAutoUnref aur4(blue); 80 81 return new SkMergeImageFilter(compose, blue); 82 } 83 84 static void draw0(SkCanvas* canvas) { 85 SkPaint p; 86 p.setAntiAlias(true); 87 SkRect r = SkRect::MakeWH(FILTER_WIDTH, FILTER_HEIGHT); 88 r.inset(SK_Scalar1 * 12, SK_Scalar1 * 12); 89 p.setColor(SK_ColorRED); 90 canvas->drawOval(r, p); 91 } 92 93 class TestImageFiltersGM : public skiagm::GM { 94 public: 95 TestImageFiltersGM () {} 96 97 protected: 98 99 virtual SkString onShortName() { 100 return SkString("testimagefilters"); 101 } 102 103 virtual SkISize onISize() { return SkISize::Make(700, 460); } 104 105 virtual void onDraw(SkCanvas* canvas) { 106 // this->drawSizeBounds(canvas, 0xFFCCCCCC); 107 108 static SkImageFilter* (*gFilterProc[])() = { 109 make0, make1, make2, make3, make4, make5, make6, make7 110 }; 111 112 const SkRect bounds = SkRect::MakeWH(FILTER_WIDTH, FILTER_HEIGHT); 113 114 const SkScalar dx = bounds.width() * 8 / 7; 115 const SkScalar dy = bounds.height() * 8 / 7; 116 117 canvas->translate(SkIntToScalar(8), SkIntToScalar(8)); 118 119 for (size_t i = 0; i < SK_ARRAY_COUNT(gFilterProc); ++i) { 120 int ix = i % 4; 121 int iy = i / 4; 122 123 SkAutoCanvasRestore acr(canvas, true); 124 canvas->translate(ix * dx, iy * dy); 125 126 SkPaint p; 127 p.setStyle(SkPaint::kStroke_Style); 128 canvas->drawRect(bounds, p); 129 130 SkPaint paint; 131 paint.setImageFilter(gFilterProc[i]())->unref(); 132 canvas->saveLayer(&bounds, &paint); 133 draw0(canvas); 134 } 135 } 136 137 private: 138 typedef GM INHERITED; 139 }; 140 141 ////////////////////////////////////////////////////////////////////////////// 142 143 static skiagm::GM* MyFactory(void*) { return new TestImageFiltersGM; } 144 static skiagm::GMRegistry reg(MyFactory); 145