epic-s6ts
[kivitendo-erp.git] / scripts / image_maps.pl
index e6a47d9..f0471d6 100755 (executable)
@@ -1,15 +1,16 @@
 #!/usr/bin/perl
 
 use strict;
-use GD;
 use Getopt::Long;
 use File::Basename;
 
-
 my $css_file   = 'generated.css';
 my $image_file = 'generated.png';
 my $class_for_map = 'icon';
 
+my $convert_bin  = 'convert';
+my $identify_bin = 'identify';
+
 GetOptions(
   'css-out=s'    => \$css_file,
   'image-out=s'  => \$image_file,
@@ -17,71 +18,74 @@ GetOptions(
 );
 
 my @files = @ARGV;
-my @gd_images;
-
-GD::Image->trueColor(1);
+my @images;
 
 # read files
 
-for my $filename (@files) {
-  my $image = GD::Image->newFromPng($filename);
+for my $filename (sort @files) {
+   my $image = `$identify_bin $filename`;
    if (!defined $image) {
-     warn "warning: could not load image '$filename'. skpping...";
+     warn "warning: could not identify image '$filename'. skipping...";
      next;
    }
-  push @gd_images, {
-    gd       => $image,
+  $image =~ /^(?<filename>\S+) \s (?<type>\S+) \s (?<width>\d+) x (?<height>\d+)/x;
+  push @images, {
     filename => $filename,
+    type     => $+{type},
+    width    => $+{width},
+    height   => $+{height},
   };
 }
 
 # make target layout
 # for simplification thi will check if all the  images have the same dimensions
 # and croak if not
-my $first_height = $gd_images[0]->{gd}->height;
-my $first_width  = $gd_images[0]->{gd}->width;
+my $first_height = $images[0]->{height};
+my $first_width  = $images[0]->{width};
 
 use Data::Dumper;
 
-for my $img (@gd_images) {
-  die 'heights are not equal' if $first_height != $img->{gd}->height;
-  die 'widths are not equal'  if $first_width  != $img->{gd}->width;
+for my $img (@images) {
+  die 'heights are not equal' if $first_height != $img->{height};
+  die 'widths are not equal'  if $first_width  != $img->{width};
 }
 
 # all equal? nice.
 # we'll be lazy and just put them all together left-to-right
 my $new_height = $first_height;
-my $new_width  = $first_width * @gd_images;
+my $new_width  = $first_width * @images;
 
-my $new_image = GD::Image->new($new_width, $new_height, 1);
 # now copy them all together, and keep a referende to;
 
-$new_image->saveAlpha(1);
-$new_image->alphaBlending(0);
+my $convert_string = "$convert_bin ";
 
 my $h_offset = 0;
-for (@gd_images) {
+for (@images) {
   $_->{h_offset} = $h_offset;
   $_->{v_offset} = 0;
-  $new_image->copy($_->{gd}, $_->{h_offset}, $_->{v_offset}, 0, 0, $_->{gd}->width, $_->{gd}->height);
+  $convert_string .= ' +append ' . $_->{filename};
 } continue {
-  $h_offset += $_->{gd}->width;
+  $h_offset += $_->{width};
 }
 
+$convert_string .= " -background none +append $image_file";
+
 # now write that png...
-{
-  open my $file, '>:raw', $image_file or die "can't write to $image_file";
-  print $file $new_image->png;
-}
+system($convert_string);
 
 # make css file
 {
   open my $file, ">", $css_file or die "can't write too $css_file";
   print $file ".$class_for_map { background: url(../$image_file) ${first_width}px 0px no-repeat; padding: 0; width: ${first_width}px; height: ${first_height}px; }\n";
 
-  for (@gd_images) {
+  for (@images) {
     my $name = fileparse($_->{filename}, ".png");
-    $name =~ s/ /-/g;
+
+    # the full grammar for valid css class names is completely bonkers (to put it mildly).
+    # so instead of trying to punch filenames into those class names, we'll
+    # just reduce them to a nice minimal set of lower case /[a-z0-9_-]*/
+    $name = lc $name;
+    $name =~ s/[^a-z0-9_-]/-/g;
     print $file ".$class_for_map.$name { background-position: -$_->{h_offset}px 0px; }\n";
   }
 }