8#ifndef SkImageFilterTypes_DEFINED
9#define SkImageFilterTypes_DEFINED
113 explicit operator const T&()
const {
return fData; }
132 explicit operator const T&()
const {
return fData; }
159 explicit operator const IVector&()
const {
return fData; }
163 int32_t
x()
const {
return fData.fX; }
164 int32_t
y()
const {
return fData.fY; }
180 fData.fX += v.fData.fX;
181 fData.fY += v.fData.fY;
184 fData.fX -= v.fData.fX;
185 fData.fY -= v.fData.fY;
199 explicit operator const Vector&()
const {
return fData; }
232 fData.fX += v.fData.fX;
233 fData.fY += v.fData.fY;
236 fData.fX -= v.fData.fX;
237 fData.fY -= v.fData.fY;
255 explicit operator const SkIPoint&()
const {
return fData; }
258 int32_t
x()
const {
return fData.fX; }
259 int32_t
y()
const {
return fData.fY; }
294 explicit operator const SkPoint&()
const {
return fData; }
335 explicit operator const SkISize&()
const {
return fData; }
337 int32_t
width()
const {
return fData.width(); }
338 int32_t
height()
const {
return fData.height(); }
340 bool isEmpty()
const {
return fData.isEmpty(); }
353 explicit operator const SkSize&()
const {
return fData; }
358 bool isEmpty()
const {
return fData.isEmpty(); }
359 bool isZero()
const {
return fData.isZero(); }
377 explicit operator const SkIRect&()
const {
return fData; }
381 static constexpr std::optional<LayerSpace<SkIRect>>
Unbounded() {
return {}; }
386 template<
typename BoundsFn>
388 if (boundsCount <= 0) {
392 for (
int i = 1; i < boundsCount; ++i) {
393 output.join(boundsFn(i));
403 bool isEmpty()
const {
return fData.isEmpty64(); }
406 int32_t
left()
const {
return fData.fLeft; }
407 int32_t
top()
const {
return fData.fTop; }
408 int32_t
right()
const {
return fData.fRight; }
409 int32_t
bottom()
const {
return fData.fBottom; }
411 int32_t
width()
const {
return fData.width(); }
412 int32_t
height()
const {
return fData.height(); }
439 explicit operator const SkRect&()
const {
return fData; }
444 bool isEmpty()
const {
return fData.isEmpty(); }
477 SkTPin(pt.y(), fData.fTop, fData.fBottom)));
495 explicit operator const SkMatrix&()
const {
return fData; }
526 return fData.invert(&inverse->fData);
534 float rc(
int row,
int col)
const {
return fData.rc(row, col); }
535 float get(
int i)
const {
return fData.get(i); }
570 : fLayerToDevMatrix(layerToDev)
572 , fDevToLayerMatrix(devToLayer) {}
613 return LayerSpace<T>(map(
static_cast<const T&
>(paramGeometry), fParamToLayerMatrix));
618 return LayerSpace<T>(map(
static_cast<const T&
>(devGeometry), fDevToLayerMatrix));
623 return DeviceSpace<T>(map(
static_cast<const T&
>(layerGeometry), fLayerToDevMatrix));
643 static T map(
const T& geom,
const SkMatrix& matrix);
734 explicit operator bool()
const {
return SkToBool(fImage); }
815 friend class ::FilterResultTestAccess;
819 enum class PixelBoundary :
int {
827 PixelBoundary boundary)
829 , fBoundary(boundary)
832 , fTransform(
SkMatrix::Translate(origin.
x(), origin.
y()))
833 , fColorFilter(nullptr)
843 bool preserveDstBounds=
false)
const;
848 FilterResult subset(
const LayerSpace<SkIPoint>& knownOrigin,
849 const LayerSpace<SkIRect>& subsetBounds,
850 bool clampSrcIfDisjoint=
false)
const;
854 enum class BoundsAnalysis :
int {
860 kDstBoundsNotCovered = 1 << 0,
864 kHasLayerFillingEffect = 1 << 1,
868 kRequiresLayerCrop = 1 << 2,
873 kRequiresShaderTiling = 1 << 3,
876 kRequiresDecalInLayerSpace = 1 << 4,
880 enum class BoundsScope :
int {
893 BoundsScope scope = BoundsScope::kDeferred)
const;
895 BoundsScope scope = BoundsScope::kDeferred)
const {
904 fBoundary == PixelBoundary::kTransparent &&
905 !(analysis & BoundsAnalysis::kRequiresDecalInLayerSpace);
918 const LayerSpace<SkSize>&
scale,
919 bool enforceDecal)
const;
934 bool preserveDeviceState,
939 void drawAnalyzedImage(
const Context& ctx,
954 const LayerSpace<SkIRect>& sampleBounds)
const;
972 PixelBoundary fBoundary;
978 LayerSpace<SkMatrix> fTransform;
987 LayerSpace<SkIRect> fLayerBounds;
1016 fInputs.push_back({input, sampleBounds, inputFlags, inputSampling});
1021 FilterResult
merge();
1027 FilterResult blur(
const LayerSpace<SkSize>& sigma);
1048 template <
typename ShaderFn>
1051 bool evaluateInParameterSpace=
false) {
1052 auto outputBounds = this->outputBounds(explicitOutput);
1053 if (outputBounds.isEmpty()) {
1057 auto inputShaders = this->createInputShaders(outputBounds, evaluateInParameterSpace);
1058 return this->drawShader(shaderFn(inputShaders), outputBounds, evaluateInParameterSpace);
1062 struct SampledFilterResult {
1063 FilterResult fImage;
1064 std::optional<LayerSpace<SkIRect>> fSampleBounds;
1070 bool evaluateInParameterSpace);
1072 LayerSpace<SkIRect> outputBounds(std::optional<LayerSpace<SkIRect>> explicitOutput)
const;
1075 const LayerSpace<SkIRect>& outputBounds,
1076 bool evaluateInParameterSpace)
const;
1241 friend class ::FilterResultTestAccess;
static void round(SkPoint *p)
static void merge(const uint8_t *SK_RESTRICT row, int rowN, const SkAlpha *SK_RESTRICT srcAA, const int16_t *SK_RESTRICT srcRuns, SkAlpha *SK_RESTRICT dstAA, int16_t *SK_RESTRICT dstRuns, int width)
#define SkAssertResult(cond)
#define SK_DECL_BITMASK_OPS_FRIENDS(E)
#define SK_MAKE_BITMASK_OPS(E)
static bool SkIsFinite(T x, Pack... values)
static SkColorType colorType(AImageDecoder *decoder, const AImageDecoderHeaderInfo *headerInfo)
static std::unique_ptr< SkEncoder > Make(SkWStream *dst, const SkPixmap *src, const SkYUVAPixmaps *srcYUVA, const SkColorSpace *srcYUVAColorSpace, const SkJpegEncoder::Options &options)
sk_sp< T > sk_ref_sp(T *obj)
static constexpr const T & SkTPin(const T &x, const T &lo, const T &hi)
static constexpr bool SkToBool(const T &x)
Type::kYUV Type::kRGBA() int(0.7 *637)
static SkMatrix RectToRect(const SkRect &src, const SkRect &dst, ScaleToFit mode=kFill_ScaleToFit)
static SkMatrix Translate(SkScalar dx, SkScalar dy)
static SkMatrix Concat(const SkMatrix &a, const SkMatrix &b)
static const SkMatrix & I()
SkMatrix & preConcat(const SkMatrix &other)
const SkSurfaceProps & surfaceProps() const
virtual const SkBlurEngine * getBlurEngine() const =0
SkImageFilterCache * cache() const
SkColorType colorType() const
virtual sk_sp< SkSpecialImage > makeImage(const SkIRect &subset, sk_sp< SkImage > image) const =0
virtual sk_sp< SkImage > getCachedBitmap(const SkBitmap &data) const =0
virtual sk_sp< SkDevice > makeDevice(SkISize size, sk_sp< SkColorSpace >, const SkSurfaceProps *props=nullptr) const =0
Context withNewColorSpace(SkColorSpace *cs) const
void markCacheHit() const
const Backend * backend() const
void markNewSurface() const
void markShaderBasedTilingRequired(SkTileMode tileMode) const
SkColorSpace * colorSpace() const
sk_sp< SkColorSpace > refColorSpace() const
const LayerSpace< SkIRect > & desiredOutput() const
const FilterResult & source() const
Context withNewDesiredOutput(const LayerSpace< SkIRect > &desiredOutput) const
Context(sk_sp< Backend > backend, const Mapping &mapping, const LayerSpace< SkIRect > &desiredOutput, const FilterResult &source, const SkColorSpace *colorSpace, Stats *stats)
const Mapping & mapping() const
Context withNewMapping(const Mapping &mapping) const
Context withNewSource(const FilterResult &source) const
void markVisitedImageFilter() const
DeviceSpace(const T &data)
Builder & add(const FilterResult &input, std::optional< LayerSpace< SkIRect > > sampleBounds={}, SkEnumBitMask< ShaderFlags > inputFlags=ShaderFlags::kNone, const SkSamplingOptions &inputSampling=kDefaultSampling)
FilterResult eval(ShaderFn shaderFn, std::optional< LayerSpace< SkIRect > > explicitOutput={}, bool evaluateInParameterSpace=false)
FilterResult applyColorFilter(const Context &ctx, sk_sp< SkColorFilter > colorFilter) const
FilterResult applyCrop(const Context &ctx, const LayerSpace< SkIRect > &crop, SkTileMode tileMode=SkTileMode::kDecal) const
FilterResult insetForSaveLayer() const
static FilterResult MakeFromPicture(const Context &ctx, sk_sp< SkPicture > pic, ParameterSpace< SkRect > cullRect)
FilterResult(sk_sp< SkSpecialImage > image)
void draw(const Context &ctx, SkDevice *target, const SkBlender *blender) const
sk_sp< SkSpecialImage > imageAndOffset(const Context &ctx, SkIPoint *offset) const
static FilterResult MakeFromImage(const Context &ctx, sk_sp< SkImage > image, SkRect srcRect, ParameterSpace< SkRect > dstRect, const SkSamplingOptions &sampling)
const SkSpecialImage * image() const
FilterResult(sk_sp< SkSpecialImage > image, const LayerSpace< SkIPoint > &origin)
const SkColorFilter * colorFilter() const
SkSamplingOptions sampling() const
sk_sp< SkSpecialImage > refImage() const
LayerSpace< SkIRect > layerBounds() const
static constexpr SkSamplingOptions kDefaultSampling
SkTileMode tileMode() const
static FilterResult MakeFromShader(const Context &ctx, sk_sp< SkShader > shader, bool dither)
FilterResult applyTransform(const Context &ctx, const LayerSpace< SkMatrix > &transform, const SkSamplingOptions &sampling) const
void operator+=(const LayerSpace< IVector > &v)
LayerSpace(IVector &&geometry)
LayerSpace< IVector > operator-() const
LayerSpace< IVector > operator-(const LayerSpace< IVector > &v) const
LayerSpace(const IVector &geometry)
void operator-=(const LayerSpace< IVector > &v)
LayerSpace< IVector > operator+(const LayerSpace< IVector > &v) const
LayerSpace(SkIPoint &&geometry)
LayerSpace(const SkIPoint &geometry)
void operator+=(const LayerSpace< IVector > &v)
LayerSpace< IVector > operator-(const LayerSpace< SkIPoint > &p)
LayerSpace< SkIPoint > operator-(const LayerSpace< IVector > &v)
LayerSpace< SkIPoint > operator+(const LayerSpace< IVector > &v)
void operator-=(const LayerSpace< IVector > &v)
LayerSpace< IVector > operator-() const
LayerSpace(const SkISize &size)
LayerSpace< SkIPoint > topLeft() const
static LayerSpace< SkIRect > Union(int boundsCount, BoundsFn boundsFn)
static constexpr std::optional< LayerSpace< SkIRect > > Unbounded()
void outset(const LayerSpace< SkISize > &delta)
bool intersect(const LayerSpace< SkIRect > &r)
static LayerSpace< SkIRect > Empty()
void inset(const LayerSpace< SkISize > &delta)
bool contains(const LayerSpace< SkIRect > &r) const
LayerSpace< SkISize > size() const
LayerSpace(const SkIRect &geometry)
LayerSpace(SkIRect &&geometry)
void join(const LayerSpace< SkIRect > &r)
void offset(const LayerSpace< IVector > &v)
static bool Intersects(const LayerSpace< SkIRect > &a, const LayerSpace< SkIRect > &b)
LayerSpace(const SkISize &geometry)
LayerSpace(SkISize &&geometry)
LayerSpace< SkMatrix > & preConcat(const LayerSpace< SkMatrix > &m)
LayerSpace< SkMatrix > & postConcat(const LayerSpace< SkMatrix > &m)
float rc(int row, int col) const
bool invert(LayerSpace< SkMatrix > *inverse) const
LayerSpace(const SkMatrix &m)
static LayerSpace< SkMatrix > RectToRect(const LayerSpace< SkRect > &from, const LayerSpace< SkRect > &to)
LayerSpace< Vector > operator-() const
SkScalar distanceToOrigin() const
void operator+=(const LayerSpace< Vector > &v)
LayerSpace(const SkPoint &geometry)
LayerSpace< SkPoint > operator-(const LayerSpace< Vector > &v)
LayerSpace(SkPoint &&geometry)
LayerSpace< SkPoint > operator+(const LayerSpace< Vector > &v)
void operator-=(const LayerSpace< Vector > &v)
LayerSpace< Vector > operator-(const LayerSpace< SkPoint > &p)
LayerSpace< SkIRect > roundOut() const
LayerSpace< SkSize > size() const
void outset(const LayerSpace< SkSize > &delta)
LayerSpace(const LayerSpace< SkIRect > &rect)
bool contains(const LayerSpace< SkRect > &r) const
LayerSpace< SkPoint > center() const
LayerSpace< SkPoint > topLeft() const
LayerSpace< SkIRect > roundIn() const
LayerSpace(SkRect &&geometry)
LayerSpace(const SkRect &geometry)
void join(const LayerSpace< SkRect > &r)
static LayerSpace< SkRect > Empty()
LayerSpace< SkPoint > clamp(LayerSpace< SkPoint > pt) const
void offset(const LayerSpace< Vector > &v)
void inset(const LayerSpace< SkSize > &delta)
LayerSpace< SkIRect > round() const
bool intersect(const LayerSpace< SkRect > &r)
LayerSpace(SkSize &&geometry)
LayerSpace(const SkSize &geometry)
LayerSpace(const Vector &geometry)
LayerSpace< Vector > operator+(const LayerSpace< Vector > &v) const
LayerSpace< Vector > operator*(SkScalar s) const
void operator-=(const LayerSpace< Vector > &v)
void operator+=(const LayerSpace< Vector > &v)
LayerSpace< Vector > operator-(const LayerSpace< Vector > &v) const
friend LayerSpace< Vector > operator*(SkScalar s, const LayerSpace< Vector > &b)
LayerSpace(Vector &&geometry)
LayerSpace< Vector > operator-() const
void operator*=(SkScalar s)
void applyOrigin(const LayerSpace< SkIPoint > &origin)
LayerSpace< T > deviceToLayer(const DeviceSpace< T > &devGeometry) const
Mapping(const SkMatrix &layerToDev, const SkMatrix &devToLayer, const SkMatrix ¶mToLayer)
const SkMatrix & deviceToLayer() const
SkMatrix totalMatrix() const
const SkMatrix & layerToDevice() const
bool decomposeCTM(const SkMatrix &ctm, const SkImageFilter *filter, const skif::ParameterSpace< SkPoint > &representativePt)
const SkMatrix & layerMatrix() const
void concatLocal(const SkMatrix &local)
Mapping(const SkMatrix ¶mToLayer)
LayerSpace< T > paramToLayer(const ParameterSpace< T > ¶mGeometry) const
bool adjustLayerSpace(const SkMatrix &layer)
ParameterSpace(const T &data)
FlutterSemanticsFlag flags
SkIRect RoundOut(SkRect r)
sk_sp< Backend > MakeRasterBackend(const SkSurfaceProps &surfaceProps, SkColorType colorType)
SkIRect RoundIn(SkRect r)
static SkColor4f transform(SkColor4f c, SkColorSpace *src, SkColorSpace *dst)
static constexpr SkIPoint Make(int32_t x, int32_t y)
static bool Intersects(const SkIRect &a, const SkIRect &b)
static constexpr SkIRect MakeEmpty()
static constexpr SkPoint Make(float x, float y)
static float Length(float x, float y)
static constexpr SkRect MakeEmpty()
static constexpr SkSize Make(SkScalar w, SkScalar h)
IVector(int32_t x, int32_t y)
IVector(const SkIVector &v)
int fNumShaderClampedDraws
int fNumShaderBasedTilingDraws
int fNumOffscreenSurfaces
int fNumVisitedImageFilters
Vector(const SkVector &v)
Vector(SkScalar x, SkScalar y)