| /* |
| * Copyright 2011 Google Inc. |
| * |
| * Use of this source code is governed by a BSD-style license that can be |
| * found in the LICENSE file. |
| */ |
| #ifndef SkEdgeBuilder_DEFINED |
| #define SkEdgeBuilder_DEFINED |
| |
| #include "SkArenaAlloc.h" |
| #include "SkRect.h" |
| #include "SkTDArray.h" |
| |
| struct SkEdge; |
| struct SkAnalyticEdge; |
| class SkEdgeClipper; |
| class SkPath; |
| |
| class SkEdgeBuilder { |
| public: |
| SkEdgeBuilder(); |
| |
| // returns the number of built edges. The array of those edge pointers |
| // is returned from edgeList(). |
| int build(const SkPath& path, const SkIRect* clip, int shiftUp, bool clipToTheRight, |
| bool analyticAA = false); |
| |
| int build_edges(const SkPath& path, const SkIRect* shiftedClip, |
| int shiftEdgesUp, bool pathContainedInClip, bool analyticAA = false); |
| |
| SkEdge** edgeList() { return (SkEdge**)fEdgeList; } |
| SkAnalyticEdge** analyticEdgeList() { return (SkAnalyticEdge**)fEdgeList; } |
| |
| private: |
| enum Combine { |
| kNo_Combine, |
| kPartial_Combine, |
| kTotal_Combine |
| }; |
| |
| Combine CombineVertical(const SkEdge* edge, SkEdge* last); |
| Combine CombineVertical(const SkAnalyticEdge* edge, SkAnalyticEdge* last); |
| Combine checkVertical(const SkEdge* edge, SkEdge** edgePtr); |
| Combine checkVertical(const SkAnalyticEdge* edge, SkAnalyticEdge** edgePtr); |
| bool vertical_line(const SkEdge* edge); |
| bool vertical_line(const SkAnalyticEdge* edge); |
| |
| SkSTArenaAlloc<512> fAlloc; |
| SkTDArray<void*> fList; |
| |
| /* |
| * If we're in general mode, we allcoate the pointers in fList, and this |
| * will point at fList.begin(). If we're in polygon mode, fList will be |
| * empty, as we will have preallocated room for the pointers in fAlloc's |
| * block, and fEdgeList will point into that. |
| */ |
| void** fEdgeList; |
| |
| int fShiftUp; |
| bool fAnalyticAA; |
| |
| public: |
| void addLine(const SkPoint pts[]); |
| void addQuad(const SkPoint pts[]); |
| void addCubic(const SkPoint pts[]); |
| void addClipper(SkEdgeClipper*); |
| |
| int buildPoly(const SkPath& path, const SkIRect* clip, int shiftUp, bool clipToTheRight); |
| }; |
| |
| #endif |