1cb93a386Sopenharmony_ci/* 2cb93a386Sopenharmony_ci * Copyright 2020 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/effects/SkImageFilters.h" 9cb93a386Sopenharmony_ci#include "modules/svg/include/SkSVGAttributeParser.h" 10cb93a386Sopenharmony_ci#include "modules/svg/include/SkSVGFeBlend.h" 11cb93a386Sopenharmony_ci#include "modules/svg/include/SkSVGFilterContext.h" 12cb93a386Sopenharmony_ci#include "modules/svg/include/SkSVGRenderContext.h" 13cb93a386Sopenharmony_ci#include "modules/svg/include/SkSVGValue.h" 14cb93a386Sopenharmony_ci 15cb93a386Sopenharmony_cibool SkSVGFeBlend::parseAndSetAttribute(const char* name, const char* value) { 16cb93a386Sopenharmony_ci return INHERITED::parseAndSetAttribute(name, value) || 17cb93a386Sopenharmony_ci this->setIn2(SkSVGAttributeParser::parse<SkSVGFeInputType>("in2", name, value)) || 18cb93a386Sopenharmony_ci this->setMode(SkSVGAttributeParser::parse<SkSVGFeBlend::Mode>("mode", name, value)); 19cb93a386Sopenharmony_ci} 20cb93a386Sopenharmony_ci 21cb93a386Sopenharmony_cistatic SkBlendMode GetBlendMode(SkSVGFeBlend::Mode mode) { 22cb93a386Sopenharmony_ci switch (mode) { 23cb93a386Sopenharmony_ci case SkSVGFeBlend::Mode::kNormal: 24cb93a386Sopenharmony_ci return SkBlendMode::kSrcOver; 25cb93a386Sopenharmony_ci case SkSVGFeBlend::Mode::kMultiply: 26cb93a386Sopenharmony_ci return SkBlendMode::kMultiply; 27cb93a386Sopenharmony_ci case SkSVGFeBlend::Mode::kScreen: 28cb93a386Sopenharmony_ci return SkBlendMode::kScreen; 29cb93a386Sopenharmony_ci case SkSVGFeBlend::Mode::kDarken: 30cb93a386Sopenharmony_ci return SkBlendMode::kDarken; 31cb93a386Sopenharmony_ci case SkSVGFeBlend::Mode::kLighten: 32cb93a386Sopenharmony_ci return SkBlendMode::kLighten; 33cb93a386Sopenharmony_ci } 34cb93a386Sopenharmony_ci 35cb93a386Sopenharmony_ci SkUNREACHABLE; 36cb93a386Sopenharmony_ci} 37cb93a386Sopenharmony_ci 38cb93a386Sopenharmony_cisk_sp<SkImageFilter> SkSVGFeBlend::onMakeImageFilter(const SkSVGRenderContext& ctx, 39cb93a386Sopenharmony_ci const SkSVGFilterContext& fctx) const { 40cb93a386Sopenharmony_ci const SkRect cropRect = this->resolveFilterSubregion(ctx, fctx); 41cb93a386Sopenharmony_ci const SkBlendMode blendMode = GetBlendMode(this->getMode()); 42cb93a386Sopenharmony_ci const SkSVGColorspace colorspace = this->resolveColorspace(ctx, fctx); 43cb93a386Sopenharmony_ci const sk_sp<SkImageFilter> background = fctx.resolveInput(ctx, fIn2, colorspace); 44cb93a386Sopenharmony_ci const sk_sp<SkImageFilter> foreground = fctx.resolveInput(ctx, this->getIn(), colorspace); 45cb93a386Sopenharmony_ci return SkImageFilters::Blend(blendMode, background, foreground, cropRect); 46cb93a386Sopenharmony_ci} 47cb93a386Sopenharmony_ci 48cb93a386Sopenharmony_citemplate <> 49cb93a386Sopenharmony_cibool SkSVGAttributeParser::parse<SkSVGFeBlend::Mode>( 50cb93a386Sopenharmony_ci SkSVGFeBlend::Mode* mode) { 51cb93a386Sopenharmony_ci static constexpr std::tuple<const char*, SkSVGFeBlend::Mode> gMap[] = { 52cb93a386Sopenharmony_ci { "normal" , SkSVGFeBlend::Mode::kNormal }, 53cb93a386Sopenharmony_ci { "multiply", SkSVGFeBlend::Mode::kMultiply }, 54cb93a386Sopenharmony_ci { "screen" , SkSVGFeBlend::Mode::kScreen }, 55cb93a386Sopenharmony_ci { "darken" , SkSVGFeBlend::Mode::kDarken }, 56cb93a386Sopenharmony_ci { "lighten" , SkSVGFeBlend::Mode::kLighten }, 57cb93a386Sopenharmony_ci }; 58cb93a386Sopenharmony_ci 59cb93a386Sopenharmony_ci return this->parseEnumMap(gMap, mode) && this->parseEOSToken(); 60cb93a386Sopenharmony_ci} 61