69 std::optional<skif::LayerSpace<SkIRect>>
content;
92 combinedBounds.
join(src);
95 return combinedBounds;
124 (*filterPtr)->unref();
139 static std::atomic<int32_t> nextID{1};
143 id = nextID.fetch_add(1, std::memory_order_relaxed);
150 std::optional<bool> usesSrc)
151 : fUsesSrcInput(usesSrc.has_value() ? *usesSrc : false)
153 fInputs.
reset(inputCount);
155 for (
int i = 0; i < inputCount; ++i) {
156 if (!usesSrc.has_value() && (!inputs[i] ||
as_IFB(inputs[i])->
usesSource())) {
157 fUsesSrcInput =
true;
159 fInputs[i] = inputs[i];
167std::pair<sk_sp<SkImageFilter>, std::optional<SkRect>>
171 return {
nullptr, std::nullopt};
182 if (!
buffer.validate(expectedCount < 0 ||
count == expectedCount)) {
186#if defined(SK_BUILD_FOR_FUZZER)
193 for (
int i = 0; i <
count; i++) {
201 static constexpr uint32_t kHasAll_CropEdge = 0x0F;
213 if (
flags == kHasAll_CropEdge) {
222 for (
int i = 0; i < fInputs.
count(); i++) {
224 buffer.writeBool(input !=
nullptr);
225 if (input !=
nullptr) {
226 buffer.writeFlattenable(input);
243 const bool srcInKey = fUsesSrcInput && context.
source();
250 srcGenID, srcSubset);
271 if (!outSubset || !
offset || !src->bounds().contains(subset)) {
275 auto srcSpecialImage =
backend->makeImage(subset, src);
276 if (!srcSpecialImage) {
286 src->imageInfo().colorSpace(),
298 *outSubset =
result->subset();
311 std::optional<skif::LayerSpace<SkIRect>> contentBounds;
312 if (knownContentBounds) {
313 contentBounds = mapping.
paramToLayer(*knownContentBounds).roundOut();
326 std::optional<skif::LayerSpace<SkIRect>> filterOutput =
340 for (
int i = 0; i <
count; ++i) {
363 if (contentBounds && !visibleContent.intersect(*contentBounds)) {
367 return visibleContent;
388void SkImageFilter_Base::PurgeCache() {
static SkColorFilterBase * as_CFB(SkColorFilter *filter)
static int32_t next_image_filter_unique_id()
static SkImageFilter_Base * as_IFB(SkImageFilter *filter)
static constexpr uint32_t SK_InvalidUniqueID
static bool SkIsValidRect(const SkRect &rect)
bool affectsTransparentBlack() const
virtual bool get(const SkImageFilterCacheKey &key, skif::FilterResult *result) const =0
virtual void set(const SkImageFilterCacheKey &key, const SkImageFilter *filter, const skif::FilterResult &result)=0
static sk_sp< SkImageFilterCache > Get(CreateIfNecessary=CreateIfNecessary::kYes)
virtual void purgeByImageFilter(const SkImageFilter *)=0
bool unflatten(SkReadBuffer &, int expectedInputs)
virtual bool onIsColorFilterNode(SkColorFilter **) const
~SkImageFilter_Base() override
virtual skif::LayerSpace< SkIRect > onGetInputLayerBounds(const skif::Mapping &mapping, const skif::LayerSpace< SkIRect > &desiredOutput, std::optional< skif::LayerSpace< SkIRect > > contentBounds) const =0
std::optional< skif::DeviceSpace< SkIRect > > getOutputBounds(const skif::Mapping &mapping, const skif::ParameterSpace< SkRect > &contentBounds) const
virtual bool onAffectsTransparentBlack() const
skif::LayerSpace< SkIRect > getChildInputLayerBounds(int index, const skif::Mapping &mapping, const skif::LayerSpace< SkIRect > &desiredOutput, std::optional< skif::LayerSpace< SkIRect > > contentBounds) const
void flatten(SkWriteBuffer &) const override
virtual bool ignoreInputsAffectsTransparentBlack() const
virtual std::optional< skif::LayerSpace< SkIRect > > onGetOutputLayerBounds(const skif::Mapping &mapping, std::optional< skif::LayerSpace< SkIRect > > contentBounds) const =0
virtual skif::FilterResult onFilterImage(const skif::Context &context) const =0
skif::LayerSpace< SkIRect > getInputBounds(const skif::Mapping &mapping, const skif::DeviceSpace< SkIRect > &desiredOutput, std::optional< skif::ParameterSpace< SkRect > > knownContentBounds) const
skif::FilterResult getChildOutput(int index, const skif::Context &ctx) const
sk_sp< SkImage > makeImageWithFilter(sk_sp< skif::Backend > backend, sk_sp< SkImage > src, const SkIRect &subset, const SkIRect &clipBounds, SkIRect *outSubset, SkIPoint *offset) const
skif::FilterResult filterImage(const skif::Context &context) const
bool affectsTransparentBlack() const
std::optional< skif::LayerSpace< SkIRect > > getChildOutputLayerBounds(int index, const skif::Mapping &mapping, std::optional< skif::LayerSpace< SkIRect > > contentBounds) const
MatrixCapability getCTMCapability() const
static std::pair< sk_sp< SkImageFilter >, std::optional< SkRect > > Unflatten(SkReadBuffer &buffer)
virtual MatrixCapability onGetCTMCapability() const
friend class SkImageFilter_Base
sk_sp< SkImageFilter > refMe() const
SkIRect filterBounds(const SkIRect &src, const SkMatrix &ctm, MapDirection, const SkIRect *inputRect=nullptr) const
bool asAColorFilter(SkColorFilter **filterPtr) const
bool isColorFilterNode(SkColorFilter **filterPtr) const
virtual SkRect computeFastBounds(const SkRect &bounds) const
const SkImageFilter * getInput(int i) const
bool canComputeFastBounds() const
sk_sp< SkImageFilter > makeWithLocalMatrix(const SkMatrix &matrix) const
static sk_sp< SkImageFilter > Make(const SkMatrix &localMatrix, sk_sp< SkImageFilter > input)
static const SkMatrix & I()
@ kRemoveDeprecatedCropRect
static SkIRect MakeILarge()
uint32_t uniqueID() const
const SkIRect & subset() const
SkImageFilterCache * cache() const
void markCacheHit() const
const Backend * backend() const
const LayerSpace< SkIRect > & desiredOutput() const
const FilterResult & source() const
const Mapping & mapping() const
void markVisitedImageFilter() const
sk_sp< SkSpecialImage > imageAndOffset(const Context &ctx, SkIPoint *offset) const
const SkSpecialImage * image() const
const SkMatrix & deviceToLayer() const
const SkMatrix & layerToDevice() const
const SkMatrix & layerMatrix() const
LayerSpace< T > paramToLayer(const ParameterSpace< T > ¶mGeometry) const
FlutterSemanticsFlag flags
static const uint8_t buffer[]
union flutter::testing::@2838::KeyboardChange::@76 content
static constexpr SkIRect MakeWH(int32_t w, int32_t h)
constexpr SkIPoint topLeft() const
static constexpr SkIRect MakeXYWH(int32_t x, int32_t y, int32_t w, int32_t h)
bool contains(int32_t x, int32_t y) const
void join(const SkRect &r)