1*c8dee2aaSAndroid Build Coastguard Worker /* 2*c8dee2aaSAndroid Build Coastguard Worker * Copyright 2015 Google Inc. 3*c8dee2aaSAndroid Build Coastguard Worker * 4*c8dee2aaSAndroid Build Coastguard Worker * Use of this source code is governed by a BSD-style license that can be 5*c8dee2aaSAndroid Build Coastguard Worker * found in the LICENSE file. 6*c8dee2aaSAndroid Build Coastguard Worker */ 7*c8dee2aaSAndroid Build Coastguard Worker 8*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkCanvas.h" 9*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkDrawable.h" 10*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkFont.h" 11*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkPath.h" 12*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkRSXform.h" 13*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkSamplingOptions.h" 14*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkString.h" 15*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkSurface.h" 16*c8dee2aaSAndroid Build Coastguard Worker #include "include/effects/SkGradientShader.h" 17*c8dee2aaSAndroid Build Coastguard Worker #include "include/utils/SkTextUtils.h" 18*c8dee2aaSAndroid Build Coastguard Worker #include "src/base/SkRandom.h" 19*c8dee2aaSAndroid Build Coastguard Worker #include "tools/DecodeUtils.h" 20*c8dee2aaSAndroid Build Coastguard Worker #include "tools/fonts/FontToolUtils.h" 21*c8dee2aaSAndroid Build Coastguard Worker #include "tools/viewer/ClickHandlerSlide.h" 22*c8dee2aaSAndroid Build Coastguard Worker 23*c8dee2aaSAndroid Build Coastguard Worker const SkBlendMode gModes[] = { 24*c8dee2aaSAndroid Build Coastguard Worker SkBlendMode::kSrcOver, 25*c8dee2aaSAndroid Build Coastguard Worker SkBlendMode::kSrc, 26*c8dee2aaSAndroid Build Coastguard Worker SkBlendMode::kSrcIn, 27*c8dee2aaSAndroid Build Coastguard Worker SkBlendMode::kSrcOut, 28*c8dee2aaSAndroid Build Coastguard Worker SkBlendMode::kSrcATop, 29*c8dee2aaSAndroid Build Coastguard Worker SkBlendMode::kDstOver, 30*c8dee2aaSAndroid Build Coastguard Worker SkBlendMode::kDstIn, 31*c8dee2aaSAndroid Build Coastguard Worker SkBlendMode::kDstOut, 32*c8dee2aaSAndroid Build Coastguard Worker SkBlendMode::kDstATop, 33*c8dee2aaSAndroid Build Coastguard Worker }; 34*c8dee2aaSAndroid Build Coastguard Worker const int N_Modes = std::size(gModes); 35*c8dee2aaSAndroid Build Coastguard Worker 36*c8dee2aaSAndroid Build Coastguard Worker static SkRandom gRand; 37*c8dee2aaSAndroid Build Coastguard Worker 38*c8dee2aaSAndroid Build Coastguard Worker struct ModeButton { 39*c8dee2aaSAndroid Build Coastguard Worker SkString fLabel; 40*c8dee2aaSAndroid Build Coastguard Worker SkColor fColor; 41*c8dee2aaSAndroid Build Coastguard Worker SkRect fRect; 42*c8dee2aaSAndroid Build Coastguard Worker 43*c8dee2aaSAndroid Build Coastguard Worker public: initModeButton44*c8dee2aaSAndroid Build Coastguard Worker void init(const char label[], const SkRect& rect) { 45*c8dee2aaSAndroid Build Coastguard Worker fLabel = label; 46*c8dee2aaSAndroid Build Coastguard Worker fRect = rect; 47*c8dee2aaSAndroid Build Coastguard Worker fColor = (gRand.nextU() & 0x7F7F7F7F) | SkColorSetARGB(0xFF, 0, 0, 0x80); 48*c8dee2aaSAndroid Build Coastguard Worker } 49*c8dee2aaSAndroid Build Coastguard Worker drawModeButton50*c8dee2aaSAndroid Build Coastguard Worker void draw(SkCanvas* canvas) { 51*c8dee2aaSAndroid Build Coastguard Worker SkPaint paint; 52*c8dee2aaSAndroid Build Coastguard Worker paint.setAntiAlias(true); 53*c8dee2aaSAndroid Build Coastguard Worker paint.setColor(fColor); 54*c8dee2aaSAndroid Build Coastguard Worker canvas->drawRoundRect(fRect, 8, 8, paint); 55*c8dee2aaSAndroid Build Coastguard Worker 56*c8dee2aaSAndroid Build Coastguard Worker paint.setColor(0xFFFFFFFF); 57*c8dee2aaSAndroid Build Coastguard Worker SkFont font = ToolUtils::DefaultFont(); 58*c8dee2aaSAndroid Build Coastguard Worker font.setSize(16); 59*c8dee2aaSAndroid Build Coastguard Worker font.setEdging(SkFont::Edging::kSubpixelAntiAlias); 60*c8dee2aaSAndroid Build Coastguard Worker SkTextUtils::DrawString(canvas, fLabel.c_str(), fRect.centerX(), fRect.fTop + 0.68f * fRect.height(), 61*c8dee2aaSAndroid Build Coastguard Worker font, paint, SkTextUtils::kCenter_Align); 62*c8dee2aaSAndroid Build Coastguard Worker } 63*c8dee2aaSAndroid Build Coastguard Worker hitTestModeButton64*c8dee2aaSAndroid Build Coastguard Worker bool hitTest(SkScalar x, SkScalar y) { 65*c8dee2aaSAndroid Build Coastguard Worker return fRect.intersects({x - 1, y - 1, x + 1, y + 1}); 66*c8dee2aaSAndroid Build Coastguard Worker } 67*c8dee2aaSAndroid Build Coastguard Worker }; 68*c8dee2aaSAndroid Build Coastguard Worker 69*c8dee2aaSAndroid Build Coastguard Worker class ModeDrawable : public SkDrawable { 70*c8dee2aaSAndroid Build Coastguard Worker public: ModeDrawable()71*c8dee2aaSAndroid Build Coastguard Worker ModeDrawable() : fMode(SkBlendMode::kSrcOver), fLoc(SkPoint::Make(0, 0)) {} 72*c8dee2aaSAndroid Build Coastguard Worker 73*c8dee2aaSAndroid Build Coastguard Worker SkBlendMode fMode; 74*c8dee2aaSAndroid Build Coastguard Worker SkPoint fLoc; 75*c8dee2aaSAndroid Build Coastguard Worker hitTest(SkScalar x,SkScalar y)76*c8dee2aaSAndroid Build Coastguard Worker bool hitTest(SkScalar x, SkScalar y) { 77*c8dee2aaSAndroid Build Coastguard Worker SkRect target = SkRect::MakeXYWH(x - fLoc.x() - 1, y - fLoc.y() - 1, 3, 3); 78*c8dee2aaSAndroid Build Coastguard Worker return this->getBounds().intersects(target); 79*c8dee2aaSAndroid Build Coastguard Worker } 80*c8dee2aaSAndroid Build Coastguard Worker }; 81*c8dee2aaSAndroid Build Coastguard Worker 82*c8dee2aaSAndroid Build Coastguard Worker class CircDrawable : public ModeDrawable { 83*c8dee2aaSAndroid Build Coastguard Worker SkPaint fPaint; 84*c8dee2aaSAndroid Build Coastguard Worker SkRect fBounds; 85*c8dee2aaSAndroid Build Coastguard Worker 86*c8dee2aaSAndroid Build Coastguard Worker public: CircDrawable(SkScalar size,SkColor c)87*c8dee2aaSAndroid Build Coastguard Worker CircDrawable(SkScalar size, SkColor c) { 88*c8dee2aaSAndroid Build Coastguard Worker const SkColor colors[] = { 0, c }; 89*c8dee2aaSAndroid Build Coastguard Worker fPaint.setShader(SkGradientShader::MakeRadial(SkPoint::Make(size/2, size/2), size/2, 90*c8dee2aaSAndroid Build Coastguard Worker colors, nullptr, 2, 91*c8dee2aaSAndroid Build Coastguard Worker SkTileMode::kClamp)); 92*c8dee2aaSAndroid Build Coastguard Worker fBounds = SkRect::MakeWH(size, size); 93*c8dee2aaSAndroid Build Coastguard Worker } 94*c8dee2aaSAndroid Build Coastguard Worker 95*c8dee2aaSAndroid Build Coastguard Worker protected: onGetBounds()96*c8dee2aaSAndroid Build Coastguard Worker SkRect onGetBounds() override { 97*c8dee2aaSAndroid Build Coastguard Worker return fBounds; 98*c8dee2aaSAndroid Build Coastguard Worker } 99*c8dee2aaSAndroid Build Coastguard Worker onDraw(SkCanvas * canvas)100*c8dee2aaSAndroid Build Coastguard Worker void onDraw(SkCanvas* canvas) override { 101*c8dee2aaSAndroid Build Coastguard Worker fPaint.setBlendMode(fMode); 102*c8dee2aaSAndroid Build Coastguard Worker canvas->save(); 103*c8dee2aaSAndroid Build Coastguard Worker canvas->translate(fLoc.x(), fLoc.y()); 104*c8dee2aaSAndroid Build Coastguard Worker canvas->drawOval(fBounds, fPaint); 105*c8dee2aaSAndroid Build Coastguard Worker canvas->restore(); 106*c8dee2aaSAndroid Build Coastguard Worker } 107*c8dee2aaSAndroid Build Coastguard Worker }; 108*c8dee2aaSAndroid Build Coastguard Worker 109*c8dee2aaSAndroid Build Coastguard Worker class XferSlide : public ClickHandlerSlide { 110*c8dee2aaSAndroid Build Coastguard Worker public: XferSlide()111*c8dee2aaSAndroid Build Coastguard Worker XferSlide() { 112*c8dee2aaSAndroid Build Coastguard Worker const SkColor colors[] = { SK_ColorRED, SK_ColorGREEN, SK_ColorBLUE, SK_ColorBLACK }; 113*c8dee2aaSAndroid Build Coastguard Worker for (int i = 0; i < N; ++i) { 114*c8dee2aaSAndroid Build Coastguard Worker fDrs[i].reset(new CircDrawable(200, colors[i])); 115*c8dee2aaSAndroid Build Coastguard Worker fDrs[i]->fLoc.set(100.f + i * 100, 100.f + i * 100); 116*c8dee2aaSAndroid Build Coastguard Worker fDrs[i]->fMode = SkBlendMode::kSrcOver; 117*c8dee2aaSAndroid Build Coastguard Worker } 118*c8dee2aaSAndroid Build Coastguard Worker fSelected = nullptr; 119*c8dee2aaSAndroid Build Coastguard Worker 120*c8dee2aaSAndroid Build Coastguard Worker this->addButtons(); 121*c8dee2aaSAndroid Build Coastguard Worker fName = "XferDemo"; 122*c8dee2aaSAndroid Build Coastguard Worker } 123*c8dee2aaSAndroid Build Coastguard Worker draw(SkCanvas * canvas)124*c8dee2aaSAndroid Build Coastguard Worker void draw(SkCanvas* canvas) override { 125*c8dee2aaSAndroid Build Coastguard Worker for (int i = 0; i < N_Modes; ++i) { 126*c8dee2aaSAndroid Build Coastguard Worker fModeButtons[i].draw(canvas); 127*c8dee2aaSAndroid Build Coastguard Worker } 128*c8dee2aaSAndroid Build Coastguard Worker 129*c8dee2aaSAndroid Build Coastguard Worker SkPaint paint; 130*c8dee2aaSAndroid Build Coastguard Worker if (fSelected) { 131*c8dee2aaSAndroid Build Coastguard Worker for (int i = 0; i < N_Modes; ++i) { 132*c8dee2aaSAndroid Build Coastguard Worker if (fSelected->fMode == gModes[i]) { 133*c8dee2aaSAndroid Build Coastguard Worker canvas->drawRect(fModeRect[i], paint); 134*c8dee2aaSAndroid Build Coastguard Worker break; 135*c8dee2aaSAndroid Build Coastguard Worker } 136*c8dee2aaSAndroid Build Coastguard Worker } 137*c8dee2aaSAndroid Build Coastguard Worker } 138*c8dee2aaSAndroid Build Coastguard Worker 139*c8dee2aaSAndroid Build Coastguard Worker canvas->saveLayer(nullptr, nullptr); 140*c8dee2aaSAndroid Build Coastguard Worker for (int i = 0; i < N; ++i) { 141*c8dee2aaSAndroid Build Coastguard Worker fDrs[i]->draw(canvas); 142*c8dee2aaSAndroid Build Coastguard Worker } 143*c8dee2aaSAndroid Build Coastguard Worker canvas->restore(); 144*c8dee2aaSAndroid Build Coastguard Worker } 145*c8dee2aaSAndroid Build Coastguard Worker 146*c8dee2aaSAndroid Build Coastguard Worker protected: onFindClickHandler(SkScalar x,SkScalar y,skui::ModifierKey)147*c8dee2aaSAndroid Build Coastguard Worker Click* onFindClickHandler(SkScalar x, SkScalar y, skui::ModifierKey) override { 148*c8dee2aaSAndroid Build Coastguard Worker // Check mode buttons first 149*c8dee2aaSAndroid Build Coastguard Worker for (int i = 0; i < N_Modes; ++i) { 150*c8dee2aaSAndroid Build Coastguard Worker if (fModeButtons[i].hitTest(x, y)) { 151*c8dee2aaSAndroid Build Coastguard Worker Click* click = new Click(); 152*c8dee2aaSAndroid Build Coastguard Worker click->fMeta.setS32("mode", i); 153*c8dee2aaSAndroid Build Coastguard Worker return click; 154*c8dee2aaSAndroid Build Coastguard Worker } 155*c8dee2aaSAndroid Build Coastguard Worker } 156*c8dee2aaSAndroid Build Coastguard Worker fSelected = nullptr; 157*c8dee2aaSAndroid Build Coastguard Worker for (int i = N - 1; i >= 0; --i) { 158*c8dee2aaSAndroid Build Coastguard Worker if (fDrs[i]->hitTest(x, y)) { 159*c8dee2aaSAndroid Build Coastguard Worker fSelected = fDrs[i].get(); 160*c8dee2aaSAndroid Build Coastguard Worker break; 161*c8dee2aaSAndroid Build Coastguard Worker } 162*c8dee2aaSAndroid Build Coastguard Worker } 163*c8dee2aaSAndroid Build Coastguard Worker return fSelected ? new Click() : nullptr; 164*c8dee2aaSAndroid Build Coastguard Worker } 165*c8dee2aaSAndroid Build Coastguard Worker onClick(Click * click)166*c8dee2aaSAndroid Build Coastguard Worker bool onClick(Click* click) override { 167*c8dee2aaSAndroid Build Coastguard Worker int32_t mode; 168*c8dee2aaSAndroid Build Coastguard Worker if (click->fMeta.findS32("mode", &mode)) { 169*c8dee2aaSAndroid Build Coastguard Worker if (fSelected && skui::InputState::kUp == click->fState) { 170*c8dee2aaSAndroid Build Coastguard Worker fSelected->fMode = gModes[mode]; 171*c8dee2aaSAndroid Build Coastguard Worker } 172*c8dee2aaSAndroid Build Coastguard Worker } else { 173*c8dee2aaSAndroid Build Coastguard Worker fSelected->fLoc.fX += click->fCurr.fX - click->fPrev.fX; 174*c8dee2aaSAndroid Build Coastguard Worker fSelected->fLoc.fY += click->fCurr.fY - click->fPrev.fY; 175*c8dee2aaSAndroid Build Coastguard Worker } 176*c8dee2aaSAndroid Build Coastguard Worker return true; 177*c8dee2aaSAndroid Build Coastguard Worker } 178*c8dee2aaSAndroid Build Coastguard Worker 179*c8dee2aaSAndroid Build Coastguard Worker private: 180*c8dee2aaSAndroid Build Coastguard Worker enum { 181*c8dee2aaSAndroid Build Coastguard Worker N = 4 182*c8dee2aaSAndroid Build Coastguard Worker }; 183*c8dee2aaSAndroid Build Coastguard Worker 184*c8dee2aaSAndroid Build Coastguard Worker SkRect fModeRect[N_Modes]; 185*c8dee2aaSAndroid Build Coastguard Worker ModeButton fModeButtons[N_Modes]; 186*c8dee2aaSAndroid Build Coastguard Worker sk_sp<CircDrawable> fDrs[N]; 187*c8dee2aaSAndroid Build Coastguard Worker CircDrawable* fSelected; 188*c8dee2aaSAndroid Build Coastguard Worker addButtons()189*c8dee2aaSAndroid Build Coastguard Worker void addButtons() { 190*c8dee2aaSAndroid Build Coastguard Worker SkScalar x = 10; 191*c8dee2aaSAndroid Build Coastguard Worker SkScalar y = 10; 192*c8dee2aaSAndroid Build Coastguard Worker for (int i = 0; i < N_Modes; ++i) { 193*c8dee2aaSAndroid Build Coastguard Worker fModeButtons[i].init(SkBlendMode_Name(gModes[i]), SkRect::MakeXYWH(x, y, 70, 25)); 194*c8dee2aaSAndroid Build Coastguard Worker fModeRect[i] = SkRect::MakeXYWH(x, y + 28, 70, 2); 195*c8dee2aaSAndroid Build Coastguard Worker x += 80; 196*c8dee2aaSAndroid Build Coastguard Worker } 197*c8dee2aaSAndroid Build Coastguard Worker } 198*c8dee2aaSAndroid Build Coastguard Worker }; 199*c8dee2aaSAndroid Build Coastguard Worker 200*c8dee2aaSAndroid Build Coastguard Worker DEF_SLIDE( return new XferSlide; ) 201*c8dee2aaSAndroid Build Coastguard Worker 202*c8dee2aaSAndroid Build Coastguard Worker ////////////////////////////////////////////////////////////////////////////// 203*c8dee2aaSAndroid Build Coastguard Worker 204*c8dee2aaSAndroid Build Coastguard Worker #include "tools/Resources.h" 205*c8dee2aaSAndroid Build Coastguard Worker 206*c8dee2aaSAndroid Build Coastguard Worker class CubicResamplerSlide : public ClickHandlerSlide { 207*c8dee2aaSAndroid Build Coastguard Worker public: CubicResamplerSlide()208*c8dee2aaSAndroid Build Coastguard Worker CubicResamplerSlide() { 209*c8dee2aaSAndroid Build Coastguard Worker fName = "CubicResampler"; 210*c8dee2aaSAndroid Build Coastguard Worker } 211*c8dee2aaSAndroid Build Coastguard Worker 212*c8dee2aaSAndroid Build Coastguard Worker protected: load(SkScalar,SkScalar)213*c8dee2aaSAndroid Build Coastguard Worker void load(SkScalar, SkScalar) override { 214*c8dee2aaSAndroid Build Coastguard Worker SkRect r = {10, 10, 200, 200}; 215*c8dee2aaSAndroid Build Coastguard Worker for (const char* name : {"images/mandrill_128.png", 216*c8dee2aaSAndroid Build Coastguard Worker "images/rle.bmp", 217*c8dee2aaSAndroid Build Coastguard Worker "images/example_4.png"}) { 218*c8dee2aaSAndroid Build Coastguard Worker fRecs.push_back({ToolUtils::GetResourceAsImage(name), r}); 219*c8dee2aaSAndroid Build Coastguard Worker r.offset(0, r.height() + 10); 220*c8dee2aaSAndroid Build Coastguard Worker } 221*c8dee2aaSAndroid Build Coastguard Worker fDomain.setXYWH(r.fLeft + 3 * r.width() + 40, 50, 200, 200); 222*c8dee2aaSAndroid Build Coastguard Worker fCubic = {.3f, .5f}; 223*c8dee2aaSAndroid Build Coastguard Worker } 224*c8dee2aaSAndroid Build Coastguard Worker draw(SkCanvas * canvas)225*c8dee2aaSAndroid Build Coastguard Worker void draw(SkCanvas* canvas) override { 226*c8dee2aaSAndroid Build Coastguard Worker for (const auto& rec : fRecs) { 227*c8dee2aaSAndroid Build Coastguard Worker rec.draw(canvas, fCubic); 228*c8dee2aaSAndroid Build Coastguard Worker } 229*c8dee2aaSAndroid Build Coastguard Worker 230*c8dee2aaSAndroid Build Coastguard Worker SkPaint paint; 231*c8dee2aaSAndroid Build Coastguard Worker paint.setAntiAlias(true); 232*c8dee2aaSAndroid Build Coastguard Worker paint.setStroke(true); 233*c8dee2aaSAndroid Build Coastguard Worker canvas->drawRect(fDomain, paint); 234*c8dee2aaSAndroid Build Coastguard Worker 235*c8dee2aaSAndroid Build Coastguard Worker paint.setColor(SK_ColorRED); 236*c8dee2aaSAndroid Build Coastguard Worker paint.setStroke(false); 237*c8dee2aaSAndroid Build Coastguard Worker SkPoint loc = SkMatrix::RectToRect({0,0,1,1}, fDomain).mapXY(fCubic.B, fCubic.C); 238*c8dee2aaSAndroid Build Coastguard Worker canvas->drawCircle(loc.fX, loc.fY, 8, paint); 239*c8dee2aaSAndroid Build Coastguard Worker 240*c8dee2aaSAndroid Build Coastguard Worker SkString str; 241*c8dee2aaSAndroid Build Coastguard Worker str.printf("B=%4.2f C=%4.2f", fCubic.B, fCubic.C); 242*c8dee2aaSAndroid Build Coastguard Worker SkFont font = ToolUtils::DefaultFont(); 243*c8dee2aaSAndroid Build Coastguard Worker font.setSize(25); 244*c8dee2aaSAndroid Build Coastguard Worker font.setEdging(SkFont::Edging::kAntiAlias); 245*c8dee2aaSAndroid Build Coastguard Worker paint.setColor(SK_ColorBLACK); 246*c8dee2aaSAndroid Build Coastguard Worker canvas->drawSimpleText(str.c_str(), str.size(), SkTextEncoding::kUTF8, 247*c8dee2aaSAndroid Build Coastguard Worker fDomain.fLeft + 10, fDomain.fBottom + 40, font, paint); 248*c8dee2aaSAndroid Build Coastguard Worker } 249*c8dee2aaSAndroid Build Coastguard Worker pin_unitize(float min,float max,float value)250*c8dee2aaSAndroid Build Coastguard Worker static float pin_unitize(float min, float max, float value) { 251*c8dee2aaSAndroid Build Coastguard Worker return (std::min(std::max(value, min), max) - min) / (max - min); 252*c8dee2aaSAndroid Build Coastguard Worker } pin_unitize(const SkRect & r,SkPoint p)253*c8dee2aaSAndroid Build Coastguard Worker static SkPoint pin_unitize(const SkRect& r, SkPoint p) { 254*c8dee2aaSAndroid Build Coastguard Worker return { 255*c8dee2aaSAndroid Build Coastguard Worker pin_unitize(r.fLeft, r.fRight, p.fX), 256*c8dee2aaSAndroid Build Coastguard Worker pin_unitize(r.fTop, r.fBottom, p.fY), 257*c8dee2aaSAndroid Build Coastguard Worker }; 258*c8dee2aaSAndroid Build Coastguard Worker } 259*c8dee2aaSAndroid Build Coastguard Worker 260*c8dee2aaSAndroid Build Coastguard Worker protected: onFindClickHandler(SkScalar x,SkScalar y,skui::ModifierKey)261*c8dee2aaSAndroid Build Coastguard Worker Click* onFindClickHandler(SkScalar x, SkScalar y, skui::ModifierKey) override { 262*c8dee2aaSAndroid Build Coastguard Worker if (fDomain.contains(x, y)) { 263*c8dee2aaSAndroid Build Coastguard Worker return new Click([this](Click* click) { 264*c8dee2aaSAndroid Build Coastguard Worker auto [B, C] = pin_unitize(fDomain, click->fCurr); 265*c8dee2aaSAndroid Build Coastguard Worker fCubic = {B, C}; 266*c8dee2aaSAndroid Build Coastguard Worker return true; 267*c8dee2aaSAndroid Build Coastguard Worker }); 268*c8dee2aaSAndroid Build Coastguard Worker } 269*c8dee2aaSAndroid Build Coastguard Worker return nullptr; 270*c8dee2aaSAndroid Build Coastguard Worker } 271*c8dee2aaSAndroid Build Coastguard Worker onClick(ClickHandlerSlide::Click *)272*c8dee2aaSAndroid Build Coastguard Worker bool onClick(ClickHandlerSlide::Click *) override { return false; } 273*c8dee2aaSAndroid Build Coastguard Worker 274*c8dee2aaSAndroid Build Coastguard Worker private: 275*c8dee2aaSAndroid Build Coastguard Worker struct Rec { 276*c8dee2aaSAndroid Build Coastguard Worker sk_sp<SkImage> fImage; 277*c8dee2aaSAndroid Build Coastguard Worker SkRect fBounds; 278*c8dee2aaSAndroid Build Coastguard Worker drawCubicResamplerSlide::Rec279*c8dee2aaSAndroid Build Coastguard Worker void draw(SkCanvas* canvas, SkCubicResampler cubic) const { 280*c8dee2aaSAndroid Build Coastguard Worker SkRect r = fBounds; 281*c8dee2aaSAndroid Build Coastguard Worker SkPaint paint; 282*c8dee2aaSAndroid Build Coastguard Worker 283*c8dee2aaSAndroid Build Coastguard Worker SkMatrix lm = SkMatrix::Translate(r.x(), r.y()) 284*c8dee2aaSAndroid Build Coastguard Worker * SkMatrix::Scale(10, 10); 285*c8dee2aaSAndroid Build Coastguard Worker paint.setShader(fImage->makeShader(SkSamplingOptions(), lm)); 286*c8dee2aaSAndroid Build Coastguard Worker canvas->drawRect(r, paint); 287*c8dee2aaSAndroid Build Coastguard Worker 288*c8dee2aaSAndroid Build Coastguard Worker r.offset(r.width() + 10, 0); 289*c8dee2aaSAndroid Build Coastguard Worker lm.postTranslate(r.width() + 10, 0); 290*c8dee2aaSAndroid Build Coastguard Worker 291*c8dee2aaSAndroid Build Coastguard Worker paint.setShader(fImage->makeShader(SkSamplingOptions(SkFilterMode::kLinear), lm)); 292*c8dee2aaSAndroid Build Coastguard Worker canvas->drawRect(r, paint); 293*c8dee2aaSAndroid Build Coastguard Worker 294*c8dee2aaSAndroid Build Coastguard Worker r.offset(r.width() + 10, 0); 295*c8dee2aaSAndroid Build Coastguard Worker lm.postTranslate(r.width() + 10, 0); 296*c8dee2aaSAndroid Build Coastguard Worker 297*c8dee2aaSAndroid Build Coastguard Worker paint.setShader(fImage->makeShader(SkTileMode::kClamp, SkTileMode::kClamp, 298*c8dee2aaSAndroid Build Coastguard Worker SkSamplingOptions(cubic), &lm)); 299*c8dee2aaSAndroid Build Coastguard Worker canvas->drawRect(r, paint); 300*c8dee2aaSAndroid Build Coastguard Worker } 301*c8dee2aaSAndroid Build Coastguard Worker }; 302*c8dee2aaSAndroid Build Coastguard Worker 303*c8dee2aaSAndroid Build Coastguard Worker std::vector<Rec> fRecs; 304*c8dee2aaSAndroid Build Coastguard Worker SkRect fDomain; 305*c8dee2aaSAndroid Build Coastguard Worker SkCubicResampler fCubic; 306*c8dee2aaSAndroid Build Coastguard Worker }; 307*c8dee2aaSAndroid Build Coastguard Worker 308*c8dee2aaSAndroid Build Coastguard Worker DEF_SLIDE( return new CubicResamplerSlide; ) 309