This is an automated email from the git hooks/post-receive script.

git pushed a commit to branch master
in repository legacy-imlib2.

View the commit online.

commit e41499a528920cab4c00ed49752b9469ac1e69ba
Author: Kim Woelders <[email protected]>
AuthorDate: Mon Feb 20 16:40:22 2023 +0100

    x11_grab: Rework clipping
    
    Source clipping in imlib_copy_drawable_to_image() was broken and is
    already dealt with in __imlib_GrabDrawableToRGBA().
    Destination clipping has now been added.
---
 src/lib/api_x11.c  |  39 -----------------
 src/lib/x11_grab.c | 123 +++++++++++++++++++++++++++--------------------------
 2 files changed, 63 insertions(+), 99 deletions(-)

diff --git a/src/lib/api_x11.c b/src/lib/api_x11.c
index 5c0be7d..09c7f75 100644
--- a/src/lib/api_x11.c
+++ b/src/lib/api_x11.c
@@ -385,7 +385,6 @@ imlib_copy_drawable_to_image(Pixmap mask, int src_x, int src_y, int src_width,
 {
    ImlibImage         *im;
    char                domask = 0;
-   int                 pre_adj;
 
    CHECK_PARAM_POINTER_RETURN("image", ctx->image, 0);
    if (mask)
@@ -400,44 +399,6 @@ imlib_copy_drawable_to_image(Pixmap mask, int src_x, int src_y, int src_width,
    if (ctx->error)
       return 0;
 
-   pre_adj = 0;
-   if (src_x < 0)
-     {
-        src_width += src_x;
-        pre_adj = src_x;
-        src_x = 0;
-     }
-   if (src_width < 0)
-      src_width = 0;
-   if (dst_x < 0)
-     {
-        src_width += dst_x;
-        src_x -= dst_x - pre_adj;
-        dst_x = 0;
-     }
-   if ((dst_x + src_width) >= im->w)
-      src_width = im->w - dst_x;
-
-   pre_adj = 0;
-   if (src_y < 0)
-     {
-        src_height += src_y;
-        pre_adj = src_y;
-        src_y = 0;
-     }
-   if (src_height < 0)
-      src_height = 0;
-   if (dst_y < 0)
-     {
-        src_height += dst_y;
-        src_y -= dst_y - pre_adj;
-        dst_y = 0;
-     }
-   if ((dst_y + src_height) >= im->h)
-      src_height = im->h - dst_y;
-
-   if ((src_width <= 0) || (src_height <= 0))
-      return 0;
    __imlib_DirtyImage(im);
 
    return !__imlib_GrabDrawableToRGBA(&ctx->x11, im->data,
diff --git a/src/lib/x11_grab.c b/src/lib/x11_grab.c
index 57404ae..0038555 100644
--- a/src/lib/x11_grab.c
+++ b/src/lib/x11_grab.c
@@ -606,12 +606,11 @@ __imlib_GrabDrawableToRGBA(const ImlibContextX11 * x11, uint32_t * data,
                            int x_src, int y_src, int w_src, int h_src,
                            char *pdomask, int grab)
 {
-   XWindowAttributes   xatt, ratt;
+   XWindowAttributes   xatt;
    bool                is_pixmap, is_shm, is_mshm;
    char                domask;
    int                 i;
-   int                 src_x, src_y, src_w, src_h;
-   int                 width, height, clipx, clipy;
+   int                 width, height;
    Pixmap              mask = mask_;
    XShmSegmentInfo     shminfo, mshminfo;
    XImage             *xim, *mxim;
@@ -619,85 +618,96 @@ __imlib_GrabDrawableToRGBA(const ImlibContextX11 * x11, uint32_t * data,
 
    domask = (pdomask) ? *pdomask : 0;
 
-   h_dst = 0;                   /* h_dst is not used */
-
    if (grab)
       XGrabServer(x11->dpy);
 
+   width = w_src;
+   height = h_src;
+
    is_pixmap = _DrawableCheck(x11->dpy, draw, &xatt);
 
    if (is_pixmap)
      {
-        Window              dw;
+        Window              rret;
+        unsigned int        bw;
 
-        XGetGeometry(x11->dpy, draw, &dw, &src_x, &src_y,
-                     (unsigned int *)&src_w, (unsigned int *)&src_h,
-                     (unsigned int *)&src_x, (unsigned int *)&xatt.depth);
-        src_x = 0;
-        src_y = 0;
+        XGetGeometry(x11->dpy, draw, &rret, &xatt.x, &xatt.y,
+                     (unsigned int *)&xatt.width, (unsigned int *)&xatt.height,
+                     &bw, (unsigned int *)&xatt.depth);
      }
    else
      {
-        Window              dw;
+        XWindowAttributes   ratt;
+        Window              cret;
 
-        XGetWindowAttributes(x11->dpy, xatt.root, &ratt);
-        XTranslateCoordinates(x11->dpy, draw, xatt.root,
-                              0, 0, &src_x, &src_y, &dw);
-        src_w = xatt.width;
-        src_h = xatt.height;
         if ((xatt.map_state != IsViewable) && (xatt.backing_store == NotUseful))
            goto bail;
-     }
 
-   /* clip to the drawable tree and screen */
-   clipx = 0;
-   clipy = 0;
-   width = src_w - x_src;
-   height = src_h - y_src;
-   if (width > w_src)
-      width = w_src;
-   if (height > h_src)
-      height = h_src;
-
-   if (!is_pixmap)
-     {
-        if ((src_x + x_src + width) > ratt.width)
-           width = ratt.width - (src_x + x_src);
-        if ((src_y + y_src + height) > ratt.height)
-           height = ratt.height - (src_y + y_src);
+        /* Clip source to screen */
+        XGetWindowAttributes(x11->dpy, xatt.root, &ratt);
+        XTranslateCoordinates(x11->dpy, draw, xatt.root,
+                              0, 0, &xatt.x, &xatt.y, &cret);
+
+        if (xatt.x + x_src < 0)
+          {
+             width += xatt.x + x_src;
+             x_src = -xatt.x;
+          }
+        if (xatt.x + x_src + width > ratt.width)
+           width = ratt.width - (xatt.x + x_src);
+
+        if (xatt.y + y_src < 0)
+          {
+             height += xatt.y + y_src;
+             y_src = -xatt.y;
+          }
+        if (xatt.y + y_src + height > ratt.height)
+           height = ratt.height - (xatt.y + y_src);
+
+        /* Is this ever relevant? */
+        if (xatt.colormap == None)
+           xatt.colormap = ratt.colormap;
      }
 
+   /* Clip source to drawable */
    if (x_src < 0)
      {
-        clipx = -x_src;
+        x_dst += -x_src;
         width += x_src;
         x_src = 0;
      }
+   if (x_src + width > xatt.width)
+      width = xatt.width - x_src;
 
    if (y_src < 0)
      {
-        clipy = -y_src;
+        y_dst += -y_src;
         height += y_src;
         y_src = 0;
      }
+   if (y_src + height > xatt.height)
+      height = xatt.height - y_src;
 
-   if (!is_pixmap)
+   /* Clip source to destination */
+   if (x_dst < 0)
      {
-        if ((src_x + x_src) < 0)
-          {
-             clipx -= (src_x + x_src);
-             width += (src_x + x_src);
-             x_src = -src_x;
-          }
-        if ((src_y + y_src) < 0)
-          {
-             clipy -= (src_y + y_src);
-             height += (src_y + y_src);
-             y_src = -src_y;
-          }
+        x_src -= x_dst;
+        width += x_dst;
+        x_dst = 0;
      }
+   if (x_dst + width > w_dst)
+      width = w_dst - x_dst;
 
-   if ((width <= 0) || (height <= 0))
+   if (y_dst < 0)
+     {
+        y_src -= y_dst;
+        height += y_dst;
+        y_dst = 0;
+     }
+   else if (y_dst + height > h_dst)
+      height = h_dst - y_dst;
+
+   if (width <= 0 || height <= 0)
       goto bail;
 
    w_src = width;
@@ -757,15 +767,9 @@ __imlib_GrabDrawableToRGBA(const ImlibContextX11 * x11, uint32_t * data,
         if (!cmap)
           {
              if (is_pixmap)
-               {
-                  cmap = DefaultColormap(x11->dpy, DefaultScreen(x11->dpy));
-               }
+                cmap = DefaultColormap(x11->dpy, DefaultScreen(x11->dpy));
              else
-               {
-                  cmap = xatt.colormap;
-                  if (cmap == None)
-                     cmap = ratt.colormap;
-               }
+                cmap = xatt.colormap;
           }
 
         for (i = 0; i < (1 << xatt.depth); i++)
@@ -782,8 +786,7 @@ __imlib_GrabDrawableToRGBA(const ImlibContextX11 * x11, uint32_t * data,
           }
      }
 
-   __imlib_GrabXImageToRGBA(x11, data,
-                            x_dst + clipx, y_dst + clipy, w_dst, h_dst,
+   __imlib_GrabXImageToRGBA(x11, data, x_dst, y_dst, w_dst, h_dst,
                             xim, mxim, x_src, y_src, w_src, h_src, 0);
 
    /* destroy the Ximage */

-- 
To stop receiving notification emails like this one, please contact
the administrator of this repository.

Reply via email to