@shopify/react-native-skia 1.5.3 → 1.5.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (87) hide show
  1. package/android/CMakeLists.txt +52 -13
  2. package/android/build.gradle +3 -0
  3. package/android/cpp/rnskia-android/RNSkAndroidPlatformContext.h +18 -1
  4. package/android/cpp/rnskia-android/RNSkAndroidVideo.cpp +12 -1
  5. package/android/cpp/rnskia-android/RNSkOpenGLCanvasProvider.cpp +13 -0
  6. package/android/src/main/java/com/shopify/reactnative/skia/SkiaBaseView.java +0 -1
  7. package/cpp/api/JsiSkImage.h +15 -2
  8. package/cpp/api/JsiSkSurface.h +18 -3
  9. package/cpp/rnskia/DawnContext.h +241 -0
  10. package/cpp/rnskia/DawnUtils.h +127 -0
  11. package/cpp/rnskia/DawnWindowContext.cpp +19 -0
  12. package/cpp/rnskia/DawnWindowContext.h +77 -0
  13. package/cpp/rnskia/ImageProvider.h +100 -0
  14. package/cpp/rnskia/RNSkView.h +6 -0
  15. package/cpp/skia/include/android/SkAnimatedImage.h +14 -0
  16. package/cpp/skia/include/codec/SkAvifDecoder.h +39 -3
  17. package/cpp/skia/include/codec/SkCodec.h +16 -0
  18. package/cpp/skia/include/config/SkUserConfig.h +3 -2
  19. package/cpp/skia/include/core/SkCanvas.h +55 -10
  20. package/cpp/skia/include/core/SkContourMeasure.h +76 -0
  21. package/cpp/skia/include/core/SkFontScanner.h +48 -0
  22. package/cpp/skia/include/core/SkMilestone.h +1 -1
  23. package/cpp/skia/include/core/SkPath.h +11 -0
  24. package/cpp/skia/include/core/SkPathEffect.h +0 -23
  25. package/cpp/skia/include/core/SkRect.h +2 -0
  26. package/cpp/skia/include/core/SkString.h +4 -0
  27. package/cpp/skia/include/core/SkTypeface.h +5 -0
  28. package/cpp/skia/include/core/SkTypes.h +8 -3
  29. package/cpp/skia/include/docs/SkPDFDocument.h +3 -3
  30. package/cpp/skia/include/effects/SkOverdrawColorFilter.h +1 -0
  31. package/cpp/skia/include/effects/SkRuntimeEffect.h +2 -1
  32. package/cpp/skia/include/encode/SkJpegEncoder.h +4 -0
  33. package/cpp/skia/include/gpu/ganesh/GrContextOptions.h +8 -1
  34. package/cpp/skia/include/gpu/ganesh/GrDirectContext.h +18 -3
  35. package/cpp/skia/include/gpu/ganesh/GrTypes.h +11 -0
  36. package/cpp/skia/include/gpu/ganesh/gl/GrGLFunctions.h +5 -1
  37. package/cpp/skia/include/gpu/ganesh/gl/GrGLInterface.h +0 -1
  38. package/cpp/skia/include/gpu/graphite/GraphiteTypes.h +8 -0
  39. package/cpp/skia/include/gpu/graphite/Recorder.h +0 -2
  40. package/cpp/skia/include/gpu/graphite/precompile/PaintOptions.h +7 -4
  41. package/cpp/skia/include/gpu/graphite/precompile/PrecompileImageFilter.h +2 -0
  42. package/cpp/skia/include/gpu/graphite/precompile/PrecompileMaskFilter.h +2 -0
  43. package/cpp/skia/include/ports/SkFontMgr_android_ndk.h +25 -0
  44. package/cpp/skia/include/ports/SkFontMgr_fontconfig.h +4 -2
  45. package/cpp/skia/include/ports/SkFontScanner_Fontations.h +15 -0
  46. package/cpp/skia/include/ports/SkFontScanner_FreeType.h +15 -0
  47. package/cpp/skia/include/private/SkExif.h +14 -0
  48. package/cpp/skia/include/private/SkPathRef.h +36 -0
  49. package/cpp/skia/include/private/base/SkFeatures.h +4 -0
  50. package/cpp/skia/include/private/base/SkSpan_impl.h +1 -3
  51. package/cpp/skia/modules/skcms/src/skcms_internals.h +3 -0
  52. package/cpp/skia/src/base/SkMathPriv.h +1 -8
  53. package/ios/RNSkia-iOS/RNSkMetalCanvasProvider.h +1 -2
  54. package/ios/RNSkia-iOS/RNSkMetalCanvasProvider.mm +25 -19
  55. package/ios/RNSkia-iOS/RNSkiOSPlatformContext.mm +23 -0
  56. package/ios/RNSkia-iOS/SkiaMetalSurfaceFactory.h +22 -8
  57. package/ios/RNSkia-iOS/SkiaMetalSurfaceFactory.mm +0 -20
  58. package/libs/android/arm64-v8a/libskia.a +0 -0
  59. package/libs/android/arm64-v8a/libskottie.a +0 -0
  60. package/libs/android/armeabi-v7a/libskia.a +0 -0
  61. package/libs/android/armeabi-v7a/libskottie.a +0 -0
  62. package/libs/android/x86/libskia.a +0 -0
  63. package/libs/android/x86/libskottie.a +0 -0
  64. package/libs/android/x86_64/libskia.a +0 -0
  65. package/libs/android/x86_64/libskottie.a +0 -0
  66. package/libs/ios/libskia.xcframework/ios-arm64_arm64e/libskia.a +0 -0
  67. package/libs/ios/libskia.xcframework/ios-arm64_arm64e_x86_64-simulator/libskia.a +0 -0
  68. package/libs/ios/libskottie.xcframework/ios-arm64_arm64e/libskottie.a +0 -0
  69. package/libs/ios/libskottie.xcframework/ios-arm64_arm64e_x86_64-simulator/libskottie.a +0 -0
  70. package/libs/ios/libskparagraph.xcframework/ios-arm64_arm64e/libskparagraph.a +0 -0
  71. package/libs/ios/libskparagraph.xcframework/ios-arm64_arm64e_x86_64-simulator/libskparagraph.a +0 -0
  72. package/libs/ios/libsksg.xcframework/ios-arm64_arm64e/libsksg.a +0 -0
  73. package/libs/ios/libsksg.xcframework/ios-arm64_arm64e_x86_64-simulator/libsksg.a +0 -0
  74. package/libs/ios/libskshaper.xcframework/Info.plist +5 -5
  75. package/libs/ios/libskshaper.xcframework/ios-arm64_arm64e/libskshaper.a +0 -0
  76. package/libs/ios/libskshaper.xcframework/ios-arm64_arm64e_x86_64-simulator/libskshaper.a +0 -0
  77. package/libs/ios/libskunicode_core.xcframework/Info.plist +5 -5
  78. package/libs/ios/libskunicode_core.xcframework/ios-arm64_arm64e/libskunicode_core.a +0 -0
  79. package/libs/ios/libskunicode_core.xcframework/ios-arm64_arm64e_x86_64-simulator/libskunicode_core.a +0 -0
  80. package/libs/ios/libskunicode_libgrapheme.xcframework/Info.plist +5 -5
  81. package/libs/ios/libskunicode_libgrapheme.xcframework/ios-arm64_arm64e/libskunicode_libgrapheme.a +0 -0
  82. package/libs/ios/libskunicode_libgrapheme.xcframework/ios-arm64_arm64e_x86_64-simulator/libskunicode_libgrapheme.a +0 -0
  83. package/libs/ios/libsvg.xcframework/ios-arm64_arm64e/libsvg.a +0 -0
  84. package/libs/ios/libsvg.xcframework/ios-arm64_arm64e_x86_64-simulator/libsvg.a +0 -0
  85. package/package.json +1 -1
  86. package/react-native-skia.podspec +35 -9
  87. package/src/renderer/__tests__/e2e/SVG.spec.tsx +2 -1
@@ -11,13 +11,17 @@
11
11
  #include "include/core/SkPoint.h"
12
12
  #include "include/core/SkRefCnt.h"
13
13
  #include "include/core/SkScalar.h"
14
+ #include "include/core/SkSpan.h"
14
15
  #include "include/private/base/SkAPI.h"
16
+ #include "include/private/base/SkAssert.h"
15
17
  #include "include/private/base/SkTDArray.h"
16
18
 
19
+ #include <cstddef>
17
20
  #include <memory>
18
21
 
19
22
  class SkMatrix;
20
23
  class SkPath;
24
+ enum class SkPathVerb;
21
25
 
22
26
  class SK_API SkContourMeasure : public SkRefCnt {
23
27
  public:
@@ -57,6 +61,78 @@ public:
57
61
  */
58
62
  bool isClosed() const { return fIsClosed; }
59
63
 
64
+ /** Measurement data for individual verbs.
65
+ */
66
+ struct VerbMeasure {
67
+ SkScalar fDistance; // Cumulative distance along the current contour.
68
+ SkPathVerb fVerb; // Verb type.
69
+ SkSpan<const SkPoint> fPts; // Verb points.
70
+ };
71
+
72
+ private:
73
+ struct Segment;
74
+
75
+ public:
76
+ /** Utility for iterating over the current contour verbs:
77
+ *
78
+ * for (const auto verb_measure : contour_measure) {
79
+ * ...
80
+ * }
81
+ */
82
+ class ForwardVerbIterator final {
83
+ public:
84
+ VerbMeasure operator*() const;
85
+
86
+ ForwardVerbIterator& operator++() {
87
+ SkASSERT(!fSegments.empty());
88
+
89
+ fSegments = LastSegForCurrentVerb(fSegments.subspan(1));
90
+
91
+ return *this;
92
+ }
93
+
94
+ bool operator==(const ForwardVerbIterator& other) {
95
+ SkASSERT(fSegments.data() != other.fSegments.data() ||
96
+ fSegments.size() == other.fSegments.size());
97
+ return fSegments.data() == other.fSegments.data();
98
+ }
99
+
100
+ bool operator!=(const ForwardVerbIterator& other) {
101
+ return !((*this) == other);
102
+ }
103
+
104
+ private:
105
+ friend class SkContourMeasure;
106
+
107
+ ForwardVerbIterator(SkSpan<const Segment> segs, SkSpan<const SkPoint> pts)
108
+ : fSegments(LastSegForCurrentVerb(segs))
109
+ , fPts(pts) {}
110
+
111
+ static SkSpan<const Segment> LastSegForCurrentVerb(const SkSpan<const Segment>& segs) {
112
+ size_t i = 1;
113
+ while (i < segs.size() && segs[0].fPtIndex == segs[i].fPtIndex) {
114
+ ++i;
115
+ }
116
+
117
+ return segs.subspan(i - 1);
118
+ }
119
+
120
+ // Remaining segments for forward iteration. The first segment in the span is
121
+ // adjusted to always point to the last segment of the current verb, such that its distance
122
+ // corresponds to the verb distance.
123
+ SkSpan<const Segment> fSegments;
124
+
125
+ // All path points (indexed in segments).
126
+ SkSpan<const SkPoint> fPts;
127
+ };
128
+
129
+ ForwardVerbIterator begin() const {
130
+ return ForwardVerbIterator(fSegments, fPts);
131
+ }
132
+ ForwardVerbIterator end() const {
133
+ return ForwardVerbIterator(SkSpan(fSegments.end(), 0), fPts);
134
+ }
135
+
60
136
  private:
61
137
  struct Segment {
62
138
  SkScalar fDistance; // total distance up to this point
@@ -0,0 +1,48 @@
1
+ /*
2
+ * Copyright 2024 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 SKFONTSCANNER_H_
9
+ #define SKFONTSCANNER_H_
10
+
11
+ #include "include/core/SkFontArguments.h"
12
+ #include "include/core/SkRefCnt.h"
13
+ #include "include/core/SkTypes.h"
14
+ #include "include/private/base/SkFixed.h"
15
+ #include "include/private/base/SkNoncopyable.h"
16
+ #include "include/private/base/SkTArray.h"
17
+ class SkFontStyle;
18
+ class SkStreamAsset;
19
+ class SkString;
20
+ class SkTypeface;
21
+
22
+ class SkFontScanner : public SkNoncopyable {
23
+ public:
24
+ virtual ~SkFontScanner() = default;
25
+ struct AxisDefinition {
26
+ SkFourByteTag fTag;
27
+ SkScalar fMinimum;
28
+ SkScalar fDefault;
29
+ SkScalar fMaximum;
30
+ };
31
+ typedef skia_private::STArray<4, AxisDefinition, true> AxisDefinitions;
32
+
33
+ virtual bool scanFile(SkStreamAsset* stream, int* numFaces) const = 0;
34
+ virtual bool scanFace(SkStreamAsset* stream, int faceIndex, int* numInstances) const = 0;
35
+ /* instanceIndex 0 is the default instance, 1 to numInstances are the named instances. */
36
+ virtual bool scanInstance(SkStreamAsset* stream,
37
+ int faceIndex,
38
+ int instanceIndex,
39
+ SkString* name,
40
+ SkFontStyle* style,
41
+ bool* isFixedPitch,
42
+ AxisDefinitions* axes) const = 0;
43
+ virtual sk_sp<SkTypeface> MakeFromStream(std::unique_ptr<SkStreamAsset> stream,
44
+ const SkFontArguments& args) const = 0;
45
+ virtual SkFourByteTag getFactoryId() const = 0;
46
+ };
47
+
48
+ #endif // SKFONTSCANNER_H_
@@ -5,5 +5,5 @@
5
5
  * found in the LICENSE file.
6
6
  */
7
7
  #ifndef SK_MILESTONE
8
- #define SK_MILESTONE 130
8
+ #define SK_MILESTONE 132
9
9
  #endif
@@ -26,6 +26,7 @@
26
26
  #include <tuple>
27
27
  #include <type_traits>
28
28
 
29
+ struct SkArc;
29
30
  class SkData;
30
31
  class SkPathRef;
31
32
  class SkRRect;
@@ -280,6 +281,16 @@ public:
280
281
  */
281
282
  bool isRRect(SkRRect* rrect) const;
282
283
 
284
+ /** Returns true if path is representable as an oval arc. In other words, could this
285
+ path be drawn using SkCanvas::drawArc.
286
+
287
+ arc receives parameters of arc
288
+
289
+ @param arc storage for arc; may be nullptr
290
+ @return true if SkPath contains only a single arc from an oval
291
+ */
292
+ bool isArc(SkArc* arc) const;
293
+
283
294
  /** Sets SkPath to its initial state.
284
295
  Removes verb array, SkPoint array, and weights, and sets FillType to kWinding.
285
296
  Internal storage associated with SkPath is released.
@@ -10,14 +10,12 @@
10
10
 
11
11
  #include "include/core/SkFlattenable.h"
12
12
  #include "include/core/SkRefCnt.h"
13
- #include "include/core/SkScalar.h"
14
13
  #include "include/private/base/SkAPI.h"
15
14
 
16
15
  // TODO(kjlubick) update clients and remove this unnecessary #include
17
16
  #include "include/core/SkPath.h" // IWYU pragma: keep
18
17
 
19
18
  #include <cstddef>
20
- #include <cstdint>
21
19
 
22
20
  class SkMatrix;
23
21
  class SkStrokeRec;
@@ -55,27 +53,6 @@ public:
55
53
  return kSkPathEffect_Type;
56
54
  }
57
55
 
58
- // move to base?
59
-
60
- enum DashType {
61
- kNone_DashType, //!< ignores the info parameter
62
- kDash_DashType, //!< fills in all of the info parameter
63
- };
64
-
65
- struct DashInfo {
66
- DashInfo() : fIntervals(nullptr), fCount(0), fPhase(0) {}
67
- DashInfo(SkScalar* intervals, int32_t count, SkScalar phase)
68
- : fIntervals(intervals), fCount(count), fPhase(phase) {}
69
-
70
- SkScalar* fIntervals; //!< Length of on/off intervals for dashed lines
71
- // Even values represent ons, and odds offs
72
- int32_t fCount; //!< Number of intervals in the dash. Should be even number
73
- SkScalar fPhase; //!< Offset into the dashed interval pattern
74
- // mod the sum of all intervals
75
- };
76
-
77
- DashType asADash(DashInfo* info) const;
78
-
79
56
  /**
80
57
  * Given a src path (input) and a stroke-rec (input and output), apply
81
58
  * this effect to the src path, returning the new path in dst, and return
@@ -21,6 +21,7 @@
21
21
  #include <cstring>
22
22
 
23
23
  struct SkRect;
24
+ class SkString;
24
25
 
25
26
  /** \struct SkIRect
26
27
  SkIRect holds four 32-bit integer coordinates describing the upper and
@@ -1347,6 +1348,7 @@ public:
1347
1348
  example: https://fiddle.skia.org/c/@Rect_dump
1348
1349
  */
1349
1350
  void dump(bool asHex) const;
1351
+ SkString dumpToString(bool asHex) const;
1350
1352
 
1351
1353
  /** Writes text representation of SkRect to standard output. The representation may be
1352
1354
  directly compiled as C++ code. Floating point values are written
@@ -132,6 +132,8 @@ public:
132
132
  const char* data() const { return fRec->data(); }
133
133
  const char* c_str() const { return fRec->data(); }
134
134
  char operator[](size_t n) const { return this->c_str()[n]; }
135
+ const char* begin() const { return data(); }
136
+ const char* end() const { return data() + size(); }
135
137
 
136
138
  bool equals(const SkString&) const;
137
139
  bool equals(const char text[]) const;
@@ -177,6 +179,8 @@ public:
177
179
 
178
180
  char* data();
179
181
  char& operator[](size_t n) { return this->data()[n]; }
182
+ char* begin() { return data(); }
183
+ char* end() { return data() + size(); }
180
184
 
181
185
  void reset();
182
186
  /** String contents are preserved on resize. (For destructive resize, `set(nullptr, length)`.)
@@ -352,6 +352,10 @@ protected:
352
352
  // Must return a valid scaler context. It can not return nullptr.
353
353
  virtual std::unique_ptr<SkScalerContext> onCreateScalerContext(const SkScalerContextEffects&,
354
354
  const SkDescriptor*) const = 0;
355
+ virtual std::unique_ptr<SkScalerContext> onCreateScalerContextAsProxyTypeface
356
+ (const SkScalerContextEffects&,
357
+ const SkDescriptor*,
358
+ sk_sp<SkTypeface>) const;
355
359
  virtual void onFilterRec(SkScalerContextRec*) const = 0;
356
360
  friend class SkScalerContext; // onFilterRec
357
361
 
@@ -420,6 +424,7 @@ private:
420
424
  std::unique_ptr<SkAdvancedTypefaceMetrics> getAdvancedMetrics() const;
421
425
  friend class SkRandomTypeface; // getAdvancedMetrics
422
426
  friend class SkPDFFont; // getAdvancedMetrics
427
+ friend class SkTypeface_fontconfig;
423
428
 
424
429
  friend class SkFontPriv; // getGlyphToUnicodeMap
425
430
 
@@ -96,7 +96,8 @@
96
96
  #if defined(SK_HISTOGRAM_ENUMERATION) || \
97
97
  defined(SK_HISTOGRAM_BOOLEAN) || \
98
98
  defined(SK_HISTOGRAM_EXACT_LINEAR) || \
99
- defined(SK_HISTOGRAM_MEMORY_KB)
99
+ defined(SK_HISTOGRAM_MEMORY_KB) || \
100
+ defined(SK_HISTOGRAM_CUSTOM_MICROSECONDS_TIMES)
100
101
  # define SK_HISTOGRAMS_ENABLED 1
101
102
  #else
102
103
  # define SK_HISTOGRAMS_ENABLED 0
@@ -107,17 +108,21 @@
107
108
  #endif
108
109
 
109
110
  #ifndef SK_HISTOGRAM_ENUMERATION
110
- # define SK_HISTOGRAM_ENUMERATION(name, sample, enum_size)
111
+ # define SK_HISTOGRAM_ENUMERATION(name, sampleEnum, enumSize)
111
112
  #endif
112
113
 
113
114
  #ifndef SK_HISTOGRAM_EXACT_LINEAR
114
- # define SK_HISTOGRAM_EXACT_LINEAR(name, sample, value_max)
115
+ # define SK_HISTOGRAM_EXACT_LINEAR(name, sample, valueMax)
115
116
  #endif
116
117
 
117
118
  #ifndef SK_HISTOGRAM_MEMORY_KB
118
119
  # define SK_HISTOGRAM_MEMORY_KB(name, sample)
119
120
  #endif
120
121
 
122
+ #ifndef SK_HISTOGRAM_CUSTOM_MICROSECONDS_TIMES
123
+ # define SK_HISTOGRAM_CUSTOM_MICROSECONDS_TIMES(name, sampleUSec, minUSec, maxUSec, bucketCount)
124
+ #endif
125
+
121
126
  #define SK_HISTOGRAM_PERCENTAGE(name, percent_as_int) \
122
127
  SK_HISTOGRAM_EXACT_LINEAR(name, percent_as_int, 101)
123
128
 
@@ -18,7 +18,7 @@
18
18
  class SkCanvas;
19
19
  class SkExecutor;
20
20
  class SkPDFArray;
21
- class SkPDFTagTree;
21
+ class SkPDFStructTree;
22
22
  class SkWStream;
23
23
 
24
24
  #define SKPDF_STRING(X) SKPDF_STRING_IMPL(X)
@@ -46,9 +46,10 @@ public:
46
46
  const std::vector<int>& nodeIds);
47
47
 
48
48
  private:
49
- friend class ::SkPDFTagTree;
49
+ friend class ::SkPDFStructTree;
50
50
 
51
51
  std::unique_ptr<SkPDFArray> fAttrs;
52
+ std::vector<int> fElemIds; // element identifiers referenced by fAttrs
52
53
  };
53
54
 
54
55
  /** A node in a PDF structure tree, giving a semantic representation
@@ -60,7 +61,6 @@ struct StructureElementNode {
60
61
  SkString fTypeString;
61
62
  std::vector<std::unique_ptr<StructureElementNode>> fChildVector;
62
63
  int fNodeId = 0;
63
- std::vector<int> fAdditionalNodeIds;
64
64
  AttributeList fAttributes;
65
65
  SkString fAlt;
66
66
  SkString fLang;
@@ -21,6 +21,7 @@ class SkColorFilter;
21
21
  * ...
22
22
  * 5 (or larger) -> colors[5]
23
23
  *
24
+ * https://fiddle.skia.org/c/@overdrawcolorfilter_grid
24
25
  */
25
26
  class SK_API SkOverdrawColorFilter {
26
27
  public:
@@ -162,6 +162,7 @@ public:
162
162
 
163
163
  // Color filter SkSL requires an entry point that looks like:
164
164
  // vec4 main(vec4 inColor) { ... }
165
+ // https://fiddle.skia.org/c/@runtimeeffect_colorfilter_grid
165
166
  static Result MakeForColorFilter(SkString sksl, const Options&);
166
167
  static Result MakeForColorFilter(SkString sksl) {
167
168
  return MakeForColorFilter(std::move(sksl), Options{});
@@ -352,7 +353,7 @@ private:
352
353
  * Note that SkRuntimeEffectBuilder is built entirely on the public API of SkRuntimeEffect,
353
354
  * so can be used as-is or serve as inspiration for other interfaces or binding techniques.
354
355
  */
355
- class SkRuntimeEffectBuilder {
356
+ class SK_API SkRuntimeEffectBuilder {
356
357
  public:
357
358
  explicit SkRuntimeEffectBuilder(sk_sp<SkRuntimeEffect> effect)
358
359
  : fEffect(std::move(effect))
@@ -8,10 +8,12 @@
8
8
  #ifndef SkJpegEncoder_DEFINED
9
9
  #define SkJpegEncoder_DEFINED
10
10
 
11
+ #include "include/codec/SkEncodedOrigin.h"
11
12
  #include "include/core/SkRefCnt.h"
12
13
  #include "include/private/base/SkAPI.h"
13
14
 
14
15
  #include <memory>
16
+ #include <optional>
15
17
 
16
18
  class SkColorSpace;
17
19
  class SkData;
@@ -86,6 +88,8 @@ struct Options {
86
88
  */
87
89
  const skcms_ICCProfile* fICCProfile = nullptr;
88
90
  const char* fICCProfileDescription = nullptr;
91
+
92
+ std::optional<SkEncodedOrigin> fOrigin;
89
93
  };
90
94
 
91
95
  /**
@@ -11,9 +11,9 @@
11
11
  #include "include/core/SkData.h"
12
12
  #include "include/core/SkString.h"
13
13
  #include "include/core/SkTypes.h"
14
+ #include "include/gpu/ShaderErrorHandler.h"
14
15
  #include "include/gpu/ganesh/GrDriverBugWorkarounds.h"
15
16
  #include "include/gpu/ganesh/GrTypes.h"
16
- #include "include/gpu/ShaderErrorHandler.h"
17
17
  #include "include/private/gpu/ganesh/GrTypesPriv.h"
18
18
 
19
19
  #include <optional>
@@ -176,6 +176,13 @@ struct SK_API GrContextOptions {
176
176
  */
177
177
  bool fAvoidStencilBuffers = false;
178
178
 
179
+ /**
180
+ * If true, texture fetches from mip-mapped textures will be biased to read larger MIP levels.
181
+ * This has the effect of sharpening those textures, at the cost of some aliasing, and possible
182
+ * performance impact.
183
+ */
184
+ bool fSharpenMipmappedTextures = true;
185
+
179
186
  /**
180
187
  * Enables driver workaround to use draws instead of HW clears, e.g. glClear on the GL backend.
181
188
  */
@@ -479,10 +479,25 @@ public:
479
479
  * If it returns false, then those same semaphores will not have been submitted and we will not
480
480
  * try to submit them again. The caller is free to delete the semaphores at any time.
481
481
  *
482
- * If sync flag is GrSyncCpu::kYes, this function will return once the gpu has finished with all
483
- * submitted work.
482
+ * If GrSubmitInfo::fSync flag is GrSyncCpu::kYes, this function will return once the gpu has
483
+ * finished with all submitted work.
484
+ *
485
+ * If GrSubmitInfo::fMarkBoundary flag is GrMarkFrameBoundary::kYes and the GPU supports a way
486
+ * to be notified about frame boundaries, then we will notify the GPU during/after the
487
+ * submission of work to the GPU. GrSubmitInfo::fFrameID is a frame ID that is passed to the
488
+ * GPU when marking a boundary. Ideally this value should be unique for each frame. Currently
489
+ * marking frame boundaries is only supported with the Vulkan backend and only if the
490
+ * VK_EXT_frame_boudnary extenstion is available.
484
491
  */
485
- bool submit(GrSyncCpu sync = GrSyncCpu::kNo);
492
+ bool submit(const GrSubmitInfo&);
493
+
494
+ bool submit(GrSyncCpu sync = GrSyncCpu::kNo) {
495
+ GrSubmitInfo info;
496
+ info.fSync = sync;
497
+
498
+ return this->submit(info);
499
+ }
500
+
486
501
 
487
502
  /**
488
503
  * Checks whether any asynchronous work is complete and if so calls related callbacks.
@@ -174,4 +174,15 @@ enum class GrSyncCpu : bool {
174
174
  kYes = true,
175
175
  };
176
176
 
177
+ enum class GrMarkFrameBoundary : bool {
178
+ kNo = false,
179
+ kYes = true,
180
+ };
181
+
182
+ struct GrSubmitInfo {
183
+ GrSyncCpu fSync = GrSyncCpu::kNo;
184
+ GrMarkFrameBoundary fMarkBoundary = GrMarkFrameBoundary::kNo;
185
+ uint64_t fFrameID = 0;
186
+ };
187
+
177
188
  #endif
@@ -104,7 +104,6 @@ using GrGLGetProgramInfoLogFn = GrGLvoid GR_GL_FUNCTION_TYPE(GrGLuint program, G
104
104
  using GrGLGetProgramivFn = GrGLvoid GR_GL_FUNCTION_TYPE(GrGLuint program, GrGLenum pname, GrGLint* params);
105
105
  using GrGLGetQueryivFn = GrGLvoid GR_GL_FUNCTION_TYPE(GrGLenum GLtarget, GrGLenum pname, GrGLint* params);
106
106
  using GrGLGetQueryObjecti64vFn = GrGLvoid GR_GL_FUNCTION_TYPE(GrGLuint id, GrGLenum pname, GrGLint64* params);
107
- using GrGLGetQueryObjectivFn = GrGLvoid GR_GL_FUNCTION_TYPE(GrGLuint id, GrGLenum pname, GrGLint* params);
108
107
  using GrGLGetQueryObjectui64vFn = GrGLvoid GR_GL_FUNCTION_TYPE(GrGLuint id, GrGLenum pname, GrGLuint64* params);
109
108
  using GrGLGetQueryObjectuivFn = GrGLvoid GR_GL_FUNCTION_TYPE(GrGLuint id, GrGLenum pname, GrGLuint* params);
110
109
  using GrGLGetRenderbufferParameterivFn = GrGLvoid GR_GL_FUNCTION_TYPE(GrGLenum target, GrGLenum pname, GrGLint* params);
@@ -219,8 +218,13 @@ using GrGLMultiDrawElementsInstancedBaseVertexBaseInstanceFn = GrGLvoid GR_GL_FU
219
218
  /* ARB_sync */
220
219
  using GrGLFenceSyncFn = GrGLsync GR_GL_FUNCTION_TYPE(GrGLenum condition, GrGLbitfield flags);
221
220
  using GrGLIsSyncFn = GrGLboolean GR_GL_FUNCTION_TYPE(GrGLsync sync);
221
+ #if defined(__EMSCRIPTEN__)
222
+ using GrGLClientWaitSyncFn = GrGLenum GR_GL_FUNCTION_TYPE(GrGLsync sync, GrGLbitfield flags, GrGLint timeoutLo, GrGLint timeoutHi);
223
+ using GrGLWaitSyncFn = GrGLvoid GR_GL_FUNCTION_TYPE(GrGLsync sync, GrGLbitfield flags, GrGLuint timeoutLo, GrGLuint timeoutHi);
224
+ #else
222
225
  using GrGLClientWaitSyncFn = GrGLenum GR_GL_FUNCTION_TYPE(GrGLsync sync, GrGLbitfield flags, GrGLuint64 timeout);
223
226
  using GrGLWaitSyncFn = GrGLvoid GR_GL_FUNCTION_TYPE(GrGLsync sync, GrGLbitfield flags, GrGLuint64 timeout);
227
+ #endif
224
228
  using GrGLDeleteSyncFn = GrGLvoid GR_GL_FUNCTION_TYPE(GrGLsync sync);
225
229
 
226
230
  /* ARB_internalformat_query */
@@ -174,7 +174,6 @@ public:
174
174
  GrGLFunction<GrGLGetProgramInfoLogFn> fGetProgramInfoLog;
175
175
  GrGLFunction<GrGLGetProgramivFn> fGetProgramiv;
176
176
  GrGLFunction<GrGLGetQueryObjecti64vFn> fGetQueryObjecti64v;
177
- GrGLFunction<GrGLGetQueryObjectivFn> fGetQueryObjectiv;
178
177
  GrGLFunction<GrGLGetQueryObjectui64vFn> fGetQueryObjectui64v;
179
178
  GrGLFunction<GrGLGetQueryObjectuivFn> fGetQueryObjectuiv;
180
179
  GrGLFunction<GrGLGetQueryivFn> fGetQueryiv;
@@ -9,6 +9,7 @@
9
9
  #define skgpu_graphite_GraphiteTypes_DEFINED
10
10
 
11
11
  #include "include/core/SkPoint.h"
12
+ #include "include/core/SkRect.h"
12
13
  #include "include/core/SkTypes.h"
13
14
  #include "include/gpu/GpuTypes.h"
14
15
 
@@ -44,6 +45,9 @@ using GpuFinishedProc = void (*)(GpuFinishedContext finishedContext, CallbackRes
44
45
  *
45
46
  * fTargetTranslation is an additional translation applied to draws targeting fTargetSurface.
46
47
  *
48
+ * fTargetClip is an additional clip applied to draws targeting fTargetSurface. It is defined in the
49
+ * local replay space, that is, with fTargetTranslation applied. An empty clip will not be applied.
50
+ *
47
51
  * The client may pass in two arrays of initialized BackendSemaphores to be included in the
48
52
  * command stream. At some time before issuing commands in the Recording, the fWaitSemaphores will
49
53
  * be waited on by the gpu. We only guarantee these wait semaphores block transfer and fragment
@@ -62,6 +66,7 @@ struct InsertRecordingInfo {
62
66
 
63
67
  SkSurface* fTargetSurface = nullptr;
64
68
  SkIVector fTargetTranslation = {0, 0};
69
+ SkIRect fTargetClip = {0, 0, 0, 0};
65
70
  MutableTextureState* fTargetTextureState = nullptr;
66
71
 
67
72
  size_t fNumWaitSemaphores = 0;
@@ -150,7 +155,10 @@ enum DrawTypeFlags : uint16_t {
150
155
  // TessellateCurvesRenderStep[*] for [even-odd], [winding]
151
156
  // MiddleOutFanRenderStep[*] for [even-odd], [winding]
152
157
  kNonSimpleShape = 0b10000000,
158
+
159
+ kLast = kNonSimpleShape,
153
160
  };
161
+ static constexpr int kDrawTypeFlagsCnt = static_cast<int>(DrawTypeFlags::kLast) + 1;
154
162
 
155
163
  } // namespace skgpu::graphite
156
164
 
@@ -58,7 +58,6 @@ class UploadBufferManager;
58
58
  class UploadList;
59
59
 
60
60
  template<typename T> class PipelineDataCache;
61
- using UniformDataCache = PipelineDataCache<UniformDataBlock>;
62
61
  using TextureDataCache = PipelineDataCache<TextureDataBlock>;
63
62
 
64
63
  struct SK_API RecorderOptions final {
@@ -262,7 +261,6 @@ private:
262
261
  // Aggregated one-time uploads that preceed all tasks in the root task list.
263
262
  std::unique_ptr<UploadList> fRootUploads;
264
263
 
265
- std::unique_ptr<UniformDataCache> fUniformDataCache;
266
264
  std::unique_ptr<TextureDataCache> fTextureDataCache;
267
265
  std::unique_ptr<DrawBufferManager> fDrawBufferManager;
268
266
  std::unique_ptr<UploadBufferManager> fUploadBufferManager;
@@ -32,6 +32,7 @@ class KeyContext;
32
32
  class PaintOptionsPriv;
33
33
  class PaintParamsKeyBuilder;
34
34
  class PipelineDataGatherer;
35
+ struct RenderPassDesc;
35
36
  class UniquePaintParamsID;
36
37
 
37
38
  /** \class PaintOptions
@@ -171,14 +172,16 @@ private:
171
172
  typedef std::function<void(UniquePaintParamsID id,
172
173
  DrawTypeFlags,
173
174
  bool withPrimitiveBlender,
174
- Coverage)> ProcessCombination;
175
+ Coverage,
176
+ const RenderPassDesc&)> ProcessCombination;
175
177
 
176
178
  void buildCombinations(const KeyContext&,
177
179
  PipelineDataGatherer*,
178
- DrawTypeFlags drawTypes,
180
+ DrawTypeFlags,
179
181
  bool addPrimitiveBlender,
180
- Coverage coverage,
181
- const ProcessCombination& processCombination) const;
182
+ Coverage,
183
+ const RenderPassDesc&,
184
+ const ProcessCombination&) const;
182
185
 
183
186
  skia_private::TArray<sk_sp<PrecompileShader>> fShaderOptions;
184
187
  skia_private::TArray<sk_sp<PrecompileColorFilter>> fColorFilterOptions;
@@ -61,10 +61,12 @@ private:
61
61
 
62
62
  virtual void onCreatePipelines(const KeyContext&,
63
63
  PipelineDataGatherer*,
64
+ const RenderPassDesc&,
64
65
  const PaintOptions::ProcessCombination&) const = 0;
65
66
 
66
67
  void createPipelines(const KeyContext&,
67
68
  PipelineDataGatherer*,
69
+ const RenderPassDesc&,
68
70
  const PaintOptions::ProcessCombination&);
69
71
 
70
72
  skia_private::AutoSTArray<2, sk_sp<PrecompileImageFilter>> fInputs;
@@ -31,6 +31,8 @@ protected:
31
31
 
32
32
  virtual void createPipelines(const KeyContext&,
33
33
  PipelineDataGatherer*,
34
+ const PaintOptions&,
35
+ const RenderPassDesc&,
34
36
  const PaintOptions::ProcessCombination&) const = 0;
35
37
  };
36
38
 
@@ -0,0 +1,25 @@
1
+ /*
2
+ * Copyright 2024 Google LLC.
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 SkFontMgr_android_ndk_DEFINED
9
+ #define SkFontMgr_android_ndk_DEFINED
10
+
11
+ #include "include/core/SkRefCnt.h"
12
+ #include "include/core/SkTypes.h"
13
+
14
+ #include <memory>
15
+
16
+ class SkFontMgr;
17
+ class SkFontScanner;
18
+
19
+ /** Create a font manager for Android NDK. May return nullptr if unavailable (API < 29). */
20
+ SK_API sk_sp<SkFontMgr> SkFontMgr_New_AndroidNDK(bool cacheFontFiles);
21
+
22
+ SK_API sk_sp<SkFontMgr> SkFontMgr_New_AndroidNDK(bool cacheFontFiles,
23
+ std::unique_ptr<SkFontScanner> scanner);
24
+
25
+ #endif // SkFontMgr_android_ndk_DEFINED
@@ -8,8 +8,9 @@
8
8
  #ifndef SkFontMgr_fontconfig_DEFINED
9
9
  #define SkFontMgr_fontconfig_DEFINED
10
10
 
11
- #include "include/core/SkRefCnt.h"
12
11
  #include <fontconfig/fontconfig.h>
12
+ #include "include/core/SkRefCnt.h"
13
+ #include <memory>
13
14
 
14
15
  class SkFontMgr;
15
16
 
@@ -17,6 +18,7 @@ class SkFontMgr;
17
18
  * If 'fc' is NULL, will use a new default config.
18
19
  * Takes ownership of 'fc' and will call FcConfigDestroy on it.
19
20
  */
21
+ class SkFontScanner;
22
+ SK_API sk_sp<SkFontMgr> SkFontMgr_New_FontConfig(FcConfig* fc, std::unique_ptr<SkFontScanner> scanner);
20
23
  SK_API sk_sp<SkFontMgr> SkFontMgr_New_FontConfig(FcConfig* fc);
21
-
22
24
  #endif // #ifndef SkFontMgr_fontconfig_DEFINED
@@ -0,0 +1,15 @@
1
+ /*
2
+ * Copyright 2024 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 SKFONTSCANNER_FONTATIONS_H_
9
+ #define SKFONTSCANNER_FONTATIONS_H_
10
+
11
+ #include "include/core/SkFontScanner.h"
12
+
13
+ SK_API std::unique_ptr<SkFontScanner> SkFontScanner_Make_Fontations();
14
+
15
+ #endif // SKFONTSCANNER_FONTATIONS_H_