#!/usr/bin/perl
#
# (c) 1999 by St. Traby <stefan@quant-x.com>, GPL

#
# Erzeugt ein Preview für Povray Presentationen.
# Erwartet *.txt (Results)
#          *.tga (128x128 preview)
#
# Erzeugt: *.png         
#

use strict 'vars';
use Gimp;

#
# Global definitions
#

my ($xres,$yres) = (512,384);
my $dp;
chomp(my $prefix = `pwd`);
my $ipath = "$prefix/icons";
my $spath = "$prefix/scenes";
my $mpath = "$prefix/preview";

my ($font, $fontsize) = ('-misc-fixed-bold-r-normal-*-14-20-*-*-*-*-iso8859-1', 18);

#
# Helper functions.
#

sub text {
    my ($i, $x, $y, $t, $fs, $f, $layer) = @_;

    $fs = $fontsize if not defined $fs;
    $f = $font if not defined $f;
    $layer = -1 if not defined $layer;

    gimp_floating_sel_anchor(
    gimp_text_fontname($i, $layer, $x, $y, $t, 0, 0,  $fs, 0, $f)
			     );
    $i->selection_none();
}

sub textf {
    my ($i, $x, $y, $fn, $fs, $f, $layer) = @_;
    my $t;

    open(IN, "<$fn") or die "Can't open $fn :$!";
    
    while(<IN>) {
	$t = $_;
	chomp($t);
	last if length($t) < 1;
	text($i, $x, $y, $t, $fs, $f, $layer);
	$y += $fs + 2;
    }
}

sub dtext {
    my ($layer, $text) = @_;

    $layer->dynamic_text($text,
			 "arial",
			 "*",
			 "*",
			 "*",
			 140,
			 0,
			 0,
			 1,
			 0,
			 0,
			 [128,128,128]);
    $layer->by_color_select([128,128,128], 0, 2, 0, 0, 0, 0);
    gimp_patterns_set_pattern("3D Green");
    gimp_bucket_fill($layer, 2, 0, 70, 255, 0, 0, 0);
}

sub File2Layer {
    my ($img, $fn, $layername, $x, $y) = @_;
    my $logo = gimp_file_load(0, $fn, $fn);
    my $fs;

    gimp_selection_all($logo);
    gimp_edit_copy($logo->active_drawable);
    my $bg=$img->layer_new($logo->width,
			   $logo->height,
			   RGB_IMAGE,
			   $layername,
			   100,
			   NORMAL_MODE);
    $logo->delete;
    $bg->add_alpha();
    $bg->add_layer(0);
    $bg->edit_clear;
    $fs = $bg->edit_paste(0);
    gimp_floating_sel_anchor($fs);
    $x = 0 if not defined $x;
    $y = 0 if not defined $y;
    $bg->translate($x, $y);
    $bg;
}

#in: img layer [layer...]
sub tobottom {

    my $img = shift;

    for (@_) {
	$img->lower_layer_to_bottom($_);
    }
}

sub totop {
    my $img = shift;

    for (@_) {
	$img->raise_layer_to_top($_);
    }
}

sub query {
   print STDERR "$0: this script is not intended to be run from within the gimp!\n";
}

#
# Create the template Image.
# 
#

sub create_template {
    my $fn = shift;
    gimp_palette_set_default_colors();
    my $img=new Gimp::Image($xres,$yres,RGB_IMAGE);
    gimp_selection_none($img);
    
    my $bg=$img->layer_new($xres,$yres,RGB_IMAGE,"Background",100,NORMAL_MODE);
    $bg->add_alpha();
    $bg->add_layer(0);
    $bg->set_active_layer;
    gimp_drawable_fill($bg, 1);
    gimp_palette_set_background([0,0,255]);
    gimp_palette_set_foreground([255,255,255]);
    gimp_patterns_set_pattern("3D Green");
    gimp_bucket_fill($bg, 2, 0, 70, 255, 0,   0, 0);
    gimp_palette_set_default_colors();
    
    my $head=$img->layer_new($xres,$yres,RGB_IMAGE,"Header",100,NORMAL_MODE);
    $head->add_alpha();
    $head->add_layer(1);
    $head->edit_clear;

    my ( $x, $y ) = ( 50, 50 );

    text($img, 10, $yres - 12,
	 "Created by a Gimp-Perl (  " .
	 "     ) script (c) 1999 by St. Traby, Quant-X",
	 8, "-schumacher-clean-medium-r-*-*-8-*-*-*-*-*-iso8859-1", $head);

    my $qxl = File2Layer($img, "$ipath/quant-x.xcf", "Quant-X Logo Oben",
			 256,0);
    $qxl->set_opacity(30.0);
    my $sal = File2Layer($img, "$ipath/samsung.xcf", "Samsung Logo Oben",
			 0,0);
    $sal->set_opacity(30.0);

    my $qxl2 = File2Layer($img, "$ipath/quant-x.xcf", "Quant-X Logo Unten",
			  0,275);
    $qxl2->set_opacity(30.0);
    my $sal2 = File2Layer($img, "$ipath/samsung.xcf", "Samsung Logo Unten",
			  256,275);
    $sal2->set_opacity(30.0);

    my $gimp = File2Layer($img, "$ipath/gimp.xpm", "Gimp Logo",
			  130,$yres - 30);
    $gimp->set_opacity(80.0);

    my $api = File2Layer($img, "$ipath/api.tga", "API Logo",
			  $xres - 135, $yres - 37 + 3);
    $api->set_opacity(100.0);

    my $axp = File2Layer($img, "$ipath/axp.gif", "AXP Linux 2.2 Logo",
			  200+188, 200-112);
    $axp->set_opacity(30.0);

    tobottom($img, $axp, $qxl, $sal, $qxl2, $sal2, $gimp, $api, $bg);

    gimp_selection_none($img);
    gimp_xcf_save(0, $img, -1, "$fn", "$fn");
    $img->delete;
}

sub max {
    my $max = undef;
    foreach (@_) {
	$max = $_ if (!defined($max) || $_ > $max);
    }
    $max;
}

my $fake = 1;
my $fakecount = 0;
my @fakescenes = qw(samsung titusville lamp arches);

sub insert_Values {
    my ($img, $layer, $fn) = @_;
    my ($x, $y) = (20, 128+24);
    my ($t, $jan, $i, $idx, $lim) = (undef, undef, undef, 0, undef);
    my @text;
    my @val;

    if($fake) {
	$fn = $fakescenes[$fakecount++ / 3 % 3 ];
	$fn = "$spath/$fn/$fn.txt";
    }

    open(IN, "<$fn") or die "Can't open $fn :$!";
    @text = ();
    @val = ();
    while(<IN>) {
	$t = $_;
	chomp($t);
	last if length($t) < 1;
	$jan = $t;
	$t =~ s/[ \t]*:.*//;
	$text[$idx] = $t;
	$_ = $jan;
	$jan =~ s/.*:[ \t]*//;
	$val[$idx++] = $jan + 0;
    }

    $lim = max(@val);

    gimp_patterns_set_pattern("Wood");
    text($img, $x+200, $y-18, "<- Fast  Slow ->", 14, undef, $layer);
    text($img, $x+200, $y+6*16, "<- Fast  Slow ->", 14, undef, $layer);

    for($i = 0; $i < $idx; $i++) {
	text($img, $x, $y, $text[$i], 14, undef, $layer);
	gimp_patterns_set_pattern("Slate");  # or Wood ?
	$img->rect_select($x + 200, $y, 140,
			  12, 2, 0, 0);
	gimp_bucket_fill($layer, 2, 0, 70, 255, 0, 0, 0);
	gimp_patterns_set_pattern("Electric Blue");
	$img->rect_select($x + 200, $y+3, 140/$lim * $val[$i],
			  12-6, 2, 0, 0);
	gimp_bucket_fill($layer, 2, 0, 70, 255, 0, 0, 0);
	$y += 16;
    }
    $img->selection_none();
}


sub write_image {
    my ($img, $name, $ext) = @_;
    print "Working on $name ($ext) - ";
    my $logo = File2Layer($img, "$mpath/$name.tga", "Small Preview",
			  $xres-12-128,128);
    $logo->set_opacity(80.0);
    my $res=$img->layer_new($xres,$yres,RGB_IMAGE,"Results",100,NORMAL_MODE);
    $res->add_alpha();
    $res->add_layer(0);
    $res->edit_clear();

    my $title=$img->layer_new($xres,$yres,RGB_IMAGE,"Title",100,NORMAL_MODE);
    $title->add_alpha();
    $title->add_layer(0);
    $title->edit_clear();

    insert_Values($img, $res, "$spath/$name/$name.txt");
    gimp_by_color_select($res, [0,0,0], 0, 0, 0, 0, 0, 0);
    gimp_palette_set_background([244,9,29]);
    gimp_palette_set_foreground([58,201,36]);
    gimp_blend($res,
	       0,
	       0,
	       0,
	       50,
	       0,
	       0,
	       0,
	       0,
	       0,
	       30,
	       30,
	       $xres/2,
	       $yres/2);
    gimp_selection_none($img);
    
    if (defined $ext) {
    my $lext=$img->layer_new($xres,$yres,RGB_IMAGE,"Text: $ext",
			     100,NORMAL_MODE);
    $lext->add_alpha();
    $lext->add_layer(0);
    $lext->edit_clear();
    $lext->set_active_layer;
    dtext($lext, $ext);
    $lext->translate(10, 152);
    $lext->set_opacity(60);
    totop($img, $res);
    }
    gimp_palette_set_foreground([0,0,0]); 
    $img->selection_none();
    $title->dynamic_text("Scene: $name",
			 "arial",
			 "*",
			 "*",
			 "*",
			 28,
			 0,
			 0,
			 1,
			 0,
			 0,
			 [128,128,128]);
    $title->by_color_select([128,128,128], 0, 2, 0, 0, 0, 0);
    gimp_patterns_set_pattern("Leather");
    gimp_bucket_fill($title, 2, 0, 70, 255, 0, 0, 0);
    $title->translate(20,96);
    $img->selection_none;
    if (1) {
	gimp_xcf_save(0, $img, -1, "$spath/$name/$name.xcf", "$name.xcf")
	    if (! defined($ext));
	gimp_selection_all($img);
	$img->merge_visible_layers(1);
	file_png_save(1, $img, $img->active_drawable,
		      "$spath/$name/$name$ext.png", "$name$ext.png", 0, 1.0);
    } else {
	my $dp =  new Gimp::Display($img);
	Display->displays_flush ();
	my $xx = <STDIN>;
	$dp->delete;
	$img->delete;
    }
    print "ok\n";
}

my @scenes = qw(arches babem bezier box clouds dino dodec2
		dsotm galleon hfclip ionic5 klingon lamp lemnisc2
		ncc1701d ntreal oak2 pcw pencil planet planet2
		quant-x room samsung shark snack snowman spotlite
		sunsethf takeoff tiles titusville tree warbird wealth);

my @addons = ("21164", "21264", undef);
@scenes = qw(snowman);
# testing
# my @scenes = qw(samsung);  my @addons = ("21164");



sub net {
    my ($a, $s) = ();
    create_template("template.xcf");
    
    foreach $s (@scenes) {
	foreach $a (@addons) {
	    write_image(gimp_xcf_load(0,
				      "template.xcf",
				      "template.xcf"), $s, $a);
	}
    }
}

exit main;









