use Image::Magick;
use diagnostics; 
use File::Basename;





# 0)Input

@suffixes = ('.jpg', '.jp2', '.png');


# 0.1) counting variable, folders, file
$p = '4'; #counting variable
$sourcefolder_path = "C:/ART/IM_PlaneCovering/1_Sourceimages/";
$sourcefile_name = 'image.jpg'; 
$p4m_resultfolder_path = "C:/ART/IM_PlaneCovering/2_Tiles/p4m-Tiles/";



# 0.2) definition of lokal parameters
$triangle_width_min_Faktor = 0.4;
$triangle_width_max_Faktor = 0.6;






# 1) definition of PerlMagick objects
$image_p4m = new Image::Magick;
$p4m_mask = new Image::Magick;





# 2) inilisation of random number generator
srand;







#3) open source image 
$sourcefile_fullname = $sourcefolder_path . $sourcefile_name; 
$image_p4m->Read("$sourcefile_fullname");





#4) local parameter calculations: $triangle_width = $triangle_height, $x1, $y1 
$image_width = $image_p4m->Get('columns'); 
$image_height = $image_p4m->Get('rows'); 
if ($image_width < $image_height) {$image_min = $image_width} else {$image_min = $image_height}; 
$triangle_width_min = $triangle_width_min_Faktor * $image_min;
$triangle_width_max = $triangle_width_max_Faktor * $image_min;
$triangle_width = $triangle_width_min + (int(rand($triangle_width_max - $triangle_width_min)) + 1); 
$x_allowed = $image_width - $triangle_width;
$y_allowed = $image_height - $triangle_width;
$x1 = int(rand($x_allowed))+1;
$y1 = int(rand($y_allowed))+1;




# 5)generate p4m_mask 
#convert -size {$triangle_width}x{$triangle_width} xc:none -fill red -draw "polyline 0,0 {$triangle_width},{$triangle_width} 0,{$triangle_width}" p4m_mask.png
$p4m_mask->Set(size=>"$triangle_width x $triangle_width");
$p4m_mask->Read('xc:none');
$p4m_mask->Draw(primitive=>'polyline', points => "0,0 $triangle_width,$triangle_width 0,$triangle_width", fill=>'red');





# 6) generate image_p4m by cropping the source image
$image_p4m->Crop(geometry => "$triangle_width x $triangle_width+$x1+$y1"); 
$image_p4m->Set(page=>'0x0+0+0');
 



# 7) generate p4m_G1
#composite p4m_mask.png image_p4m.png -matte -compose Dst_In p4m_G1.png
$p4m_G1 = $p4m_mask->Clone();
$p4m_G1->Composite(image=>$image_p4m, compose=>'in', color=>'transparent', matte=>'true');



# 8) generate p4m_G2
#convert p4m_G1.png -flop -rotate -90 p4m_G2.png
$p4m_G2 = $p4m_G1->Clone();
$p4m_G2->Flop();
$p4m_G2->Rotate(degrees=>-90, color=>'transparent');



# 9) generate p4m_tile_part
#composite p4m_G1.png p4m_G2.png -compose Dst_Over p4m_tile_part.png
$p4m_tile_part = $p4m_G2->Clone();
$p4m_tile_part->Composite(image=>$p4m_G1, compose=>'over', color=>'transparent', matte=>'true');




# 10) generate p4m_tile_part_flop
#convert p4m_tile_part.png -flop p4m_tile_part_flop.png 
$p4m_tile_part_flop = $p4m_tile_part->Clone(); 
$p4m_tile_part_flop->Flop(); 




# 11) generate p4m_tile_row
#convert p4m_tile_part.png p4m_tile_part_flop.png +append p4m_tile_row.png
$q = $p4m_tile_part->Clone();
push(@$q, $p4m_tile_part_flop); 
$p4m_tile_row = $q->Append(stack=>'false'); 




# 12) generate p4m_tile_row_flip
#convert p4m_tile_row.png -flip p4m_tile_row_flip.png
$p4m_tile_row_flip = $p4m_tile_row->Clone(); 
$p4m_tile_row_flip->Flip(); 




# 13) generate p4m_tile
#convert p4m_tile_row.png p4m_tile_row_flip.png -append p4m_tile.png
@$q = ();
$q = $p4m_tile_row->Clone();
push(@$q, $p4m_tile_row_flip); 
$p4m_tile = $q->Append(stack=>'true'); 



# 14) make comment with parameter values
$comment_string = $sourcefile_name . "*" . $triangle_width . "*" . $x1 . "*" . $y1 . "*";
$p4m_comment = $p4m_tile->Comment($comment_string); 




# 15) generate name of result image
my($filename) = fileparse($sourcefile_fullname, @suffixes); 
if ($p <= 9) {$resultimage_name = "p4m_tile_" . $filename . "-0" . $p . ".jpg"}
if ($p > 9 and $p <= 99)  else {$resultimage_name = "p4m_tile_" . $filename . "-"  . $p . ".jpg"};

$resultimagepath_name = $p4m_resultfolder_path . $resultimage_name; 





# 16) save result image
$p4m_tile->Write(filename=>"$resultimagepath_name", compression=>'JPEG', quality=>'95'); 










