Added flip() and docs to Imager.pm and i_flipxy() to image.{c,h}.
authorArnar Mar Hrafnkelsson <addi@cpan.org>
Fri, 4 May 2001 07:15:09 +0000 (07:15 +0000)
committerArnar Mar Hrafnkelsson <addi@cpan.org>
Fri, 4 May 2001 07:15:09 +0000 (07:15 +0000)
Changes
Imager.pm
Imager.xs
image.c
image.h

diff --git a/Changes b/Changes
index 77288c5..6556d1a 100644 (file)
--- a/Changes
+++ b/Changes
@@ -379,7 +379,7 @@ Revision history for Perl extension Imager.
          Imager.xs, Imager.pm
         - each of the image formats now have their own test file,
           extracted from t10formats.t, usually with som extra tests
          Imager.xs, Imager.pm
         - each of the image formats now have their own test file,
           extracted from t10formats.t, usually with som extra tests
-
+  - Added flip() and docs to Imager.pm and i_flipxy to image.c.
 
 ~~~~~~~~~~~~~^ ^ ^~~~~~~~~~~~~~
 
 
 ~~~~~~~~~~~~~^ ^ ^~~~~~~~~~~~~~
 
index 2095b9a..df7c464 100644 (file)
--- a/Imager.pm
+++ b/Imager.pm
@@ -993,6 +993,18 @@ sub rubthrough {
 }
 
 
 }
 
 
+sub flip {
+  my $self  = shift;
+  my %opts  = @_;
+  my %xlate = (x=>0, y=>1, xy=>2, yx=>2);
+  my $dir;
+  return () unless defined $opts{'dir'} and defined $xlate{$opts{'dir'}};
+  $dir = $xlate{$opts{'dir'}};
+  return $self if i_flipxy($self->{IMG}, $dir);
+  return ();
+}
+
+
 
 # These two are supported for legacy code only
 
 
 # These two are supported for legacy code only
 
@@ -1887,7 +1899,6 @@ the function return undef.  Examples:
 =head2 Drawing Methods
 
 IMPLEMENTATION MORE OR LESS DONE CHECK THE TESTS
 =head2 Drawing Methods
 
 IMPLEMENTATION MORE OR LESS DONE CHECK THE TESTS
-
 DOCUMENTATION OF THIS SECTION OUT OF SYNC
 
 It is possible to draw with graphics primitives onto images.  Such
 DOCUMENTATION OF THIS SECTION OUT OF SYNC
 
 It is possible to draw with graphics primitives onto images.  Such
@@ -1994,10 +2005,21 @@ To copy an image to onto another image use the C<paste()> method.
 That copies the entire C<$logo> image onto the C<$dest> image so that the
 upper left corner of the C<$logo> image is at (40,20).
 
 That copies the entire C<$logo> image onto the C<$dest> image so that the
 upper left corner of the C<$logo> image is at (40,20).
 
-=head2 Blending Images
-To put an image or a part of an image directly into another it is
-best to call the C<paste()> method on the image you want to add to.
+
+=head2 Flipping images
+
+An inplace horizontal or vertical flip is possible by calling the
+C<flip()> method.  If the original is to be preserved it's possible
+to make a copy first.
+
+  $img->flip(dir=>"x");       # horizontal flip
+  $img->flip(dir=>"xy");      # vertical and horizontal flip
+  $nimg = $img->copy->flip(dir=>"y"); # make a copy and flip the copy vertically
+
+
+=head2 Blending Images To put an image or a part of an image directly
+into another it is best to call the C<paste()> method on the image you
+want to add to.
 
   $img->paste(img=>$srcimage,left=>30,top=>50);
 
 
   $img->paste(img=>$srcimage,left=>30,top=>50);
 
index 6cd9569..71390c9 100644 (file)
--- a/Imager.xs
+++ b/Imager.xs
@@ -745,6 +745,11 @@ i_rubthru(im,src,tx,ty)
               int     tx
               int     ty
 
               int     tx
               int     ty
 
+undef_int
+i_flipxy(im, direction)
+    Imager::ImgRaw     im
+              int     direction
+
 
 void
 i_gaussian(im,stdev)
 
 void
 i_gaussian(im,stdev)
diff --git a/image.c b/image.c
index dbbf1be..b83be16 100644 (file)
--- a/image.c
+++ b/image.c
@@ -32,6 +32,7 @@ Some of these functions are internal.
 
 #define XAXIS 0
 #define YAXIS 1
 
 #define XAXIS 0
 #define YAXIS 1
+#define XYAXIS 2
 
 #define minmax(a,b,i) ( ((a>=i)?a: ( (b<=i)?b:i   )) )
 
 
 #define minmax(a,b,i) ( ((a>=i)?a: ( (b<=i)?b:i   )) )
 
@@ -252,8 +253,8 @@ i_img_empty(i_img *im,int x,int y) {
 Re-new image reference 
 
    im - Image pointer
 Re-new image reference 
 
    im - Image pointer
-   x - xsize of destination image
-   y - ysize of destination image
+   x  - xsize of destination image
+   y  - ysize of destination image
    ch - number of channels
 
 =cut
    ch - number of channels
 
 =cut
@@ -595,6 +596,7 @@ unmodified.
 
 =cut
 */
 
 =cut
 */
+
 void
 i_rubthru(i_img *im,i_img *src,int tx,int ty) {
   i_color pv,orig,dest;
 void
 i_rubthru(i_img *im,i_img *src,int tx,int ty) {
   i_color pv,orig,dest;
@@ -624,6 +626,94 @@ i_rubthru(i_img *im,i_img *src,int tx,int ty) {
     }
 }
 
     }
 }
 
+
+/*
+=item i_flipxy(im, axis)
+
+Flips the image inplace around the axis specified.
+Returns 0 if parameters are invalid.
+
+   im   - Image pointer
+   axis - 0 = x, 1 = y, 2 = both
+
+=cut
+*/
+
+undef_int
+i_flipxy(i_img *im, int direction) {
+  int x, x2, y, y2, xm, ym;
+  int xs = im->xsize;
+  int ys = im->ysize;
+  
+  mm_log((1, "i_flipxy(im %p, direction %d)\n", im, direction ));
+
+  if (!im) return 0;
+
+  switch (direction) {
+  case XAXIS: /* Horizontal flip */
+    xm = xs/2;
+    ym = ys;
+    for(y=0; y<ym; y++) {
+      x2 = xs-1;
+      for(x=0; x<xm; x++) {
+       i_color val1, val2;
+       i_gpix(im, x,  y,  &val1);
+       i_gpix(im, x2, y,  &val2);
+       i_ppix(im, x,  y,  &val2);
+       i_ppix(im, x2, y,  &val1);
+       x2--;
+      }
+    }
+    break;
+  case YAXIS:
+    xm = xs;
+    ym = ys/2;
+    y2 = ys-1;
+    for(y=0; y<ym; y++) {
+      for(x=0; x<xm; x++) {
+       i_color val1, val2;
+       i_gpix(im, x,  y,  &val1);
+       i_gpix(im, x,  y2, &val2);
+       i_ppix(im, x,  y,  &val2);
+       i_ppix(im, x,  y2, &val1);
+      }
+      y2--;
+    }
+    break;
+  case XYAXIS:
+    xm = xs/2;
+    ym = ys/2;
+    y2 = ys-1;
+    for(y=0; y<ym; y++) {
+      x2 = xs-1;
+      for(x=0; x<xm; x++) {
+       i_color val1, val2;
+       i_gpix(im, x,  y,  &val1);
+       i_gpix(im, x2, y2, &val2);
+       i_ppix(im, x,  y,  &val2);
+       i_ppix(im, x2, y2, &val1);
+
+       i_gpix(im, x2, y,  &val1);
+       i_gpix(im, x,  y2, &val2);
+       i_ppix(im, x2, y,  &val2);
+       i_ppix(im, x,  y2, &val1);
+       x2--;
+      }
+      y2--;
+    }
+    break;
+  default:
+    mm_log((1, "i_flipxy: direction is invalid\n" ));
+    return 0;
+  }
+  return 1;
+}
+
+
+
+
+
+static
 float
 Lanczos(float x) {
   float PIx, PIx2;
 float
 Lanczos(float x) {
   float PIx, PIx2;
diff --git a/image.h b/image.h
index 3bfb76a..f8213ab 100644 (file)
--- a/image.h
+++ b/image.h
@@ -77,6 +77,10 @@ void i_copyto_trans(i_img *im,i_img *src,int x1,int y1,int x2,int y2,int tx,int
 void i_copy        (i_img *im,i_img *src);
 void i_rubthru     (i_img *im,i_img *src,int tx,int ty);
 
 void i_copy        (i_img *im,i_img *src);
 void i_rubthru     (i_img *im,i_img *src,int tx,int ty);
 
+undef_int i_flipxy (i_img *im, int direction);
+
+
+
 void i_bezier_multi(i_img *im,int l,double *x,double *y,i_color *val);
 void i_poly_aa     (i_img *im,int l,double *x,double *y,i_color *val);
 
 void i_bezier_multi(i_img *im,int l,double *x,double *y,i_color *val);
 void i_poly_aa     (i_img *im,int l,double *x,double *y,i_color *val);