sk_sp<SkImageFilter> FEImage::createImageFilter() { if (auto* layoutObject = referencedLayoutObject()) return createImageFilterForLayoutObject(*layoutObject); sk_sp<SkImage> image = m_image ? toSkSp(m_image->imageForCurrentFrame()) : nullptr; if (!image) { // "A href reference that is an empty image (zero width or zero height), that fails // to download, is non-existent, or that cannot be displayed (e.g. because it is // not in a supported image format) fills the filter primitive subregion with // transparent black." return createTransparentBlack(); } FloatRect srcRect = FloatRect(FloatPoint(), FloatSize(m_image->size())); FloatRect dstRect = filterPrimitiveSubregion(); m_preserveAspectRatio->transformRect(dstRect, srcRect); return SkImageSource::Make(std::move(image), srcRect, dstRect, kHigh_SkFilterQuality); }
PassRefPtr<SkImageFilter> FEImage::createImageFilter(SkiaImageFilterBuilder* builder) { if (auto* layoutObject = referencedLayoutObject()) return createImageFilterForLayoutObject(*layoutObject, builder); FloatRect dstRect = filterPrimitiveSubregion(); RefPtr<SkImage> image = m_image ? m_image->imageForCurrentFrame() : nullptr; if (!image) { // "A href reference that is an empty image (zero width or zero height), that fails // to download, is non-existent, or that cannot be displayed (e.g. because it is // not in a supported image format) fills the filter primitive subregion with // transparent black." return adoptRef(SkPictureImageFilter::Create(nullptr, dstRect)); } FloatRect srcRect = FloatRect(FloatPoint(), m_image->size()); m_preserveAspectRatio->transformRect(dstRect, srcRect); return adoptRef(SkImageSource::Create(image.get(), srcRect, dstRect, kHigh_SkFilterQuality)); }