Skip to content

Commit 800387e

Browse files
authored
fix(🏞️): throw error if makeNonImageTexture() is invoked in the wrong context (#3418)
1 parent 91fb531 commit 800387e

4 files changed

Lines changed: 27 additions & 15 deletions

File tree

packages/skia/cpp/api/JsiSkCanvas.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,10 @@
3434
#include "include/core/SkRegion.h"
3535
#include "include/core/SkSurface.h"
3636
#include "include/core/SkTypeface.h"
37+
38+
#if !defined(SK_GRAPHITE)
3739
#include "include/gpu/ganesh/GrDirectContext.h"
40+
#endif
3841

3942
#pragma clang diagnostic pop
4043

packages/skia/cpp/api/JsiSkImage.h

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@
1717
#if defined(SK_GRAPHITE)
1818
#include "RNDawnContext.h"
1919
#include "include/gpu/graphite/Context.h"
20+
#else
21+
#include "include/gpu/ganesh/GrDirectContext.h"
2022
#endif
2123

2224
#pragma clang diagnostic push
@@ -241,7 +243,15 @@ class JsiSkImage : public JsiSkWrappingSkPtrHostObject<SkImage> {
241243
auto rasterImage = DawnContext::getInstance().MakeRasterImage(getObject());
242244
#else
243245
auto grContext = getContext()->getDirectContext();
244-
auto rasterImage = getObject()->makeRasterImage(grContext);
246+
auto image = getObject();
247+
if (!grContext) {
248+
throw jsi::JSError(runtime, "No GPU context available");
249+
}
250+
if (image && !image->isValid(grContext->asRecorder())) {
251+
throw jsi::JSError(runtime, "invoked makeNonTextureImage() on an image "
252+
"that does not belong to this context");
253+
}
254+
auto rasterImage = image->makeRasterImage(grContext);
245255
#endif
246256
auto hostObjectInstance =
247257
std::make_shared<JsiSkImage>(getContext(), std::move(rasterImage));
@@ -312,4 +322,4 @@ class JsiSkImage : public JsiSkWrappingSkPtrHostObject<SkImage> {
312322
}
313323
};
314324

315-
} // namespace RNSkia
325+
} // namespace RNSkia

packages/skia/cpp/api/JsiSkSVG.h

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,9 +23,7 @@ class JsiSkSVG : public JsiSkWrappingSkPtrHostObject<SkSVGDOM> {
2323
JsiSkSVG(std::shared_ptr<RNSkPlatformContext> context, sk_sp<SkSVGDOM> svgdom,
2424
sk_sp<skresources::ResourceProvider> resourceProvider = nullptr)
2525
: JsiSkWrappingSkPtrHostObject<SkSVGDOM>(std::move(context),
26-
std::move(svgdom)) {
27-
28-
}
26+
std::move(svgdom)) {}
2927

3028
~JsiSkSVG() = default;
3129

packages/skia/cpp/api/JsiSkSVGFactory.h

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -50,8 +50,7 @@ class SVGAssetProvider : public skresources::ResourceProvider {
5050
private:
5151
explicit SVGAssetProvider(AssetMap assets,
5252
skresources::ImageDecodeStrategy strategy)
53-
: fAssets(std::move(assets)), fStrategy(strategy) {
54-
}
53+
: fAssets(std::move(assets)), fStrategy(strategy) {}
5554
const AssetMap fAssets;
5655
const skresources::ImageDecodeStrategy fStrategy;
5756
};
@@ -101,9 +100,9 @@ class JsiSkSVGFactory : public JsiSkHostObject {
101100

102101
private:
103102
jsi::Value makeSVGFromStream(jsi::Runtime &runtime,
104-
std::unique_ptr<SkMemoryStream> stream,
105-
sk_sp<SkFontMgr> fontMgr,
106-
SVGAssetProvider::AssetMap assets) {
103+
std::unique_ptr<SkMemoryStream> stream,
104+
sk_sp<SkFontMgr> fontMgr,
105+
SVGAssetProvider::AssetMap assets) {
107106
auto builder = SkSVGDOM::Builder();
108107

109108
if (fontMgr) {
@@ -113,15 +112,15 @@ class JsiSkSVGFactory : public JsiSkHostObject {
113112
auto baseProvider = SVGAssetProvider::Make(
114113
std::move(assets), skresources::ImageDecodeStrategy::kPreDecode);
115114
auto provider = skresources::DataURIResourceProviderProxy::Make(
116-
std::move(baseProvider), skresources::ImageDecodeStrategy::kPreDecode, fontMgr);
115+
std::move(baseProvider), skresources::ImageDecodeStrategy::kPreDecode,
116+
fontMgr);
117117

118118
// TODO: this sk_sp subclassing issue needs to be fixed.
119119
provider->ref();
120120
builder.setResourceProvider(provider);
121121

122122
auto svg_dom = builder.make(*stream);
123-
auto svg =
124-
std::make_shared<JsiSkSVG>(getContext(), std::move(svg_dom));
123+
auto svg = std::make_shared<JsiSkSVG>(getContext(), std::move(svg_dom));
125124
return JSI_CREATE_HOST_OBJECT_WITH_MEMORY_PRESSURE(runtime, svg,
126125
getContext());
127126
}
@@ -140,7 +139,8 @@ class JsiSkSVGFactory : public JsiSkHostObject {
140139
auto assets = count > 2 ? parseAssetMap(runtime, arguments[2])
141140
: SVGAssetProvider::AssetMap();
142141

143-
return makeSVGFromStream(runtime, std::move(stream), fontMgr, std::move(assets));
142+
return makeSVGFromStream(runtime, std::move(stream), fontMgr,
143+
std::move(assets));
144144
}
145145

146146
JSI_HOST_FUNCTION(MakeFromString) {
@@ -156,7 +156,8 @@ class JsiSkSVGFactory : public JsiSkHostObject {
156156
auto assets = count > 2 ? parseAssetMap(runtime, arguments[2])
157157
: SVGAssetProvider::AssetMap();
158158

159-
return makeSVGFromStream(runtime, std::move(stream), fontMgr, std::move(assets));
159+
return makeSVGFromStream(runtime, std::move(stream), fontMgr,
160+
std::move(assets));
160161
}
161162

162163
size_t getMemoryPressure() const override { return 512; }

0 commit comments

Comments
 (0)