You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
43 lines
1.8 KiB
43 lines
1.8 KiB
/*
|
|
* Copyright 2021 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/SkSVGFeImage.h"
|
|
#include "modules/svg/include/SkSVGFilterContext.h"
|
|
#include "modules/svg/include/SkSVGImage.h"
|
|
#include "modules/svg/include/SkSVGRenderContext.h"
|
|
#include "modules/svg/include/SkSVGValue.h"
|
|
|
|
bool SkSVGFeImage::parseAndSetAttribute(const char* n, const char* v) {
|
|
return INHERITED::parseAndSetAttribute(n, v) ||
|
|
this->setHref(SkSVGAttributeParser::parse<SkSVGIRI>("xlink:href", n, v)) ||
|
|
this->setPreserveAspectRatio(SkSVGAttributeParser::parse<SkSVGPreserveAspectRatio>(
|
|
"preserveAspectRatio", n, v));
|
|
}
|
|
|
|
sk_sp<SkImageFilter> SkSVGFeImage::onMakeImageFilter(const SkSVGRenderContext& ctx,
|
|
const SkSVGFilterContext& fctx) const {
|
|
// Load image and map viewbox (image bounds) to viewport (filter effects subregion).
|
|
const SkRect viewport = this->resolveFilterSubregion(ctx, fctx);
|
|
const auto imgInfo =
|
|
SkSVGImage::LoadImage(ctx.resourceProvider(), fHref, viewport, fPreserveAspectRatio);
|
|
if (!imgInfo.fImage) {
|
|
return nullptr;
|
|
}
|
|
|
|
// Create the image filter mapped according to aspect ratio
|
|
const SkRect srcRect = SkRect::Make(imgInfo.fImage->bounds());
|
|
const SkRect& dstRect = imgInfo.fDst;
|
|
// TODO: image-rendering property
|
|
const SkFilterQuality fq = SkFilterQuality::kMedium_SkFilterQuality;
|
|
auto imgfilt = SkImageFilters::Image(imgInfo.fImage, srcRect, dstRect, SkSamplingOptions(fq));
|
|
|
|
// Aspect ratio mapping may end up drawing content outside of the filter effects region,
|
|
// so perform an explicit crop.
|
|
return SkImageFilters::Merge(&imgfilt, 1, fctx.filterEffectsRegion());
|
|
}
|