The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!perl -w

use strict;
use Test::More tests => 12;

use Imager qw/NC/;
use Imager::Test qw(is_image is_color3);

sub PI () { 3.14159265358979323846 }

-d "testout" or mkdir "testout";

my @cleanup;
push @cleanup, "testout/060-polypoly.log";
Imager->open_log(log => "testout/060-polypoly.log");

my $red   = NC(255,0,0);
my $green = NC(0,255,0);
my $blue  = NC(0,0,255);
my $white = NC(255,255,255);
my $black = NC(0, 0, 0);

END {
  unlink @cleanup unless $ENV{IMAGER_KEEP_FILES};
  rmdir "testout";
}

{
  my $out = "testout/060-ppsimple.ppm";
  my $im = Imager->new(xsize => 100, ysize => 100);
  ok($im->polypolygon
     (
      filled => 1,
      color => $red,
      points =>
      [
       [
	[ 20, 20, 40, 40 ],
	[ 20, 80, 80, 20 ],
       ],
       [
	[ 60, 60, 80, 80 ],
	[ 20, 80, 80, 20 ],
       ],
      ]
     ), "simple filled polypolygon");
  ok($im->write(file => $out), "save to $out");
  my $cmp = Imager->new(xsize => 100, ysize => 100);
  $cmp->box(filled => 1, color => $red, box => [ 20, 20, 39, 79 ]);
  $cmp->box(filled => 1, color => $red, box => [ 60, 20, 79, 79 ]);
  is_image($im, $cmp, "check expected output");
  push @cleanup, $out;
}

{
  my $im = Imager->new(xsize => 100, ysize => 100);
  my $cross_cw =
    [
     [
      [ 10, 90, 90, 10 ],
      [ 40, 40, 60, 60 ],
     ],
     [
      [ 40, 60, 60, 40 ],
      [ 10, 10, 90, 90 ],
     ],
    ];
  ok($im->polypolygon
     (
      filled => 1,
      color => $red,
      points =>$cross_cw,
      mode => "nonzero",
     ), "cross polypolygon nz");
  save($im, "060-ppcrossnz.ppm");
  my $cmp = Imager->new(xsize => 100, ysize => 100);
  $cmp->box(filled => 1, color => $red, box => [ 10, 40, 89, 59 ]);
  $cmp->box(filled => 1, color => $red, box => [ 40, 10, 59, 89 ]);
  is_image($im, $cmp, "check expected output");

  my $im2 = Imager->new(xsize => 100, ysize => 100);
  ok($im2->polypolygon
     (
      filled => 1,
      color => $red,
      points =>$cross_cw,
      #mode => "nonzero", # default to evenodd
     ), "cross polypolygon eo");
  save($im2, "060-ppcrosseo.ppm");

  $cmp->box(filled => 1, color => $black, box => [ 40, 40, 59, 59 ]);
  is_image($im2, $cmp, "check expected output");

  # same as cross_cw except that the second box is in reversed order
  my $cross_diff =
    [
     [
      [ 10, 90, 90, 10 ],
      [ 40, 40, 60, 60 ],
     ],
     [
      [ 40, 60, 60, 40 ],
      [ 90, 90, 10, 10 ],
     ],
    ];
  my $im3 = Imager->new(xsize => 100, ysize => 100);
  ok($im3->polypolygon
     (
      filled => 1,
      color => $red,
      points => $cross_diff,
      mode => "nonzero",
     ), "cross polypolygon diff");
  is_image($im3, $cmp, "check expected output");
  save($im3, "060-ppcrossdiff.ppm");
}

Imager->close_log;

sub save {
  my ($im, $file) = @_;

  $file = "testout/" . $file;
  push @cleanup, $file;
  ok($im->write(file => $file), "save to $file");
}