1/*
2 * Copyright 2020 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
8#pragma once
9
10#include "include/core/SkPathTypes.h"
11#include "include/core/SkPoint.h"
12#include "include/core/SkRect.h"
13#include "src/core/SkSpan.h"
14
15struct SkPathView {
16 SkPathView(SkSpan<const SkPoint> points, SkSpan<const uint8_t> verbs, SkSpan<const float> weights,
17 SkPathFillType ft, SkPathConvexityType ct, const SkRect& bounds, unsigned segmentMask,
18 bool isFinite)
19 : fPoints(points)
20 , fVerbs(verbs)
21 , fWeights(weights)
22 , fBounds(bounds)
23 , fFillType(ft)
24 , fConvexity(ct)
25 , fSegmentMask(segmentMask)
26 , fIsFinite(isFinite)
27 {
28 this->validate();
29 }
30
31 bool isInverseFillType() const { return SkPathFillType_IsInverse(fFillType); }
32 bool isConvex() const { return fConvexity == SkPathConvexityType::kConvex; }
33
34 bool isEmpty() const { return fPoints.size() == 0; }
35
36 bool isRect(SkRect*) const;
37 bool isFinite() const { return fIsFinite; }
38
39 SkSpan<const SkPoint> fPoints;
40 SkSpan<const uint8_t> fVerbs;
41 SkSpan<const float> fWeights;
42
43 SkRect fBounds;
44
45 SkPathFillType fFillType;
46 SkPathConvexityType fConvexity;
47 uint8_t fSegmentMask;
48 bool fIsFinite;
49
50#ifdef SK_DEBUG
51 void validate() const;
52#else
53 void validate() const {}
54#endif
55};
56
57static inline SkPathView SkPathView_triangle(const SkPoint pts[3], const SkRect& bounds) {
58 static constexpr uint8_t verbs[] = {
59 (uint8_t)SkPathVerb::kMove,
60 (uint8_t)SkPathVerb::kLine,
61 (uint8_t)SkPathVerb::kLine,
62 };
63 return SkPathView({pts, 3}, SkMakeSpan(verbs), {},
64 SkPathFillType::kWinding, SkPathConvexityType::kConvex,
65 bounds, kLine_SkPathSegmentMask, true);
66}
67
68static inline SkPathView SkPathView_quad(const SkPoint pts[4], const SkRect& bounds) {
69 static constexpr uint8_t verbs[] = {
70 (uint8_t)SkPathVerb::kMove,
71 (uint8_t)SkPathVerb::kLine,
72 (uint8_t)SkPathVerb::kLine,
73 (uint8_t)SkPathVerb::kLine,
74 };
75 return SkPathView({pts, 4}, SkMakeSpan(verbs), {},
76 SkPathFillType::kWinding, SkPathConvexityType::kConvex,
77 bounds, kLine_SkPathSegmentMask, true);
78};
79