Bug 1057 - cogl_texture_rectangle doesn't support backward
authorNeil Roberts <neil@openedhand.com>
Wed, 12 Nov 2008 13:03:09 +0000 (13:03 +0000)
committerNeil Roberts <neil@openedhand.com>
Wed, 12 Nov 2008 13:03:09 +0000 (13:03 +0000)
coordinates

* clutter/cogl/gl/cogl-texture.c: Instead of sorting the vertex
and texture coordinates passed to cogl_texture_rectangle, just
swap both sets whenever the texture coordinates are backward.

ChangeLog
clutter/cogl/gl/cogl-texture.c
clutter/cogl/gles/cogl-texture.c

index fc7bc0b..bccd90e 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,14 @@
 2008-11-12  Neil Roberts  <neil@linux.intel.com>
 
+       Bug 1057 - cogl_texture_rectangle doesn't support backward
+       coordinates
+
+       * clutter/cogl/gl/cogl-texture.c: Instead of sorting the vertex
+       and texture coordinates passed to cogl_texture_rectangle, just
+       swap both sets whenever the texture coordinates are backward.
+
+2008-11-12  Neil Roberts  <neil@linux.intel.com>
+
        * clutter/clutter-rectangle.c (clutter_rectangle_paint): Fixed so
        that it doesn't use the alpha value from the border colour to draw
        the rectangle
index 0beec07..3477cd6 100644 (file)
@@ -1967,6 +1967,29 @@ _cogl_texture_quad_sw (CoglTexture *tex,
   
   cogl_enable (enable_flags);
   
+  /* If the texture coordinates are backwards then swap both the
+     geometry and texture coordinates so that the texture will be
+     flipped but we can still use the same algorithm to iterate the
+     slices */
+  if (tx2 < tx1)
+    {
+      CoglFixed temp = x1;
+      x1 = x2;
+      x2 = temp;
+      temp = tx1;
+      tx1 = tx2;
+      tx2 = temp;
+    }
+  if (ty2 < ty1)
+    {
+      CoglFixed temp = y1;
+      y1 = y2;
+      y2 = temp;
+      temp = ty1;
+      ty1 = ty2;
+      ty2 = temp;
+    }
+  
   /* Scale ratio from texture to quad widths */
   tw = COGL_FIXED_FROM_INT (tex->bitmap.width);
   th = COGL_FIXED_FROM_INT (tex->bitmap.height);
@@ -2168,7 +2191,6 @@ cogl_texture_rectangle (CoglHandle   handle,
                        CoglFixed ty2)
 {
   CoglTexture       *tex;
-  CoglFixed       tempx;
   
   /* Check if valid texture */
   if (!cogl_is_texture (handle))
@@ -2186,38 +2208,6 @@ cogl_texture_rectangle (CoglHandle   handle,
   if (tx1 == tx2 || ty1 == ty2)
     return;
   
-  /* Fix quad coord ordering 
-     (atm this is required for sw tiling to iterate
-      over slices properly) */
-  if (x1 > x2)
-    {
-      tempx = x1;
-      x1 = x2;
-      x2 = tempx;
-    }
-  
-  if (y1 > y2)
-    {
-      tempx = y1;
-      y1 = y2;
-      y2 = tempx;
-    }
-  
-  /* Fix texture coord ordering */
-  if (tx1 > tx2)
-    {
-      tempx = tx1;
-      tx1 = tx2;
-      tx2 = tempx;
-    }
-  
-  if (ty1 > ty2)
-    {
-      tempx = ty1;
-      ty1 = ty2;
-      ty2 = tempx;
-    }
-  
   /* Pick tiling mode according to hw support */
   if (cogl_features_available (COGL_FEATURE_TEXTURE_NPOT)
       && tex->slice_gl_handles->len == 1)
index bcebef8..dbefa77 100644 (file)
@@ -1931,6 +1931,29 @@ _cogl_texture_quad_sw (CoglTexture *tex,
 
   cogl_enable (enable_flags);
   
+  /* If the texture coordinates are backwards then swap both the
+     geometry and texture coordinates so that the texture will be
+     flipped but we can still use the same algorithm to iterate the
+     slices */
+  if (tx2 < tx1)
+    {
+      CoglFixed temp = x1;
+      x1 = x2;
+      x2 = temp;
+      temp = tx1;
+      tx1 = tx2;
+      tx2 = temp;
+    }
+  if (ty2 < ty1)
+    {
+      CoglFixed temp = y1;
+      y1 = y2;
+      y2 = temp;
+      temp = ty1;
+      ty1 = ty2;
+      ty2 = temp;
+    }
+  
   GE( cogl_wrap_glTexCoordPointer (2, GL_FIXED, 0, tex_coords) );
   GE( cogl_wrap_glVertexPointer   (2, GL_FIXED, 0, quad_coords) );
   
@@ -2123,7 +2146,6 @@ cogl_texture_rectangle (CoglHandle   handle,
                        CoglFixed ty2)
 {
   CoglTexture       *tex;
-  CoglFixed       tempx;
   
   /* Check if valid texture */
   if (!cogl_is_texture (handle))
@@ -2141,36 +2163,6 @@ cogl_texture_rectangle (CoglHandle   handle,
   if (tx1 == tx2 || ty1 == ty2)
     return;
   
-  /* Fix quad coord ordering */
-  if (x1 > x2)
-    {
-      tempx = x1;
-      x1 = x2;
-      x2 = tempx;
-    }
-  
-  if (y1 > y2)
-    {
-      tempx = y1;
-      y1 = y2;
-      y2 = tempx;
-    }
-  
-  /* Fix texture coord ordering */
-  if (tx1 > tx2)
-    {
-      tempx = tx1;
-      tx1 = tx2;
-      tx2 = tempx;
-    }
-  
-  if (ty1 > ty2)
-    {
-      tempx = ty1;
-      ty1 = ty2;
-      ty2 = tempx;
-    }
-  
   /* Tile textured quads */
   if (tex->slice_gl_handles->len == 1 &&
       tx1 >= -COGL_FIXED_1 && tx2 <= COGL_FIXED_1 &&