Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Fetching contributors…

Cannot retrieve contributors at this time

300 lines (252 sloc) 11.956 kb
#!perl -w
use strict;
use Test::More tests => 54;
use Imager;
use Imager::Test qw(is_image);
#$Imager::DEBUG=1;
Imager::init('log'=>'testout/t66paste.log');
# the original smoke tests
my $img=Imager->new() || die "unable to create image object\n";
ok($img->open(file=>'testimg/scale.ppm',type=>'pnm'), "load test img");
my $nimg=Imager->new() or die "Unable to create image object\n";
ok($nimg->open(file=>'testimg/scale.ppm',type=>'pnm'), "load test img again");
ok($img->paste(img=>$nimg, top=>30, left=>30), "paste it")
or print "# ", $img->errstr, "\n";;
ok($img->write(type=>'pnm',file=>'testout/t66.ppm'), "save it")
or print "# ", $img->errstr, "\n";
# more stringent tests
{
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 => 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
my $cmp = $targ->copy;
$cmp->box(filled=>1, xmin=>15, ymin => 10, color=>'FF0000');
$cmp->box(filled=>1, xmin=>35, ymin => 30, xmax=>94, ymax=>89,
color=>'0000FF');
is(Imager::i_img_diff($work->{IMG}, $cmp->{IMG}), 0,
"compare pasted and expected");
$work = $targ->copy;
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=>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,
"compare pasted and expected");
# paste part source
$work = $targ->copy;
ok($work->paste(src=>$src, left=>15, top=>20,
src_minx=>10, src_miny=>15, src_maxx=>80, src_maxy =>70),
"paste src cropped all sides");
$cmp = $targ->copy;
$cmp->box(filled=>1, xmin=>15, ymin=>20, xmax=>84, ymax=>74,
color=>'FF0000');
$cmp->box(filled=>1, xmin=>25, ymin=>25, xmax=>84, ymax=>74,
color=>'0000FF');
is(Imager::i_img_diff($work->{IMG}, $cmp->{IMG}), 0,
"compare pasted and expected");
# go by width instead
$work = $targ->copy;
ok($work->paste(src=>$src, left=>15, top=>20,
src_minx=>10, src_miny => 15, width => 70, height => 55),
"same but specify width/height instead");
is(Imager::i_img_diff($work->{IMG}, $cmp->{IMG}), 0,
"compare pasted and expected");
# use src_coords
$work = $targ->copy;
ok($work->paste(src=>$src, left => 15, top => 20,
src_coords => [ 10, 15, 80, 70 ]),
"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");
}
}
Jump to Line
Something went wrong with that request. Please try again.