- correct handling of sz in matrix_transform() - this should allow
authorTony Cook <tony@develop=help.com>
Fri, 12 Oct 2007 06:38:55 +0000 (06:38 +0000)
committerTony Cook <tony@develop=help.com>
Fri, 12 Oct 2007 06:38:55 +0000 (06:38 +0000)
   perspective type transformations to work now.
   http://rt.cpan.org/Ticket/Display.html?id=29936

Changes
TODO
rotate.c
t/t64copyflip.t

diff --git a/Changes b/Changes
index 044a137b6cdc2b053a25e4d798d507b2516ec098..a75c7418695c3922708bbcf016658a66fefb4c54 100644 (file)
--- a/Changes
+++ b/Changes
@@ -7,6 +7,10 @@ Imager 0.61 - unreleased
    when scaling an animated gif
    http://rt.cpan.org/Ticket/Display.html?id=27591
 
+ - correct handling of sz in matrix_transform() - this should allow
+   perspective type transformations to work now.
+   http://rt.cpan.org/Ticket/Display.html?id=29936
+
 Imager 0.60 - 30 August 2007
 ===========
 
diff --git a/TODO b/TODO
index 5ec2811f840d086f5b577660d481b245574dd1e1..43ad7ad6126f069878e696b6c10ec27b6d5d0d23 100644 (file)
--- a/TODO
+++ b/TODO
@@ -55,7 +55,7 @@ PNG images sometimes get larger (#29268) (maybe 0.62)
 CMYK alpha TIFF problems with old libtiff (#29353) (done)
 
 matrix_transform() should use fabs() instead of abs() range checking
-sz (#29936)
+sz (#29936) (done)
 
 For 0.60 (hopefully):
 
index 6dee34fcfdd68b9364b015ae8fb469db8f5b8313..5beba6688000ee7dcec36b3c4fec8405ba83fe5f 100644 (file)
--- a/rotate.c
+++ b/rotate.c
@@ -211,7 +211,7 @@ i_img *i_matrix_transform_bg(i_img *src, int xsize, int ysize, const double *mat
           /* dividing by sz gives us the ability to do perspective 
              transforms */
           sz = x * matrix[6] + y * matrix[7] + matrix[8];
-          if (abs(sz) > 0.0000001) {
+          if (fabs(sz) > 0.0000001) {
             sx = (x * matrix[0] + y * matrix[1] + matrix[2]) / sz;
             sy = (x * matrix[3] + y * matrix[4] + matrix[5]) / sz;
           }
@@ -221,7 +221,7 @@ i_img *i_matrix_transform_bg(i_img *src, int xsize, int ysize, const double *mat
 
           /* anything outside these ranges is either a broken co-ordinate
              or outside the source */
-          if (abs(sz) > 0.0000001 
+          if (fabs(sz) > 0.0000001 
               && sx >= -1 && sx < src->xsize
               && sy >= -1 && sy < src->ysize) {
 
@@ -289,7 +289,7 @@ i_img *i_matrix_transform_bg(i_img *src, int xsize, int ysize, const double *mat
           /* dividing by sz gives us the ability to do perspective 
              transforms */
           sz = x * matrix[6] + y * matrix[7] + matrix[8];
-          if (abs(sz) > 0.0000001) {
+          if (fabs(sz) > 0.0000001) {
             sx = (x * matrix[0] + y * matrix[1] + matrix[2]) / sz;
             sy = (x * matrix[3] + y * matrix[4] + matrix[5]) / sz;
           }
@@ -299,7 +299,7 @@ i_img *i_matrix_transform_bg(i_img *src, int xsize, int ysize, const double *mat
 
           /* anything outside these ranges is either a broken co-ordinate
              or outside the source */
-          if (abs(sz) > 0.0000001 
+          if (fabs(sz) > 0.0000001 
               && sx >= -1 && sx < src->xsize
               && sy >= -1 && sy < src->ysize) {
 
index 375ee285daeb301160e56f70b98af819baf75f84..330d76645d7cd923485e7ccabd38e1a42364c921 100644 (file)
@@ -1,6 +1,6 @@
 #!perl -w
 use strict;
-use Test::More tests => 61;
+use Test::More tests => 62;
 use Imager;
 
 #$Imager::DEBUG=1;
@@ -151,3 +151,22 @@ sub rot_test {
   cmp_ok($warning, '=~', 't64copyflip\\.t', "correct file");
 }
 
+{
+  # 29936 - matrix_transform() should use fabs() instead of abs()
+  # range checking sz 
+
+  # this meant that when sz was < 1 (which it often is for these
+  # transformations), it treated the values out of range, producing a
+  # blank output image
+
+  my $src = Imager->new(xsize => 20, ysize => 20);
+  $src->box(filled => 1, color => 'FF0000');
+  my $out = $src->matrix_transform(matrix => [ 1, 0, 0,
+                                              0, 1, 0,
+                                              0, 0, 0.9999 ])
+    or print "# ", $src->errstr, "\n";
+  my $blank = Imager->new(xsize => 20, ysize => 20);
+  # they have to be different, surely that would be easy
+  my $diff = Imager::i_img_diff($out->{IMG}, $blank->{IMG});
+  ok($diff, "RT#29936 - check non-blank output");
+}