e_blur: add dimming layer 32/325132/1
authorhojoon-ryou <hojoon.ryou@samsung.com>
Tue, 27 May 2025 10:39:39 +0000 (19:39 +0900)
committerTizen Window System <tizen.windowsystem@gmail.com>
Wed, 4 Jun 2025 03:47:47 +0000 (12:47 +0900)
The initial dimming layer's color is #1A1A1A, 60% opacity

Change-Id: I59762ae1269b6f711d719066c42ce44364f3e3ad

src/bin/server/e_blur.c

index 57101d897c15c88fe4824e5aa8c4143f9e58c29d..d3a3502a828b3b43dd4f4a5ebcdeb521a9f3061b 100644 (file)
@@ -4,6 +4,7 @@
 #include "e_comp_wl_intern.h"
 #include "e_client_intern.h"
 #include "e_view_image_intern.h"
+#include "e_view_rect.h"
 #include "e_comp_cfdata_intern.h"
 #include <pixman.h>
 #include <libds-tizen/blur.h>
@@ -77,6 +78,7 @@ struct _E_Blur_Rectangle
    int rx, ry;
 
    E_View_Image *view_image;
+   E_View_Rect  *dim_rect;
    E_View_Image *corner_radius_view_image;
 };
 
@@ -97,6 +99,7 @@ struct _E_Blur_Behind
 
    uint32_t radius;
    E_View_Image *view_image;
+   E_View_Rect  *dim_rect;
 
    Eina_Bool enabled;
 };
@@ -229,6 +232,7 @@ _e_blur_rectangle_free(E_Blur_Rectangle *blur_rectangle)
    _e_blur_rectangle_remove(blur_rectangle->blur, blur_rectangle);
 
    e_view_destroy(e_view_image_view_get(blur_rectangle->view_image));
+   e_view_destroy(e_view_rect_view_get(blur_rectangle->dim_rect));
 
    if (blur_rectangle->corner_radius_view_image)
      e_view_destroy(e_view_image_view_get(blur_rectangle->corner_radius_view_image));
@@ -265,6 +269,7 @@ _e_blur_rectangle_geometry_set(E_Blur_Rectangle *blur_rectangle, E_Client *ec)
 {
    int ec_x, ec_y, ec_w, ec_h;
    int vc_x, vc_y, vc_w, vc_h;
+   int final_x, final_y, final_w, final_h;
    double scale_w, scale_h;
    E_View_Client *view_client;
 
@@ -280,33 +285,34 @@ _e_blur_rectangle_geometry_set(E_Blur_Rectangle *blur_rectangle, E_Client *ec)
         scale_w = (double)ec_w / (double)vc_w;
         scale_h = (double)ec_h / (double)vc_h;
 
-        e_view_image_geometry_set(blur_rectangle->view_image,
-                                  ec_x + blur_rectangle->x,
-                                  ec_y + blur_rectangle->y,
-                                  (int)((double)blur_rectangle->w * scale_w),
-                                  (int)((double)blur_rectangle->h * scale_h));
-
-        if (blur_rectangle->corner_radius_view_image)
-          e_view_image_geometry_set(blur_rectangle->corner_radius_view_image,
-                                    ec_x + blur_rectangle->x,
-                                    ec_y + blur_rectangle->y,
-                                    (int)((double)blur_rectangle->w * scale_w),
-                                    (int)((double)blur_rectangle->h * scale_h));
+        final_x = ec_x + blur_rectangle->x;
+        final_y = ec_y + blur_rectangle->y;
+        final_w = (int)((double)blur_rectangle->w * scale_w);
+        final_h = (int)((double)blur_rectangle->h * scale_h);
      }
    else
      {
-        e_view_image_geometry_set(blur_rectangle->view_image,
-                                  vc_x + blur_rectangle->x,
-                                  vc_y + blur_rectangle->y,
-                                  blur_rectangle->w,
-                                  blur_rectangle->h);
+        final_x = vc_x + blur_rectangle->x;
+        final_y = vc_y + blur_rectangle->y;
+        final_w = blur_rectangle->w;
+        final_h = blur_rectangle->h;
+     }
 
-        if (blur_rectangle->corner_radius_view_image)
-          e_view_image_geometry_set(blur_rectangle->corner_radius_view_image,
-                                    vc_x + blur_rectangle->x,
-                                    vc_y + blur_rectangle->y,
-                                    blur_rectangle->w,
-                                    blur_rectangle->h);
+   e_view_image_geometry_set(blur_rectangle->view_image,
+                             final_x, final_y, final_w, final_h);
+   e_view_position_set(e_view_rect_view_get(blur_rectangle->dim_rect),
+                       final_x, final_y);
+   e_view_rect_size_set(blur_rectangle->dim_rect,
+                        final_w, final_h);
+
+   if (blur_rectangle->corner_radius_view_image)
+     {
+        e_view_image_geometry_set(blur_rectangle->corner_radius_view_image,
+                                  final_x, final_y, final_w, final_h);
+        e_view_position_set(e_view_rect_view_get(blur_rectangle->dim_rect),
+                            final_x, final_y);
+        e_view_rect_size_set(blur_rectangle->dim_rect,
+                             final_w, final_h);
      }
 }
 
@@ -372,6 +378,7 @@ _e_blur_cb_ds_tizen_blur_commit(struct wl_listener *listener, void *data)
              if (!e_view_client_visible_get(vc)) continue;
 
              e_view_show(e_view_image_view_get(blur_rectangle->view_image));
+             e_view_show(e_view_rect_view_get(blur_rectangle->dim_rect));
              if (blur_rectangle->corner_radius_view_image)
                e_view_show(e_view_image_view_get(blur_rectangle->corner_radius_view_image));
           }
@@ -383,6 +390,7 @@ _e_blur_cb_ds_tizen_blur_commit(struct wl_listener *listener, void *data)
         EINA_LIST_FOREACH(blur->blur_rectangles, l, blur_rectangle)
           {
              e_view_hide(e_view_image_view_get(blur_rectangle->view_image));
+             e_view_hide(e_view_rect_view_get(blur_rectangle->dim_rect));
              if (blur_rectangle->corner_radius_view_image)
                e_view_hide(e_view_image_view_get(blur_rectangle->corner_radius_view_image));
           }
@@ -404,6 +412,7 @@ _e_blur_cb_show(struct wl_listener *listener, void *data)
    EINA_LIST_FOREACH(blur->blur_rectangles, l, blur_rectangle)
      {
         e_view_show(e_view_image_view_get(blur_rectangle->view_image));
+        e_view_show(e_view_rect_view_get(blur_rectangle->dim_rect));
         if (blur_rectangle->corner_radius_view_image)
           e_view_show(e_view_image_view_get(blur_rectangle->corner_radius_view_image));
      }
@@ -421,6 +430,7 @@ _e_blur_cb_hide(struct wl_listener *listener, void *data)
    EINA_LIST_FOREACH(blur->blur_rectangles, l, blur_rectangle)
      {
         e_view_hide(e_view_image_view_get(blur_rectangle->view_image));
+        e_view_hide(e_view_rect_view_get(blur_rectangle->dim_rect));
         if (blur_rectangle->corner_radius_view_image)
           e_view_hide(e_view_image_view_get(blur_rectangle->corner_radius_view_image));
      }
@@ -581,7 +591,9 @@ _e_blur_cb_new_rectangle(struct wl_listener *listener, void *data)
    E_Blur_Rectangle *blur_rectangle;
    struct ds_tizen_blur_rectangle *tizen_blur_rectangle = data;
    E_View_Image *view_image = NULL, *corner_radius_view_image = NULL;
-   E_View *img_view = NULL, *corner_img_view = NULL;
+   E_View_Rect *dim_rect = NULL;
+   int dim_color[4] = {0x1A, 0x1A, 0x1A, 0.6 * 0xFF};
+   E_View *dim_view = NULL, *img_view = NULL, *corner_img_view = NULL;
    E_View_Client *blur_view_client;
    E_View_Tree *blur_view_client_tree;
    E_Blur_Hook_Data hook_data;
@@ -598,7 +610,11 @@ _e_blur_cb_new_rectangle(struct wl_listener *listener, void *data)
    view_image = e_view_image_filled_create(blur_view_client_tree);
    EINA_SAFETY_ON_NULL_RETURN(view_image);
 
+   dim_rect = e_view_rect_create(blur_view_client_tree, 1, 1, dim_color);
+   EINA_SAFETY_ON_NULL_RETURN(dim_rect);
+
    img_view = e_view_image_view_get(view_image);
+   dim_view = e_view_rect_view_get(dim_rect);
 
    blur_rectangle = E_NEW(E_Blur_Rectangle, 1);
    EINA_SAFETY_ON_NULL_GOTO(blur_rectangle, fail);
@@ -619,6 +635,8 @@ _e_blur_cb_new_rectangle(struct wl_listener *listener, void *data)
 
    e_view_image_snapshot_set(view_image, true);
    e_view_name_set(img_view, "blur_obj");
+   e_view_position_set(dim_view, blur_rectangle->x, blur_rectangle->y);
+   e_view_rect_size_set(dim_rect, blur_rectangle->w, blur_rectangle->h);
 
    if ((blur_rectangle->rx != 0) && (blur_rectangle->ry != 0))
      {
@@ -635,25 +653,29 @@ _e_blur_cb_new_rectangle(struct wl_listener *listener, void *data)
         e_view_image_data_set(corner_radius_view_image, pixels);
         e_view_image_data_update_add(corner_radius_view_image, 0, 0, 1, 1);
         e_view_clip_set(img_view, corner_img_view);
+        e_view_clip_set(dim_view, corner_img_view);
 
         blur_rectangle->corner_radius_view_image = corner_radius_view_image;
      }
    blur_rectangle->blur = blur;
    blur_rectangle->view_image = view_image;
+   blur_rectangle->dim_rect = dim_rect;
 
    _e_blur_rectangle_add(blur, blur_rectangle);
    _e_blur_rectangle_filter_set(blur_rectangle);
    _e_blur_rectangle_geometry_set(blur_rectangle, blur->ec);
    e_view_pass_events_set(img_view, true);
+   e_view_pass_events_set(dim_view, true);
    e_view_place_below(img_view, e_view_client_view_get(blur_view_client));
    if (corner_img_view)
      e_view_place_above(corner_img_view, img_view);
-
+   e_view_place_below(dim_view, img_view);
    if (e_view_client_visible_get(blur_view_client) && _e_blur_enabled_get(blur))
      {
         e_view_show(img_view);
+        e_view_show(dim_view);
         if (corner_img_view)
-        e_view_show(corner_img_view);
+          e_view_show(corner_img_view);
      }
 
 
@@ -667,6 +689,7 @@ _e_blur_cb_new_rectangle(struct wl_listener *listener, void *data)
    return;
 
 fail:
+   if (dim_view) e_view_destroy(dim_view);
    if (img_view) e_view_destroy(img_view);
    if (corner_img_view) e_view_destroy(corner_img_view);
    if (blur_rectangle) free(blur_rectangle);
@@ -780,6 +803,7 @@ _e_blur_behind_free(E_Blur_Behind *blur_behind)
 
    _e_blur_behind_ec_set(blur_behind, NULL);
    e_view_destroy(e_view_image_view_get(blur_behind->view_image));
+   e_view_destroy(e_view_rect_view_get(blur_behind->dim_rect));
    _e_blur_behind_enabled_set(blur_behind, EINA_FALSE);
 
    free(blur_behind);
@@ -838,12 +862,14 @@ _e_blur_behind_cb_ds_tizen_blur_behind_commit(struct wl_listener *listener, void
          _e_blur_behind_filter_set(blur_behind);
         if (!e_view_client_visible_get(e_client_view_get(blur_behind->ec))) return;
         e_view_show(e_view_image_view_get(blur_behind->view_image));
+        e_view_show(e_view_rect_view_get(blur_behind->dim_rect));
 
         _e_blur_behind_enabled_set(blur_behind, EINA_TRUE);
      }
    else
      {
         e_view_hide(e_view_image_view_get(blur_behind->view_image));
+        e_view_hide(e_view_rect_view_get(blur_behind->dim_rect));
 
         _e_blur_behind_enabled_set(blur_behind, EINA_FALSE);
      }
@@ -874,6 +900,7 @@ _e_blur_behind_cb_show(struct wl_listener *listener, void *data)
    if (!blur_behind->radius) return;
 
    e_view_show(e_view_image_view_get(blur_behind->view_image));
+   e_view_show(e_view_rect_view_get(blur_behind->dim_rect));
 
    _e_blur_behind_enabled_set(blur_behind, EINA_TRUE);
 }
@@ -886,6 +913,7 @@ _e_blur_behind_cb_hide(struct wl_listener *listener, void *data)
    blur_behind = wl_container_of(listener, blur_behind, listener.hide);
 
    e_view_hide(e_view_image_view_get(blur_behind->view_image));
+   e_view_hide(e_view_rect_view_get(blur_behind->dim_rect));
 
    _e_blur_behind_enabled_set(blur_behind, EINA_FALSE);
 }
@@ -896,7 +924,7 @@ _e_blur_behind_cb_restack(struct wl_listener *listener, void *data)
    E_View *event_src_view = ((E_View_Event_Callback_Data *)data)->view;
    E_Blur_Behind *blur_behind;
    E_View_Tree *layer_tree;
-   E_View *img_view;
+   E_View *img_view, *dim_view;
 
    blur_behind = wl_container_of(listener, blur_behind, listener.restack);
 
@@ -904,9 +932,12 @@ _e_blur_behind_cb_restack(struct wl_listener *listener, void *data)
    if (!layer_tree) return;
 
    img_view = e_view_image_view_get(blur_behind->view_image);
+   dim_view = e_view_rect_view_get(blur_behind->dim_rect);
 
    e_view_reparent(img_view, layer_tree);
+   e_view_reparent(dim_view, layer_tree);
    e_view_place_below(img_view, _e_blur_behind_bottom_view_get(event_src_view));
+   e_view_place_below(dim_view, img_view);
 }
 
 static void
@@ -972,7 +1003,9 @@ _e_blur_manager_cb_new_blur_behind(struct wl_listener *listener, void *data)
    E_View_Client *view_client;
    E_View_Tree *view_client_tree;
    E_View_Image *view_image;
-   E_View *image_view;
+   E_View_Rect *dim_rect;
+   int dim_color[4] = {0x1A, 0x1A, 0x1A, 0.6 * 0xFF};
+   E_View *image_view, *dim_view;
    E_Blur_Hook_Data hook_data;
    int comp_w = 0, comp_h = 0;
 
@@ -998,7 +1031,12 @@ _e_blur_manager_cb_new_blur_behind(struct wl_listener *listener, void *data)
 
    view_image = e_view_image_filled_create(view_client_tree);
    EINA_SAFETY_ON_NULL_RETURN(view_image);
+
+   dim_rect = e_view_rect_create(view_client_tree, 1, 1, dim_color);
+   EINA_SAFETY_ON_NULL_RETURN(dim_rect);
+
    image_view = e_view_image_view_get(view_image);
+   dim_view = e_view_rect_view_get(dim_rect);
 
    blur_behind = E_NEW(E_Blur_Behind, 1);
    EINA_SAFETY_ON_NULL_RETURN(blur_behind);
@@ -1016,11 +1054,16 @@ _e_blur_manager_cb_new_blur_behind(struct wl_listener *listener, void *data)
    e_view_image_snapshot_set(view_image, true);
    e_view_name_set(image_view, "blur_behind_obj");
    e_view_pass_events_set(image_view, true);
+   e_view_pass_events_set(dim_view, true);
    e_comp_size_get(&comp_w, &comp_h);
    e_view_image_geometry_set(view_image, 0, 0, comp_w, comp_h);
+   e_view_position_set(dim_view, 0, 0);
+   e_view_rect_size_set(dim_rect, comp_w, comp_h);
    e_view_place_below(image_view, _e_blur_behind_bottom_view_get(e_view_client_view_get(view_client)));
+   e_view_place_below(dim_view, image_view);
 
    blur_behind->view_image = view_image;
+   blur_behind->dim_rect = dim_rect;
    blur_manager->blurs_behind = eina_list_append(blur_manager->blurs_behind, blur_behind);
 
    ELOGF("E_BLUR", "E_Blur_Behind:%p Create", ec, blur_behind);