]> git.imager.perl.org - imager.git/blobdiff - t/t66paste.t
re-work XS handling of channel lists
[imager.git] / t / t66paste.t
index 7a369d933c9b50ab4aaa61125cb676cc58a3f6c6..c8f1f3772772f494d5b39a6dafad7ec65f2aa46c 100644 (file)
@@ -1,12 +1,14 @@
 #!perl -w
 use strict;
-use lib 't';
-use Test::More tests => 15;
+use Test::More tests => 54;
 
-BEGIN { use_ok("Imager") }
+use Imager;
+use Imager::Test qw(is_image);
 
 #$Imager::DEBUG=1;
 
+-d "testout" or mkdir "testout";
+
 Imager::init('log'=>'testout/t66paste.log');
 
 # the original smoke tests
@@ -25,16 +27,16 @@ ok($img->write(type=>'pnm',file=>'testout/t66.ppm'), "save it")
 
 # more stringent tests
 {
-  my $src = Imager->new(xsize => 100, ysize => 100);
+  my $src = Imager->new(xsize => 100, ysize => 110);
   $src->box(filled=>1, color=>'FF0000');
 
   $src->box(filled=>1, color=>'0000FF', xmin => 20, ymin=>20,
             xmax=>79, ymax=>79);
 
-  my $targ = Imager->new(xsize => 100, ysize => 100);
+  my $targ = Imager->new(xsize => 100, ysize => 110);
+  $targ->box(filled=>1, color =>'00FFFF');
   $targ->box(filled=>1, color=>'00FF00', xmin=>20, ymin=>20, xmax=>79,
              ymax=>79);
-
   my $work = $targ->copy;
   ok($work->paste(src=>$src, left => 15, top => 10), "paste whole image");
   # build comparison image
@@ -50,7 +52,7 @@ ok($img->write(type=>'pnm',file=>'testout/t66.ppm'), "save it")
   ok($work->paste(src=>$src, left=>2, top=>7, src_minx => 10, src_miny => 15),
      "paste from inside src");
   $cmp = $targ->copy;
-  $cmp->box(filled=>1, xmin=>2, ymin=>7, xmax=>91, ymax=>91, color=>'FF0000');
+  $cmp->box(filled=>1, xmin=>2, ymin=>7, xmax=>91, ymax=>101, color=>'FF0000');
   $cmp->box(filled=>1, xmin=>12, ymin=>12, xmax=>71, ymax=>71, 
             color=>'0000FF');
   is(Imager::i_img_diff($work->{IMG}, $cmp->{IMG}), 0,
@@ -84,4 +86,216 @@ ok($img->write(type=>'pnm',file=>'testout/t66.ppm'), "save it")
      "using src_coords");
   is(Imager::i_img_diff($work->{IMG}, $cmp->{IMG}), 0,
      "compare pasted and expected");
+
+  {
+    # Issue #18712
+    # supplying just src_maxx would set the internal maxy to undef
+    # supplying just src_maxy would be ignored
+    # src_maxy (or it's derived value) was being bounds checked against 
+    # the image width instead of the image height
+    $work = $targ->copy;
+    my @warns;
+    local $SIG{__WARN__} = sub { push @warns, "@_"; print "# @_"; };
+    
+    ok($work->paste(src=>$src, left => 15, top => 20,
+                   src_maxx => 50),
+       "paste with just src_maxx");
+    ok(!@warns, "shouldn't warn");
+    my $cmp = $targ->copy;
+    $cmp->box(filled=>1, color => 'FF0000', xmin => 15, ymin => 20,
+             xmax => 64, ymax => 109);
+    $cmp->box(filled=>1, color => '0000FF', xmin => 35, ymin => 40,
+             xmax => 64, ymax => 99);
+    is(Imager::i_img_diff($work->{IMG}, $cmp->{IMG}), 0,
+       "check correctly pasted");
+
+    $work = $targ->copy;
+    @warns = ();
+    ok($work->paste(src=>$src, left=>15, top=>20,
+                   src_maxy => 60),
+       "paste with just src_maxy");
+    ok(!@warns, "shouldn't warn");
+    $cmp = $targ->copy;
+    $cmp->box(filled => 1, color => 'FF0000', xmin => 15, ymin => 20,
+             xmax => 99, ymax => 79);
+    $cmp->box(filled => 1, color => '0000FF', xmin => 35, ymin => 40,
+             xmax => 94, ymax => 79);
+    is(Imager::i_img_diff($work->{IMG}, $cmp->{IMG}), 0,
+       "check pasted correctly");
+
+    $work = $targ->copy;
+    @warns = ();
+    ok($work->paste(src=>$src, left=>15, top=>20,
+                   src_miny => 20, src_maxy => 105),
+       "paste with src_maxy > source width");
+
+    $cmp = $targ->copy;
+    $cmp->box(filled => 1, color => 'FF0000', xmin => 15, ymin => 20,
+             ymax => 104);
+    $cmp->box(filled => 1, color => '0000FF', xmin => 35, ymin => 20,
+             xmax => 94, ymax => 79);
+    is(Imager::i_img_diff($work->{IMG}, $cmp->{IMG}), 0,
+       "check pasted correctly");
+  }
+}
+
+{ # https://rt.cpan.org/Ticket/Display.html?id=30908
+  # we now adapt the source channels to the target
+  # check each combination works as expected
+
+  # various source images
+  my $src1 = Imager->new(xsize => 50, ysize => 50, channels => 1);
+  my $g_grey_full = Imager::Color->new(128, 255, 0, 0);
+  my $g_white_50 = Imager::Color->new(255, 128, 0, 0);
+  $src1->box(filled => 1, xmax => 24, color => $g_grey_full);
+
+  my $src2 = Imager->new(xsize => 50, ysize => 50, channels => 2);
+  $src2->box(filled => 1, xmax => 24, color => $g_grey_full);
+  $src2->box(filled => 1, xmin => 25, color => $g_white_50);
+
+  my $c_red_full = Imager::Color->new(255, 0, 0);
+  my $c_blue_full = Imager::Color->new(0, 0, 255);
+  my $src3 = Imager->new(xsize => 50, ysize => 50, channels => 3);
+  $src3->box(filled => 1, xmax => 24, color => $c_red_full);
+  $src3->box(filled => 1, xmin => 25, color => $c_blue_full);
+
+  my $c_green_50 = Imager::Color->new(0, 255, 0, 127);
+  my $src4 = Imager->new(xsize => 50, ysize => 50, channels => 4);
+  $src4->box(filled => 1, xmax => 24, color => $c_blue_full);
+  $src4->box(filled => 1, xmin => 25, color => $c_green_50);
+
+  my @left_box = ( box => [ 25, 25, 49, 74 ] );
+  my @right_box = ( box => [ 50, 25, 74, 74 ] );
+
+  { # 1 channel output
+    my $base = Imager->new(xsize => 100, ysize => 100, channels => 1);
+    $base->box(filled => 1, color => Imager::Color->new(64, 255, 0, 0));
+
+    my $work = $base->copy;
+    ok($work->paste(left => 25, top => 25, src => $src1), "paste 1 to 1");
+    my $comp = $base->copy;
+    $comp->box(filled => 1, color => $g_grey_full, @left_box);
+    $comp->box(filled => 1, color => [ 0, 0, 0, 0 ], @right_box);
+    is_image($work, $comp, "compare paste target to expected");
+
+    $work = $base->copy;
+    ok($work->paste(left => 25, top => 25, src => $src2), "paste 2 to 1");
+    $comp = $base->copy;
+    $comp->box(filled => 1, @left_box, color => $g_grey_full);
+    $comp->box(filled => 1, @right_box, color => [ 128, 0, 0, 0 ]);
+    is_image($work, $comp, "compare paste target to expected");
+
+    $work = $base->copy;
+    ok($work->paste(left => 25, top => 25, src => $src3), "paste 3 to 1");
+     $comp = $base->copy;
+    $comp->box(filled => 1, @left_box, color => [ 57, 255, 0, 0 ]);
+    $comp->box(filled => 1, @right_box, color => [ 18, 255, 0, 0 ]);
+    is_image($work, $comp, "compare paste target to expected");
+
+    $work = $base->copy;
+    ok($work->paste(left => 25, top => 25, src => $src4), "paste 4 to 1");
+    $comp = $base->copy;
+    $comp->box(filled => 1, color => [ 18, 255, 0, 0 ], @left_box);
+    $comp->box(filled => 1, color => [ 90, 255, 0, 0 ], @right_box);
+    is_image($work, $comp, "compare paste target to expected");
+  }
+
+  { # 2 channel output
+    my $base = Imager->new(xsize => 100, ysize => 100, channels => 2);
+    $base->box(filled => 1, color => [ 128, 128, 0, 0 ]);
+    
+    my $work = $base->copy;
+    ok($work->paste(top => 25, left => 25, src => $src1), "paste 1 to 2");
+    my $comp = $base->copy;
+    $comp->box(filled => 1, color => $g_grey_full, @left_box);
+    $comp->box(filled => 1, color => [ 0, 255, 0, 0 ], @right_box);
+    is_image($work, $comp, "compare paste target to expected");
+
+    $work = $base->copy;
+    ok($work->paste(top => 25, left => 25, src => $src2), "paste 2 to 2");
+    $comp = $base->copy;
+    $comp->box(filled => 1, color => $g_grey_full, @left_box);
+    $comp->box(filled => 1, color => $g_white_50, @right_box);
+    is_image($work, $comp, "compare paste target to expected");
+
+    $work = $base->copy;
+    ok($work->paste(top => 25, left => 25, src => $src3), "paste 3 to 2");
+    $comp = $base->copy;
+    $comp->box(filled => 1, color => [ 57, 255, 0, 0 ], @left_box);
+    $comp->box(filled => 1, color => [ 18, 255, 0, 0 ], @right_box);
+    is_image($work, $comp, "compare paste target to expected");
+
+    $work = $base->copy;
+    ok($work->paste(top => 25, left => 25, src => $src4), "paste 4 to 2");
+    $comp = $base->copy;
+    $comp->box(filled => 1, color => [ 18, 255, 0, 0 ], @left_box);
+    $comp->box(filled => 1, color => [ 180, 127, 0, 0 ], @right_box);
+    is_image($work, $comp, "compare paste target to expected");
+  }
+
+  { # 3 channel output
+    my $base = Imager->new(xsize => 100, ysize => 100, channels => 3);
+    $base->box(filled => 1, color => [ 128, 255, 0, 0 ]);
+    
+    my $work = $base->copy;
+    ok($work->paste(top => 25, left => 25, src => $src1), "paste 1 to 3");
+    my $comp = $base->copy;
+    $comp->box(filled => 1, color => [ 128, 128, 128, 255 ], @left_box);
+    $comp->box(filled => 1, color => [ 0, 0, 0, 0 ], @right_box);
+    is_image($work, $comp, "compare paste target to expected");
+
+    $work = $base->copy;
+    ok($work->paste(top => 25, left => 25, src => $src2), "paste 2 to 3");
+    $comp = $base->copy;
+    $comp->box(filled => 1, color => [ 128, 128, 128, 255 ], @left_box);
+    $comp->box(filled => 1, color => [ 128, 128, 128, 255 ], @right_box);
+    is_image($work, $comp, "compare paste target to expected");
+
+    $work = $base->copy;
+    ok($work->paste(top => 25, left => 25, src => $src3), "paste 3 to 3");
+    $comp = $base->copy;
+    $comp->box(filled => 1, color => [ 255, 0, 0 ], @left_box);
+    $comp->box(filled => 1, color => [ 0, 0, 255 ], @right_box);
+    is_image($work, $comp, "compare paste target to expected");
+
+    $work = $base->copy;
+    ok($work->paste(top => 25, left => 25, src => $src4), "paste 4 to 3");
+    $comp = $base->copy;
+    $comp->box(filled => 1, color => [ 0, 0, 255 ], @left_box);
+    $comp->box(filled => 1, color => [ 0, 127, 0 ], @right_box);
+    is_image($work, $comp, "compare paste target to expected");
+  }
+
+  { # 4 channel output
+    my $base = Imager->new(xsize => 100, ysize => 100, channels => 4);
+    $base->box(filled => 1, color => [ 128, 255, 64, 128 ]);
+    
+    my $work = $base->copy;
+    ok($work->paste(top => 25, left => 25, src => $src1), "paste 1 to 4");
+    my $comp = $base->copy;
+    $comp->box(filled => 1, color => [ 128, 128, 128, 255 ], @left_box);
+    $comp->box(filled => 1, color => [ 0, 0, 0, 255 ], @right_box);
+    is_image($work, $comp, "compare paste target to expected");
+
+    $work = $base->copy;
+    ok($work->paste(top => 25, left => 25, src => $src2), "paste 2 to 4");
+    $comp = $base->copy;
+    $comp->box(filled => 1, color => [ 128, 128, 128, 255 ], @left_box);
+    $comp->box(filled => 1, color => [ 255, 255, 255, 128 ], @right_box);
+    is_image($work, $comp, "compare paste target to expected");
+
+    $work = $base->copy;
+    ok($work->paste(top => 25, left => 25, src => $src3), "paste 3 to 4");
+    $comp = $base->copy;
+    $comp->box(filled => 1, color => [ 255, 0, 0 ], @left_box);
+    $comp->box(filled => 1, color => [ 0, 0, 255 ], @right_box);
+    is_image($work, $comp, "compare paste target to expected");
+
+    $work = $base->copy;
+    ok($work->paste(top => 25, left => 25, src => $src4), "paste 4 to 4");
+    $comp = $base->copy;
+    $comp->box(filled => 1, color => $c_blue_full, @left_box);
+    $comp->box(filled => 1, color => $c_green_50, @right_box);
+    is_image($work, $comp, "compare paste target to expected");
+  }
 }