add to_rgb_double() method
authorTony Cook <tony@develop-help.com>
Mon, 23 May 2011 10:52:25 +0000 (20:52 +1000)
committerTony Cook <tony@develop-help.com>
Mon, 23 May 2011 10:52:25 +0000 (20:52 +1000)
https://rt.cpan.org/Ticket/Display.html?id=65101

Changes
Imager.pm
Imager.xs
imager.h
imgdouble.c
lib/Imager/ImageTypes.pod
t/t022double.t

diff --git a/Changes b/Changes
index 84d74b1..b3f3180 100644 (file)
--- a/Changes
+++ b/Changes
@@ -16,6 +16,9 @@ Bug fixes:
 
  - test and add error reporting to to_*() family methods
 
+ - add to_rgb_double() method.
+   https://rt.cpan.org/Ticket/Display.html?id=65101
+
 Imager 0.83 - 21 May 2011
 ===========
 
index 1fb9f3a..eeadd91 100644 (file)
--- a/Imager.pm
+++ b/Imager.pm
@@ -1024,6 +1024,28 @@ sub to_rgb16 {
   return $result;
 }
 
+# convert a paletted (or any image) to an double/channel RGB image
+sub to_rgb_double {
+  my $self = shift;
+
+  unless (defined wantarray) {
+    my @caller = caller;
+    warn "to_rgb16() called in void context - to_rgb_double() returns the converted image at $caller[1] line $caller[2]\n";
+    return;
+  }
+
+  $self->_valid_image
+    or return;
+
+  my $result = Imager->new;
+  unless ($result->{IMG} = i_img_to_drgb($self->{IMG})) {
+    $self->_set_error(Imager->_error_as_msg());
+    return;
+  }
+
+  return $result;
+}
+
 sub addcolors {
   my $self = shift;
   my %opts = (colors=>[], @_);
@@ -4481,6 +4503,9 @@ to_rgb16() - L<Imager::ImageTypes/to_rgb16()>
 
 to_rgb8() - L<Imager::ImageTypes/to_rgb8()>
 
+to_rgb_double() - L<Imager::ImageTypes/to_rgb_double()> - convert to
+double per sample image.
+
 transform() - L<Imager::Engines/"transform()">
 
 transform2() - L<Imager::Engines/"transform2()">
index 07462bc..434e4e0 100644 (file)
--- a/Imager.xs
+++ b/Imager.xs
@@ -3529,6 +3529,10 @@ i_img_double_new(x, y, ch)
         int y
         int ch
 
+Imager::ImgRaw
+i_img_to_drgb(im)
+       Imager::ImgRaw im
+
 undef_int
 i_tags_addn(im, name, code, idata)
         Imager::ImgRaw im
index 944c97f..1c25aa4 100644 (file)
--- a/imager.h
+++ b/imager.h
@@ -326,6 +326,7 @@ extern i_img *i_img_masked_new(i_img *targ, i_img *mask, int x, int y,
 extern i_img *i_img_16_new(int x, int y, int ch);
 extern i_img *i_img_to_rgb16(i_img *im);
 extern i_img *i_img_double_new(int x, int y, int ch);
+extern i_img *i_img_to_drgb(i_img *im);
 
 extern int i_img_is_monochrome(i_img *im, int *zero_is_white);
 extern void i_get_file_background(i_img *im, i_color *bg);
index a12b5ee..c2fb7e5 100644 (file)
@@ -399,6 +399,37 @@ static int i_gsampf_ddoub(i_img *im, int l, int r, int y, i_fsample_t *samps,
   }
 }
 
+/*
+=item i_img_to_drgb(im)
+
+=category Image creation
+
+Returns a double/sample version of the supplied image.
+
+Returns the image on success, or NULL on failure.
+
+=cut
+*/
+
+i_img *
+i_img_to_drgb(i_img *im) {
+  i_img *targ;
+  i_fcolor *line;
+  int y;
+
+  targ = i_img_double_new(im->xsize, im->ysize, im->channels);
+  if (!targ)
+    return NULL;
+  line = mymalloc(sizeof(i_fcolor) * im->xsize);
+  for (y = 0; y < im->ysize; ++y) {
+    i_glinf(im, 0, im->xsize, y, line);
+    i_plinf(targ, 0, im->xsize, y, line);
+  }
+
+  myfree(line);
+
+  return targ;
+}
 
 /*
 =back
index 6b6ea60..4a36c64 100644 (file)
@@ -638,13 +638,21 @@ No parameters.
 
 =item to_rgb16()
 
-You can convert a paletted image (or any image) to an 16-bit/channel
-RGB image with:
+Convert a paletted image (or any image) to a 16-bit/channel RGB image.
 
   $rgbimg = $img->to_rgb16;
 
 No parameters.
 
+=item to_rgb_double()
+
+Convert a paletted image (or any image) to an double/channel direct
+color image.
+
+  $rgbimg = $img->to_rgb_double;
+
+No parameters.
+
 =item masked()
 
 Creates a masked image.  A masked image lets you create an image proxy
index fa2e07b..1def380 100644 (file)
@@ -1,9 +1,10 @@
 #!perl -w
 use strict;
-use Test::More tests => 83;
-
+use Test::More tests => 88;
 BEGIN { use_ok(Imager => qw(:all :handy)) }
 
+use Imager::Test qw(test_image is_image);
+
 -d "testout" or mkdir "testout";
 
 init_log("testout/t022double.log", 1);
@@ -151,3 +152,19 @@ cmp_ok(Imager->errstr, '=~', qr/channels must be between 1 and 4/,
   my $im = Imager->new(xsize => 10, ysize=>10, bits=>'double');
   image_bounds_checks($im);
 }
+
+
+{ # convert to rgb double
+  my $im = test_image();
+  my $imdb = $im->to_rgb_double;
+  print "# check conversion to double\n";
+  is($imdb->bits, "double", "check bits");
+  is_image($im, $imdb, "check image data matches");
+}
+
+{ # empty image handling
+  my $im = Imager->new;
+  ok($im, "make empty image");
+  ok(!$im->to_rgb_double, "convert empty image to double");
+  is($im->errstr, "empty input image", "check message");
+}