intel: Fix glBitmap top/bottom clipping.
authorEric Anholt <eric@anholt.net>
Fri, 19 Dec 2008 00:00:09 +0000 (16:00 -0800)
committerEric Anholt <eric@anholt.net>
Fri, 19 Dec 2008 21:05:50 +0000 (13:05 -0800)
Bug #19139.

src/mesa/drivers/dri/intel/intel_pixel_bitmap.c

index f6713dbc7ba4eb134bfec0d9ff5860c9d14d300b..fb1a051cdc8ef315f83989a17c796ec7c0c413be 100644 (file)
@@ -150,8 +150,18 @@ static GLuint get_bitmap_rect(GLsizei width, GLsizei height,
    return count;
 }
 
-
-
+/**
+ * Returns the low Y value of the vertical range given, flipped according to
+ * whether the framebuffer is or not.
+ */
+static inline int
+y_flip(struct gl_framebuffer *fb, int y, int height)
+{
+   if (fb->Name != 0)
+      return y;
+   else
+      return fb->Height - y - height;
+}
 
 /*
  * Render a bitmap.
@@ -208,8 +218,6 @@ do_blit_bitmap( GLcontext *ctx,
 
    intel_get_cliprects(intel, &cliprects, &num_cliprects, &x_off, &y_off);
    if (num_cliprects != 0) {
-      drm_clip_rect_t dest_rect;
-      GLint srcx = 0, srcy = 0;
       GLuint i;
       GLint orig_dstx = dstx;
       GLint orig_dsty = dsty;
@@ -220,45 +228,26 @@ do_blit_bitmap( GLcontext *ctx,
                                &dstx, &dsty, &width, &height))
             goto out;
 
-      /* Convert from GL to hardware coordinates.  Transform original points
-       * along with it so that we can look at cliprects in hw coordinates and
-       * map back to points in the source space.
-       */
-      if (fb->Name == 0) {
-        /* bitmap to a system framebuffer */
-        dstx = x_off + dstx;
-        dsty = y_off + (fb->Height - dsty - height);
-        orig_dstx = x_off + orig_dstx;
-        orig_dsty = y_off + (fb->Height - orig_dsty - height);
-      } else {
-        /* bitmap to a user framebuffer object */
-        dstx = x_off + dstx;
-        dsty = y_off + dsty;
-        orig_dstx = x_off + orig_dstx;
-        orig_dsty = y_off + orig_dsty;
-      }
-
-      dest_rect.x1 = dstx;
-      dest_rect.y1 = dsty;
-      dest_rect.x2 = dstx + width;
-      dest_rect.y2 = dsty + height;
+      dstx = x_off + dstx;
+      dsty = y_off + y_flip(fb, dsty, height);
 
       for (i = 0; i < num_cliprects; i++) {
-         drm_clip_rect_t rect;
-        int box_w, box_h;
+        int box_x, box_y, box_w, box_h;
         GLint px, py;
         GLuint stipple[32];  
 
-         if (!intel_intersect_cliprects(&rect, &dest_rect, &cliprects[i]))
-            continue;
+        box_x = dstx;
+        box_y = dsty;
+        box_w = width;
+        box_h = height;
 
-        /* Now go back to GL coordinates to figure out what subset of
-         * the bitmap we are uploading for this cliprect:
-         */
-        box_w = rect.x2 - rect.x1;
-        box_h = rect.y2 - rect.y1;
-        srcx = rect.x1 - orig_dstx;
-        srcy = rect.y1 - orig_dsty;
+        /* Clip to drawable cliprect */
+         if (!_mesa_clip_to_region(cliprects[i].x1,
+                                  cliprects[i].y1,
+                                  cliprects[i].x2 - cliprects[i].x1,
+                                  cliprects[i].y2 - cliprects[i].y1,
+                                  &box_x, &box_y, &box_w, &box_h))
+           continue;
 
 #define DY 32
 #define DX 32
@@ -279,10 +268,16 @@ do_blit_bitmap( GLcontext *ctx,
 
               /* May need to adjust this when padding has been introduced in
                * sz above:
+               *
+               * Have to translate destination coordinates back into source
+               * coordinates.
                */
               if (get_bitmap_rect(bitmap_width, bitmap_height, unpack,
                                   bitmap,
-                                  srcx + px, srcy + py, w, h,
+                                  -orig_dstx + (box_x + px - x_off),
+                                  -orig_dsty + y_flip(fb,
+                                                      box_y + py - y_off, h),
+                                  w, h,
                                   (GLubyte *)stipple,
                                   8,
                                   fb->Name == 0 ? GL_TRUE : GL_FALSE) == 0)
@@ -299,8 +294,8 @@ do_blit_bitmap( GLcontext *ctx,
                                                  dst->buffer,
                                                  0,
                                                  dst->tiling,
-                                                 rect.x1 + px,
-                                                 rect.y2 - (py + h),
+                                                 box_x + px,
+                                                 box_y + py,
                                                  w, h,
                                                  logic_op);
            }