Skip to content

Commit 2335967

Browse files
authored
feat(🍏): add support for non p3 colors on iOS (#3253)
1 parent ddc3573 commit 2335967

File tree

13 files changed

+59
-13
lines changed

13 files changed

+59
-13
lines changed

apps/example/src/Examples/API/ColorFilter.tsx

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import React, { useMemo } from "react";
2-
import { ScrollView, useWindowDimensions } from "react-native";
2+
import { ScrollView, useWindowDimensions, View } from "react-native";
33
import {
44
Skia,
55
PaintStyle,
@@ -16,6 +16,7 @@ import {
1616
SRGBToLinearGamma,
1717
SkiaPictureView,
1818
createPicture,
19+
Fill,
1920
} from "@shopify/react-native-skia";
2021

2122
import { Title } from "./components/Title";
@@ -137,6 +138,10 @@ export const ColorFilter = () => {
137138
</LinearToSRGBGamma>
138139
</Image>
139140
</Canvas>
141+
<Canvas style={{ width: 256, height: 256 }} colorSpace="srgb">
142+
<Fill color="green" />
143+
</Canvas>
144+
<View style={{ width: 256, height: 256, backgroundColor: "green" }} />
140145
</ScrollView>
141146
);
142147
};

packages/skia/android/src/main/java/com/shopify/reactnative/skia/SkiaPictureViewManager.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import com.facebook.react.viewmanagers.SkiaPictureViewManagerInterface;
66

77
import androidx.annotation.NonNull;
8+
import androidx.annotation.Nullable;
89

910
public class SkiaPictureViewManager extends SkiaBaseViewManager<SkiaPictureView> implements SkiaPictureViewManagerInterface<SkiaPictureView> {
1011

@@ -30,4 +31,9 @@ public String getName() {
3031
public SkiaPictureView createViewInstance(@NonNull ThemedReactContext reactContext) {
3132
return new SkiaPictureView(reactContext);
3233
}
34+
35+
@Override
36+
public void setColorSpace(SkiaPictureView view, @Nullable String value) {
37+
// nothing to do here at the moment
38+
}
3339
}

packages/skia/apple/MetalContext.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -113,10 +113,10 @@ class MetalContext {
113113
}
114114

115115
std::unique_ptr<RNSkia::WindowContext> MakeWindow(CALayer *window, int width,
116-
int height) {
116+
int height, bool useP3ColorSpace = true) {
117117
auto device = MetalSharedContext::getInstance().getDevice();
118118
return std::make_unique<MetalWindowContext>(
119-
_directContext.get(), device, _commandQueue, window, width, height);
119+
_directContext.get(), device, _commandQueue, window, width, height, useP3ColorSpace);
120120
}
121121

122122
GrDirectContext *getDirectContext() { return _directContext.get(); }

packages/skia/apple/MetalWindowContext.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ class MetalWindowContext : public RNSkia::WindowContext {
1010
public:
1111
MetalWindowContext(GrDirectContext *directContext, id<MTLDevice> device,
1212
id<MTLCommandQueue> commandQueue, CALayer *layer,
13-
int width, int height);
13+
int width, int height, bool useP3ColorSpace = true);
1414
~MetalWindowContext() = default;
1515

1616
sk_sp<SkSurface> getSurface() override;

packages/skia/apple/MetalWindowContext.mm

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,8 @@
66
MetalWindowContext::MetalWindowContext(GrDirectContext *directContext,
77
id<MTLDevice> device,
88
id<MTLCommandQueue> commandQueue,
9-
CALayer *layer, int width, int height)
9+
CALayer *layer, int width, int height,
10+
bool useP3ColorSpace)
1011
: _directContext(directContext), _commandQueue(commandQueue) {
1112
#pragma clang diagnostic push
1213
#pragma clang diagnostic ignored "-Wunguarded-availability-new"
@@ -24,9 +25,11 @@
2425
_layer.contentsGravity = kCAGravityBottomLeft;
2526
_layer.drawableSize = CGSizeMake(width, height);
2627
BOOL supportsWideColor = NO;
27-
if (@available(iOS 10.0, *)) {
28-
supportsWideColor =
29-
[UIScreen mainScreen].traitCollection.displayGamut == UIDisplayGamutP3;
28+
if (useP3ColorSpace) {
29+
if (@available(iOS 10.0, *)) {
30+
supportsWideColor =
31+
[UIScreen mainScreen].traitCollection.displayGamut == UIDisplayGamutP3;
32+
}
3033
}
3134
if (supportsWideColor) {
3235
CGColorSpaceRef colorSpace =

packages/skia/apple/RNSkAppleView.h

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ class RNSkBaseAppleView {
1010
public:
1111
virtual CALayer *getLayer() = 0;
1212
virtual void setSize(int width, int height) = 0;
13+
virtual void setUseP3ColorSpace(bool useP3ColorSpace) = 0;
1314
virtual std::shared_ptr<RNSkia::RNSkView> getDrawView() = 0;
1415
};
1516

@@ -18,7 +19,7 @@ template <class T> class RNSkAppleView : public RNSkBaseAppleView, public T {
1819
RNSkAppleView(std::shared_ptr<RNSkia::RNSkPlatformContext> context)
1920
: T(context,
2021
std::make_shared<RNSkMetalCanvasProvider>(
21-
std::bind(&RNSkia::RNSkView::requestRedraw, this), context)) {}
22+
std::bind(&RNSkia::RNSkView::requestRedraw, this), context, true)) {}
2223

2324
CALayer *getLayer() override {
2425
return std::static_pointer_cast<RNSkMetalCanvasProvider>(
@@ -31,6 +32,11 @@ template <class T> class RNSkAppleView : public RNSkBaseAppleView, public T {
3132
->setSize(width, height);
3233
}
3334

35+
void setUseP3ColorSpace(bool useP3ColorSpace) override {
36+
std::static_pointer_cast<RNSkMetalCanvasProvider>(this->getCanvasProvider())
37+
->setUseP3ColorSpace(useP3ColorSpace);
38+
}
39+
3440
std::shared_ptr<RNSkia::RNSkView> getDrawView() override {
3541
return this->shared_from_this();
3642
}

packages/skia/apple/RNSkMetalCanvasProvider.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,8 @@
1616
class RNSkMetalCanvasProvider : public RNSkia::RNSkCanvasProvider {
1717
public:
1818
RNSkMetalCanvasProvider(std::function<void()> requestRedraw,
19-
std::shared_ptr<RNSkia::RNSkPlatformContext> context);
19+
std::shared_ptr<RNSkia::RNSkPlatformContext> context,
20+
bool useP3ColorSpace = true);
2021

2122
~RNSkMetalCanvasProvider();
2223

@@ -26,6 +27,7 @@ class RNSkMetalCanvasProvider : public RNSkia::RNSkCanvasProvider {
2627
bool renderToCanvas(const std::function<void(SkCanvas *)> &cb) override;
2728

2829
void setSize(int width, int height);
30+
void setUseP3ColorSpace(bool useP3ColorSpace);
2931
CALayer *getLayer();
3032

3133
private:
@@ -35,4 +37,5 @@ class RNSkMetalCanvasProvider : public RNSkia::RNSkCanvasProvider {
3537
#pragma clang diagnostic ignored "-Wunguarded-availability-new"
3638
CAMetalLayer *_layer;
3739
#pragma clang diagnostic pop
40+
bool _useP3ColorSpace = true;
3841
};

packages/skia/apple/RNSkMetalCanvasProvider.mm

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,9 @@
2323

2424
RNSkMetalCanvasProvider::RNSkMetalCanvasProvider(
2525
std::function<void()> requestRedraw,
26-
std::shared_ptr<RNSkia::RNSkPlatformContext> context)
27-
: RNSkCanvasProvider(requestRedraw), _context(context) {
26+
std::shared_ptr<RNSkia::RNSkPlatformContext> context,
27+
bool useP3ColorSpace)
28+
: RNSkCanvasProvider(requestRedraw), _context(context), _useP3ColorSpace(useP3ColorSpace) {
2829
#pragma clang diagnostic push
2930
#pragma clang diagnostic ignored "-Wunguarded-availability-new"
3031
_layer = [CAMetalLayer layer];
@@ -100,9 +101,13 @@
100101
_ctx = RNSkia::DawnContext::getInstance().MakeWindow((__bridge void *)_layer,
101102
w, h);
102103
#else
103-
_ctx = MetalContext::getInstance().MakeWindow(_layer, w, h);
104+
_ctx = MetalContext::getInstance().MakeWindow(_layer, w, h, _useP3ColorSpace);
104105
#endif
105106
_requestRedraw();
106107
}
107108

108109
CALayer *RNSkMetalCanvasProvider::getLayer() { return _layer; }
110+
111+
void RNSkMetalCanvasProvider::setUseP3ColorSpace(bool useP3ColorSpace) {
112+
_useP3ColorSpace = useP3ColorSpace;
113+
}

packages/skia/apple/SkiaPictureView.mm

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,10 @@ - (void)updateProps:(const Props::Shared &)props
5555
[self setNativeId:nativeId];
5656
[self setDebugMode:newProps.debug];
5757
[self setOpaque:newProps.opaque];
58+
if (newProps.colorSpace == "" || newProps.colorSpace == "srgb") {
59+
bool useP3 = false;
60+
[self setUseP3ColorSpace:useP3];
61+
}
5862
}
5963

6064
@end

packages/skia/apple/SkiaUIView.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,5 +41,6 @@
4141
- (void)setDebugMode:(bool)debugMode;
4242
- (void)setOpaque:(bool)opaque;
4343
- (void)setNativeId:(size_t)nativeId;
44+
- (void)setUseP3ColorSpace:(bool)useP3ColorSpace;
4445

4546
@end

0 commit comments

Comments
 (0)