18926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com/* 28926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com * Copyright 2011 Google Inc. 38926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com * 48926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com * Use of this source code is governed by a BSD-style license that can be 58926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com * found in the LICENSE file. 68926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com */ 78926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com 88926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com#include "gm.h" 933d2055e594177b27360f84e0631b26d74a55a9bMike Klein#include "sk_tool_utils.h" 108926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com#include "SkCanvas.h" 118926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com#include "SkColorFilter.h" 128926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com#include "SkColorPriv.h" 1360aaeb2b551d5e3e90baacac315e899e26f758f1Cary Clark#include "SkImageFilterPriv.h" 148926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com#include "SkShader.h" 158926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com 168926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com#include "SkBlurImageFilter.h" 1744888c66d4bf03da58eb9fbd3db92eb477141aabsenorblanco@chromium.org#include "SkColorFilterImageFilter.h" 18f44fcdca01722959c3be335f44e88b59dbb33a10junov@chromium.org#include "SkDropShadowImageFilter.h" 194ba94e26106a4ecab4d3841d702b57487b82334erobertphillips#include "SkSpecialImage.h" 208926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com 218926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.comclass FailImageFilter : public SkImageFilter { 228926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.compublic: 237daaaa4425ea083df437eea95ba6b38315ce98adreed class Registrar { 247daaaa4425ea083df437eea95ba6b38315ce98adreed public: 257daaaa4425ea083df437eea95ba6b38315ce98adreed Registrar() { 267daaaa4425ea083df437eea95ba6b38315ce98adreed SkFlattenable::Register("FailImageFilter", 273b37545bc594a96de45eba62dea0ce478750f2a9mtklein FailImageFilter::CreateProc, 283b37545bc594a96de45eba62dea0ce478750f2a9mtklein FailImageFilter::GetFlattenableType()); 297daaaa4425ea083df437eea95ba6b38315ce98adreed } 307daaaa4425ea083df437eea95ba6b38315ce98adreed }; 3143c2ad4e8f9ed84f46caa57e0b471f7393f1280arobertphillips static sk_sp<SkImageFilter> Make() { 3243c2ad4e8f9ed84f46caa57e0b471f7393f1280arobertphillips return sk_sp<SkImageFilter>(new FailImageFilter); 3343c2ad4e8f9ed84f46caa57e0b471f7393f1280arobertphillips } 34ba28d03e94dc221d6a803bf2a84a420b9159255cdjsollen@google.com 35f3f5bad7ded35265c0b5d042cc4174386b197a33robertphillips SK_TO_STRING_OVERRIDE() 36ba28d03e94dc221d6a803bf2a84a420b9159255cdjsollen@google.com SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(FailImageFilter) 379fa60daad4d5f54c0dbe3dbcc7608a8f6d721187reed 388926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.comprotected: 3943c2ad4e8f9ed84f46caa57e0b471f7393f1280arobertphillips FailImageFilter() : INHERITED(nullptr, 0, nullptr) {} 409fa60daad4d5f54c0dbe3dbcc7608a8f6d721187reed 414ba94e26106a4ecab4d3841d702b57487b82334erobertphillips sk_sp<SkSpecialImage> onFilterImage(SkSpecialImage* source, const Context&, 424ba94e26106a4ecab4d3841d702b57487b82334erobertphillips SkIPoint* offset) const override { 434ba94e26106a4ecab4d3841d702b57487b82334erobertphillips return nullptr; 448926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com } 4562745a8bba20d7ca91167915eb459339bcfb8862Matt Sarett sk_sp<SkImageFilter> onMakeColorSpace(SkColorSpaceXformer*) const override { 4662745a8bba20d7ca91167915eb459339bcfb8862Matt Sarett return nullptr; 4762745a8bba20d7ca91167915eb459339bcfb8862Matt Sarett } 48d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 498926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.comprivate: 508926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com typedef SkImageFilter INHERITED; 518926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com}; 528926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com 537daaaa4425ea083df437eea95ba6b38315ce98adreedstatic FailImageFilter::Registrar gReg0; 547daaaa4425ea083df437eea95ba6b38315ce98adreed 5560c9b58b3214b0154c931656e91e39b230e987d8reedsk_sp<SkFlattenable> FailImageFilter::CreateProc(SkReadBuffer& buffer) { 569fa60daad4d5f54c0dbe3dbcc7608a8f6d721187reed SK_IMAGEFILTER_UNFLATTEN_COMMON(common, 0); 5743c2ad4e8f9ed84f46caa57e0b471f7393f1280arobertphillips return FailImageFilter::Make(); 589fa60daad4d5f54c0dbe3dbcc7608a8f6d721187reed} 59ba28d03e94dc221d6a803bf2a84a420b9159255cdjsollen@google.com 60f3f5bad7ded35265c0b5d042cc4174386b197a33robertphillips#ifndef SK_IGNORE_TO_STRING 61f3f5bad7ded35265c0b5d042cc4174386b197a33robertphillipsvoid FailImageFilter::toString(SkString* str) const { 62f3f5bad7ded35265c0b5d042cc4174386b197a33robertphillips str->appendf("FailImageFilter: ("); 63f3f5bad7ded35265c0b5d042cc4174386b197a33robertphillips str->append(")"); 64f3f5bad7ded35265c0b5d042cc4174386b197a33robertphillips} 65f3f5bad7ded35265c0b5d042cc4174386b197a33robertphillips#endif 66f3f5bad7ded35265c0b5d042cc4174386b197a33robertphillips 678926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.comclass IdentityImageFilter : public SkImageFilter { 688926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.compublic: 697daaaa4425ea083df437eea95ba6b38315ce98adreed class Registrar { 707daaaa4425ea083df437eea95ba6b38315ce98adreed public: 717daaaa4425ea083df437eea95ba6b38315ce98adreed Registrar() { 727daaaa4425ea083df437eea95ba6b38315ce98adreed SkFlattenable::Register("IdentityImageFilter", 733b37545bc594a96de45eba62dea0ce478750f2a9mtklein IdentityImageFilter::CreateProc, 743b37545bc594a96de45eba62dea0ce478750f2a9mtklein IdentityImageFilter::GetFlattenableType()); 757daaaa4425ea083df437eea95ba6b38315ce98adreed } 767daaaa4425ea083df437eea95ba6b38315ce98adreed }; 7743c2ad4e8f9ed84f46caa57e0b471f7393f1280arobertphillips static sk_sp<SkImageFilter> Make(sk_sp<SkImageFilter> input) { 7843c2ad4e8f9ed84f46caa57e0b471f7393f1280arobertphillips return sk_sp<SkImageFilter>(new IdentityImageFilter(std::move(input))); 79cac5fd597f6e2495f50aaa6bcbe3dadc56f0b977commit-bot@chromium.org } 808926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com 81f3f5bad7ded35265c0b5d042cc4174386b197a33robertphillips SK_TO_STRING_OVERRIDE() 82ba28d03e94dc221d6a803bf2a84a420b9159255cdjsollen@google.com SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(IdentityImageFilter) 839fa60daad4d5f54c0dbe3dbcc7608a8f6d721187reed 8443c2ad4e8f9ed84f46caa57e0b471f7393f1280arobertphillipsprotected: 854ba94e26106a4ecab4d3841d702b57487b82334erobertphillips sk_sp<SkSpecialImage> onFilterImage(SkSpecialImage* source, const Context&, 864ba94e26106a4ecab4d3841d702b57487b82334erobertphillips SkIPoint* offset) const override { 87f7efa502d62af80bd15b03e1131603fb6577c3dfcommit-bot@chromium.org offset->set(0, 0); 884ba94e26106a4ecab4d3841d702b57487b82334erobertphillips return sk_ref_sp<SkSpecialImage>(source); 898926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com } 9062745a8bba20d7ca91167915eb459339bcfb8862Matt Sarett sk_sp<SkImageFilter> onMakeColorSpace(SkColorSpaceXformer*) const override { 9162745a8bba20d7ca91167915eb459339bcfb8862Matt Sarett return sk_ref_sp(const_cast<IdentityImageFilter*>(this)); 9262745a8bba20d7ca91167915eb459339bcfb8862Matt Sarett } 938926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com 948926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.comprivate: 9543c2ad4e8f9ed84f46caa57e0b471f7393f1280arobertphillips IdentityImageFilter(sk_sp<SkImageFilter> input) : INHERITED(&input, 1, nullptr) {} 9643c2ad4e8f9ed84f46caa57e0b471f7393f1280arobertphillips 978926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com typedef SkImageFilter INHERITED; 988926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com}; 998926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com 1007daaaa4425ea083df437eea95ba6b38315ce98adreedstatic IdentityImageFilter::Registrar gReg1; 1017daaaa4425ea083df437eea95ba6b38315ce98adreed 10260c9b58b3214b0154c931656e91e39b230e987d8reedsk_sp<SkFlattenable> IdentityImageFilter::CreateProc(SkReadBuffer& buffer) { 1039fa60daad4d5f54c0dbe3dbcc7608a8f6d721187reed SK_IMAGEFILTER_UNFLATTEN_COMMON(common, 1); 10443c2ad4e8f9ed84f46caa57e0b471f7393f1280arobertphillips return IdentityImageFilter::Make(common.getInput(0)); 1059fa60daad4d5f54c0dbe3dbcc7608a8f6d721187reed} 106ba28d03e94dc221d6a803bf2a84a420b9159255cdjsollen@google.com 107f3f5bad7ded35265c0b5d042cc4174386b197a33robertphillips#ifndef SK_IGNORE_TO_STRING 108f3f5bad7ded35265c0b5d042cc4174386b197a33robertphillipsvoid IdentityImageFilter::toString(SkString* str) const { 109f3f5bad7ded35265c0b5d042cc4174386b197a33robertphillips str->appendf("IdentityImageFilter: ("); 110f3f5bad7ded35265c0b5d042cc4174386b197a33robertphillips str->append(")"); 111f3f5bad7ded35265c0b5d042cc4174386b197a33robertphillips} 112f3f5bad7ded35265c0b5d042cc4174386b197a33robertphillips#endif 113f3f5bad7ded35265c0b5d042cc4174386b197a33robertphillips 1148926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com/////////////////////////////////////////////////////////////////////////////// 1158926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com 1165605b56afa5bd89f3148b397318b616fccfd4004robertphillipsstatic void draw_paint(SkCanvas* canvas, const SkRect& r, sk_sp<SkImageFilter> imf) { 1178926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com SkPaint paint; 1185605b56afa5bd89f3148b397318b616fccfd4004robertphillips paint.setImageFilter(std::move(imf)); 1198926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com paint.setColor(SK_ColorGREEN); 1208926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com canvas->save(); 1218926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com canvas->clipRect(r); 1228926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com canvas->drawPaint(paint); 1238926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com canvas->restore(); 1248926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com} 1258926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com 1265605b56afa5bd89f3148b397318b616fccfd4004robertphillipsstatic void draw_line(SkCanvas* canvas, const SkRect& r, sk_sp<SkImageFilter> imf) { 1278926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com SkPaint paint; 1288926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com paint.setColor(SK_ColorBLUE); 1298926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com paint.setImageFilter(imf); 1308926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com paint.setStrokeWidth(r.width()/10); 1318926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com canvas->drawLine(r.fLeft, r.fTop, r.fRight, r.fBottom, paint); 1328926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com} 1338926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com 1345605b56afa5bd89f3148b397318b616fccfd4004robertphillipsstatic void draw_rect(SkCanvas* canvas, const SkRect& r, sk_sp<SkImageFilter> imf) { 1358926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com SkPaint paint; 1368926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com paint.setColor(SK_ColorYELLOW); 1378926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com paint.setImageFilter(imf); 1388926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com SkRect rr(r); 1398926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com rr.inset(r.width()/10, r.height()/10); 1408926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com canvas->drawRect(rr, paint); 1418926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com} 1428926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com 1435605b56afa5bd89f3148b397318b616fccfd4004robertphillipsstatic void draw_path(SkCanvas* canvas, const SkRect& r, sk_sp<SkImageFilter> imf) { 1448926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com SkPaint paint; 1458926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com paint.setColor(SK_ColorMAGENTA); 1468926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com paint.setImageFilter(imf); 1478926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com paint.setAntiAlias(true); 1488926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com canvas->drawCircle(r.centerX(), r.centerY(), r.width()*2/5, paint); 1498926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com} 1508926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com 1515605b56afa5bd89f3148b397318b616fccfd4004robertphillipsstatic void draw_text(SkCanvas* canvas, const SkRect& r, sk_sp<SkImageFilter> imf) { 1528926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com SkPaint paint; 1538926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com paint.setImageFilter(imf); 1548926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com paint.setColor(SK_ColorCYAN); 1558926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com paint.setAntiAlias(true); 1561818acb6a4b11cd9a1d44ce5dde77452502a9796caryclark sk_tool_utils::set_portable_typeface(&paint); 1578926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com paint.setTextSize(r.height()/2); 1588926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com paint.setTextAlign(SkPaint::kCenter_Align); 1592a475eae622adc1e8fa29206be1eaf862c23548eCary Clark canvas->drawString("Text", r.centerX(), r.centerY(), paint); 1608926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com} 1618926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com 1625605b56afa5bd89f3148b397318b616fccfd4004robertphillipsstatic void draw_bitmap(SkCanvas* canvas, const SkRect& r, sk_sp<SkImageFilter> imf) { 1638926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com SkPaint paint; 1645605b56afa5bd89f3148b397318b616fccfd4004robertphillips paint.setImageFilter(std::move(imf)); 165d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 1668926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com SkIRect bounds; 1678926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com r.roundOut(&bounds); 168d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 1698926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com SkBitmap bm; 170eb9a46cbbb475e862a084aa2224ec18d4ac5e95breed@google.com bm.allocN32Pixels(bounds.width(), bounds.height()); 171dbfac8a72393eaf01670aeb3244de0e18d8faf98junov@google.com bm.eraseColor(SK_ColorTRANSPARENT); 1728926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com SkCanvas c(bm); 17396fcdcc219d2a0d3579719b84b28bede76efba64halcanary draw_path(&c, r, nullptr); 174d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 1758926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com canvas->drawBitmap(bm, 0, 0, &paint); 1768926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com} 1778926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com 1788926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com/////////////////////////////////////////////////////////////////////////////// 1798926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com 1808926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.comclass ImageFiltersBaseGM : public skiagm::GM { 1818926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.compublic: 1828926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com ImageFiltersBaseGM () {} 1838926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com 1848926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.comprotected: 18536352bf5e38f45a70ee4f4fc132a38048d38206dmtklein SkString onShortName() override { 1868926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com return SkString("imagefiltersbase"); 1878926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com } 1888926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com 18936352bf5e38f45a70ee4f4fc132a38048d38206dmtklein SkISize onISize() override { return SkISize::Make(700, 500); } 1908926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com 1918926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com void draw_frame(SkCanvas* canvas, const SkRect& r) { 1928926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com SkPaint paint; 1938926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com paint.setStyle(SkPaint::kStroke_Style); 1948926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com paint.setColor(SK_ColorRED); 1958926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com canvas->drawRect(r, paint); 1968926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com } 1978926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com 19836352bf5e38f45a70ee4f4fc132a38048d38206dmtklein void onDraw(SkCanvas* canvas) override { 1995605b56afa5bd89f3148b397318b616fccfd4004robertphillips void (*drawProc[])(SkCanvas*, const SkRect&, sk_sp<SkImageFilter>) = { 2008926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com draw_paint, 2018926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com draw_line, draw_rect, draw_path, draw_text, 2028926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com draw_bitmap, 2038926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com }; 204d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 2057d954ad797176afedb9262fdea4507d0fc60eb9dMike Reed auto cf = SkColorFilter::MakeModeFilter(SK_ColorRED, SkBlendMode::kSrcIn); 2065605b56afa5bd89f3148b397318b616fccfd4004robertphillips sk_sp<SkImageFilter> filters[] = { 20796fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr, 2085605b56afa5bd89f3148b397318b616fccfd4004robertphillips IdentityImageFilter::Make(nullptr), 2095605b56afa5bd89f3148b397318b616fccfd4004robertphillips FailImageFilter::Make(), 2105605b56afa5bd89f3148b397318b616fccfd4004robertphillips SkColorFilterImageFilter::Make(std::move(cf), nullptr), 2114fafedd33add9948db1147c60d681ed9340984fdHerb Derby // The strage 0.29 value tickles an edge case where crop rect calculates 2124fafedd33add9948db1147c60d681ed9340984fdHerb Derby // a small border, but the blur really needs no border. This tickels 2134fafedd33add9948db1147c60d681ed9340984fdHerb Derby // an msan uninitialized value bug. 2144fafedd33add9948db1147c60d681ed9340984fdHerb Derby SkBlurImageFilter::Make(12.0f, 0.29f, nullptr), 215c416912da4840af0c49bd8cdcf00044ed39500f6robertphillips SkDropShadowImageFilter::Make( 2165605b56afa5bd89f3148b397318b616fccfd4004robertphillips 10.0f, 5.0f, 3.0f, 3.0f, SK_ColorBLUE, 217c416912da4840af0c49bd8cdcf00044ed39500f6robertphillips SkDropShadowImageFilter::kDrawShadowAndForeground_ShadowMode, 218c416912da4840af0c49bd8cdcf00044ed39500f6robertphillips nullptr), 2198926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com }; 2208926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com 2218926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com SkRect r = SkRect::MakeWH(SkIntToScalar(64), SkIntToScalar(64)); 2228926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com SkScalar MARGIN = SkIntToScalar(16); 2238926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com SkScalar DX = r.width() + MARGIN; 2248926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com SkScalar DY = r.height() + MARGIN; 2258926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com 2268926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com canvas->translate(MARGIN, MARGIN); 2278926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com for (size_t i = 0; i < SK_ARRAY_COUNT(drawProc); ++i) { 2288926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com canvas->save(); 2298926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com for (size_t j = 0; j < SK_ARRAY_COUNT(filters); ++j) { 2308926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com drawProc[i](canvas, r, filters[j]); 231d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 2328926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com draw_frame(canvas, r); 2338926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com canvas->translate(0, DY); 2348926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com } 2358926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com canvas->restore(); 2368926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com canvas->translate(DX, 0); 2378926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com } 2388926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com } 2398926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com 2408926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.comprivate: 2418926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com typedef GM INHERITED; 2428926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com}; 2438dc0ccb8d33d1af7dd13228509e61fe915bc7705reedDEF_GM( return new ImageFiltersBaseGM; ) 2448926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com 2458926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com/////////////////////////////////////////////////////////////////////////////// 2468926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com 2478dc0ccb8d33d1af7dd13228509e61fe915bc7705reed/* 2488dc0ccb8d33d1af7dd13228509e61fe915bc7705reed * Want to test combos of filter and LCD text, to be sure we disable LCD in the presence of 2498dc0ccb8d33d1af7dd13228509e61fe915bc7705reed * a filter. 2508dc0ccb8d33d1af7dd13228509e61fe915bc7705reed */ 2518dc0ccb8d33d1af7dd13228509e61fe915bc7705reedclass ImageFiltersTextBaseGM : public skiagm::GM { 2528dc0ccb8d33d1af7dd13228509e61fe915bc7705reed SkString fSuffix; 2538dc0ccb8d33d1af7dd13228509e61fe915bc7705reedpublic: 2548dc0ccb8d33d1af7dd13228509e61fe915bc7705reed ImageFiltersTextBaseGM(const char suffix[]) : fSuffix(suffix) {} 2558dc0ccb8d33d1af7dd13228509e61fe915bc7705reed 2568dc0ccb8d33d1af7dd13228509e61fe915bc7705reedprotected: 25736352bf5e38f45a70ee4f4fc132a38048d38206dmtklein SkString onShortName() override { 2588dc0ccb8d33d1af7dd13228509e61fe915bc7705reed SkString name; 2598dc0ccb8d33d1af7dd13228509e61fe915bc7705reed name.printf("%s_%s", "textfilter", fSuffix.c_str()); 2608dc0ccb8d33d1af7dd13228509e61fe915bc7705reed return name; 2618dc0ccb8d33d1af7dd13228509e61fe915bc7705reed } 2628dc0ccb8d33d1af7dd13228509e61fe915bc7705reed 26336352bf5e38f45a70ee4f4fc132a38048d38206dmtklein SkISize onISize() override { return SkISize::Make(512, 342); } 2648dc0ccb8d33d1af7dd13228509e61fe915bc7705reed 2658dc0ccb8d33d1af7dd13228509e61fe915bc7705reed void drawWaterfall(SkCanvas* canvas, const SkPaint& origPaint) { 2668dc0ccb8d33d1af7dd13228509e61fe915bc7705reed const uint32_t flags[] = { 2678dc0ccb8d33d1af7dd13228509e61fe915bc7705reed 0, 2688dc0ccb8d33d1af7dd13228509e61fe915bc7705reed SkPaint::kAntiAlias_Flag, 2698dc0ccb8d33d1af7dd13228509e61fe915bc7705reed SkPaint::kAntiAlias_Flag | SkPaint::kLCDRenderText_Flag, 2708dc0ccb8d33d1af7dd13228509e61fe915bc7705reed }; 2718dc0ccb8d33d1af7dd13228509e61fe915bc7705reed SkPaint paint(origPaint); 2721818acb6a4b11cd9a1d44ce5dde77452502a9796caryclark sk_tool_utils::set_portable_typeface(&paint); 2738dc0ccb8d33d1af7dd13228509e61fe915bc7705reed paint.setTextSize(30); 2748dc0ccb8d33d1af7dd13228509e61fe915bc7705reed 2758dc0ccb8d33d1af7dd13228509e61fe915bc7705reed SkAutoCanvasRestore acr(canvas, true); 2768dc0ccb8d33d1af7dd13228509e61fe915bc7705reed for (size_t i = 0; i < SK_ARRAY_COUNT(flags); ++i) { 2778dc0ccb8d33d1af7dd13228509e61fe915bc7705reed paint.setFlags(flags[i]); 2782a475eae622adc1e8fa29206be1eaf862c23548eCary Clark canvas->drawString("Hamburgefon", 0, 0, paint); 2798dc0ccb8d33d1af7dd13228509e61fe915bc7705reed canvas->translate(0, 40); 2808dc0ccb8d33d1af7dd13228509e61fe915bc7705reed } 2818dc0ccb8d33d1af7dd13228509e61fe915bc7705reed } 2828dc0ccb8d33d1af7dd13228509e61fe915bc7705reed 2838dc0ccb8d33d1af7dd13228509e61fe915bc7705reed virtual void installFilter(SkPaint* paint) = 0; 2848dc0ccb8d33d1af7dd13228509e61fe915bc7705reed 28536352bf5e38f45a70ee4f4fc132a38048d38206dmtklein void onDraw(SkCanvas* canvas) override { 2868dc0ccb8d33d1af7dd13228509e61fe915bc7705reed SkPaint paint; 2878dc0ccb8d33d1af7dd13228509e61fe915bc7705reed 2888dc0ccb8d33d1af7dd13228509e61fe915bc7705reed canvas->translate(20, 40); 2898dc0ccb8d33d1af7dd13228509e61fe915bc7705reed 2908dc0ccb8d33d1af7dd13228509e61fe915bc7705reed for (int doSaveLayer = 0; doSaveLayer <= 1; ++doSaveLayer) { 2918dc0ccb8d33d1af7dd13228509e61fe915bc7705reed SkAutoCanvasRestore acr(canvas, true); 2928dc0ccb8d33d1af7dd13228509e61fe915bc7705reed for (int useFilter = 0; useFilter <= 1; ++useFilter) { 2938dc0ccb8d33d1af7dd13228509e61fe915bc7705reed SkAutoCanvasRestore acr2(canvas, true); 2948dc0ccb8d33d1af7dd13228509e61fe915bc7705reed 2958dc0ccb8d33d1af7dd13228509e61fe915bc7705reed SkPaint paint; 2968dc0ccb8d33d1af7dd13228509e61fe915bc7705reed if (useFilter) { 2978dc0ccb8d33d1af7dd13228509e61fe915bc7705reed this->installFilter(&paint); 2988dc0ccb8d33d1af7dd13228509e61fe915bc7705reed } 2998dc0ccb8d33d1af7dd13228509e61fe915bc7705reed if (doSaveLayer) { 30096fcdcc219d2a0d3579719b84b28bede76efba64halcanary canvas->saveLayer(nullptr, &paint); 30196fcdcc219d2a0d3579719b84b28bede76efba64halcanary paint.setImageFilter(nullptr); 3028dc0ccb8d33d1af7dd13228509e61fe915bc7705reed } 3038dc0ccb8d33d1af7dd13228509e61fe915bc7705reed this->drawWaterfall(canvas, paint); 3048dc0ccb8d33d1af7dd13228509e61fe915bc7705reed 3058dc0ccb8d33d1af7dd13228509e61fe915bc7705reed acr2.restore(); 3068dc0ccb8d33d1af7dd13228509e61fe915bc7705reed canvas->translate(250, 0); 3078dc0ccb8d33d1af7dd13228509e61fe915bc7705reed } 3088dc0ccb8d33d1af7dd13228509e61fe915bc7705reed acr.restore(); 3098dc0ccb8d33d1af7dd13228509e61fe915bc7705reed canvas->translate(0, 200); 3108dc0ccb8d33d1af7dd13228509e61fe915bc7705reed } 3118dc0ccb8d33d1af7dd13228509e61fe915bc7705reed } 3129d524f22bfde5dc3dc8f48e1be39bdebd3bb0304halcanary 3138dc0ccb8d33d1af7dd13228509e61fe915bc7705reedprivate: 3148dc0ccb8d33d1af7dd13228509e61fe915bc7705reed typedef GM INHERITED; 3158dc0ccb8d33d1af7dd13228509e61fe915bc7705reed}; 3168dc0ccb8d33d1af7dd13228509e61fe915bc7705reed 3178dc0ccb8d33d1af7dd13228509e61fe915bc7705reedclass ImageFiltersText_IF : public ImageFiltersTextBaseGM { 3188dc0ccb8d33d1af7dd13228509e61fe915bc7705reedpublic: 3198dc0ccb8d33d1af7dd13228509e61fe915bc7705reed ImageFiltersText_IF() : ImageFiltersTextBaseGM("image") {} 3208dc0ccb8d33d1af7dd13228509e61fe915bc7705reed 32136352bf5e38f45a70ee4f4fc132a38048d38206dmtklein void installFilter(SkPaint* paint) override { 3226e7025ab13dfc4f0037233e67b4b8e18d6dfd1e1robertphillips paint->setImageFilter(SkBlurImageFilter::Make(1.5f, 1.5f, nullptr)); 3238dc0ccb8d33d1af7dd13228509e61fe915bc7705reed } 3248dc0ccb8d33d1af7dd13228509e61fe915bc7705reed}; 3258dc0ccb8d33d1af7dd13228509e61fe915bc7705reedDEF_GM( return new ImageFiltersText_IF; ) 3268dc0ccb8d33d1af7dd13228509e61fe915bc7705reed 3278dc0ccb8d33d1af7dd13228509e61fe915bc7705reedclass ImageFiltersText_CF : public ImageFiltersTextBaseGM { 3288dc0ccb8d33d1af7dd13228509e61fe915bc7705reedpublic: 3298dc0ccb8d33d1af7dd13228509e61fe915bc7705reed ImageFiltersText_CF() : ImageFiltersTextBaseGM("color") {} 3308dc0ccb8d33d1af7dd13228509e61fe915bc7705reed 33136352bf5e38f45a70ee4f4fc132a38048d38206dmtklein void installFilter(SkPaint* paint) override { 3327d954ad797176afedb9262fdea4507d0fc60eb9dMike Reed paint->setColorFilter(SkColorFilter::MakeModeFilter(SK_ColorBLUE, SkBlendMode::kSrcIn)); 3338dc0ccb8d33d1af7dd13228509e61fe915bc7705reed } 3348dc0ccb8d33d1af7dd13228509e61fe915bc7705reed}; 3358dc0ccb8d33d1af7dd13228509e61fe915bc7705reedDEF_GM( return new ImageFiltersText_CF; ) 336