• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 
2 /*
3  * Copyright 2011 Google Inc.
4  *
5  * Use of this source code is governed by a BSD-style license that can be
6  * found in the LICENSE file.
7  */
8 #ifndef SkEdgeBuilder_DEFINED
9 #define SkEdgeBuilder_DEFINED
10 
11 #include "SkChunkAlloc.h"
12 #include "SkRect.h"
13 #include "SkTDArray.h"
14 
15 struct SkEdge;
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 
edgeList()27     SkEdge** edgeList() { return fEdgeList; }
28 
29 private:
30     enum Combine {
31         kNo_Combine,
32         kPartial_Combine,
33         kTotal_Combine
34     };
35 
36     static Combine CombineVertical(const SkEdge* edge, SkEdge* last);
37     Combine checkVertical(const SkEdge* edge, SkEdge** edgePtr);
38 
39     SkChunkAlloc        fAlloc;
40     SkTDArray<SkEdge*>  fList;
41 
42     /*
43      *  If we're in general mode, we allcoate the pointers in fList, and this
44      *  will point at fList.begin(). If we're in polygon mode, fList will be
45      *  empty, as we will have preallocated room for the pointers in fAlloc's
46      *  block, and fEdgeList will point into that.
47      */
48     SkEdge**    fEdgeList;
49 
50     int         fShiftUp;
51 
52 public:
53     void addLine(const SkPoint pts[]);
54     void addQuad(const SkPoint pts[]);
55     void addCubic(const SkPoint pts[]);
56     void addClipper(SkEdgeClipper*);
57 
58     int buildPoly(const SkPath& path, const SkIRect* clip, int shiftUp, bool clipToTheRight);
59 };
60 
61 #endif
62