SkEdgeBuilder.h 2.7 KB

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