88#include " Convertor.h"
99#include " DrawingCtx.h"
1010
11+ #include " include/core/SkCanvas.h"
12+
1113namespace RNSkia {
1214
1315struct TransformProps {
@@ -38,7 +40,35 @@ SkMatrix processTransform(std::optional<SkMatrix> &matrix,
3840 return m3;
3941}
4042
41- struct CTMCmdProps : TransformProps {
43+ struct SaveLayerProps {
44+ std::optional<SkCanvas::SaveLayerFlags> saveLayerFlags;
45+ }
46+
47+ class SaveLayerCmd : public Command {
48+ private:
49+ SaveLayerProps props;
50+
51+ public:
52+ SaveLayerCmd (jsi::Runtime &runtime, const jsi::Object &object,
53+ Variables &variables)
54+ : Command(CommandType::SaveLayer) {
55+ convertProperty (runtime, object, " saveLayerFlags" , props.saveLayerFlags ,
56+ variables);
57+ }
58+
59+ void saveLayer (DrawingCtx *ctx) {
60+ ctx->materializePaint ();
61+ auto paint = ctx->paintDeclarations .back ();
62+ ctx->paintDeclarations .pop_back ();
63+
64+ SkCanvas::SaveLayerRec layerRec (nullptr , &paint, nullptr ,
65+ props.saveLayerFlags .value_or (0 ));
66+ ctx->canvas ->saveLayer (layerRec);
67+ }
68+ }
69+
70+ struct CTMCmdProps : TransformProps,
71+ SaveLayerProps {
4272 std::optional<ClipDef> clip;
4373 std::optional<bool > invertClip;
4474 std::optional<Layer> layer;
@@ -58,12 +88,15 @@ class SaveCTMCmd : public Command {
5888 convertProperty (runtime, object, " clip" , props.clip , variables);
5989 convertProperty (runtime, object, " invertClip" , props.invertClip , variables);
6090 convertProperty (runtime, object, " layer" , props.layer , variables);
91+ convertProperty (runtime, object, " saveLayerFlags" , props.saveLayerFlags ,
92+ variables);
6193 }
6294
6395 void saveCTM (DrawingCtx *ctx) {
6496 auto clip = props.clip ;
6597 auto invertClip = props.invertClip ;
6698 auto layer = props.layer ;
99+ auto saveLayerFlags = props.saveLayerFlags ;
67100 auto hasTransform = props.matrix .has_value () || props.transform .has_value ();
68101 auto hasClip = clip.has_value ();
69102 auto op = invertClip.has_value () && invertClip.value ()
@@ -73,12 +106,12 @@ class SaveCTMCmd : public Command {
73106 SkMatrix m3 = processTransform (props.matrix , props.transform , props.origin );
74107 if (shouldSave) {
75108 if (layer.has_value ()) {
76- if (std::holds_alternative<bool >(layer.value ())) {
77- ctx->canvas ->saveLayer (nullptr , nullptr );
78- } else {
79- auto paint = std::get<SkPaint>(layer.value ());
80- ctx->canvas ->saveLayer (nullptr , &paint);
109+ SkCanvas::SaveLayerRec layerRec;
110+ layerRec.fPaint = std::get_if<SkPaint>(layer.value ());
111+ if (saveLayerFlags.has_value ()) {
112+ layerRec.fSaveLayerFlags = saveLayerFlags.value ();
81113 }
114+ ctx->canvas ->saveLayer (layerRec);
82115 } else {
83116 ctx->canvas ->save ();
84117 }
0 commit comments