#!/usr/bin/perl
# gallery.pl
#
# Copyright (c) Fabian Frederick 2001
#
# Rewritten for GIMP 1.2 and the Graphics Muse Tools CD
# by Michael J. Hammel (mjhammel@graphics-muse.org
# Jan 26, 2002
#
# 17/07/2001 (Fab)
# V2.0
#	-Adding Html instance per picture + Header
#	-Adding URL
#
# 07/07/2001 (Darkin)
#	-Item was unreachable from menu because of RGB requesite -> undef.
#
# 17/6/2001 (Fab)
# V1.3
#	-Adding global progression bar
#	-Preserving Gimp cache (progressive image_delete)
#	-Adding trailing / to path
#	-Plugin crashed when no label was given 
# 25/5/2001 (Fab)
# V1.2 -Bug in rotation parameter : OK
#	-Adding color for label(Parasite editor helped here :) ).
#	-Register as gallery_maker
#	-Adding corner selection for copyright using layer_translate
#	-Recovering colors for HTML (Thanks Marc).
#
# 18/19/5/2001 (Fab)
# V1.01 -Moving plug-in to Toolbox/Render menu
#	-Added some error-handling
#	-Automatically put html file in gallery path
#	-Added some features to HTML generated
#	-Simplified I/O
#	-Status supply
#	-Source is not overwritten anymore .... c$name applied.
#	-Working in sub-path (using gallery title)
#	-HTML file not deployed in /tmp (directly in dpath)
# 10-13/5/2001 (Fab)
# V1.0	First workable version.
#

eval 'exec /usr/bin/perl  -S $0 ${1+"$@"}'
    if 0; # not running under some shell

eval 'exec /usr/app/bin/perl  -S $0 ${1+"$@"}'
    if 0; # not running under some shell

use Gimp qw(:auto __ N_);
use Gimp::Fu;
use Gimp::Util;

#Gimp::set_trace(TRACE_ALL);

sub printHeader {
	my ($rf,$gf,$bf,$r,$g,$b, $htmlFile,$gallerytitle)=@_;
	printf $htmlFile "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0//EN\">";
   	printf $htmlFile "<body bgcolor='#%x%x%x'>\n",$r,$g,$b;
        printf $htmlFile "<center><font face=\"verdana,arial\" size=\"5\" color=\"#%x%x%x\">",$rf,$gf,$bf;
	printf $htmlFile "$gallerytitle\n";
        printf $htmlFile "<table><tr>\n";
}


sub printFooter {
	my ($rf,$gf,$bf,$URL, $htmlFile)=@_;
	printf $htmlFile "<br><br><hr size=\"1\" color=\"white\"><a href=\"$URL\">Back to previous page</a>\n";
	printf $htmlFile "</body>\n</html>";

}

sub galleryMaker {
   my ($path, $label, $labelcolor, $labelpos, $font, $bright, $contrast, $rotate, $scalefix, $fixed, $gallerytitle, $color, $foregroundcolor, $galleryfile,$columns,$parentURL) = @_;
 
   $oldforeground=gimp_palette_get_foreground();
   $path=$path.'/';
   if ($path eq ""){
        Gimp->message(__"All fields were not completed, sorry.");
	exit main;
   }	
   if ($fixed == 0){
	Gimp->message(__"Scale factor has not to be 0");
	exit main;	
   }	

   $countTotal=`ls $path*.jpg | wc -l`+`ls $path*.JPG | wc -l`;
   $gallerytitle=~s/ /_/g;	
   opendir(cpath, $path) or die ("Unable to open destination path");
   $sysval=system("mkdir $path$gallerytitle");
   if ($sysval != 0){
    	Gimp->message(__"Make sure you've got write access to selected path ...\nMaybe the target path already exist in which case you can simply change the Gallery title and launch again");
	exit main;
   }
   my $dpath="$path$gallerytitle/";
   open (htmlFile, "> $dpath$galleryfile.html") or die ("Unable to process HTML File.");

   my ($rf,$gf, $bf)=@$foregroundcolor;
   my ($r,$g,$b)=@$color;
   printHeader($rf,$gf,$bf,$r,$g,$b,htmlFile,$gallerytitle);
   print htmlFile "<table><tr>\n";
   my $totalentries=0;
   my $entries=1;
   my $twidthEval=0;
   my $txtwidth=0;
   my $txtheight=0;
   my $ycorrection=0;			   		   
   my $xcorrection=0;

   Gimp->progress_init("Releasing the gallery");
   while (defined($cfile=readdir(cpath))) { 	
	   if (( $cfile =~ /.jpg/ ) || ($cfile =~ /.JPG/)) {
		   my $img=gimp_file_load(RUN_NONINTERACTIVE,"$path$cfile", "$path$cfile");
		   my $clayer=gimp_image_get_active_layer($img);
		   if ($rotate != 0){
			#plug_in_rotate manages both global 90-180-270 - reshape $img
			plug_in_rotate(RUN_NONINTERACTIVE,$img,-1,$rotate,1);
		   }  	

		   my $width=gimp_image_width($img);
		   my $height=gimp_image_height($img);		
		   gimp_brightness_contrast($clayer, $bright, $contrast);
		   if ( $label ne "" ){	
			   my $newlayer=gimp_layer_new($img, 200, 100, RGB_IMAGE, "newlayer", 100, NORMAL_MODE);
			   gimp_palette_set_foreground($labelcolor);
			   my $txtlayer=gimp_text_fontname($img, -1, 1, 1, $label, 0, 0, 16, 0, $font); 
			   if ($twidthEval == 0) {	
			   	$txtwidth=gimp_drawable_width($txtlayer);
				$txtheight=gimp_drawable_height($txtlayer);
			        $twidthEval=1;
			   } 	
			   $ycorrection=$height-$txtheight if (($labelpos == 2) || ($labelpos == 3));
			   $xcorrection=$width-$txtwidth if (($labelpos == 1) || ($labelpos == 3));
			   gimp_layer_translate($txtlayer, $xcorrection, $ycorrection);
			   gimp_image_merge_visible_layers($img,0);
		   }	
		   my $cvname="$dpath$cfile";
		   #$cvname=~s/ /c/g;	
		   ($img->get_layers)[0]->file_jpeg_save("$cvname", "$cvname",0.7,0,1,0,"",0,1,0,0);
		
		   #Processing Thumbnail	
		   my $tbheight=1;
		   my $tbwidth=1; 	
		   if ($scalefix == 1){
				    my $scalefactor=$width/$fixed;
				    $tbheight=$height/$scalefactor;	
				    $tbwidth=$fixed;
			  }else{
				    if ($scalefix == 2) {
					   my $scalefactor=$height/$fixed;
					   my $newwidth=$width/$scalefactor;
					   $tbwidth=$newwidth;
					   $tbheight=$fixed;
				    }else {
					   # scalefix 0 => both scaled by factor (value_factor)
					   $tbwidth=$width/$fixed;		    
					   $tbheight=$height/$fixed;
				    }	
		   }
		   my $tbfname="$dpath $cfile";
		   $tbfname=~s/ /m/g;	
		   system("cp $cvname $tbfname");
		   gimp_image_delete($img);	
		   my $img=gimp_file_load(RUN_NONINTERACTIVE,"$tbfname", "$tbfname");
		   my $clayer=gimp_image_get_active_layer($img);
		   gimp_image_scale($img, $tbwidth, $tbheight);

		   #Processing detail HTML		
		   my $htmlDetail=$cfile;
		   $htmlDetail=~s/.jpg/.html/g;	
		   $htmlDetail=~s/.JPG/.html/g;	
		   open (fhtmlDetail, "> $dpath$htmlDetail") or die ("Unable to process HTML File.");
   		   printHeader($rf,$gf,$bf,$r,$g,$b,fhtmlDetail,$gallerytitle);
		   print fhtmlDetail "<img src=\"$cfile\"></img>";	
		   printFooter($rf,$gf,$bf,"$galleryfile.html", fhtmlDetail);
		   close fhtmlDetail;
		   file_jpeg_save(RUN_NONINTERACTIVE,$img, ($img->get_layers)[0],"$tbfname", "$tbfname",0.7,0,1,0,"",0,1,0,0);
		   print htmlFile "		<td><a href='$htmlDetail'><img src='m$cfile' border='0'></a></td>\n";
		   if ($entries >= $columns){
			 	print htmlFile "</tr><tr>";
				$entries=1;
			    }else{
				$entries=$entries+1;
		   }
          $totalentries=$totalentries+1;
	  Gimp->progress_update ($totalentries/$countTotal);
	  gimp_image_delete($img);	
	  }	
    }
    Gimp->progress_update(1);	
    print htmlFile "</table>\n";
    printFooter($rf,$gf,$bf,$parentURL, htmlFile);
    close htmlFile;
    Gimp->message(__"Your gallery ($galleryfile) has been generated through Gallery plug-in with $totalentries entries");
    gimp_palette_set_foreground($oldforeground);
   # return();

}

$help=<<EOF.$help;
This script will hopefully help you creating an html gallery of a path full of JPG pictures ... This one creates thumbnails - Copyright notice on picture and some other cool tips.
EOF

register("gallerymaker",
         "Generate your gallery in HTML format + some picture improvements", 
         $help,
         "Fabian Frederick <Fabian.Frederick\@gmx.fr>",
         "(c) 2001 Fabian Frederick",
         "20010601",
         N_"<Toolbox>/Xtns/Web Gallery/Gallery Maker",
         undef,
         [
          [PF_FILE,   "path", "Destination path .... "],
          [PF_STRING, "label", "Text to add at the top of each picture"],
	  [PF_COLOR,  "label_color", "Color of the label to be displayed on each picture", [255,255,255]],
	  [PF_RADIO,  "label_position", "Position of your text label...", 0, [ UpLeft => 0, UpRight => 1, DownLeft => 2, DownRight => 3 ]],	
	  [PF_FONT,   "displayfont", "Select font", undef ],
	  [PF_SLIDER, "brightness", "Brightness correction", 0, [ -127, 127]],
	  [PF_SLIDER, "contrast", "Contrast correction", 0, [-127,127]],
	  [PF_RADIO,  "rotate", "Rotation angle", 0, [ None => 0, Rotate90CCW => 3, Rotate90 => 1]],
	  [PF_RADIO,  "scalefix", "Scale fixing for thumbnails", 1 ,[ both_by_factor => 0, X => 1, Y => 2 ]],	
	  [PF_INT32,  "value_factor", "value or factor", 150],
	  [PF_STRING, "gallery_title", "Gallery's Title" ],	
	  [PF_COLOR,  "background_color","Gallery background color", [100,100,100]],
	  [PF_COLOR,  "foreground_color","Gallery background color", [255,255,255]],
	  [PF_STRING, "gallery_file", "HTML file generated" ],	
	  [PF_INT32,  "columns", "Gallery columns number", 2],
	  [PF_STRING, "parent_file", "Gallery's parent URL" ]
         ],
	 \&galleryMaker);
exit main; 

__END__

=head1 NAME

Gallery Maker

=head1 SYNOPSIS

Gallery Maker

=head1 DESCRIPTION

Gallery Maker is a Gimp plugin.It generates an HTML file from all pictures it finds in a designed path.A thumbnail is generated from each picture with a desired global scale or X or Y fixed...This tool will hopefully help batch conversions from photo albums for instance as you can add copyright notice on source picture but also adjust brightness/contrast or give polar rotations ....
Convention used here is the following : All pictures converted is c<name> ....Relative thumbnail is m<name>
Note : This plugin only processes JPG pictures.

=head1 AUTHOR

Written by Fabian Frederick <fabian.frederick@gmx.fr>, (c) 2001
