diff options
Diffstat (limited to 'src/utils/SkShadowTessellator.h')
-rwxr-xr-x | src/utils/SkShadowTessellator.h | 154 |
1 files changed, 45 insertions, 109 deletions
diff --git a/src/utils/SkShadowTessellator.h b/src/utils/SkShadowTessellator.h index ababba74dd..301b684267 100755 --- a/src/utils/SkShadowTessellator.h +++ b/src/utils/SkShadowTessellator.h @@ -9,6 +9,7 @@ #define SkShadowTessellator_DEFINED #include "SkTDArray.h" +#include "SkRefCnt.h" #include "SkPoint.h" #include "SkColor.h" @@ -16,118 +17,53 @@ class SkMatrix; class SkPath; -// TODO: derive these two classes from a base class containing common elements - -/** - * This class generates an ambient shadow for a path by walking the path, outsetting by the - * radius, and setting inner and outer colors to umbraColor and penumbraColor, respectively. - * If transparent is true, then the center of the ambient shadow will be filled in. - */ -class SkAmbientShadowTessellator { -public: - SkAmbientShadowTessellator(const SkPath& path, SkScalar radius, SkColor umbraColor, - SkColor penumbraColor, bool transparent); - - int vertexCount() { return fPositions.count(); } - SkPoint* positions() { return fPositions.begin(); } - SkColor* colors() { return fColors.begin(); } - int indexCount() { return fIndices.count(); } - uint16_t* indices() { return fIndices.begin(); } - -private: - void handleLine(const SkPoint& p); - - void handleQuad(const SkPoint pts[3]); - - void handleCubic(SkPoint pts[4]); - - void handleConic(SkPoint pts[3], SkScalar w); - - void addArc(const SkVector& nextNormal); - void finishArcAndAddEdge(const SkVector& nextPoint, const SkVector& nextNormal); - void addEdge(const SkVector& nextPoint, const SkVector& nextNormal); - - SkScalar fRadius; - SkColor fUmbraColor; - SkColor fPenumbraColor; - bool fTransparent; - - SkTDArray<SkPoint> fPositions; - SkTDArray<SkColor> fColors; - SkTDArray<uint16_t> fIndices; - - int fPrevInnerIndex; - SkVector fPrevNormal; - int fFirstVertex; - SkVector fFirstNormal; - SkScalar fDirection; - int fCentroidCount; - - // first three points - SkTDArray<SkPoint> fInitPoints; - // temporary buffer - SkTDArray<SkPoint> fPointBuffer; -}; - -/** - * This class generates an spot shadow for a path by walking the transformed path, further - * transforming by the scale and translation, and outsetting and insetting by a radius. - * The center will be clipped against the original path unless transparent is true. - */ -class SkSpotShadowTessellator { +class SkShadowVertices : public SkRefCnt { public: - SkSpotShadowTessellator(const SkPath& path, SkScalar scale, const SkVector& translate, - SkScalar radius, SkColor umbraColor, SkColor penumbraColor, - bool transparent); - - int vertexCount() { return fPositions.count(); } - SkPoint* positions() { return fPositions.begin(); } - SkColor* colors() { return fColors.begin(); } - int indexCount() { return fIndices.count(); } - uint16_t* indices() { return fIndices.begin(); } + /** + * This function generates an ambient shadow mesh for a path by walking the path, outsetting by + * the radius, and setting inner and outer colors to umbraColor and penumbraColor, respectively. + * If transparent is true, then the center of the ambient shadow will be filled in. + */ + static sk_sp<SkShadowVertices> MakeAmbient(const SkPath& path, SkScalar radius, + SkColor umbraColor, SkColor penumbraColor, + bool transparent); + + /** + * This function generates a spot shadow mesh for a path by walking the transformed path, + * further transforming by the scale and translation, and outsetting and insetting by a radius. + * The center will be clipped against the original path unless transparent is true. + */ + static sk_sp<SkShadowVertices> MakeSpot(const SkPath& path, SkScalar scale, + const SkVector& translate, SkScalar radius, + SkColor umbraColor, SkColor penumbraColor, + bool transparent); + + int vertexCount() const { return fVertexCnt; } + const SkPoint* positions() const { return fPositions.get(); } + const SkColor* colors() const { return fColors.get(); } + + int indexCount() const { return fIndexCnt; } + const uint16_t* indices() const { return fIndices.get(); } private: - void computeClipBounds(const SkPath& path); - - void handleLine(const SkPoint& p); - void handleLine(SkScalar scale, const SkVector& xlate, SkPoint p); - - void handleQuad(const SkPoint pts[3]); - void handleQuad(SkScalar scale, const SkVector& xlate, SkPoint pts[3]); - - void handleCubic(SkScalar scale, const SkVector& xlate, SkPoint pts[4]); - - void handleConic(SkScalar scale, const SkVector& xlate, SkPoint pts[3], SkScalar w); - - void mapPoints(SkScalar scale, const SkVector& xlate, SkPoint* pts, int count); - void addInnerPoint(const SkPoint& pathPoint, SkColor umbraColor, SkScalar radiusSqd); - void addArc(const SkVector& nextNormal); - void finishArcAndAddEdge(const SkVector& nextPoint, const SkVector& nextNormal); - void addEdge(const SkVector& nextPoint, const SkVector& nextNormal); - - SkScalar fRadius; - SkColor fUmbraColor; - SkColor fPenumbraColor; - - SkTDArray<SkPoint> fPositions; - SkTDArray<SkColor> fColors; - SkTDArray<uint16_t> fIndices; - - int fPrevInnerIndex; - SkPoint fPrevPoint; - SkVector fPrevNormal; - int fFirstVertex; - SkPoint fFirstPoint; - SkVector fFirstNormal; - SkScalar fDirection; - - SkPoint fCentroid; - SkTDArray<SkPoint> fClipPolygon; - - // first three points - SkTDArray<SkPoint> fInitPoints; - // temporary buffer - SkTDArray<SkPoint> fPointBuffer; + template<typename T> using Deleter = SkTDArray<SkPoint>::Deleter; + template<typename T> using UniqueArray = std::unique_ptr<const T[], Deleter<T>>; + + SkShadowVertices(UniqueArray<SkPoint>&& positions, UniqueArray<SkColor>&& colors, + UniqueArray<uint16_t>&& indices, int vertexCnt, int indexCnt) + : fVertexCnt(vertexCnt) + , fIndexCnt(indexCnt) + , fPositions(std::move(positions)) + , fColors(std::move(colors)) + , fIndices(std::move(indices)) { + SkASSERT(SkToBool(indices) == SkToBool(indexCnt)); + } + + int fVertexCnt; + int fIndexCnt; + UniqueArray<SkPoint> fPositions; + UniqueArray<SkColor> fColors; + UniqueArray<uint16_t> fIndices; }; #endif |