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
15struct SkEdge;
16class SkEdgeClipper;
17class SkPath;
18
19class SkEdgeBuilder {
20public:
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
27    SkEdge** edgeList() { return fEdgeList; }
28
29private:
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
52public:
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