e_blur: add dim_config and api for config 40/325140/1
authorhojoon-ryou <hojoon.ryou@samsung.com>
Thu, 22 May 2025 02:25:16 +0000 (11:25 +0900)
committerTizen Window System <tizen.windowsystem@gmail.com>
Wed, 4 Jun 2025 03:47:47 +0000 (12:47 +0900)
Change-Id: I583b18fc863bd9179af84ba605bbd94435f76c4c

src/bin/server/e_blur.c
src/include/e_blur.h [new file with mode: 0644]

index 94facfc750af46938bc1327d3d3af03dd053a1db..b1d2355fd4cac6c5240148bd2831696bfa3e6977 100644 (file)
@@ -1,4 +1,5 @@
 #include "e.h"
+#include "e_blur.h"
 #include "e_blur_intern.h"
 #include "e_blur_video_capture_intern.h"
 #include "e_comp_wl_intern.h"
@@ -38,6 +39,10 @@ struct _E_Blur_Manager
 
    Eina_List *blurs;
    Eina_List *blurs_behind;
+
+   struct {
+      E_Blur_Dim_Config *dim_config;
+   } configs;
 };
 
 struct _E_Blur
@@ -634,9 +639,14 @@ _e_blur_rectangle_dim_rect_new(E_Blur_Rectangle *blur_rectangle, E_View_Tree *vi
 {
    E_View_Rect *dim_rect = NULL;
    E_View *dim_view = NULL;
-   int dim_color[4] = {15, 15, 15, 153};
+   int dim_color[4];
 
    EINA_SAFETY_ON_NULL_RETURN(view_tree);
+   EINA_SAFETY_ON_NULL_RETURN(_blur_manager->configs.dim_config);
+   dim_color[0] = _blur_manager->configs.dim_config->color.r;
+   dim_color[1] = _blur_manager->configs.dim_config->color.g;
+   dim_color[2] = _blur_manager->configs.dim_config->color.b;
+   dim_color[3] = _blur_manager->configs.dim_config->color.a;
 
    dim_rect = e_view_rect_create(view_tree, 1, 1, dim_color);
    EINA_SAFETY_ON_NULL_RETURN(dim_rect);
@@ -1188,6 +1198,14 @@ e_blur_manager_init(void)
    blur_manager = E_NEW(E_Blur_Manager, 1);
    EINA_SAFETY_ON_NULL_RETURN_VAL(blur_manager, EINA_FALSE);
 
+   blur_manager->configs.dim_config = E_NEW(E_Blur_Dim_Config, 1);
+   EINA_SAFETY_ON_NULL_GOTO(blur_manager->configs.dim_config, fail);
+   blur_manager->configs.dim_config->enabled = EINA_TRUE;
+   blur_manager->configs.dim_config->color.r = 15;
+   blur_manager->configs.dim_config->color.g = 15;
+   blur_manager->configs.dim_config->color.b = 15;
+   blur_manager->configs.dim_config->color.a = 153; // #1A1A1A, 60%, premultiplied alpha
+
    blur_manager->tizen_blur_manager = ds_tizen_blur_manager_create(wl_disp);
    EINA_SAFETY_ON_NULL_GOTO(blur_manager->tizen_blur_manager, fail);
 
@@ -1215,6 +1233,7 @@ e_blur_manager_init(void)
 
 fail:
 
+   if (blur_manager->configs.dim_config) free(blur_manager->configs.dim_config);
    free(blur_manager);
 
    return EINA_FALSE;
@@ -1332,3 +1351,103 @@ e_blur_trace_debug(Eina_Bool onoff)
    INF("Blur Debug is %s", onoff?"ON":"OFF");
    e_blur_video_capture_trace_debug(onoff);
 }
+
+E_API Eina_Bool 
+e_blur_dim_config_set(E_Blur_Dim_Config *dim_config)
+{
+   EINA_SAFETY_ON_NULL_RETURN_VAL(_blur_manager, EINA_FALSE);
+   EINA_SAFETY_ON_NULL_RETURN_VAL(_blur_manager->configs.dim_config, EINA_FALSE);
+
+   E_Blur_Dim_Config *current_dim_config = _blur_manager->configs.dim_config;
+   Eina_Bool before_enabled = current_dim_config->enabled;
+   Eina_Bool after_enabled = dim_config->enabled;
+   E_View_Client *view_client;
+   E_View_Tree *view_client_tree;
+   E_Blur *blur;
+   E_Blur_Behind *blur_behind;
+   E_Blur_Rectangle *blur_rectangle;
+   Eina_List *l, *ll;
+
+   current_dim_config->enabled = dim_config->enabled;
+   current_dim_config->color.r = dim_config->color.r;
+   current_dim_config->color.g = dim_config->color.g;
+   current_dim_config->color.b = dim_config->color.b;
+   current_dim_config->color.a = dim_config->color.a;
+
+   if (!before_enabled && !after_enabled)
+     return EINA_TRUE;
+
+   EINA_LIST_FOREACH(_blur_manager->blurs, l, blur)
+     {
+        view_client = e_client_view_get(blur->ec);
+        if (!view_client) continue;
+        view_client_tree = e_view_parent_get(e_view_client_view_get(view_client));
+        if (!view_client_tree) continue;
+        EINA_LIST_FOREACH(blur->blur_rectangles, ll, blur_rectangle)
+          {
+             if (after_enabled)
+               {
+                  if (!blur_rectangle->dim_rect)
+                    {
+                       _e_blur_rectangle_dim_rect_new(blur_rectangle, view_client_tree, "blur_dim_obj");
+                       EINA_SAFETY_ON_NULL_RETURN_VAL(blur_rectangle->dim_rect, EINA_FALSE);
+                       e_view_place_below(e_view_rect_view_get(blur_rectangle->dim_rect),
+                                          e_view_image_view_get(blur_rectangle->view_image));
+                       if (blur_rectangle->corner_radius_image)
+                         e_view_clip_set(e_view_rect_view_get(blur_rectangle->dim_rect),
+                                         e_view_image_view_get(blur_rectangle->corner_radius_image));
+                       _e_blur_rectangle_geometry_set(blur_rectangle, blur->ec);
+                       if (blur->enabled) _e_blur_rectangle_show(blur_rectangle);
+                    }
+                  e_view_rect_color_set(blur_rectangle->dim_rect,
+                                       current_dim_config->color.r,
+                                       current_dim_config->color.g,
+                                       current_dim_config->color.b,
+                                       current_dim_config->color.a);
+               }
+             else if (before_enabled)
+               _e_blur_rectangle_dim_rect_free(blur_rectangle);
+         }
+     }
+
+   EINA_LIST_FOREACH(_blur_manager->blurs_behind, l, blur_behind)
+     {
+        view_client = e_client_view_get(blur_behind->ec);
+        if (!view_client) continue;
+        view_client_tree = e_view_parent_get(e_view_client_view_get(view_client));
+        if (!view_client_tree) continue;
+        blur_rectangle = blur_behind->blur_rectangle;
+        if (after_enabled)
+          {
+             if (!blur_rectangle->dim_rect)
+               {
+                  _e_blur_rectangle_dim_rect_new(blur_rectangle, view_client_tree, "blur_behind_dim_obj");
+                  EINA_SAFETY_ON_NULL_RETURN_VAL(blur_rectangle->dim_rect, EINA_FALSE);
+                  e_view_place_below(e_view_rect_view_get(blur_rectangle->dim_rect),
+                                     e_view_image_view_get(blur_rectangle->view_image));
+                  if (blur_rectangle->corner_radius_image)
+                    e_view_clip_set(e_view_rect_view_get(blur_rectangle->dim_rect),
+                                    e_view_image_view_get(blur_rectangle->corner_radius_image));
+                  _e_blur_rectangle_geometry_set(blur_rectangle, blur_behind->ec);
+                  if (blur_behind->enabled) _e_blur_rectangle_show(blur_rectangle);
+               }
+             e_view_rect_color_set(blur_rectangle->dim_rect,
+                                   current_dim_config->color.r,
+                                   current_dim_config->color.g,
+                                   current_dim_config->color.b,
+                                   current_dim_config->color.a);
+          }
+        else if (before_enabled)
+          _e_blur_rectangle_dim_rect_free(blur_rectangle);
+     }
+
+   return EINA_TRUE;
+}
+
+E_API E_Blur_Dim_Config *
+e_blur_dim_config_get(void)
+{
+   EINA_SAFETY_ON_NULL_RETURN_VAL(_blur_manager, NULL);
+
+   return _blur_manager->configs.dim_config;
+}
diff --git a/src/include/e_blur.h b/src/include/e_blur.h
new file mode 100644 (file)
index 0000000..b5c7b07
--- /dev/null
@@ -0,0 +1,30 @@
+#ifndef E_BLUR_H
+#define E_BLUR_H
+
+#ifdef  __cplusplus
+extern "C" {
+#endif
+
+#include "e_types.h"
+
+typedef struct _E_Blur_Dim_Config E_Blur_Dim_Config;
+
+struct _E_Blur_Dim_Config
+{
+   Eina_Bool enabled;
+   struct {
+      unsigned char r;
+      unsigned char g;
+      unsigned char b;
+      unsigned char a;
+   } color; /* premultiplied alpha */
+};
+
+E_API Eina_Bool e_blur_dim_config_set(E_Blur_Dim_Config *dim_config);
+E_API E_Blur_Dim_Config *e_blur_dim_config_get(void);
+
+#ifdef  __cplusplus
+}
+#endif
+
+#endif
\ No newline at end of file