1cb93a386Sopenharmony_ci/* 2cb93a386Sopenharmony_ci * Copyright 2011 Google Inc. 3cb93a386Sopenharmony_ci * 4cb93a386Sopenharmony_ci * Use of this source code is governed by a BSD-style license that can be 5cb93a386Sopenharmony_ci * found in the LICENSE file. 6cb93a386Sopenharmony_ci */ 7cb93a386Sopenharmony_ci#ifndef SkEdgeBuilder_DEFINED 8cb93a386Sopenharmony_ci#define SkEdgeBuilder_DEFINED 9cb93a386Sopenharmony_ci 10cb93a386Sopenharmony_ci#include "include/core/SkRect.h" 11cb93a386Sopenharmony_ci#include "include/private/SkTDArray.h" 12cb93a386Sopenharmony_ci#include "src/core/SkAnalyticEdge.h" 13cb93a386Sopenharmony_ci#include "src/core/SkArenaAlloc.h" 14cb93a386Sopenharmony_ci#include "src/core/SkEdge.h" 15cb93a386Sopenharmony_ci 16cb93a386Sopenharmony_ciclass SkPath; 17cb93a386Sopenharmony_ci 18cb93a386Sopenharmony_ciclass SkEdgeBuilder { 19cb93a386Sopenharmony_cipublic: 20cb93a386Sopenharmony_ci int buildEdges(const SkPath& path, 21cb93a386Sopenharmony_ci const SkIRect* shiftedClip); 22cb93a386Sopenharmony_ci 23cb93a386Sopenharmony_ciprotected: 24cb93a386Sopenharmony_ci SkEdgeBuilder() = default; 25cb93a386Sopenharmony_ci virtual ~SkEdgeBuilder() = default; 26cb93a386Sopenharmony_ci 27cb93a386Sopenharmony_ci // In general mode we allocate pointers in fList and fEdgeList points to its head. 28cb93a386Sopenharmony_ci // In polygon mode we preallocated edges contiguously in fAlloc and fEdgeList points there. 29cb93a386Sopenharmony_ci void** fEdgeList = nullptr; 30cb93a386Sopenharmony_ci SkTDArray<void*> fList; 31cb93a386Sopenharmony_ci SkSTArenaAlloc<512> fAlloc; 32cb93a386Sopenharmony_ci 33cb93a386Sopenharmony_ci enum Combine { 34cb93a386Sopenharmony_ci kNo_Combine, 35cb93a386Sopenharmony_ci kPartial_Combine, 36cb93a386Sopenharmony_ci kTotal_Combine 37cb93a386Sopenharmony_ci }; 38cb93a386Sopenharmony_ci 39cb93a386Sopenharmony_ciprivate: 40cb93a386Sopenharmony_ci int build (const SkPath& path, const SkIRect* clip, bool clipToTheRight); 41cb93a386Sopenharmony_ci int buildPoly(const SkPath& path, const SkIRect* clip, bool clipToTheRight); 42cb93a386Sopenharmony_ci 43cb93a386Sopenharmony_ci virtual char* allocEdges(size_t n, size_t* sizeof_edge) = 0; 44cb93a386Sopenharmony_ci virtual SkRect recoverClip(const SkIRect&) const = 0; 45cb93a386Sopenharmony_ci 46cb93a386Sopenharmony_ci virtual void addLine (const SkPoint pts[]) = 0; 47cb93a386Sopenharmony_ci virtual void addQuad (const SkPoint pts[]) = 0; 48cb93a386Sopenharmony_ci virtual void addCubic(const SkPoint pts[]) = 0; 49cb93a386Sopenharmony_ci virtual Combine addPolyLine(const SkPoint pts[], char* edge, char** edgePtr) = 0; 50cb93a386Sopenharmony_ci}; 51cb93a386Sopenharmony_ci 52cb93a386Sopenharmony_ciclass SkBasicEdgeBuilder final : public SkEdgeBuilder { 53cb93a386Sopenharmony_cipublic: 54cb93a386Sopenharmony_ci explicit SkBasicEdgeBuilder(int clipShift) : fClipShift(clipShift) {} 55cb93a386Sopenharmony_ci 56cb93a386Sopenharmony_ci SkEdge** edgeList() { return (SkEdge**)fEdgeList; } 57cb93a386Sopenharmony_ci 58cb93a386Sopenharmony_ciprivate: 59cb93a386Sopenharmony_ci Combine combineVertical(const SkEdge* edge, SkEdge* last); 60cb93a386Sopenharmony_ci 61cb93a386Sopenharmony_ci char* allocEdges(size_t, size_t*) override; 62cb93a386Sopenharmony_ci SkRect recoverClip(const SkIRect&) const override; 63cb93a386Sopenharmony_ci 64cb93a386Sopenharmony_ci void addLine (const SkPoint pts[]) override; 65cb93a386Sopenharmony_ci void addQuad (const SkPoint pts[]) override; 66cb93a386Sopenharmony_ci void addCubic(const SkPoint pts[]) override; 67cb93a386Sopenharmony_ci Combine addPolyLine(const SkPoint pts[], char* edge, char** edgePtr) override; 68cb93a386Sopenharmony_ci 69cb93a386Sopenharmony_ci const int fClipShift; 70cb93a386Sopenharmony_ci}; 71cb93a386Sopenharmony_ci 72cb93a386Sopenharmony_ciclass SkAnalyticEdgeBuilder final : public SkEdgeBuilder { 73cb93a386Sopenharmony_cipublic: 74cb93a386Sopenharmony_ci SkAnalyticEdgeBuilder() {} 75cb93a386Sopenharmony_ci 76cb93a386Sopenharmony_ci SkAnalyticEdge** analyticEdgeList() { return (SkAnalyticEdge**)fEdgeList; } 77cb93a386Sopenharmony_ci 78cb93a386Sopenharmony_ciprivate: 79cb93a386Sopenharmony_ci Combine combineVertical(const SkAnalyticEdge* edge, SkAnalyticEdge* last); 80cb93a386Sopenharmony_ci 81cb93a386Sopenharmony_ci char* allocEdges(size_t, size_t*) override; 82cb93a386Sopenharmony_ci SkRect recoverClip(const SkIRect&) const override; 83cb93a386Sopenharmony_ci 84cb93a386Sopenharmony_ci void addLine (const SkPoint pts[]) override; 85cb93a386Sopenharmony_ci void addQuad (const SkPoint pts[]) override; 86cb93a386Sopenharmony_ci void addCubic(const SkPoint pts[]) override; 87cb93a386Sopenharmony_ci Combine addPolyLine(const SkPoint pts[], char* edge, char** edgePtr) override; 88cb93a386Sopenharmony_ci}; 89cb93a386Sopenharmony_ci#endif 90