diff options
Diffstat (limited to 'libs/hwui/effects/StretchEffect.h')
-rw-r--r-- | libs/hwui/effects/StretchEffect.h | 38 |
1 files changed, 32 insertions, 6 deletions
diff --git a/libs/hwui/effects/StretchEffect.h b/libs/hwui/effects/StretchEffect.h index 7dfd6398765a..d2da06b31f68 100644 --- a/libs/hwui/effects/StretchEffect.h +++ b/libs/hwui/effects/StretchEffect.h @@ -18,9 +18,11 @@ #include "utils/MathUtils.h" +#include <SkImage.h> +#include <SkImageFilter.h> #include <SkPoint.h> #include <SkRect.h> -#include <SkImageFilter.h> +#include <SkRuntimeEffect.h> namespace android::uirenderer { @@ -31,15 +33,27 @@ public: SmoothStep, }; + StretchEffect(const SkRect& area, const SkVector& direction, float maxStretchAmount) + : stretchArea(area), maxStretchAmount(maxStretchAmount), mStretchDirection(direction) {} + + StretchEffect() {} + bool isEmpty() const { - return MathUtils::isZero(stretchDirection.x()) - && MathUtils::isZero(stretchDirection.y()); + return MathUtils::isZero(mStretchDirection.x()) && MathUtils::isZero(mStretchDirection.y()); } void setEmpty() { *this = StretchEffect{}; } + StretchEffect& operator=(const StretchEffect& other) { + this->stretchArea = other.stretchArea; + this->mStretchDirection = other.mStretchDirection; + this->mStretchFilter = nullptr; + this->maxStretchAmount = other.maxStretchAmount; + return *this; + } + void mergeWith(const StretchEffect& other) { if (other.isEmpty()) { return; @@ -48,7 +62,7 @@ public: *this = other; return; } - stretchDirection += other.stretchDirection; + setStretchDirection(mStretchDirection + other.mStretchDirection); if (isEmpty()) { return setEmpty(); } @@ -56,11 +70,23 @@ public: maxStretchAmount = std::max(maxStretchAmount, other.maxStretchAmount); } - sk_sp<SkImageFilter> getImageFilter() const; + sk_sp<SkImageFilter> getImageFilter(const sk_sp<SkImage>& snapshotImage) const; SkRect stretchArea {0, 0, 0, 0}; - SkVector stretchDirection {0, 0}; float maxStretchAmount = 0; + + void setStretchDirection(const SkVector& direction) { + mStretchFilter = nullptr; + mStretchDirection = direction; + } + + const SkVector getStretchDirection() const { return mStretchDirection; } + +private: + static sk_sp<SkRuntimeEffect> getStretchEffect(); + mutable SkVector mStretchDirection{0, 0}; + mutable std::unique_ptr<SkRuntimeShaderBuilder> mBuilder; + mutable sk_sp<SkImageFilter> mStretchFilter; }; } // namespace android::uirenderer |