From 2a3e51f3344b90b637f40ce15d997593ffae5529 Mon Sep 17 00:00:00 2001 From: ahmed walid Date: Tue, 30 Jul 2024 22:50:36 +0300 Subject: [PATCH 1/2] feat(SaveLayerRec): implement sk_canvas_save_layer_rec to expose SkCanvas::SaveLayerRec functionality --- include/c/sk_canvas.h | 1 + src/c/sk_canvas.cpp | 4 ++++ 2 files changed, 5 insertions(+) diff --git a/include/c/sk_canvas.h b/include/c/sk_canvas.h index 684da11e3dfc..ff28dbbddb80 100644 --- a/include/c/sk_canvas.h +++ b/include/c/sk_canvas.h @@ -38,6 +38,7 @@ SK_C_API bool sk_canvas_get_local_clip_bounds(sk_canvas_t* ccanvas, sk_rect_t* c SK_C_API bool sk_canvas_get_device_clip_bounds(sk_canvas_t* ccanvas, sk_irect_t* cbounds); SK_C_API int sk_canvas_save(sk_canvas_t* ccanvas); SK_C_API int sk_canvas_save_layer(sk_canvas_t* ccanvas, const sk_rect_t* crect, const sk_paint_t* cpaint); +SK_C_API int sk_canvas_save_layer_rec(sk_canvas_t* ccanvas, const sk_rect_t* cbounds, const sk_paint_t* cpaint, const sk_imagefilter_t* cfilter, uint32_t flags); SK_C_API void sk_canvas_restore(sk_canvas_t* ccanvas); SK_C_API void sk_canvas_translate(sk_canvas_t* ccanvas, float dx, float dy); SK_C_API void sk_canvas_scale(sk_canvas_t* ccanvas, float sx, float sy); diff --git a/src/c/sk_canvas.cpp b/src/c/sk_canvas.cpp index 921834d335dd..999143bed0b8 100644 --- a/src/c/sk_canvas.cpp +++ b/src/c/sk_canvas.cpp @@ -113,6 +113,10 @@ int sk_canvas_save_layer(sk_canvas_t* ccanvas, const sk_rect_t* crect, const sk_ return AsCanvas(ccanvas)->saveLayer(AsRect(crect), AsPaint(cpaint)); } +int sk_canvas_save_layer_rec(sk_canvas_t* ccanvas, const sk_rect_t* cbounds, const sk_paint_t* cpaint, const sk_imagefilter_t* cfilter, uint32_t flags) { + return AsCanvas(ccanvas)->saveLayer(SkCanvas::SaveLayerRec(AsRect(cbounds), AsPaint(cpaint), AsImageFilter(cfilter), flags)); +} + void sk_canvas_restore(sk_canvas_t* ccanvas) { AsCanvas(ccanvas)->restore(); } From fb802116d22f7c5c026c388436d97e9942f66ab5 Mon Sep 17 00:00:00 2001 From: Matthew Leibowitz Date: Tue, 29 Oct 2024 00:08:37 +0800 Subject: [PATCH 2/2] Update the API a bit to handle the future --- include/c/sk_canvas.h | 2 +- include/c/sk_types.h | 14 ++++++++++++++ src/c/sk_canvas.cpp | 4 ++-- src/c/sk_enums.cpp | 6 ++++++ src/c/sk_types_priv.h | 8 ++++++++ 5 files changed, 31 insertions(+), 3 deletions(-) diff --git a/include/c/sk_canvas.h b/include/c/sk_canvas.h index fff7127395c5..be8dc7836874 100644 --- a/include/c/sk_canvas.h +++ b/include/c/sk_canvas.h @@ -38,7 +38,7 @@ SK_C_API bool sk_canvas_get_local_clip_bounds(sk_canvas_t* ccanvas, sk_rect_t* c SK_C_API bool sk_canvas_get_device_clip_bounds(sk_canvas_t* ccanvas, sk_irect_t* cbounds); SK_C_API int sk_canvas_save(sk_canvas_t* ccanvas); SK_C_API int sk_canvas_save_layer(sk_canvas_t* ccanvas, const sk_rect_t* crect, const sk_paint_t* cpaint); -SK_C_API int sk_canvas_save_layer_rec(sk_canvas_t* ccanvas, const sk_rect_t* cbounds, const sk_paint_t* cpaint, const sk_imagefilter_t* cfilter, uint32_t flags); +SK_C_API int sk_canvas_save_layer_rec(sk_canvas_t* ccanvas, const sk_canvas_savelayerrec_t* crec); SK_C_API void sk_canvas_restore(sk_canvas_t* ccanvas); SK_C_API void sk_canvas_translate(sk_canvas_t* ccanvas, float dx, float dy); SK_C_API void sk_canvas_scale(sk_canvas_t* ccanvas, float sx, float sy); diff --git a/include/c/sk_types.h b/include/c/sk_types.h index 12dd12aa64b6..cfc30a0b59bd 100644 --- a/include/c/sk_types.h +++ b/include/c/sk_types.h @@ -1077,6 +1077,20 @@ typedef struct { sk_mipmap_mode_t fMipmap; } sk_sampling_options_t; +typedef enum { + NONE_SK_CANVAS_SAVELAYERREC_FLAGS = 0, + PRESERVE_LCD_TEXT_SK_CANVAS_SAVELAYERREC_FLAGS = 1 << 1, + INITIALIZE_WITH_PREVIOUS_SK_CANVAS_SAVELAYERREC_FLAGS = 1 << 2, + F16_COLOR_TYPE_SK_CANVAS_SAVELAYERREC_FLAGS = 1 << 4, +} sk_canvas_savelayerrec_flags_t; + +typedef struct { + sk_rect_t* fBounds; + sk_paint_t* fPaint; + sk_imagefilter_t* fBackdrop; + sk_canvas_savelayerrec_flags_t fFlags; +} sk_canvas_savelayerrec_t; + /* * Skottie Animation */ diff --git a/src/c/sk_canvas.cpp b/src/c/sk_canvas.cpp index 2e99202d54b5..4d2324485435 100644 --- a/src/c/sk_canvas.cpp +++ b/src/c/sk_canvas.cpp @@ -113,8 +113,8 @@ int sk_canvas_save_layer(sk_canvas_t* ccanvas, const sk_rect_t* crect, const sk_ return AsCanvas(ccanvas)->saveLayer(AsRect(crect), AsPaint(cpaint)); } -int sk_canvas_save_layer_rec(sk_canvas_t* ccanvas, const sk_rect_t* cbounds, const sk_paint_t* cpaint, const sk_imagefilter_t* cfilter, uint32_t flags) { - return AsCanvas(ccanvas)->saveLayer(SkCanvas::SaveLayerRec(AsRect(cbounds), AsPaint(cpaint), AsImageFilter(cfilter), flags)); +int sk_canvas_save_layer_rec(sk_canvas_t* ccanvas, const sk_canvas_savelayerrec_t* crec) { + return AsCanvas(ccanvas)->saveLayer(AsCanvasSaveLayerRec(crec)); } void sk_canvas_restore(sk_canvas_t* ccanvas) { diff --git a/src/c/sk_enums.cpp b/src/c/sk_enums.cpp index b66e70431e0c..e498470fcfda 100644 --- a/src/c/sk_enums.cpp +++ b/src/c/sk_enums.cpp @@ -394,6 +394,12 @@ static_assert ((int)SkRuntimeEffect::Uniform::Flags::kVertex_Flag == (i static_assert ((int)SkRuntimeEffect::Uniform::Flags::kFragment_Flag == (int)FRAGMENT_SK_RUNTIMEEFFECT_UNIFORM_FLAGS, ASSERT_MSG(SkRuntimeEffect::Uniform::Flags, sk_runtimeeffect_uniform_flags_t)); static_assert ((int)SkRuntimeEffect::Uniform::Flags::kHalfPrecision_Flag == (int)HALF_PRECISION_SK_RUNTIMEEFFECT_UNIFORM_FLAGS, ASSERT_MSG(SkRuntimeEffect::Uniform::Flags, sk_runtimeeffect_uniform_flags_t)); +// sk_canvas_savelayerrec_flags_t +static_assert ((int)0 == (int)NONE_SK_CANVAS_SAVELAYERREC_FLAGS, ASSERT_MSG(SkCanvas::SaveLayerFlagsSet, sk_canvas_savelayerrec_flags_t)); +static_assert ((int)SkCanvas::SaveLayerFlagsSet::kPreserveLCDText_SaveLayerFlag == (int)PRESERVE_LCD_TEXT_SK_CANVAS_SAVELAYERREC_FLAGS, ASSERT_MSG(SkCanvas::SaveLayerFlagsSet, sk_canvas_savelayerrec_flags_t)); +static_assert ((int)SkCanvas::SaveLayerFlagsSet::kInitWithPrevious_SaveLayerFlag == (int)INITIALIZE_WITH_PREVIOUS_SK_CANVAS_SAVELAYERREC_FLAGS, ASSERT_MSG(SkCanvas::SaveLayerFlagsSet, sk_canvas_savelayerrec_flags_t)); +static_assert ((int)SkCanvas::SaveLayerFlagsSet::kF16ColorType == (int)F16_COLOR_TYPE_SK_CANVAS_SAVELAYERREC_FLAGS, ASSERT_MSG(SkCanvas::SaveLayerFlagsSet, sk_canvas_savelayerrec_flags_t)); + #if defined(SK_GANESH) // gr_surfaceorigin_t diff --git a/src/c/sk_types_priv.h b/src/c/sk_types_priv.h index 080cf2268509..695211bd1b98 100644 --- a/src/c/sk_types_priv.h +++ b/src/c/sk_types_priv.h @@ -184,6 +184,14 @@ DEF_MAP(SkRuntimeEffect::Child, sk_runtimeeffect_child_t, RuntimeEffectChild) #include "include/core/SkCanvas.h" DEF_MAP(SkCanvas::Lattice, sk_lattice_t, Lattice) +static inline SkCanvas::SaveLayerRec AsCanvasSaveLayerRec(const sk_canvas_savelayerrec_t* rec) { + return SkCanvas::SaveLayerRec( + AsRect(rec->fBounds), + AsPaint(rec->fPaint), + AsImageFilter(rec->fBackdrop), + (SkCanvas::SaveLayerFlags)rec->fFlags); +} + #include "include/codec/SkCodec.h" DEF_MAP(SkCodec::FrameInfo, sk_codec_frameinfo_t, FrameInfo) DEF_MAP(SkCodec::Options, sk_codec_options_t, CodecOptions)