• Home
  • History
  • Annotate
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright 2011 Google Inc.
3  *
4  * Use of this source code is governed by a BSD-style license that can be
5  * found in the LICENSE file.
6  */
7 #ifndef SkEdgeBuilder_DEFINED
8 #define SkEdgeBuilder_DEFINED
9 
10 #include "SkArenaAlloc.h"
11 #include "SkRect.h"
12 #include "SkTDArray.h"
13 
14 struct SkEdge;
15 struct SkAnalyticEdge;
16 class SkEdgeClipper;
17 class SkPath;
18 
19 class SkEdgeBuilder {
20 public:
21     SkEdgeBuilder();
22 
23     // returns the number of built edges. The array of those edge pointers
24     // is returned from edgeList().
25     int build(const SkPath& path, const SkIRect* clip, int shiftUp, bool clipToTheRight,
26               bool analyticAA = false);
27 
edgeList()28     SkEdge** edgeList() { return (SkEdge**)fEdgeList; }
analyticEdgeList()29     SkAnalyticEdge** analyticEdgeList() { return (SkAnalyticEdge**)fEdgeList; }
30 
31 private:
32     enum Combine {
33         kNo_Combine,
34         kPartial_Combine,
35         kTotal_Combine
36     };
37 
38     Combine CombineVertical(const SkEdge* edge, SkEdge* last);
39     Combine CombineVertical(const SkAnalyticEdge* edge, SkAnalyticEdge* last);
40     Combine checkVertical(const SkEdge* edge, SkEdge** edgePtr);
41     Combine checkVertical(const SkAnalyticEdge* edge, SkAnalyticEdge** edgePtr);
42     bool vertical_line(const SkEdge* edge);
43     bool vertical_line(const SkAnalyticEdge* edge);
44 
45     SkArenaAlloc        fAlloc;
46     SkTDArray<void*>    fList;
47 
48     /*
49      *  If we're in general mode, we allcoate the pointers in fList, and this
50      *  will point at fList.begin(). If we're in polygon mode, fList will be
51      *  empty, as we will have preallocated room for the pointers in fAlloc's
52      *  block, and fEdgeList will point into that.
53      */
54     void**      fEdgeList;
55 
56     int         fShiftUp;
57     bool        fAnalyticAA;
58 
59 public:
60     void addLine(const SkPoint pts[]);
61     void addQuad(const SkPoint pts[]);
62     void addCubic(const SkPoint pts[]);
63     void addClipper(SkEdgeClipper*);
64 
65     int buildPoly(const SkPath& path, const SkIRect* clip, int shiftUp, bool clipToTheRight);
66 };
67 
68 #endif
69