xref: /third_party/skia/src/core/SkEdgeBuilder.h (revision cb93a386)
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 "include/core/SkRect.h"
11#include "include/private/SkTDArray.h"
12#include "src/core/SkAnalyticEdge.h"
13#include "src/core/SkArenaAlloc.h"
14#include "src/core/SkEdge.h"
15
16class SkPath;
17
18class SkEdgeBuilder {
19public:
20    int buildEdges(const SkPath& path,
21                   const SkIRect* shiftedClip);
22
23protected:
24    SkEdgeBuilder() = default;
25    virtual ~SkEdgeBuilder() = default;
26
27    // In general mode we allocate pointers in fList and fEdgeList points to its head.
28    // In polygon mode we preallocated edges contiguously in fAlloc and fEdgeList points there.
29    void**              fEdgeList = nullptr;
30    SkTDArray<void*>    fList;
31    SkSTArenaAlloc<512> fAlloc;
32
33    enum Combine {
34        kNo_Combine,
35        kPartial_Combine,
36        kTotal_Combine
37    };
38
39private:
40    int build    (const SkPath& path, const SkIRect* clip, bool clipToTheRight);
41    int buildPoly(const SkPath& path, const SkIRect* clip, bool clipToTheRight);
42
43    virtual char* allocEdges(size_t n, size_t* sizeof_edge) = 0;
44    virtual SkRect recoverClip(const SkIRect&) const = 0;
45
46    virtual void addLine (const SkPoint pts[]) = 0;
47    virtual void addQuad (const SkPoint pts[]) = 0;
48    virtual void addCubic(const SkPoint pts[]) = 0;
49    virtual Combine addPolyLine(const SkPoint pts[], char* edge, char** edgePtr) = 0;
50};
51
52class SkBasicEdgeBuilder final : public SkEdgeBuilder {
53public:
54    explicit SkBasicEdgeBuilder(int clipShift) : fClipShift(clipShift) {}
55
56    SkEdge** edgeList() { return (SkEdge**)fEdgeList; }
57
58private:
59    Combine combineVertical(const SkEdge* edge, SkEdge* last);
60
61    char* allocEdges(size_t, size_t*) override;
62    SkRect recoverClip(const SkIRect&) const override;
63
64    void addLine (const SkPoint pts[]) override;
65    void addQuad (const SkPoint pts[]) override;
66    void addCubic(const SkPoint pts[]) override;
67    Combine addPolyLine(const SkPoint pts[], char* edge, char** edgePtr) override;
68
69    const int fClipShift;
70};
71
72class SkAnalyticEdgeBuilder final : public SkEdgeBuilder {
73public:
74    SkAnalyticEdgeBuilder() {}
75
76    SkAnalyticEdge** analyticEdgeList() { return (SkAnalyticEdge**)fEdgeList; }
77
78private:
79    Combine combineVertical(const SkAnalyticEdge* edge, SkAnalyticEdge* last);
80
81    char* allocEdges(size_t, size_t*) override;
82    SkRect recoverClip(const SkIRect&) const override;
83
84    void addLine (const SkPoint pts[]) override;
85    void addQuad (const SkPoint pts[]) override;
86    void addCubic(const SkPoint pts[]) override;
87    Combine addPolyLine(const SkPoint pts[], char* edge, char** edgePtr) override;
88};
89#endif
90