aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/utils/SkShadowTessellator.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/utils/SkShadowTessellator.h')
-rwxr-xr-xsrc/utils/SkShadowTessellator.h154
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