#!/usr/bin/perl

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

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>";
}

podregister {
  $oldforeground=gimp_context_get_foreground();
  $path.='/';
  die __"All fields were not completed, sorry.\n" if $path eq "";
  die __"Scale factor must not be 0\n" if $fixed == 0;

  $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){
    die __"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\n";
  }
  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("$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_context_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);
      $img=gimp_file_load("$tbfname", "$tbfname");
      $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(($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,$parent_url, *htmlFile);
  close htmlFile;
  Gimp->message(__"Your gallery ($galleryfile) has been generated through Gallery plug-in with $totalentries entries");
  gimp_context_set_foreground($oldforeground);
  ();
};

exit main;
__END__

=head1 NAME

gallerymaker - Generate your gallery in HTML format + some picture improvements

=head1 SYNOPSIS

<Image>/Filters/Render/Gallery Maker

=head1 DESCRIPTION

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 PARAMETERS

  [PF_FILE,   "path", "Destination path"],
  [PF_STRING, "label", "Text at top of each picture"],
  [PF_COLOR,  "labelcolor", "Color of label on each picture", [255,255,255]],
  [PF_RADIO,  "labelpos", "Position of text label", 0, [ UpLeft => 0, UpRight => 1, DownLeft => 2, DownRight => 3 ]],
  [PF_FONT,   "font", "Select font", undef ],
  [PF_SLIDER, "bright", "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,  "fixed", "Value or factor", 150],
  [PF_STRING, "gallerytitle", "Gallery title" ],
  [PF_COLOR,  "color", "Gallery background color", [100,100,100]],
  [PF_COLOR,  "foregroundcolor","Gallery foreground color", [255,255,255]],
  [PF_STRING, "galleryfile", "HTML file generated" ],
  [PF_INT32,  "columns", "Gallery columns number", 2],
  [PF_STRING, "parent_url", "Gallery's parent URL" ]

=head1 AUTHOR

Fabian Frederick <fabian.frederick@gmx.fr>

=head1 DATE

20010601

=head1 HISTORY

 2004-03-28 (Dov)
       - Fixed for Gimp-2.0

 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.

=head1 LICENSE

Copyright Fabian Frederick.
This plugin may be distributed under the same terms as GIMP itself.
