| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright 2011 Google Inc. | 2 * Copyright 2011 Google Inc. |
| 3 * | 3 * |
| 4 * Use of this source code is governed by a BSD-style license that can be | 4 * Use of this source code is governed by a BSD-style license that can be |
| 5 * found in the LICENSE file. | 5 * found in the LICENSE file. |
| 6 */ | 6 */ |
| 7 | 7 |
| 8 #include "gm.h" | 8 #include "gm.h" |
| 9 #include "SkCanvas.h" | 9 #include "SkCanvas.h" |
| 10 #include "SkColorFilter.h" | 10 #include "SkColorFilter.h" |
| 11 #include "SkColorPriv.h" | 11 #include "SkColorPriv.h" |
| 12 #include "SkShader.h" | 12 #include "SkShader.h" |
| 13 | 13 |
| 14 #include "SkBlurImageFilter.h" | 14 #include "SkBlurImageFilter.h" |
| 15 #include "SkColorFilterImageFilter.h" | 15 #include "SkColorFilterImageFilter.h" |
| 16 #include "SkTestImageFilters.h" | 16 #include "SkTestImageFilters.h" |
| 17 | 17 |
| 18 class FailImageFilter : public SkImageFilter { | |
| 19 public: | |
| 20 FailImageFilter() : INHERITED(0) {} | |
| 21 | |
| 22 SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(FailImageFilter) | |
| 23 protected: | |
| 24 virtual bool onFilterImage(Proxy*, const SkBitmap& src, const SkMatrix&, | |
| 25 SkBitmap* result, SkIPoint* offset) { | |
| 26 return false; | |
| 27 } | |
| 28 | |
| 29 FailImageFilter(SkFlattenableReadBuffer& buffer) : INHERITED(buffer) {} | |
| 30 | |
| 31 private: | |
| 32 typedef SkImageFilter INHERITED; | |
| 33 }; | |
| 34 | |
| 35 // register the filter with the flattenable registry | |
| 36 static SkFlattenable::Registrar gFailImageFilterReg("FailImageFilter", | |
| 37 FailImageFilter::CreateProc)
; | |
| 38 | |
| 39 class IdentityImageFilter : public SkImageFilter { | |
| 40 public: | |
| 41 IdentityImageFilter() : INHERITED(0) {} | |
| 42 | |
| 43 SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(IdentityImageFilter) | |
| 44 protected: | |
| 45 virtual bool onFilterImage(Proxy*, const SkBitmap& src, const SkMatrix&, | |
| 46 SkBitmap* result, SkIPoint* offset) { | |
| 47 *result = src; | |
| 48 return true; | |
| 49 } | |
| 50 | |
| 51 IdentityImageFilter(SkFlattenableReadBuffer& buffer) : INHERITED(buffer) {} | |
| 52 | |
| 53 private: | |
| 54 typedef SkImageFilter INHERITED; | |
| 55 }; | |
| 56 | |
| 57 // register the filter with the flattenable registry | |
| 58 static SkFlattenable::Registrar gIdentityImageFilterReg("IdentityImageFilter", | |
| 59 IdentityImageFilter::Cre
ateProc); | |
| 60 | |
| 61 | |
| 62 /////////////////////////////////////////////////////////////////////////////// | 18 /////////////////////////////////////////////////////////////////////////////// |
| 63 | 19 |
| 64 static void draw_paint(SkCanvas* canvas, const SkRect& r, SkImageFilter* imf) { | 20 static void draw_paint(SkCanvas* canvas, const SkRect& r, SkImageFilter* imf) { |
| 65 SkPaint paint; | 21 SkPaint paint; |
| 66 paint.setImageFilter(imf); | 22 paint.setImageFilter(imf); |
| 67 paint.setColor(SK_ColorGREEN); | 23 paint.setColor(SK_ColorBLACK); |
| 68 canvas->save(); | 24 canvas->save(); |
| 69 canvas->clipRect(r); | 25 canvas->clipRect(r); |
| 70 canvas->drawPaint(paint); | 26 canvas->drawPaint(paint); |
| 71 canvas->restore(); | 27 canvas->restore(); |
| 72 } | 28 } |
| 73 | 29 |
| 74 static void draw_line(SkCanvas* canvas, const SkRect& r, SkImageFilter* imf) { | 30 static void draw_line(SkCanvas* canvas, const SkRect& r, SkImageFilter* imf) { |
| 75 SkPaint paint; | 31 SkPaint paint; |
| 76 paint.setColor(SK_ColorBLUE); | 32 paint.setColor(SK_ColorBLUE); |
| 77 paint.setImageFilter(imf); | 33 paint.setImageFilter(imf); |
| 78 paint.setStrokeWidth(r.width()/10); | 34 paint.setStrokeWidth(r.width()/10); |
| 35 canvas->save(); |
| 36 canvas->clipRect(r); |
| 79 canvas->drawLine(r.fLeft, r.fTop, r.fRight, r.fBottom, paint); | 37 canvas->drawLine(r.fLeft, r.fTop, r.fRight, r.fBottom, paint); |
| 38 canvas->restore(); |
| 80 } | 39 } |
| 81 | 40 |
| 82 static void draw_rect(SkCanvas* canvas, const SkRect& r, SkImageFilter* imf) { | 41 static void draw_rect(SkCanvas* canvas, const SkRect& r, SkImageFilter* imf) { |
| 83 SkPaint paint; | 42 SkPaint paint; |
| 84 paint.setColor(SK_ColorYELLOW); | 43 paint.setColor(SK_ColorYELLOW); |
| 85 paint.setImageFilter(imf); | 44 paint.setImageFilter(imf); |
| 86 SkRect rr(r); | 45 SkRect rr(r); |
| 87 rr.inset(r.width()/10, r.height()/10); | 46 rr.inset(r.width()/10, r.height()/10); |
| 47 canvas->save(); |
| 48 canvas->clipRect(r); |
| 88 canvas->drawRect(rr, paint); | 49 canvas->drawRect(rr, paint); |
| 50 canvas->restore(); |
| 89 } | 51 } |
| 90 | 52 |
| 91 static void draw_path(SkCanvas* canvas, const SkRect& r, SkImageFilter* imf) { | 53 static void draw_path(SkCanvas* canvas, const SkRect& r, SkImageFilter* imf) { |
| 92 SkPaint paint; | 54 SkPaint paint; |
| 93 paint.setColor(SK_ColorMAGENTA); | 55 paint.setColor(SK_ColorMAGENTA); |
| 94 paint.setImageFilter(imf); | 56 paint.setImageFilter(imf); |
| 95 paint.setAntiAlias(true); | 57 paint.setAntiAlias(true); |
| 58 canvas->save(); |
| 59 canvas->clipRect(r); |
| 96 canvas->drawCircle(r.centerX(), r.centerY(), r.width()*2/5, paint); | 60 canvas->drawCircle(r.centerX(), r.centerY(), r.width()*2/5, paint); |
| 61 canvas->restore(); |
| 97 } | 62 } |
| 98 | 63 |
| 99 static void draw_text(SkCanvas* canvas, const SkRect& r, SkImageFilter* imf) { | 64 static void draw_text(SkCanvas* canvas, const SkRect& r, SkImageFilter* imf) { |
| 100 SkPaint paint; | 65 SkPaint paint; |
| 101 paint.setImageFilter(imf); | 66 paint.setImageFilter(imf); |
| 102 paint.setColor(SK_ColorCYAN); | 67 paint.setColor(SK_ColorGREEN); |
| 103 paint.setAntiAlias(true); | 68 paint.setAntiAlias(true); |
| 104 paint.setTextSize(r.height()/2); | 69 paint.setTextSize(r.height()/2); |
| 105 paint.setTextAlign(SkPaint::kCenter_Align); | 70 paint.setTextAlign(SkPaint::kCenter_Align); |
| 71 canvas->save(); |
| 72 canvas->clipRect(r); |
| 106 canvas->drawText("Text", 4, r.centerX(), r.centerY(), paint); | 73 canvas->drawText("Text", 4, r.centerX(), r.centerY(), paint); |
| 74 canvas->restore(); |
| 107 } | 75 } |
| 108 | 76 |
| 109 static void draw_bitmap(SkCanvas* canvas, const SkRect& r, SkImageFilter* imf) { | 77 static void draw_bitmap(SkCanvas* canvas, const SkRect& r, SkImageFilter* imf) { |
| 110 SkPaint paint; | 78 SkPaint paint; |
| 111 paint.setImageFilter(imf); | |
| 112 | 79 |
| 113 SkIRect bounds; | 80 SkIRect bounds; |
| 114 r.roundOut(&bounds); | 81 r.roundOut(&bounds); |
| 115 | 82 |
| 116 SkBitmap bm; | 83 SkBitmap bm; |
| 117 bm.setConfig(SkBitmap::kARGB_8888_Config, bounds.width(), bounds.height()); | 84 bm.setConfig(SkBitmap::kARGB_8888_Config, bounds.width(), bounds.height()); |
| 118 bm.allocPixels(); | 85 bm.allocPixels(); |
| 119 bm.eraseColor(SK_ColorTRANSPARENT); | 86 bm.eraseColor(SK_ColorTRANSPARENT); |
| 120 SkCanvas c(bm); | 87 SkCanvas c(bm); |
| 121 draw_path(&c, r, NULL); | 88 draw_path(&c, r, NULL); |
| 122 | 89 |
| 90 paint.setImageFilter(imf); |
| 91 canvas->save(); |
| 92 canvas->clipRect(r); |
| 123 canvas->drawBitmap(bm, 0, 0, &paint); | 93 canvas->drawBitmap(bm, 0, 0, &paint); |
| 94 canvas->restore(); |
| 124 } | 95 } |
| 125 | 96 |
| 126 static void draw_sprite(SkCanvas* canvas, const SkRect& r, SkImageFilter* imf) { | 97 static void draw_sprite(SkCanvas* canvas, const SkRect& r, SkImageFilter* imf) { |
| 127 SkPaint paint; | 98 SkPaint paint; |
| 128 paint.setImageFilter(imf); | |
| 129 | 99 |
| 130 SkIRect bounds; | 100 SkIRect bounds; |
| 131 r.roundOut(&bounds); | 101 r.roundOut(&bounds); |
| 132 | 102 |
| 133 SkBitmap bm; | 103 SkBitmap bm; |
| 134 bm.setConfig(SkBitmap::kARGB_8888_Config, bounds.width(), bounds.height()); | 104 bm.setConfig(SkBitmap::kARGB_8888_Config, bounds.width(), bounds.height()); |
| 135 bm.allocPixels(); | 105 bm.allocPixels(); |
| 136 bm.eraseColor(SK_ColorTRANSPARENT); | 106 bm.eraseColor(SK_ColorRED); |
| 137 SkCanvas c(bm); | 107 SkCanvas c(bm); |
| 138 draw_path(&c, r, NULL); | 108 |
| 109 SkIRect cropRect = SkIRect::MakeXYWH(10, 10, 44, 44); |
| 110 paint.setColor(SK_ColorGREEN); |
| 111 c.drawRect(SkRect::Make(cropRect), paint); |
| 139 | 112 |
| 113 paint.setImageFilter(imf); |
| 140 SkPoint loc = { r.fLeft, r.fTop }; | 114 SkPoint loc = { r.fLeft, r.fTop }; |
| 141 canvas->getTotalMatrix().mapPoints(&loc, 1); | 115 canvas->getTotalMatrix().mapPoints(&loc, 1); |
| 142 canvas->drawSprite(bm, | 116 canvas->drawSprite(bm, |
| 143 SkScalarRoundToInt(loc.fX), SkScalarRoundToInt(loc.fY), | 117 SkScalarRoundToInt(loc.fX), SkScalarRoundToInt(loc.fY), |
| 144 &paint); | 118 &paint); |
| 145 } | 119 } |
| 146 | 120 |
| 147 /////////////////////////////////////////////////////////////////////////////// | 121 /////////////////////////////////////////////////////////////////////////////// |
| 148 | 122 |
| 149 class ImageFiltersBaseGM : public skiagm::GM { | 123 class ImageFiltersCroppedGM : public skiagm::GM { |
| 150 public: | 124 public: |
| 151 ImageFiltersBaseGM () {} | 125 ImageFiltersCroppedGM () {} |
| 152 | 126 |
| 153 protected: | 127 protected: |
| 154 | 128 |
| 155 virtual SkString onShortName() { | 129 virtual SkString onShortName() { |
| 156 return SkString("imagefiltersbase"); | 130 return SkString("imagefilterscropped"); |
| 157 } | 131 } |
| 158 | 132 |
| 159 virtual SkISize onISize() { return SkISize::Make(700, 460); } | 133 virtual SkISize onISize() { return SkISize::Make(700, 460); } |
| 160 | 134 |
| 161 void draw_frame(SkCanvas* canvas, const SkRect& r) { | 135 void draw_frame(SkCanvas* canvas, const SkRect& r) { |
| 162 SkPaint paint; | 136 SkPaint paint; |
| 163 paint.setStyle(SkPaint::kStroke_Style); | 137 paint.setStyle(SkPaint::kStroke_Style); |
| 164 paint.setColor(SK_ColorRED); | 138 paint.setColor(SK_ColorRED); |
| 165 canvas->drawRect(r, paint); | 139 canvas->drawRect(r, paint); |
| 166 } | 140 } |
| 167 | 141 |
| 168 virtual uint32_t onGetFlags() const { | 142 virtual uint32_t onGetFlags() const { |
| 169 // Because of the use of drawSprite, this test is excluded | 143 // Because of the use of drawSprite, this test is excluded |
| 170 // from scaled replay tests because drawSprite ignores the | 144 // from scaled replay tests because drawSprite ignores the |
| 171 // reciprocal scale that is applied at record time, which is | 145 // reciprocal scale that is applied at record time, which is |
| 172 // the intended behavior of drawSprite. | 146 // the intended behavior of drawSprite. |
| 173 return kSkipScaledReplay_Flag; | 147 return kSkipScaledReplay_Flag; |
| 174 } | 148 } |
| 175 | 149 |
| 176 virtual void onDraw(SkCanvas* canvas) { | 150 virtual void onDraw(SkCanvas* canvas) { |
| 177 void (*drawProc[])(SkCanvas*, const SkRect&, SkImageFilter*) = { | 151 void (*drawProc[])(SkCanvas*, const SkRect&, SkImageFilter*) = { |
| 178 draw_paint, | 152 draw_paint, |
| 179 draw_line, draw_rect, draw_path, draw_text, | 153 draw_line, draw_rect, draw_path, draw_text, |
| 180 draw_bitmap, | 154 draw_bitmap, |
| 181 draw_sprite | 155 draw_sprite |
| 182 }; | 156 }; |
| 183 | 157 |
| 184 SkColorFilter* cf = SkColorFilter::CreateModeFilter(SK_ColorRED, | 158 SkColorFilter* cf = SkColorFilter::CreateModeFilter(SK_ColorRED, |
| 185 SkXfermode::kSrcIn_Mode); | 159 SkXfermode::kSrcIn_Mode); |
| 160 SkIRect cropRect = SkIRect::MakeXYWH(10, 10, 44, 44); |
| 161 |
| 186 SkImageFilter* filters[] = { | 162 SkImageFilter* filters[] = { |
| 187 NULL, | 163 NULL, |
| 188 new IdentityImageFilter, | 164 SkColorFilterImageFilter::Create(cf, NULL, &cropRect), |
| 189 new FailImageFilter, | 165 new SkBlurImageFilter(8.0f, 0.0f, NULL, &cropRect), |
| 190 SkColorFilterImageFilter::Create(cf), | 166 new SkBlurImageFilter(0.0f, 8.0f, NULL, &cropRect), |
| 191 new SkBlurImageFilter(12.0f, 0.0f), | 167 new SkBlurImageFilter(8.0f, 8.0f, NULL, &cropRect), |
| 192 }; | 168 }; |
| 193 cf->unref(); | 169 cf->unref(); |
| 194 | 170 |
| 195 SkRect r = SkRect::MakeWH(SkIntToScalar(64), SkIntToScalar(64)); | 171 SkRect r = SkRect::MakeWH(SkIntToScalar(64), SkIntToScalar(64)); |
| 196 SkScalar MARGIN = SkIntToScalar(16); | 172 SkScalar MARGIN = SkIntToScalar(16); |
| 197 SkScalar DX = r.width() + MARGIN; | 173 SkScalar DX = r.width() + MARGIN; |
| 198 SkScalar DY = r.height() + MARGIN; | 174 SkScalar DY = r.height() + MARGIN; |
| 199 | 175 |
| 200 canvas->translate(MARGIN, MARGIN); | 176 canvas->translate(MARGIN, MARGIN); |
| 201 for (size_t i = 0; i < SK_ARRAY_COUNT(drawProc); ++i) { | 177 for (size_t i = 0; i < SK_ARRAY_COUNT(drawProc); ++i) { |
| 202 canvas->save(); | 178 canvas->save(); |
| 203 for (size_t j = 0; j < SK_ARRAY_COUNT(filters); ++j) { | 179 for (size_t j = 0; j < SK_ARRAY_COUNT(filters); ++j) { |
| 204 drawProc[i](canvas, r, filters[j]); | 180 drawProc[i](canvas, r, filters[j]); |
| 205 | |
| 206 draw_frame(canvas, r); | |
| 207 canvas->translate(0, DY); | 181 canvas->translate(0, DY); |
| 208 } | 182 } |
| 209 canvas->restore(); | 183 canvas->restore(); |
| 210 canvas->translate(DX, 0); | 184 canvas->translate(DX, 0); |
| 211 } | 185 } |
| 212 | 186 |
| 213 for(size_t j = 0; j < SK_ARRAY_COUNT(filters); ++j) { | 187 for(size_t j = 0; j < SK_ARRAY_COUNT(filters); ++j) { |
| 214 SkSafeUnref(filters[j]); | 188 SkSafeUnref(filters[j]); |
| 215 } | 189 } |
| 216 } | 190 } |
| 217 | 191 |
| 218 private: | 192 private: |
| 219 typedef GM INHERITED; | 193 typedef GM INHERITED; |
| 220 }; | 194 }; |
| 221 | 195 |
| 222 /////////////////////////////////////////////////////////////////////////////// | 196 /////////////////////////////////////////////////////////////////////////////// |
| 223 | 197 |
| 224 static skiagm::GM* MyFactory(void*) { return new ImageFiltersBaseGM; } | 198 static skiagm::GM* MyFactory(void*) { return new ImageFiltersCroppedGM; } |
| 225 static skiagm::GMRegistry reg(MyFactory); | 199 static skiagm::GMRegistry reg(MyFactory); |
| OLD | NEW |