1*c8dee2aaSAndroid Build Coastguard Worker /* 2*c8dee2aaSAndroid Build Coastguard Worker * Copyright 2017 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/SkColorFilter.h" 10*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkImage.h" 11*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkPath.h" 12*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkRegion.h" 13*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkShader.h" 14*c8dee2aaSAndroid Build Coastguard Worker #include "include/effects/SkGradientShader.h" 15*c8dee2aaSAndroid Build Coastguard Worker #include "src/base/SkUtils.h" 16*c8dee2aaSAndroid Build Coastguard Worker #include "tools/DecodeUtils.h" 17*c8dee2aaSAndroid Build Coastguard Worker #include "tools/Resources.h" 18*c8dee2aaSAndroid Build Coastguard Worker #include "tools/viewer/ClickHandlerSlide.h" 19*c8dee2aaSAndroid Build Coastguard Worker 20*c8dee2aaSAndroid Build Coastguard Worker const float gMat[] = { 21*c8dee2aaSAndroid Build Coastguard Worker .3f, .6f, .1f, 0, 0, 22*c8dee2aaSAndroid Build Coastguard Worker .3f, .6f, .1f, 0, 0, 23*c8dee2aaSAndroid Build Coastguard Worker .3f, .6f, .1f, 0, 0, 24*c8dee2aaSAndroid Build Coastguard Worker 0, 0, 0, 1, 0, 25*c8dee2aaSAndroid Build Coastguard Worker }; 26*c8dee2aaSAndroid Build Coastguard Worker 27*c8dee2aaSAndroid Build Coastguard Worker class MixerSlide : public ClickHandlerSlide { 28*c8dee2aaSAndroid Build Coastguard Worker sk_sp<SkImage> fImg; 29*c8dee2aaSAndroid Build Coastguard Worker sk_sp<SkColorFilter> fCF0; 30*c8dee2aaSAndroid Build Coastguard Worker sk_sp<SkColorFilter> fCF1; 31*c8dee2aaSAndroid Build Coastguard Worker 32*c8dee2aaSAndroid Build Coastguard Worker float fWeight = 0; 33*c8dee2aaSAndroid Build Coastguard Worker float fDW = 0.02f; 34*c8dee2aaSAndroid Build Coastguard Worker 35*c8dee2aaSAndroid Build Coastguard Worker public: MixerSlide()36*c8dee2aaSAndroid Build Coastguard Worker MixerSlide() { fName = "Mixer"; } 37*c8dee2aaSAndroid Build Coastguard Worker draw(SkCanvas * canvas)38*c8dee2aaSAndroid Build Coastguard Worker void draw(SkCanvas* canvas) override { 39*c8dee2aaSAndroid Build Coastguard Worker if (!fImg) { 40*c8dee2aaSAndroid Build Coastguard Worker fImg = ToolUtils::GetResourceAsImage("images/mandrill_256.png"); 41*c8dee2aaSAndroid Build Coastguard Worker fCF0 = SkColorFilters::Matrix(gMat); 42*c8dee2aaSAndroid Build Coastguard Worker fCF1 = SkColorFilters::Blend(0xFF44CC88, SkBlendMode::kScreen); 43*c8dee2aaSAndroid Build Coastguard Worker } 44*c8dee2aaSAndroid Build Coastguard Worker 45*c8dee2aaSAndroid Build Coastguard Worker float gap = fImg->width() * 3; 46*c8dee2aaSAndroid Build Coastguard Worker 47*c8dee2aaSAndroid Build Coastguard Worker canvas->translate(10, 10); 48*c8dee2aaSAndroid Build Coastguard Worker dodraw(canvas, nullptr, fCF1, gap); 49*c8dee2aaSAndroid Build Coastguard Worker canvas->translate(0, fImg->height() + 10); 50*c8dee2aaSAndroid Build Coastguard Worker dodraw(canvas, fCF0, nullptr, gap); 51*c8dee2aaSAndroid Build Coastguard Worker canvas->translate(0, fImg->height() + 10); 52*c8dee2aaSAndroid Build Coastguard Worker dodraw(canvas, fCF0, fCF1, gap); 53*c8dee2aaSAndroid Build Coastguard Worker 54*c8dee2aaSAndroid Build Coastguard Worker fWeight += fDW; 55*c8dee2aaSAndroid Build Coastguard Worker if (fWeight > 1 || fWeight < 0) { 56*c8dee2aaSAndroid Build Coastguard Worker fDW = -fDW; 57*c8dee2aaSAndroid Build Coastguard Worker } 58*c8dee2aaSAndroid Build Coastguard Worker } 59*c8dee2aaSAndroid Build Coastguard Worker 60*c8dee2aaSAndroid Build Coastguard Worker protected: onFindClickHandler(SkScalar x,SkScalar y,skui::ModifierKey)61*c8dee2aaSAndroid Build Coastguard Worker Click* onFindClickHandler(SkScalar x, SkScalar y, skui::ModifierKey) override { 62*c8dee2aaSAndroid Build Coastguard Worker return fRect.contains(SkScalarRoundToInt(x), 63*c8dee2aaSAndroid Build Coastguard Worker SkScalarRoundToInt(y)) ? new Click() : nullptr; 64*c8dee2aaSAndroid Build Coastguard Worker } 65*c8dee2aaSAndroid Build Coastguard Worker onClick(Click * click)66*c8dee2aaSAndroid Build Coastguard Worker bool onClick(Click* click) override { 67*c8dee2aaSAndroid Build Coastguard Worker fRect.offset(click->fCurr.fX - click->fPrev.fX, 68*c8dee2aaSAndroid Build Coastguard Worker click->fCurr.fY - click->fPrev.fY); 69*c8dee2aaSAndroid Build Coastguard Worker return true; 70*c8dee2aaSAndroid Build Coastguard Worker } 71*c8dee2aaSAndroid Build Coastguard Worker 72*c8dee2aaSAndroid Build Coastguard Worker private: dodraw(SkCanvas * canvas,sk_sp<SkColorFilter> cf0,sk_sp<SkColorFilter> cf1,float gap)73*c8dee2aaSAndroid Build Coastguard Worker void dodraw(SkCanvas* canvas, sk_sp<SkColorFilter> cf0, sk_sp<SkColorFilter> cf1, float gap) { 74*c8dee2aaSAndroid Build Coastguard Worker SkPaint paint; 75*c8dee2aaSAndroid Build Coastguard Worker paint.setColorFilter(cf0); 76*c8dee2aaSAndroid Build Coastguard Worker canvas->drawImage(fImg, 0, 0, SkSamplingOptions(), &paint); 77*c8dee2aaSAndroid Build Coastguard Worker 78*c8dee2aaSAndroid Build Coastguard Worker paint.setColorFilter(SkColorFilters::Lerp(fWeight, cf0, cf1)); 79*c8dee2aaSAndroid Build Coastguard Worker canvas->drawImage(fImg, fImg->width() + gap * fWeight, 0, 80*c8dee2aaSAndroid Build Coastguard Worker SkSamplingOptions(), &paint); 81*c8dee2aaSAndroid Build Coastguard Worker 82*c8dee2aaSAndroid Build Coastguard Worker paint.setColorFilter(cf1); 83*c8dee2aaSAndroid Build Coastguard Worker canvas->drawImage(fImg, 2*fImg->width() + gap, 0, SkSamplingOptions(), &paint); 84*c8dee2aaSAndroid Build Coastguard Worker } 85*c8dee2aaSAndroid Build Coastguard Worker 86*c8dee2aaSAndroid Build Coastguard Worker SkIRect fRect; 87*c8dee2aaSAndroid Build Coastguard Worker 88*c8dee2aaSAndroid Build Coastguard Worker }; 89*c8dee2aaSAndroid Build Coastguard Worker DEF_SLIDE( return new MixerSlide; ) 90