blob: ea9683bcb31792d236fd105d62fba0d6aa31ce63 [file] [log] [blame]
/*
* Copyright 2020 Google Inc.
*
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/
#include "include/effects/SkImageFilters.h"
#include "modules/svg/include/SkSVGFilterContext.h"
#include "modules/svg/include/SkSVGNode.h"
#include "modules/svg/include/SkSVGRenderContext.h"
#include "modules/svg/include/SkSVGTypes.h"
sk_sp<SkImageFilter> SkSVGFilterContext::findResultById(const SkSVGStringType& id) const {
const sk_sp<SkImageFilter>* res = fResults.find(id);
return res ? *res : nullptr;
}
void SkSVGFilterContext::registerResult(const SkSVGStringType& id,
const sk_sp<SkImageFilter>& result) {
SkASSERT(!id.isEmpty());
fResults[id] = result;
}
sk_sp<SkImageFilter> SkSVGFilterContext::resolveInput(const SkSVGRenderContext& ctx,
const SkSVGFeInputType& inputType) const {
switch (inputType.type()) {
case SkSVGFeInputType::Type::kSourceGraphic:
return nullptr;
case SkSVGFeInputType::Type::kFillPaint:
return SkImageFilters::Paint(*ctx.fillPaint());
case SkSVGFeInputType::Type::kStrokePaint: {
// The paint filter doesn't handle stroke paints properly, so convert to fill for
// simplicity.
// TODO: Paint filter is deprecated, but the replacement (SkShaders::*())
// requires some extra work to handle all paint features (gradients, etc).
SkPaint p = *ctx.strokePaint();
p.setStyle(SkPaint::kFill_Style);
return SkImageFilters::Paint(p);
}
case SkSVGFeInputType::Type::kFilterPrimitiveReference:
return findResultById(inputType.id());
default:
SkDebugf("unhandled filter input type %d\n", inputType.type());
return nullptr;
}
}