| Index: src/gpu/GrAAConvexTessellator.h
|
| diff --git a/src/gpu/GrAAConvexTessellator.h b/src/gpu/GrAAConvexTessellator.h
|
| deleted file mode 100644
|
| index f3d84dc8ad8b7de222f7ecfd2f08c5873ff0e111..0000000000000000000000000000000000000000
|
| --- a/src/gpu/GrAAConvexTessellator.h
|
| +++ /dev/null
|
| @@ -1,270 +0,0 @@
|
| -/*
|
| - * Copyright 2015 Google Inc.
|
| - *
|
| - * Use of this source code is governed by a BSD-style license that can be
|
| - * found in the LICENSE file.
|
| - */
|
| -
|
| -#ifndef GrAAConvexTessellator_DEFINED
|
| -#define GrAAConvexTessellator_DEFINED
|
| -
|
| -#include "SkColor.h"
|
| -#include "SkPaint.h"
|
| -#include "SkPoint.h"
|
| -#include "SkScalar.h"
|
| -#include "SkTDArray.h"
|
| -
|
| -class SkCanvas;
|
| -class SkMatrix;
|
| -class SkPath;
|
| -
|
| -//#define GR_AA_CONVEX_TESSELLATOR_VIZ 1
|
| -
|
| -// device space distance which we inset / outset points in order to create the soft antialiased edge
|
| -static const SkScalar kAntialiasingRadius = 0.5f;
|
| -
|
| -class GrAAConvexTessellator;
|
| -
|
| -// The AAConvexTessellator holds the global pool of points and the triangulation
|
| -// that connects them. It also drives the tessellation process.
|
| -// The outward facing normals of the original polygon are stored (in 'fNorms') to service
|
| -// computeDepthFromEdge requests.
|
| -class GrAAConvexTessellator {
|
| -public:
|
| - GrAAConvexTessellator(SkScalar strokeWidth = -1.0f,
|
| - SkPaint::Join join = SkPaint::Join::kBevel_Join,
|
| - SkScalar miterLimit = 0.0f)
|
| - : fSide(SkPoint::kOn_Side)
|
| - , fStrokeWidth(strokeWidth)
|
| - , fJoin(join)
|
| - , fMiterLimit(miterLimit) {
|
| - }
|
| -
|
| - SkPoint::Side side() const { return fSide; }
|
| -
|
| - bool tessellate(const SkMatrix& m, const SkPath& path);
|
| -
|
| - // The next five should only be called after tessellate to extract the result
|
| - int numPts() const { return fPts.count(); }
|
| - int numIndices() const { return fIndices.count(); }
|
| -
|
| - const SkPoint& lastPoint() const { return fPts.top(); }
|
| - const SkPoint& point(int index) const { return fPts[index]; }
|
| - int index(int index) const { return fIndices[index]; }
|
| - SkScalar coverage(int index) const { return fCoverages[index]; }
|
| -
|
| -#if GR_AA_CONVEX_TESSELLATOR_VIZ
|
| - void draw(SkCanvas* canvas) const;
|
| -#endif
|
| -
|
| - // The tessellator can be reused for multiple paths by rewinding in between
|
| - void rewind();
|
| -
|
| -private:
|
| - // CandidateVerts holds the vertices for the next ring while they are
|
| - // being generated. Its main function is to de-dup the points.
|
| - class CandidateVerts {
|
| - public:
|
| - void setReserve(int numPts) { fPts.setReserve(numPts); }
|
| - void rewind() { fPts.rewind(); }
|
| -
|
| - int numPts() const { return fPts.count(); }
|
| -
|
| - const SkPoint& lastPoint() const { return fPts.top().fPt; }
|
| - const SkPoint& firstPoint() const { return fPts[0].fPt; }
|
| - const SkPoint& point(int index) const { return fPts[index].fPt; }
|
| -
|
| - int originatingIdx(int index) const { return fPts[index].fOriginatingIdx; }
|
| - int origEdge(int index) const { return fPts[index].fOrigEdgeId; }
|
| - bool needsToBeNew(int index) const { return fPts[index].fNeedsToBeNew; }
|
| -
|
| - int addNewPt(const SkPoint& newPt, int originatingIdx, int origEdge, bool needsToBeNew) {
|
| - struct PointData* pt = fPts.push();
|
| - pt->fPt = newPt;
|
| - pt->fOrigEdgeId = origEdge;
|
| - pt->fOriginatingIdx = originatingIdx;
|
| - pt->fNeedsToBeNew = needsToBeNew;
|
| - return fPts.count() - 1;
|
| - }
|
| -
|
| - int fuseWithPrior(int origEdgeId) {
|
| - fPts.top().fOrigEdgeId = origEdgeId;
|
| - fPts.top().fOriginatingIdx = -1;
|
| - fPts.top().fNeedsToBeNew = true;
|
| - return fPts.count() - 1;
|
| - }
|
| -
|
| - int fuseWithNext() {
|
| - fPts[0].fOriginatingIdx = -1;
|
| - fPts[0].fNeedsToBeNew = true;
|
| - return 0;
|
| - }
|
| -
|
| - int fuseWithBoth() {
|
| - if (fPts.count() > 1) {
|
| - fPts.pop();
|
| - }
|
| -
|
| - fPts[0].fOriginatingIdx = -1;
|
| - fPts[0].fNeedsToBeNew = true;
|
| - return 0;
|
| - }
|
| -
|
| - private:
|
| - struct PointData {
|
| - SkPoint fPt;
|
| - int fOriginatingIdx;
|
| - int fOrigEdgeId;
|
| - bool fNeedsToBeNew;
|
| - };
|
| -
|
| - SkTDArray<struct PointData> fPts;
|
| - };
|
| -
|
| - // The Ring holds a set of indices into the global pool that together define
|
| - // a single polygon inset.
|
| - class Ring {
|
| - public:
|
| - void setReserve(int numPts) { fPts.setReserve(numPts); }
|
| - void rewind() { fPts.rewind(); }
|
| -
|
| - int numPts() const { return fPts.count(); }
|
| -
|
| - void addIdx(int index, int origEdgeId) {
|
| - struct PointData* pt = fPts.push();
|
| - pt->fIndex = index;
|
| - pt->fOrigEdgeId = origEdgeId;
|
| - }
|
| -
|
| - // init should be called after all the indices have been added (via addIdx)
|
| - void init(const GrAAConvexTessellator& tess);
|
| - void init(const SkTDArray<SkVector>& norms, const SkTDArray<SkVector>& bisectors);
|
| -
|
| - const SkPoint& norm(int index) const { return fPts[index].fNorm; }
|
| - const SkPoint& bisector(int index) const { return fPts[index].fBisector; }
|
| - int index(int index) const { return fPts[index].fIndex; }
|
| - int origEdgeID(int index) const { return fPts[index].fOrigEdgeId; }
|
| - void setOrigEdgeId(int index, int id) { fPts[index].fOrigEdgeId = id; }
|
| -
|
| - #if GR_AA_CONVEX_TESSELLATOR_VIZ
|
| - void draw(SkCanvas* canvas, const GrAAConvexTessellator& tess) const;
|
| - #endif
|
| -
|
| - private:
|
| - void computeNormals(const GrAAConvexTessellator& result);
|
| - void computeBisectors(const GrAAConvexTessellator& tess);
|
| -
|
| - SkDEBUGCODE(bool isConvex(const GrAAConvexTessellator& tess) const;)
|
| -
|
| - struct PointData {
|
| - SkPoint fNorm;
|
| - SkPoint fBisector;
|
| - int fIndex;
|
| - int fOrigEdgeId;
|
| - };
|
| -
|
| - SkTDArray<PointData> fPts;
|
| - };
|
| -
|
| - bool movable(int index) const { return fMovable[index]; }
|
| -
|
| - // Movable points are those that can be slid along their bisector.
|
| - // Basically, a point is immovable if it is part of the original
|
| - // polygon or it results from the fusing of two bisectors.
|
| - int addPt(const SkPoint& pt, SkScalar depth, SkScalar coverage, bool movable, bool isCurve);
|
| - void popLastPt();
|
| - void popFirstPtShuffle();
|
| -
|
| - void updatePt(int index, const SkPoint& pt, SkScalar depth, SkScalar coverage);
|
| -
|
| - void addTri(int i0, int i1, int i2);
|
| -
|
| - void reservePts(int count) {
|
| - fPts.setReserve(count);
|
| - fCoverages.setReserve(count);
|
| - fMovable.setReserve(count);
|
| - }
|
| -
|
| - SkScalar computeDepthFromEdge(int edgeIdx, const SkPoint& p) const;
|
| -
|
| - bool computePtAlongBisector(int startIdx, const SkPoint& bisector,
|
| - int edgeIdx, SkScalar desiredDepth,
|
| - SkPoint* result) const;
|
| -
|
| - void lineTo(SkPoint p, bool isCurve);
|
| -
|
| - void lineTo(const SkMatrix& m, SkPoint p, bool isCurve);
|
| -
|
| - void quadTo(SkPoint pts[3]);
|
| -
|
| - void quadTo(const SkMatrix& m, SkPoint pts[3]);
|
| -
|
| - void cubicTo(const SkMatrix& m, SkPoint pts[4]);
|
| -
|
| - void conicTo(const SkMatrix& m, SkPoint pts[3], SkScalar w);
|
| -
|
| - void terminate(const Ring& lastRing);
|
| -
|
| - // return false on failure/degenerate path
|
| - bool extractFromPath(const SkMatrix& m, const SkPath& path);
|
| - void computeBisectors();
|
| -
|
| - void fanRing(const Ring& ring);
|
| -
|
| - Ring* getNextRing(Ring* lastRing);
|
| -
|
| - void createOuterRing(const Ring& previousRing, SkScalar outset, SkScalar coverage,
|
| - Ring* nextRing);
|
| -
|
| - bool createInsetRings(Ring& previousRing, SkScalar initialDepth, SkScalar initialCoverage,
|
| - SkScalar targetDepth, SkScalar targetCoverage, Ring** finalRing);
|
| -
|
| - bool createInsetRing(const Ring& lastRing, Ring* nextRing,
|
| - SkScalar initialDepth, SkScalar initialCoverage, SkScalar targetDepth,
|
| - SkScalar targetCoverage, bool forceNew);
|
| -
|
| - void validate() const;
|
| -
|
| - // fPts, fCoverages & fMovable should always have the same # of elements
|
| - SkTDArray<SkPoint> fPts;
|
| - SkTDArray<SkScalar> fCoverages;
|
| - // movable points are those that can be slid further along their bisector
|
| - SkTDArray<bool> fMovable;
|
| -
|
| - // The outward facing normals for the original polygon
|
| - SkTDArray<SkVector> fNorms;
|
| - // The inward facing bisector at each point in the original polygon. Only
|
| - // needed for exterior ring creation and then handed off to the initial ring.
|
| - SkTDArray<SkVector> fBisectors;
|
| -
|
| - // Tracks whether a given point is interior to a curve. Such points are
|
| - // assumed to have shallow curvature.
|
| - SkTDArray<bool> fIsCurve;
|
| -
|
| - SkPoint::Side fSide; // winding of the original polygon
|
| -
|
| - // The triangulation of the points
|
| - SkTDArray<int> fIndices;
|
| -
|
| - Ring fInitialRing;
|
| -#if GR_AA_CONVEX_TESSELLATOR_VIZ
|
| - // When visualizing save all the rings
|
| - SkTDArray<Ring*> fRings;
|
| -#else
|
| - Ring fRings[2];
|
| -#endif
|
| - CandidateVerts fCandidateVerts;
|
| -
|
| - // < 0 means filling rather than stroking
|
| - SkScalar fStrokeWidth;
|
| -
|
| - SkPaint::Join fJoin;
|
| -
|
| - SkScalar fMiterLimit;
|
| -
|
| - SkTDArray<SkPoint> fPointBuffer;
|
| -};
|
| -
|
| -
|
| -#endif
|
| -
|
|
|