[comp.windows.x] Patch to speedup to the Xhp ImageEdit widget

spa%hara.fctunl.rccn.pt@MITVMA.MIT.EDU (Salvador Pinto Abreu) (01/03/89)

While we're at   it, I have  another  patch to  speedup  handling   of
exposure events in the ImageEdit widget as distributed in X.V11R3.

For large images this is really necessary.

By the way, I have done some work in porting the HP Xw widgets  to the
R3 intrinsics. It is not finished  (I still have  problems with Popups
and  a  few layout widgets)  but most of the stuff  is working now. If
there is interest I may post the diffs to xpert.

*** Note: This patch must be  applied  with  'patch -l'  because  most
          BITNET mailers trucidate tabs.

*** ImageEdit.c.old     Tue Jan  3 13:38:10 1989
--- ImageEdit.c Tue Jan  3 13:37:50 1989
***************
*** 368,374

  static void Redisplay (iw, event, region)
  XwImageEditWidget iw;
! XEvent * event;
  Region region;

  {

--- 368,374 -----

  static void Redisplay (iw, event, region)
  XwImageEditWidget iw;
! XExposeEvent * event;
  Region region;

  {
***************
*** 421,426
                         iw -> primitive.highlight_thickness,
                         rect, 1, Unsorted);



     yPos = gridThickness + iw -> primitive.highlight_thickness;

--- 421,427 -----
                         iw -> primitive.highlight_thickness,
                         rect, 1, Unsorted);

+    XClipBox (region, rect);

  #define SCALE_WI(v) \
     (((v) - gridThickness - iw->primitive.highlight_thickness) / \
***************
*** 422,427
                         rect, 1, Unsorted);



     yPos = gridThickness + iw -> primitive.highlight_thickness;


--- 423,431 -----

     XClipBox (region, rect);

+ #define SCALE_WI(v) \
+    (((v) - gridThickness - iw->primitive.highlight_thickness) / \
+     (gridThickness + pixelScale))

  #define SCALE_IW(v) \
     ((v) * (gridThickness + pixelScale) + \
***************
*** 423,429



!    yPos = gridThickness + iw -> primitive.highlight_thickness;

     for (y = 0; y < image -> height; y++)
     {

--- 427,435 -----
     (((v) - gridThickness - iw->primitive.highlight_thickness) / \
      (gridThickness + pixelScale))

! #define SCALE_IW(v) \
!    ((v) * (gridThickness + pixelScale) + \
!     (gridThickness + iw->primitive.highlight_thickness))

      {
         int xwMin = rect[0].x - 1;
***************
*** 425,433

     yPos = gridThickness + iw -> primitive.highlight_thickness;

!    for (y = 0; y < image -> height; y++)
!    {
!       xPos = gridThickness + iw -> primitive.highlight_thickness;

        for (x = 0; x < image -> width; x++)
        {

--- 431,441 -----
     ((v) * (gridThickness + pixelScale) + \
      (gridThickness + iw->primitive.highlight_thickness))

!     {
!        int xwMin = rect[0].x - 1;
!        int xwMax = rect[0].x + rect[0].width + 1;
!        int ywMin = rect[0].y - 1;
!        int ywMax = rect[0].y + rect[0].height + 1;

         int xiMin = SCALE_WI(xwMin) - 1;
         int xiMax = SCALE_WI(xwMax) + 1;
***************
*** 429,437
     {
        xPos = gridThickness + iw -> primitive.highlight_thickness;

!       for (x = 0; x < image -> width; x++)
!       {
!          pixel = XGetPixel (image, x, y);

           if (pixel != background)
           {

--- 437,446 -----
         int ywMin = rect[0].y - 1;
         int ywMax = rect[0].y + rect[0].height + 1;

!        int xiMin = SCALE_WI(xwMin) - 1;
!        int xiMax = SCALE_WI(xwMax) + 1;
!        int yiMin = SCALE_WI(ywMin) - 1;
!        int yiMax = SCALE_WI(ywMax) + 1;

         if (xiMin < 0) xiMin = 0;
         if (yiMin < 0) yiMin = 0;
***************
*** 433,446
        {
           pixel = XGetPixel (image, x, y);

!          if (pixel != background)
!          {
!             if (pixel != foreground)
!             {
!                foreground = pixel;
!                values.foreground = foreground;
!              XChangeGC (display, drawGC, valueMask, &values);
!             }

              if (XRectInRegion (region, xPos, yPos,
                                 pixelScale, pixelScale) != RectangleOut)

--- 442,451 -----
         int yiMin = SCALE_WI(ywMin) - 1;
         int yiMax = SCALE_WI(ywMax) + 1;

!        if (xiMin < 0) xiMin = 0;
!        if (yiMin < 0) yiMin = 0;
!        if (xiMax > image->width)  xiMax = image->width;
!        if (yiMax > image->height) yiMax = image->height;

         yPos = SCALE_IW(yiMin);

***************
*** 442,451
               XChangeGC (display, drawGC, valueMask, &values);
              }

!             if (XRectInRegion (region, xPos, yPos,
!                                pixelScale, pixelScale) != RectangleOut)
!                XFillRectangle (display, window, drawGC,
!                                xPos, yPos, pixelScale, pixelScale);

           }


--- 447,453 -----
         if (xiMax > image->width)  xiMax = image->width;
         if (yiMax > image->height) yiMax = image->height;

!        yPos = SCALE_IW(yiMin);

         for (y = yiMin; y < yiMax; y++) {
           xPos = SCALE_IW(xiMin);
***************
*** 447,453
                 XFillRectangle (display, window, drawGC,
                                 xPos, yPos, pixelScale, pixelScale);

!          }

           xPos += gridThickness + pixelScale;
        }

--- 449,456 -----

         yPos = SCALE_IW(yiMin);

!        for (y = yiMin; y < yiMax; y++) {
!          xPos = SCALE_IW(xiMin);

           for (x = xiMin; x < xiMax; x++) {
               pixel = XGetPixel (image, x, y);
***************
*** 449,456

           }

!          xPos += gridThickness + pixelScale;
!       }

        yPos += gridThickness + pixelScale;
     }

--- 452,459 -----
         for (y = yiMin; y < yiMax; y++) {
           xPos = SCALE_IW(xiMin);

!          for (x = xiMin; x < xiMax; x++) {
!              pixel = XGetPixel (image, x, y);

               if (pixel != background) {
                   if (pixel != foreground) {
***************
*** 452,458
           xPos += gridThickness + pixelScale;
        }

!       yPos += gridThickness + pixelScale;
     }

     XFreeGC (display, drawGC);

--- 455,479 -----
           for (x = xiMin; x < xiMax; x++) {
               pixel = XGetPixel (image, x, y);

!              if (pixel != background) {
!                  if (pixel != foreground) {
!                      foreground = pixel;
!                      values.foreground = foreground;
!                      XChangeGC (display, drawGC, valueMask, &values);
!                  }
!
!                  if (XRectInRegion (region, xPos, yPos,
!                                     pixelScale, pixelScale) != RectangleOut)
!                      XFillRectangle (display, window, drawGC,
!                                      xPos, yPos, pixelScale, pixelScale);
!
!              }
!
!              xPos += gridThickness + pixelScale;
!          }
!
!          yPos += gridThickness + pixelScale;
!        }
     }

     XFreeGC (display, drawGC);
---
Salvador Pinto Abreu                 BITNET/Internet: spa@hara.fctunl.rccn.pt
                                                  or: FCT_SPA@PTIFM.BITNET
UUCP: ...{mcvax,inria}!inesc!unl!spa          PSI/VMS: PSI%(+2680)05010310::SPA
ARPA: spa%hara.fctunl.rccn.pt@mitvma.mit.edu  Phone: (+351) (1) 295-4464 x.0560
                                                Fax: (+351) (1) 295-4461
Snail:  Dept. de Informatica, Universidade Nova de Lisboa
        2825 Monte Caparica, PORTUGAL