1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889 |
- /*
- * 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 "include/core/SkRect.h"
- #include "include/private/SkTDArray.h"
- #include "src/core/SkAnalyticEdge.h"
- #include "src/core/SkArenaAlloc.h"
- #include "src/core/SkEdge.h"
- class SkPath;
- class SkEdgeBuilder {
- public:
- int buildEdges(const SkPath& path,
- const SkIRect* shiftedClip);
- protected:
- SkEdgeBuilder() = default;
- virtual ~SkEdgeBuilder() = default;
- // In general mode we allocate pointers in fList and fEdgeList points to its head.
- // In polygon mode we preallocated edges contiguously in fAlloc and fEdgeList points there.
- void** fEdgeList = nullptr;
- SkTDArray<void*> fList;
- SkSTArenaAlloc<512> fAlloc;
- enum Combine {
- kNo_Combine,
- kPartial_Combine,
- kTotal_Combine
- };
- private:
- int build (const SkPath& path, const SkIRect* clip, bool clipToTheRight);
- int buildPoly(const SkPath& path, const SkIRect* clip, bool clipToTheRight);
- virtual char* allocEdges(size_t n, size_t* sizeof_edge) = 0;
- virtual SkRect recoverClip(const SkIRect&) const = 0;
- virtual void addLine (const SkPoint pts[]) = 0;
- virtual void addQuad (const SkPoint pts[]) = 0;
- virtual void addCubic(const SkPoint pts[]) = 0;
- virtual Combine addPolyLine(SkPoint pts[], char* edge, char** edgePtr) = 0;
- };
- class SkBasicEdgeBuilder final : public SkEdgeBuilder {
- public:
- explicit SkBasicEdgeBuilder(int clipShift) : fClipShift(clipShift) {}
- SkEdge** edgeList() { return (SkEdge**)fEdgeList; }
- private:
- Combine combineVertical(const SkEdge* edge, SkEdge* last);
- char* allocEdges(size_t, size_t*) override;
- SkRect recoverClip(const SkIRect&) const override;
- void addLine (const SkPoint pts[]) override;
- void addQuad (const SkPoint pts[]) override;
- void addCubic(const SkPoint pts[]) override;
- Combine addPolyLine(SkPoint pts[], char* edge, char** edgePtr) override;
- const int fClipShift;
- };
- class SkAnalyticEdgeBuilder final : public SkEdgeBuilder {
- public:
- SkAnalyticEdgeBuilder() {}
- SkAnalyticEdge** analyticEdgeList() { return (SkAnalyticEdge**)fEdgeList; }
- private:
- Combine combineVertical(const SkAnalyticEdge* edge, SkAnalyticEdge* last);
- char* allocEdges(size_t, size_t*) override;
- SkRect recoverClip(const SkIRect&) const override;
- void addLine (const SkPoint pts[]) override;
- void addQuad (const SkPoint pts[]) override;
- void addCubic(const SkPoint pts[]) override;
- Combine addPolyLine(SkPoint pts[], char* edge, char** edgePtr) override;
- };
- #endif
|