@shopify/react-native-skia 0.1.210 → 0.1.212

Sign up to get free protection for your applications and to get access to all the features.
Files changed (95) hide show
  1. package/cpp/api/JsiSkAnimatedImage.h +60 -0
  2. package/cpp/api/JsiSkAnimatedImageFactory.h +39 -0
  3. package/cpp/api/JsiSkApi.h +4 -0
  4. package/cpp/api/JsiSkImage.h +15 -23
  5. package/cpp/api/JsiSkPath.h +66 -22
  6. package/cpp/skia/src/core/SkPathPriv.h +540 -0
  7. package/lib/commonjs/external/reanimated/moduleWrapper.d.ts +2 -0
  8. package/lib/commonjs/external/reanimated/moduleWrapper.js +11 -11
  9. package/lib/commonjs/external/reanimated/moduleWrapper.js.map +1 -1
  10. package/lib/commonjs/skia/core/AnimatedImage.d.ts +6 -0
  11. package/lib/commonjs/skia/core/AnimatedImage.js +65 -0
  12. package/lib/commonjs/skia/core/AnimatedImage.js.map +1 -0
  13. package/lib/commonjs/skia/core/Font.js +7 -6
  14. package/lib/commonjs/skia/core/Font.js.map +1 -1
  15. package/lib/commonjs/skia/core/index.d.ts +1 -0
  16. package/lib/commonjs/skia/core/index.js +13 -0
  17. package/lib/commonjs/skia/core/index.js.map +1 -1
  18. package/lib/commonjs/skia/types/AnimatedImage/AnimatedImage.d.ts +24 -0
  19. package/lib/commonjs/skia/types/AnimatedImage/AnimatedImage.js +6 -0
  20. package/lib/commonjs/skia/types/AnimatedImage/AnimatedImage.js.map +1 -0
  21. package/lib/commonjs/skia/types/AnimatedImage/AnimatedImageFactory.d.ts +13 -0
  22. package/lib/commonjs/skia/types/AnimatedImage/AnimatedImageFactory.js +6 -0
  23. package/lib/commonjs/skia/types/AnimatedImage/AnimatedImageFactory.js.map +1 -0
  24. package/lib/commonjs/skia/types/AnimatedImage/index.d.ts +2 -0
  25. package/lib/commonjs/skia/types/AnimatedImage/index.js +32 -0
  26. package/lib/commonjs/skia/types/AnimatedImage/index.js.map +1 -0
  27. package/lib/commonjs/skia/types/Skia.d.ts +2 -0
  28. package/lib/commonjs/skia/types/Skia.js.map +1 -1
  29. package/lib/commonjs/skia/types/index.d.ts +1 -0
  30. package/lib/commonjs/skia/types/index.js +13 -0
  31. package/lib/commonjs/skia/types/index.js.map +1 -1
  32. package/lib/commonjs/skia/web/JsiSkAnimatedImage.d.ts +11 -0
  33. package/lib/commonjs/skia/web/JsiSkAnimatedImage.js +44 -0
  34. package/lib/commonjs/skia/web/JsiSkAnimatedImage.js.map +1 -0
  35. package/lib/commonjs/skia/web/JsiSkAnimatedImageFactory.d.ts +9 -0
  36. package/lib/commonjs/skia/web/JsiSkAnimatedImageFactory.js +32 -0
  37. package/lib/commonjs/skia/web/JsiSkAnimatedImageFactory.js.map +1 -0
  38. package/lib/commonjs/skia/web/JsiSkia.js +3 -0
  39. package/lib/commonjs/skia/web/JsiSkia.js.map +1 -1
  40. package/lib/module/external/reanimated/moduleWrapper.d.ts +2 -0
  41. package/lib/module/external/reanimated/moduleWrapper.js +8 -11
  42. package/lib/module/external/reanimated/moduleWrapper.js.map +1 -1
  43. package/lib/module/skia/core/AnimatedImage.d.ts +6 -0
  44. package/lib/module/skia/core/AnimatedImage.js +49 -0
  45. package/lib/module/skia/core/AnimatedImage.js.map +1 -0
  46. package/lib/module/skia/core/Font.js +6 -5
  47. package/lib/module/skia/core/Font.js.map +1 -1
  48. package/lib/module/skia/core/index.d.ts +1 -0
  49. package/lib/module/skia/core/index.js +1 -0
  50. package/lib/module/skia/core/index.js.map +1 -1
  51. package/lib/module/skia/types/AnimatedImage/AnimatedImage.d.ts +24 -0
  52. package/lib/module/skia/types/AnimatedImage/AnimatedImage.js +2 -0
  53. package/lib/module/skia/types/AnimatedImage/AnimatedImage.js.map +1 -0
  54. package/lib/module/skia/types/AnimatedImage/AnimatedImageFactory.d.ts +13 -0
  55. package/lib/module/skia/types/AnimatedImage/AnimatedImageFactory.js +2 -0
  56. package/lib/module/skia/types/AnimatedImage/AnimatedImageFactory.js.map +1 -0
  57. package/lib/module/skia/types/AnimatedImage/index.d.ts +2 -0
  58. package/lib/module/skia/types/AnimatedImage/index.js +3 -0
  59. package/lib/module/skia/types/AnimatedImage/index.js.map +1 -0
  60. package/lib/module/skia/types/Skia.d.ts +2 -0
  61. package/lib/module/skia/types/Skia.js.map +1 -1
  62. package/lib/module/skia/types/index.d.ts +1 -0
  63. package/lib/module/skia/types/index.js +1 -0
  64. package/lib/module/skia/types/index.js.map +1 -1
  65. package/lib/module/skia/web/JsiSkAnimatedImage.d.ts +11 -0
  66. package/lib/module/skia/web/JsiSkAnimatedImage.js +33 -0
  67. package/lib/module/skia/web/JsiSkAnimatedImage.js.map +1 -0
  68. package/lib/module/skia/web/JsiSkAnimatedImageFactory.d.ts +9 -0
  69. package/lib/module/skia/web/JsiSkAnimatedImageFactory.js +20 -0
  70. package/lib/module/skia/web/JsiSkAnimatedImageFactory.js.map +1 -0
  71. package/lib/module/skia/web/JsiSkia.js +2 -0
  72. package/lib/module/skia/web/JsiSkia.js.map +1 -1
  73. package/lib/typescript/src/external/reanimated/moduleWrapper.d.ts +2 -0
  74. package/lib/typescript/src/skia/core/AnimatedImage.d.ts +6 -0
  75. package/lib/typescript/src/skia/core/index.d.ts +1 -0
  76. package/lib/typescript/src/skia/types/AnimatedImage/AnimatedImage.d.ts +24 -0
  77. package/lib/typescript/src/skia/types/AnimatedImage/AnimatedImageFactory.d.ts +13 -0
  78. package/lib/typescript/src/skia/types/AnimatedImage/index.d.ts +2 -0
  79. package/lib/typescript/src/skia/types/Skia.d.ts +2 -0
  80. package/lib/typescript/src/skia/types/index.d.ts +1 -0
  81. package/lib/typescript/src/skia/web/JsiSkAnimatedImage.d.ts +11 -0
  82. package/lib/typescript/src/skia/web/JsiSkAnimatedImageFactory.d.ts +9 -0
  83. package/package.json +1 -1
  84. package/src/external/reanimated/moduleWrapper.ts +9 -8
  85. package/src/skia/core/AnimatedImage.ts +63 -0
  86. package/src/skia/core/Font.ts +5 -5
  87. package/src/skia/core/index.ts +1 -0
  88. package/src/skia/types/AnimatedImage/AnimatedImage.ts +29 -0
  89. package/src/skia/types/AnimatedImage/AnimatedImageFactory.ts +15 -0
  90. package/src/skia/types/AnimatedImage/index.ts +2 -0
  91. package/src/skia/types/Skia.ts +3 -0
  92. package/src/skia/types/index.ts +1 -0
  93. package/src/skia/web/JsiSkAnimatedImage.ts +35 -0
  94. package/src/skia/web/JsiSkAnimatedImageFactory.ts +27 -0
  95. package/src/skia/web/JsiSkia.ts +2 -0
@@ -0,0 +1,540 @@
1
+ /*
2
+ * Copyright 2015 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
+ #ifndef SkPathPriv_DEFINED
9
+ #define SkPathPriv_DEFINED
10
+
11
+ #include "include/core/SkPath.h"
12
+ #include "include/core/SkPathBuilder.h"
13
+ #include "include/core/SkPathTypes.h"
14
+ #include "include/core/SkPoint.h"
15
+ #include "include/core/SkRect.h"
16
+ #include "include/core/SkRefCnt.h"
17
+ #include "include/core/SkScalar.h"
18
+ #include "include/core/SkTypes.h"
19
+ #include "include/private/SkIDChangeListener.h"
20
+ #include "include/private/SkPathRef.h"
21
+ #include "include/private/base/SkDebug.h"
22
+ #include "include/private/base/SkPathEnums.h"
23
+
24
+ #include <cstdint>
25
+ #include <iterator>
26
+ #include <utility>
27
+
28
+ class SkMatrix;
29
+ class SkRRect;
30
+
31
+ static_assert(0 == static_cast<int>(SkPathFillType::kWinding), "fill_type_mismatch");
32
+ static_assert(1 == static_cast<int>(SkPathFillType::kEvenOdd), "fill_type_mismatch");
33
+ static_assert(2 == static_cast<int>(SkPathFillType::kInverseWinding), "fill_type_mismatch");
34
+ static_assert(3 == static_cast<int>(SkPathFillType::kInverseEvenOdd), "fill_type_mismatch");
35
+
36
+ class SkPathPriv {
37
+ public:
38
+ // skbug.com/9906: Not a perfect solution for W plane clipping, but 1/16384 is a
39
+ // reasonable limit (roughly 5e-5)
40
+ inline static constexpr SkScalar kW0PlaneDistance = 1.f / (1 << 14);
41
+
42
+ static SkPathFirstDirection AsFirstDirection(SkPathDirection dir) {
43
+ // since we agree numerically for the values in Direction, we can just cast.
44
+ return (SkPathFirstDirection)dir;
45
+ }
46
+
47
+ /**
48
+ * Return the opposite of the specified direction. kUnknown is its own
49
+ * opposite.
50
+ */
51
+ static SkPathFirstDirection OppositeFirstDirection(SkPathFirstDirection dir) {
52
+ static const SkPathFirstDirection gOppositeDir[] = {
53
+ SkPathFirstDirection::kCCW, SkPathFirstDirection::kCW, SkPathFirstDirection::kUnknown,
54
+ };
55
+ return gOppositeDir[(unsigned)dir];
56
+ }
57
+
58
+ /**
59
+ * Tries to compute the direction of the outer-most non-degenerate
60
+ * contour. If it can be computed, return that direction. If it cannot be determined,
61
+ * or the contour is known to be convex, return kUnknown. If the direction was determined,
62
+ * it is cached to make subsequent calls return quickly.
63
+ */
64
+ static SkPathFirstDirection ComputeFirstDirection(const SkPath&);
65
+
66
+ static bool IsClosedSingleContour(const SkPath& path) {
67
+ int verbCount = path.countVerbs();
68
+ if (verbCount == 0)
69
+ return false;
70
+ int moveCount = 0;
71
+ auto verbs = path.fPathRef->verbsBegin();
72
+ for (int i = 0; i < verbCount; i++) {
73
+ switch (verbs[i]) {
74
+ case SkPath::Verb::kMove_Verb:
75
+ moveCount += 1;
76
+ if (moveCount > 1) {
77
+ return false;
78
+ }
79
+ break;
80
+ case SkPath::Verb::kClose_Verb:
81
+ if (i == verbCount - 1) {
82
+ return true;
83
+ }
84
+ return false;
85
+ default: break;
86
+ }
87
+ }
88
+ return false;
89
+ }
90
+
91
+ // In some scenarios (e.g. fill or convexity checking all but the last leading move to are
92
+ // irrelevant to behavior). SkPath::injectMoveToIfNeeded should ensure that this is always at
93
+ // least 1.
94
+ static int LeadingMoveToCount(const SkPath& path) {
95
+ int verbCount = path.countVerbs();
96
+ auto verbs = path.fPathRef->verbsBegin();
97
+ for (int i = 0; i < verbCount; i++) {
98
+ if (verbs[i] != SkPath::Verb::kMove_Verb) {
99
+ return i;
100
+ }
101
+ }
102
+ return verbCount; // path is all move verbs
103
+ }
104
+
105
+ static void AddGenIDChangeListener(const SkPath& path, sk_sp<SkIDChangeListener> listener) {
106
+ path.fPathRef->addGenIDChangeListener(std::move(listener));
107
+ }
108
+
109
+ /**
110
+ * This returns true for a rect that has a move followed by 3 or 4 lines and a close. If
111
+ * 'isSimpleFill' is true, an uncloseed rect will also be accepted as long as it starts and
112
+ * ends at the same corner. This does not permit degenerate line or point rectangles.
113
+ */
114
+ static bool IsSimpleRect(const SkPath& path, bool isSimpleFill, SkRect* rect,
115
+ SkPathDirection* direction, unsigned* start);
116
+
117
+ /**
118
+ * Creates a path from arc params using the semantics of SkCanvas::drawArc. This function
119
+ * assumes empty ovals and zero sweeps have already been filtered out.
120
+ */
121
+ static void CreateDrawArcPath(SkPath* path, const SkRect& oval, SkScalar startAngle,
122
+ SkScalar sweepAngle, bool useCenter, bool isFillNoPathEffect);
123
+
124
+ /**
125
+ * Determines whether an arc produced by CreateDrawArcPath will be convex. Assumes a non-empty
126
+ * oval.
127
+ */
128
+ static bool DrawArcIsConvex(SkScalar sweepAngle, bool useCenter, bool isFillNoPathEffect);
129
+
130
+ static void ShrinkToFit(SkPath* path) {
131
+ path->shrinkToFit();
132
+ }
133
+
134
+ /**
135
+ * Returns a C++11-iterable object that traverses a path's verbs in order. e.g:
136
+ *
137
+ * for (SkPath::Verb verb : SkPathPriv::Verbs(path)) {
138
+ * ...
139
+ * }
140
+ */
141
+ struct Verbs {
142
+ public:
143
+ Verbs(const SkPath& path) : fPathRef(path.fPathRef.get()) {}
144
+ struct Iter {
145
+ void operator++() { fVerb++; }
146
+ bool operator!=(const Iter& b) { return fVerb != b.fVerb; }
147
+ SkPath::Verb operator*() { return static_cast<SkPath::Verb>(*fVerb); }
148
+ const uint8_t* fVerb;
149
+ };
150
+ Iter begin() { return Iter{fPathRef->verbsBegin()}; }
151
+ Iter end() { return Iter{fPathRef->verbsEnd()}; }
152
+ private:
153
+ Verbs(const Verbs&) = delete;
154
+ Verbs& operator=(const Verbs&) = delete;
155
+ SkPathRef* fPathRef;
156
+ };
157
+
158
+ /**
159
+ * Iterates through a raw range of path verbs, points, and conics. All values are returned
160
+ * unaltered.
161
+ *
162
+ * NOTE: This class's definition will be moved into SkPathPriv once RangeIter is removed.
163
+ */
164
+ using RangeIter = SkPath::RangeIter;
165
+
166
+ /**
167
+ * Iterable object for traversing verbs, points, and conic weights in a path:
168
+ *
169
+ * for (auto [verb, pts, weights] : SkPathPriv::Iterate(skPath)) {
170
+ * ...
171
+ * }
172
+ */
173
+ struct Iterate {
174
+ public:
175
+ Iterate(const SkPath& path)
176
+ : Iterate(path.fPathRef->verbsBegin(),
177
+ // Don't allow iteration through non-finite points.
178
+ (!path.isFinite()) ? path.fPathRef->verbsBegin()
179
+ : path.fPathRef->verbsEnd(),
180
+ path.fPathRef->points(), path.fPathRef->conicWeights()) {
181
+ }
182
+ Iterate(const uint8_t* verbsBegin, const uint8_t* verbsEnd, const SkPoint* points,
183
+ const SkScalar* weights)
184
+ : fVerbsBegin(verbsBegin), fVerbsEnd(verbsEnd), fPoints(points), fWeights(weights) {
185
+ }
186
+ SkPath::RangeIter begin() { return {fVerbsBegin, fPoints, fWeights}; }
187
+ SkPath::RangeIter end() { return {fVerbsEnd, nullptr, nullptr}; }
188
+ private:
189
+ const uint8_t* fVerbsBegin;
190
+ const uint8_t* fVerbsEnd;
191
+ const SkPoint* fPoints;
192
+ const SkScalar* fWeights;
193
+ };
194
+
195
+ /**
196
+ * Returns a pointer to the verb data.
197
+ */
198
+ static const uint8_t* VerbData(const SkPath& path) {
199
+ return path.fPathRef->verbsBegin();
200
+ }
201
+
202
+ /** Returns a raw pointer to the path points */
203
+ static const SkPoint* PointData(const SkPath& path) {
204
+ return path.fPathRef->points();
205
+ }
206
+
207
+ /** Returns the number of conic weights in the path */
208
+ static int ConicWeightCnt(const SkPath& path) {
209
+ return path.fPathRef->countWeights();
210
+ }
211
+
212
+ /** Returns a raw pointer to the path conic weights. */
213
+ static const SkScalar* ConicWeightData(const SkPath& path) {
214
+ return path.fPathRef->conicWeights();
215
+ }
216
+
217
+ /** Returns true if the underlying SkPathRef has one single owner. */
218
+ static bool TestingOnly_unique(const SkPath& path) {
219
+ return path.fPathRef->unique();
220
+ }
221
+
222
+ // Won't be needed once we can make path's immutable (with their bounds always computed)
223
+ static bool HasComputedBounds(const SkPath& path) {
224
+ return path.hasComputedBounds();
225
+ }
226
+
227
+ /** Returns true if constructed by addCircle(), addOval(); and in some cases,
228
+ addRoundRect(), addRRect(). SkPath constructed with conicTo() or rConicTo() will not
229
+ return true though SkPath draws oval.
230
+
231
+ rect receives bounds of oval.
232
+ dir receives SkPathDirection of oval: kCW_Direction if clockwise, kCCW_Direction if
233
+ counterclockwise.
234
+ start receives start of oval: 0 for top, 1 for right, 2 for bottom, 3 for left.
235
+
236
+ rect, dir, and start are unmodified if oval is not found.
237
+
238
+ Triggers performance optimizations on some GPU surface implementations.
239
+
240
+ @param rect storage for bounding SkRect of oval; may be nullptr
241
+ @param dir storage for SkPathDirection; may be nullptr
242
+ @param start storage for start of oval; may be nullptr
243
+ @return true if SkPath was constructed by method that reduces to oval
244
+ */
245
+ static bool IsOval(const SkPath& path, SkRect* rect, SkPathDirection* dir, unsigned* start) {
246
+ bool isCCW = false;
247
+ bool result = path.fPathRef->isOval(rect, &isCCW, start);
248
+ if (dir && result) {
249
+ *dir = isCCW ? SkPathDirection::kCCW : SkPathDirection::kCW;
250
+ }
251
+ return result;
252
+ }
253
+
254
+ /** Returns true if constructed by addRoundRect(), addRRect(); and if construction
255
+ is not empty, not SkRect, and not oval. SkPath constructed with other calls
256
+ will not return true though SkPath draws SkRRect.
257
+
258
+ rrect receives bounds of SkRRect.
259
+ dir receives SkPathDirection of oval: kCW_Direction if clockwise, kCCW_Direction if
260
+ counterclockwise.
261
+ start receives start of SkRRect: 0 for top, 1 for right, 2 for bottom, 3 for left.
262
+
263
+ rrect, dir, and start are unmodified if SkRRect is not found.
264
+
265
+ Triggers performance optimizations on some GPU surface implementations.
266
+
267
+ @param rrect storage for bounding SkRect of SkRRect; may be nullptr
268
+ @param dir storage for SkPathDirection; may be nullptr
269
+ @param start storage for start of SkRRect; may be nullptr
270
+ @return true if SkPath contains only SkRRect
271
+ */
272
+ static bool IsRRect(const SkPath& path, SkRRect* rrect, SkPathDirection* dir,
273
+ unsigned* start) {
274
+ bool isCCW = false;
275
+ bool result = path.fPathRef->isRRect(rrect, &isCCW, start);
276
+ if (dir && result) {
277
+ *dir = isCCW ? SkPathDirection::kCCW : SkPathDirection::kCW;
278
+ }
279
+ return result;
280
+ }
281
+
282
+ /**
283
+ * Sometimes in the drawing pipeline, we have to perform math on path coordinates, even after
284
+ * the path is in device-coordinates. Tessellation and clipping are two examples. Usually this
285
+ * is pretty modest, but it can involve subtracting/adding coordinates, or multiplying by
286
+ * small constants (e.g. 2,3,4). To try to preflight issues where these optionations could turn
287
+ * finite path values into infinities (or NaNs), we allow the upper drawing code to reject
288
+ * the path if its bounds (in device coordinates) is too close to max float.
289
+ */
290
+ static bool TooBigForMath(const SkRect& bounds) {
291
+ // This value is just a guess. smaller is safer, but we don't want to reject largish paths
292
+ // that we don't have to.
293
+ constexpr SkScalar scale_down_to_allow_for_small_multiplies = 0.25f;
294
+ constexpr SkScalar max = SK_ScalarMax * scale_down_to_allow_for_small_multiplies;
295
+
296
+ // use ! expression so we return true if bounds contains NaN
297
+ return !(bounds.fLeft >= -max && bounds.fTop >= -max &&
298
+ bounds.fRight <= max && bounds.fBottom <= max);
299
+ }
300
+ static bool TooBigForMath(const SkPath& path) {
301
+ return TooBigForMath(path.getBounds());
302
+ }
303
+
304
+ // Returns number of valid points for each SkPath::Iter verb
305
+ static int PtsInIter(unsigned verb) {
306
+ static const uint8_t gPtsInVerb[] = {
307
+ 1, // kMove pts[0]
308
+ 2, // kLine pts[0..1]
309
+ 3, // kQuad pts[0..2]
310
+ 3, // kConic pts[0..2]
311
+ 4, // kCubic pts[0..3]
312
+ 0, // kClose
313
+ 0 // kDone
314
+ };
315
+
316
+ SkASSERT(verb < std::size(gPtsInVerb));
317
+ return gPtsInVerb[verb];
318
+ }
319
+
320
+ // Returns number of valid points for each verb, not including the "starter"
321
+ // point that the Iterator adds for line/quad/conic/cubic
322
+ static int PtsInVerb(unsigned verb) {
323
+ static const uint8_t gPtsInVerb[] = {
324
+ 1, // kMove pts[0]
325
+ 1, // kLine pts[0..1]
326
+ 2, // kQuad pts[0..2]
327
+ 2, // kConic pts[0..2]
328
+ 3, // kCubic pts[0..3]
329
+ 0, // kClose
330
+ 0 // kDone
331
+ };
332
+
333
+ SkASSERT(verb < std::size(gPtsInVerb));
334
+ return gPtsInVerb[verb];
335
+ }
336
+
337
+ static bool IsAxisAligned(const SkPath& path);
338
+
339
+ static bool AllPointsEq(const SkPoint pts[], int count) {
340
+ for (int i = 1; i < count; ++i) {
341
+ if (pts[0] != pts[i]) {
342
+ return false;
343
+ }
344
+ }
345
+ return true;
346
+ }
347
+
348
+ static int LastMoveToIndex(const SkPath& path) { return path.fLastMoveToIndex; }
349
+
350
+ static bool IsRectContour(const SkPath&, bool allowPartial, int* currVerb,
351
+ const SkPoint** ptsPtr, bool* isClosed, SkPathDirection* direction,
352
+ SkRect* rect);
353
+
354
+ /** Returns true if SkPath is equivalent to nested SkRect pair when filled.
355
+ If false, rect and dirs are unchanged.
356
+ If true, rect and dirs are written to if not nullptr:
357
+ setting rect[0] to outer SkRect, and rect[1] to inner SkRect;
358
+ setting dirs[0] to SkPathDirection of outer SkRect, and dirs[1] to SkPathDirection of
359
+ inner SkRect.
360
+
361
+ @param rect storage for SkRect pair; may be nullptr
362
+ @param dirs storage for SkPathDirection pair; may be nullptr
363
+ @return true if SkPath contains nested SkRect pair
364
+ */
365
+ static bool IsNestedFillRects(const SkPath&, SkRect rect[2],
366
+ SkPathDirection dirs[2] = nullptr);
367
+
368
+ static bool IsInverseFillType(SkPathFillType fill) {
369
+ return (static_cast<int>(fill) & 2) != 0;
370
+ }
371
+
372
+ /** Returns equivalent SkPath::FillType representing SkPath fill inside its bounds.
373
+ .
374
+
375
+ @param fill one of: kWinding_FillType, kEvenOdd_FillType,
376
+ kInverseWinding_FillType, kInverseEvenOdd_FillType
377
+ @return fill, or kWinding_FillType or kEvenOdd_FillType if fill is inverted
378
+ */
379
+ static SkPathFillType ConvertToNonInverseFillType(SkPathFillType fill) {
380
+ return (SkPathFillType)(static_cast<int>(fill) & 1);
381
+ }
382
+
383
+ /**
384
+ * If needed (to not blow-up under a perspective matrix), clip the path, returning the
385
+ * answer in "result", and return true.
386
+ *
387
+ * Note result might be empty (if the path was completely clipped out).
388
+ *
389
+ * If no clipping is needed, returns false and "result" is left unchanged.
390
+ */
391
+ static bool PerspectiveClip(const SkPath& src, const SkMatrix&, SkPath* result);
392
+
393
+ /**
394
+ * Gets the number of GenIDChangeListeners. If another thread has access to this path then
395
+ * this may be stale before return and only indicates that the count was the return value
396
+ * at some point during the execution of the function.
397
+ */
398
+ static int GenIDChangeListenersCount(const SkPath&);
399
+
400
+ static void UpdatePathPoint(SkPath* path, int index, const SkPoint& pt) {
401
+ SkASSERT(index < path->countPoints());
402
+ SkPathRef::Editor ed(&path->fPathRef);
403
+ ed.writablePoints()[index] = pt;
404
+ path->dirtyAfterEdit();
405
+ }
406
+
407
+ static SkPathConvexity GetConvexity(const SkPath& path) {
408
+ return path.getConvexity();
409
+ }
410
+ static SkPathConvexity GetConvexityOrUnknown(const SkPath& path) {
411
+ return path.getConvexityOrUnknown();
412
+ }
413
+ static void SetConvexity(const SkPath& path, SkPathConvexity c) {
414
+ path.setConvexity(c);
415
+ }
416
+ static void ForceComputeConvexity(const SkPath& path) {
417
+ path.setConvexity(SkPathConvexity::kUnknown);
418
+ (void)path.isConvex();
419
+ }
420
+
421
+ static void ReverseAddPath(SkPathBuilder* builder, const SkPath& reverseMe) {
422
+ builder->privateReverseAddPath(reverseMe);
423
+ }
424
+
425
+ static SkPath MakePath(const SkPathVerbAnalysis& analysis,
426
+ const SkPoint points[],
427
+ const uint8_t verbs[],
428
+ int verbCount,
429
+ const SkScalar conics[],
430
+ SkPathFillType fillType,
431
+ bool isVolatile) {
432
+ return SkPath::MakeInternal(analysis, points, verbs, verbCount, conics, fillType,
433
+ isVolatile);
434
+ }
435
+ };
436
+
437
+ // Lightweight variant of SkPath::Iter that only returns segments (e.g. lines/conics).
438
+ // Does not return kMove or kClose.
439
+ // Always "auto-closes" each contour.
440
+ // Roughly the same as SkPath::Iter(path, true), but does not return moves or closes
441
+ //
442
+ class SkPathEdgeIter {
443
+ const uint8_t* fVerbs;
444
+ const uint8_t* fVerbsStop;
445
+ const SkPoint* fPts;
446
+ const SkPoint* fMoveToPtr;
447
+ const SkScalar* fConicWeights;
448
+ SkPoint fScratch[2]; // for auto-close lines
449
+ bool fNeedsCloseLine;
450
+ bool fNextIsNewContour;
451
+ SkDEBUGCODE(bool fIsConic;)
452
+
453
+ enum {
454
+ kIllegalEdgeValue = 99
455
+ };
456
+
457
+ public:
458
+ SkPathEdgeIter(const SkPath& path);
459
+
460
+ SkScalar conicWeight() const {
461
+ SkASSERT(fIsConic);
462
+ return *fConicWeights;
463
+ }
464
+
465
+ enum class Edge {
466
+ kLine = SkPath::kLine_Verb,
467
+ kQuad = SkPath::kQuad_Verb,
468
+ kConic = SkPath::kConic_Verb,
469
+ kCubic = SkPath::kCubic_Verb,
470
+ };
471
+
472
+ static SkPath::Verb EdgeToVerb(Edge e) {
473
+ return SkPath::Verb(e);
474
+ }
475
+
476
+ struct Result {
477
+ const SkPoint* fPts; // points for the segment, or null if done
478
+ Edge fEdge;
479
+ bool fIsNewContour;
480
+
481
+ // Returns true when it holds an Edge, false when the path is done.
482
+ explicit operator bool() { return fPts != nullptr; }
483
+ };
484
+
485
+ Result next() {
486
+ auto closeline = [&]() {
487
+ fScratch[0] = fPts[-1];
488
+ fScratch[1] = *fMoveToPtr;
489
+ fNeedsCloseLine = false;
490
+ fNextIsNewContour = true;
491
+ return Result{ fScratch, Edge::kLine, false };
492
+ };
493
+
494
+ for (;;) {
495
+ SkASSERT(fVerbs <= fVerbsStop);
496
+ if (fVerbs == fVerbsStop) {
497
+ return fNeedsCloseLine
498
+ ? closeline()
499
+ : Result{ nullptr, Edge(kIllegalEdgeValue), false };
500
+ }
501
+
502
+ SkDEBUGCODE(fIsConic = false;)
503
+
504
+ const auto v = *fVerbs++;
505
+ switch (v) {
506
+ case SkPath::kMove_Verb: {
507
+ if (fNeedsCloseLine) {
508
+ auto res = closeline();
509
+ fMoveToPtr = fPts++;
510
+ return res;
511
+ }
512
+ fMoveToPtr = fPts++;
513
+ fNextIsNewContour = true;
514
+ } break;
515
+ case SkPath::kClose_Verb:
516
+ if (fNeedsCloseLine) return closeline();
517
+ break;
518
+ default: {
519
+ // Actual edge.
520
+ const int pts_count = (v+2) / 2,
521
+ cws_count = (v & (v-1)) / 2;
522
+ SkASSERT(pts_count == SkPathPriv::PtsInIter(v) - 1);
523
+
524
+ fNeedsCloseLine = true;
525
+ fPts += pts_count;
526
+ fConicWeights += cws_count;
527
+
528
+ SkDEBUGCODE(fIsConic = (v == SkPath::kConic_Verb);)
529
+ SkASSERT(fIsConic == (cws_count > 0));
530
+
531
+ bool isNewContour = fNextIsNewContour;
532
+ fNextIsNewContour = false;
533
+ return { &fPts[-(pts_count + 1)], Edge(v), isNewContour };
534
+ }
535
+ }
536
+ }
537
+ }
538
+ };
539
+
540
+ #endif
@@ -1,7 +1,9 @@
1
1
  import type { SharedValueType } from "../../renderer/processors/Animations";
2
2
  export declare const HAS_REANIMATED2: boolean;
3
3
  export declare const HAS_REANIMATED3: boolean;
4
+ export declare function throwOnMissingReanimated(): void;
4
5
  export declare const useSharedValue: any;
6
+ export declare const useFrameCallback: (...args: any[]) => any;
5
7
  export declare const startMapper: any;
6
8
  export declare const stopMapper: any;
7
9
  export declare const runOnJS: any;
@@ -3,17 +3,17 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.useSharedValue = exports.stopMapper = exports.startMapper = exports.runOnJS = exports.isSharedValue = exports.HAS_REANIMATED3 = exports.HAS_REANIMATED2 = void 0;
6
+ exports.stopMapper = exports.startMapper = exports.runOnJS = exports.isSharedValue = exports.HAS_REANIMATED3 = exports.HAS_REANIMATED2 = void 0;
7
+ exports.throwOnMissingReanimated = throwOnMissingReanimated;
8
+ exports.useSharedValue = exports.useFrameCallback = void 0;
7
9
 
8
10
  var _react = require("react");
9
11
 
10
- var _Reanimated, _Reanimated2, _Reanimated3, _Reanimated4;
12
+ var _Reanimated, _Reanimated2, _Reanimated3, _Reanimated4, _Reanimated5;
11
13
 
12
14
  // This one is needed for the deprecated useSharedValue function
13
15
  // We can remove it once we remove the deprecation
14
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
15
- let Reanimated2; // eslint-disable-next-line @typescript-eslint/no-explicit-any
16
-
16
+ let Reanimated2;
17
17
  let Reanimated3;
18
18
  let reanimatedVersion;
19
19
 
@@ -32,7 +32,7 @@ exports.HAS_REANIMATED2 = HAS_REANIMATED2;
32
32
  const HAS_REANIMATED3 = !!Reanimated3;
33
33
  exports.HAS_REANIMATED3 = HAS_REANIMATED3;
34
34
 
35
- function throwOnMissingReanimated2() {
35
+ function throwOnMissingReanimated() {
36
36
  if (!HAS_REANIMATED2) {
37
37
  throw new Error("Reanimated was not found, make sure react-native-reanimated package is installed if you want to use \
38
38
  react-native-skia's integration layer API.");
@@ -43,8 +43,6 @@ function throwOnMissingReanimated3() {
43
43
  if (!HAS_REANIMATED3) {
44
44
  throw new Error(`Reanimated version ${reanimatedVersion} is not supported, please upgrade to 3.0.0 or newer.`);
45
45
  }
46
-
47
- throwOnMissingReanimated2();
48
46
  }
49
47
 
50
48
  const useSharedValue = ((_Reanimated = Reanimated2) === null || _Reanimated === void 0 ? void 0 : _Reanimated.useSharedValue) || (value => (0, _react.useMemo)(() => ({
@@ -52,11 +50,13 @@ const useSharedValue = ((_Reanimated = Reanimated2) === null || _Reanimated ===
52
50
  }), [value]));
53
51
 
54
52
  exports.useSharedValue = useSharedValue;
55
- const startMapper = ((_Reanimated2 = Reanimated2) === null || _Reanimated2 === void 0 ? void 0 : _Reanimated2.startMapper) || throwOnMissingReanimated2;
53
+ const useFrameCallback = ((_Reanimated2 = Reanimated2) === null || _Reanimated2 === void 0 ? void 0 : _Reanimated2.useFrameCallback) || throwOnMissingReanimated;
54
+ exports.useFrameCallback = useFrameCallback;
55
+ const startMapper = ((_Reanimated3 = Reanimated2) === null || _Reanimated3 === void 0 ? void 0 : _Reanimated3.startMapper) || throwOnMissingReanimated;
56
56
  exports.startMapper = startMapper;
57
- const stopMapper = ((_Reanimated3 = Reanimated2) === null || _Reanimated3 === void 0 ? void 0 : _Reanimated3.stopMapper) || throwOnMissingReanimated2;
57
+ const stopMapper = ((_Reanimated4 = Reanimated2) === null || _Reanimated4 === void 0 ? void 0 : _Reanimated4.stopMapper) || throwOnMissingReanimated;
58
58
  exports.stopMapper = stopMapper;
59
- const runOnJS = ((_Reanimated4 = Reanimated2) === null || _Reanimated4 === void 0 ? void 0 : _Reanimated4.runOnJS) || throwOnMissingReanimated2;
59
+ const runOnJS = ((_Reanimated5 = Reanimated2) === null || _Reanimated5 === void 0 ? void 0 : _Reanimated5.runOnJS) || throwOnMissingReanimated;
60
60
  exports.runOnJS = runOnJS;
61
61
 
62
62
  const isSharedValue = value => {
@@ -1 +1 @@
1
- {"version":3,"names":["Reanimated2","Reanimated3","reanimatedVersion","require","version","includes","e","HAS_REANIMATED2","HAS_REANIMATED3","throwOnMissingReanimated2","Error","throwOnMissingReanimated3","useSharedValue","value","useMemo","startMapper","stopMapper","runOnJS","isSharedValue"],"sources":["moduleWrapper.ts"],"sourcesContent":["import { useMemo } from \"react\";\n\nimport type { SharedValueType } from \"../../renderer/processors/Animations\";\n\n// This one is needed for the deprecated useSharedValue function\n// We can remove it once we remove the deprecation\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nlet Reanimated2: any;\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nlet Reanimated3: any;\nlet reanimatedVersion: string;\n\ntry {\n Reanimated2 = require(\"react-native-reanimated\");\n reanimatedVersion =\n // eslint-disable-next-line import/extensions\n require(\"react-native-reanimated/package.json\").version;\n if (\n reanimatedVersion &&\n (reanimatedVersion >= \"3.0.0\" || reanimatedVersion.includes(\"3.0.0-\"))\n ) {\n Reanimated3 = Reanimated2;\n }\n} catch (e) {}\n\nexport const HAS_REANIMATED2 = !!Reanimated2;\nexport const HAS_REANIMATED3 = !!Reanimated3;\n\nfunction throwOnMissingReanimated2() {\n if (!HAS_REANIMATED2) {\n throw new Error(\n \"Reanimated was not found, make sure react-native-reanimated package is installed if you want to use \\\n react-native-skia's integration layer API.\"\n );\n }\n}\n\nfunction throwOnMissingReanimated3() {\n if (!HAS_REANIMATED3) {\n throw new Error(\n `Reanimated version ${reanimatedVersion} is not supported, please upgrade to 3.0.0 or newer.`\n );\n }\n throwOnMissingReanimated2();\n}\n\nexport const useSharedValue =\n Reanimated2?.useSharedValue ||\n ((value: number) => useMemo(() => ({ value }), [value]));\n\nexport const startMapper =\n Reanimated2?.startMapper || throwOnMissingReanimated2;\nexport const stopMapper = Reanimated2?.stopMapper || throwOnMissingReanimated2;\nexport const runOnJS = Reanimated2?.runOnJS || throwOnMissingReanimated2;\nexport const isSharedValue = <T>(\n value: unknown\n): value is SharedValueType<T> => {\n throwOnMissingReanimated3();\n return !!value && Reanimated3.isSharedValue(value);\n};\n"],"mappings":";;;;;;;AAAA;;;;AAIA;AACA;AACA;AACA,IAAIA,WAAJ,C,CACA;;AACA,IAAIC,WAAJ;AACA,IAAIC,iBAAJ;;AAEA,IAAI;EACFF,WAAW,GAAGG,OAAO,CAAC,yBAAD,CAArB;EACAD,iBAAiB,GACf;EACAC,OAAO,CAAC,sCAAD,CAAP,CAAgDC,OAFlD;;EAGA,IACEF,iBAAiB,KAChBA,iBAAiB,IAAI,OAArB,IAAgCA,iBAAiB,CAACG,QAAlB,CAA2B,QAA3B,CADhB,CADnB,EAGE;IACAJ,WAAW,GAAGD,WAAd;EACD;AACF,CAXD,CAWE,OAAOM,CAAP,EAAU,CAAE;;AAEP,MAAMC,eAAe,GAAG,CAAC,CAACP,WAA1B;;AACA,MAAMQ,eAAe,GAAG,CAAC,CAACP,WAA1B;;;AAEP,SAASQ,yBAAT,GAAqC;EACnC,IAAI,CAACF,eAAL,EAAsB;IACpB,MAAM,IAAIG,KAAJ,CACJ;AACN,iDAFU,CAAN;EAID;AACF;;AAED,SAASC,yBAAT,GAAqC;EACnC,IAAI,CAACH,eAAL,EAAsB;IACpB,MAAM,IAAIE,KAAJ,CACH,sBAAqBR,iBAAkB,sDADpC,CAAN;EAGD;;EACDO,yBAAyB;AAC1B;;AAEM,MAAMG,cAAc,GACzB,gBAAAZ,WAAW,UAAX,kDAAaY,cAAb,MACEC,KAAD,IAAmB,IAAAC,cAAA,EAAQ,OAAO;EAAED;AAAF,CAAP,CAAR,EAA2B,CAACA,KAAD,CAA3B,CADpB,CADK;;;AAIA,MAAME,WAAW,GACtB,iBAAAf,WAAW,UAAX,oDAAae,WAAb,KAA4BN,yBADvB;;AAEA,MAAMO,UAAU,GAAG,iBAAAhB,WAAW,UAAX,oDAAagB,UAAb,KAA2BP,yBAA9C;;AACA,MAAMQ,OAAO,GAAG,iBAAAjB,WAAW,UAAX,oDAAaiB,OAAb,KAAwBR,yBAAxC;;;AACA,MAAMS,aAAa,GACxBL,KAD2B,IAEK;EAChCF,yBAAyB;EACzB,OAAO,CAAC,CAACE,KAAF,IAAWZ,WAAW,CAACiB,aAAZ,CAA0BL,KAA1B,CAAlB;AACD,CALM"}
1
+ {"version":3,"names":["Reanimated2","Reanimated3","reanimatedVersion","require","version","includes","e","HAS_REANIMATED2","HAS_REANIMATED3","throwOnMissingReanimated","Error","throwOnMissingReanimated3","useSharedValue","value","useMemo","useFrameCallback","startMapper","stopMapper","runOnJS","isSharedValue"],"sources":["moduleWrapper.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { useMemo } from \"react\";\n\nimport type { SharedValueType } from \"../../renderer/processors/Animations\";\n\n// This one is needed for the deprecated useSharedValue function\n// We can remove it once we remove the deprecation\n\nlet Reanimated2: any;\n\nlet Reanimated3: any;\nlet reanimatedVersion: string;\n\ntry {\n Reanimated2 = require(\"react-native-reanimated\");\n reanimatedVersion =\n // eslint-disable-next-line import/extensions\n require(\"react-native-reanimated/package.json\").version;\n if (\n reanimatedVersion &&\n (reanimatedVersion >= \"3.0.0\" || reanimatedVersion.includes(\"3.0.0-\"))\n ) {\n Reanimated3 = Reanimated2;\n }\n} catch (e) {}\n\nexport const HAS_REANIMATED2 = !!Reanimated2;\nexport const HAS_REANIMATED3 = !!Reanimated3;\n\nexport function throwOnMissingReanimated() {\n if (!HAS_REANIMATED2) {\n throw new Error(\n \"Reanimated was not found, make sure react-native-reanimated package is installed if you want to use \\\n react-native-skia's integration layer API.\"\n );\n }\n}\n\nfunction throwOnMissingReanimated3() {\n if (!HAS_REANIMATED3) {\n throw new Error(\n `Reanimated version ${reanimatedVersion} is not supported, please upgrade to 3.0.0 or newer.`\n );\n }\n}\n\nexport const useSharedValue =\n Reanimated2?.useSharedValue ||\n ((value: number) => useMemo(() => ({ value }), [value]));\nexport const useFrameCallback: (...args: any[]) => any =\n Reanimated2?.useFrameCallback || throwOnMissingReanimated;\n\nexport const startMapper = Reanimated2?.startMapper || throwOnMissingReanimated;\nexport const stopMapper = Reanimated2?.stopMapper || throwOnMissingReanimated;\nexport const runOnJS = Reanimated2?.runOnJS || throwOnMissingReanimated;\nexport const isSharedValue = <T>(\n value: unknown\n): value is SharedValueType<T> => {\n throwOnMissingReanimated3();\n return !!value && Reanimated3.isSharedValue(value);\n};\n"],"mappings":";;;;;;;;;AACA;;;;AAIA;AACA;AAEA,IAAIA,WAAJ;AAEA,IAAIC,WAAJ;AACA,IAAIC,iBAAJ;;AAEA,IAAI;EACFF,WAAW,GAAGG,OAAO,CAAC,yBAAD,CAArB;EACAD,iBAAiB,GACf;EACAC,OAAO,CAAC,sCAAD,CAAP,CAAgDC,OAFlD;;EAGA,IACEF,iBAAiB,KAChBA,iBAAiB,IAAI,OAArB,IAAgCA,iBAAiB,CAACG,QAAlB,CAA2B,QAA3B,CADhB,CADnB,EAGE;IACAJ,WAAW,GAAGD,WAAd;EACD;AACF,CAXD,CAWE,OAAOM,CAAP,EAAU,CAAE;;AAEP,MAAMC,eAAe,GAAG,CAAC,CAACP,WAA1B;;AACA,MAAMQ,eAAe,GAAG,CAAC,CAACP,WAA1B;;;AAEA,SAASQ,wBAAT,GAAoC;EACzC,IAAI,CAACF,eAAL,EAAsB;IACpB,MAAM,IAAIG,KAAJ,CACJ;AACN,iDAFU,CAAN;EAID;AACF;;AAED,SAASC,yBAAT,GAAqC;EACnC,IAAI,CAACH,eAAL,EAAsB;IACpB,MAAM,IAAIE,KAAJ,CACH,sBAAqBR,iBAAkB,sDADpC,CAAN;EAGD;AACF;;AAEM,MAAMU,cAAc,GACzB,gBAAAZ,WAAW,UAAX,kDAAaY,cAAb,MACEC,KAAD,IAAmB,IAAAC,cAAA,EAAQ,OAAO;EAAED;AAAF,CAAP,CAAR,EAA2B,CAACA,KAAD,CAA3B,CADpB,CADK;;;AAGA,MAAME,gBAAyC,GACpD,iBAAAf,WAAW,UAAX,oDAAae,gBAAb,KAAiCN,wBAD5B;;AAGA,MAAMO,WAAW,GAAG,iBAAAhB,WAAW,UAAX,oDAAagB,WAAb,KAA4BP,wBAAhD;;AACA,MAAMQ,UAAU,GAAG,iBAAAjB,WAAW,UAAX,oDAAaiB,UAAb,KAA2BR,wBAA9C;;AACA,MAAMS,OAAO,GAAG,iBAAAlB,WAAW,UAAX,oDAAakB,OAAb,KAAwBT,wBAAxC;;;AACA,MAAMU,aAAa,GACxBN,KAD2B,IAEK;EAChCF,yBAAyB;EACzB,OAAO,CAAC,CAACE,KAAF,IAAWZ,WAAW,CAACkB,aAAZ,CAA0BN,KAA1B,CAAlB;AACD,CALM"}
@@ -0,0 +1,6 @@
1
+ import type { DataSourceParam } from "../types";
2
+ /**
3
+ * Returns a Skia Animated Image object
4
+ * */
5
+ export declare const useAnimatedImage: (source: DataSourceParam, onError?: ((err: Error) => void) | undefined) => import("../types").SkAnimatedImage | null;
6
+ export declare const useAnimatedImageValue: (source: DataSourceParam) => any;