1cb93a386Sopenharmony_ci/* 2cb93a386Sopenharmony_ci * Copyright 2017 Google Inc. 3cb93a386Sopenharmony_ci * 4cb93a386Sopenharmony_ci * Use of this source code is governed by a BSD-style license that can be 5cb93a386Sopenharmony_ci * found in the LICENSE file. 6cb93a386Sopenharmony_ci */ 7cb93a386Sopenharmony_ci 8cb93a386Sopenharmony_ci#include "include/core/SkCanvas.h" 9cb93a386Sopenharmony_ci#include "include/core/SkColorFilter.h" 10cb93a386Sopenharmony_ci#include "include/core/SkImage.h" 11cb93a386Sopenharmony_ci#include "include/core/SkPath.h" 12cb93a386Sopenharmony_ci#include "include/core/SkRegion.h" 13cb93a386Sopenharmony_ci#include "include/core/SkShader.h" 14cb93a386Sopenharmony_ci#include "include/effects/SkGradientShader.h" 15cb93a386Sopenharmony_ci#include "samplecode/Sample.h" 16cb93a386Sopenharmony_ci#include "src/core/SkUtils.h" 17cb93a386Sopenharmony_ci#include "tools/Resources.h" 18cb93a386Sopenharmony_ci 19cb93a386Sopenharmony_ciconst float gMat[] = { 20cb93a386Sopenharmony_ci .3f, .6f, .1f, 0, 0, 21cb93a386Sopenharmony_ci .3f, .6f, .1f, 0, 0, 22cb93a386Sopenharmony_ci .3f, .6f, .1f, 0, 0, 23cb93a386Sopenharmony_ci 0, 0, 0, 1, 0, 24cb93a386Sopenharmony_ci}; 25cb93a386Sopenharmony_ci 26cb93a386Sopenharmony_ciclass MixerView : public Sample { 27cb93a386Sopenharmony_ci sk_sp<SkImage> fImg; 28cb93a386Sopenharmony_ci sk_sp<SkColorFilter> fCF0; 29cb93a386Sopenharmony_ci sk_sp<SkColorFilter> fCF1; 30cb93a386Sopenharmony_ci 31cb93a386Sopenharmony_ci float fWeight = 0; 32cb93a386Sopenharmony_ci float fDW = 0.02f; 33cb93a386Sopenharmony_ci 34cb93a386Sopenharmony_cipublic: 35cb93a386Sopenharmony_ci MixerView() {} 36cb93a386Sopenharmony_ci 37cb93a386Sopenharmony_ciprotected: 38cb93a386Sopenharmony_ci SkString name() override { return SkString("Mixer"); } 39cb93a386Sopenharmony_ci 40cb93a386Sopenharmony_ci void dodraw(SkCanvas* canvas, sk_sp<SkColorFilter> cf0, sk_sp<SkColorFilter> cf1, float gap) { 41cb93a386Sopenharmony_ci SkPaint paint; 42cb93a386Sopenharmony_ci paint.setColorFilter(cf0); 43cb93a386Sopenharmony_ci canvas->drawImage(fImg, 0, 0, SkSamplingOptions(), &paint); 44cb93a386Sopenharmony_ci 45cb93a386Sopenharmony_ci paint.setColorFilter(SkColorFilters::Lerp(fWeight, cf0, cf1)); 46cb93a386Sopenharmony_ci canvas->drawImage(fImg, fImg->width() + gap * fWeight, 0, 47cb93a386Sopenharmony_ci SkSamplingOptions(), &paint); 48cb93a386Sopenharmony_ci 49cb93a386Sopenharmony_ci paint.setColorFilter(cf1); 50cb93a386Sopenharmony_ci canvas->drawImage(fImg, 2*fImg->width() + gap, 0, SkSamplingOptions(), &paint); 51cb93a386Sopenharmony_ci } 52cb93a386Sopenharmony_ci 53cb93a386Sopenharmony_ci void onDrawContent(SkCanvas* canvas) override { 54cb93a386Sopenharmony_ci if (!fImg) { 55cb93a386Sopenharmony_ci fImg = GetResourceAsImage("images/mandrill_256.png"); 56cb93a386Sopenharmony_ci fCF0 = SkColorFilters::Matrix(gMat); 57cb93a386Sopenharmony_ci fCF1 = SkColorFilters::Blend(0xFF44CC88, SkBlendMode::kScreen); 58cb93a386Sopenharmony_ci } 59cb93a386Sopenharmony_ci 60cb93a386Sopenharmony_ci float gap = fImg->width() * 3; 61cb93a386Sopenharmony_ci 62cb93a386Sopenharmony_ci canvas->translate(10, 10); 63cb93a386Sopenharmony_ci dodraw(canvas, nullptr, fCF1, gap); 64cb93a386Sopenharmony_ci canvas->translate(0, fImg->height() + 10); 65cb93a386Sopenharmony_ci dodraw(canvas, fCF0, nullptr, gap); 66cb93a386Sopenharmony_ci canvas->translate(0, fImg->height() + 10); 67cb93a386Sopenharmony_ci dodraw(canvas, fCF0, fCF1, gap); 68cb93a386Sopenharmony_ci 69cb93a386Sopenharmony_ci fWeight += fDW; 70cb93a386Sopenharmony_ci if (fWeight > 1 || fWeight < 0) { 71cb93a386Sopenharmony_ci fDW = -fDW; 72cb93a386Sopenharmony_ci } 73cb93a386Sopenharmony_ci } 74cb93a386Sopenharmony_ci 75cb93a386Sopenharmony_ci Click* onFindClickHandler(SkScalar x, SkScalar y, skui::ModifierKey) override { 76cb93a386Sopenharmony_ci return fRect.contains(SkScalarRoundToInt(x), 77cb93a386Sopenharmony_ci SkScalarRoundToInt(y)) ? new Click() : nullptr; 78cb93a386Sopenharmony_ci } 79cb93a386Sopenharmony_ci 80cb93a386Sopenharmony_ci bool onClick(Click* click) override { 81cb93a386Sopenharmony_ci fRect.offset(click->fCurr.fX - click->fPrev.fX, 82cb93a386Sopenharmony_ci click->fCurr.fY - click->fPrev.fY); 83cb93a386Sopenharmony_ci return true; 84cb93a386Sopenharmony_ci } 85cb93a386Sopenharmony_ci 86cb93a386Sopenharmony_ciprivate: 87cb93a386Sopenharmony_ci SkIRect fRect; 88cb93a386Sopenharmony_ci 89cb93a386Sopenharmony_ci using INHERITED = Sample; 90cb93a386Sopenharmony_ci}; 91cb93a386Sopenharmony_ciDEF_SAMPLE( return new MixerView; ) 92