source: subversion/applications/share/map-icons/update_thumbnails.pl @ 4335

Last change on this file since 4335 was 4193, checked in by joerg, 13 years ago

rename jp to japan

  • Property svn:executable set to *
File size: 3.8 KB
Line 
1#!/usr/bin/perl -w
2# This little helper traverses the build tree and tries to add
3# missing symbols/icons which can be created
4# by resizing/converting/combining other existing images
5
6use strict;
7use warnings;
8use Data::Dumper;
9use XML::Simple;
10use File::Basename;
11use File::Path;
12use File::Copy;
13use File::Find;
14use File::Slurp;
15use Image::Magick;
16
17my $base_dir=$ARGV[0];
18
19die "Can't find dir \"$base_dir\""
20    unless -d $base_dir;
21
22my $VERBOSE=1;
23
24my @theme_dirs=qw(classic.big classic.small
25                  japan
26                  nickw
27                  square.big square.small
28                  svg
29                  );
30
31sub update_svg_thumbnail($$);
32sub create_tn();
33
34our $COUNT_FILES_SEEN=0;
35our $COUNT_FILES_CONVERTED=0;
36# ---------------------- MAIN ----------------------
37print "Update Thumbnails for Icons in Directory '$base_dir'\n";
38find( { no_chdir=> 1,
39        wanted => \&create_tn,
40      },
41      "$base_dir/svg","$base_dir/japan");
42
43print "Thumbnails seen:  $COUNT_FILES_SEEN\n";
44print "Thumbnails converted: $COUNT_FILES_CONVERTED\n";
45
46exit;
47
48# ------------------------------------------------------------------
49
50sub create_tn()
51{ 
52    my $icon_file = $File::Find::name;
53    my $icon_dir = $File::Find::dir;
54    return if $icon_file =~ m/\.svn/;
55   
56    if ( $icon_file =~ m/\.svg$/ ) {
57        $COUNT_FILES_SEEN++;
58        my $dst_file=$icon_file;
59        for my $theme ( @theme_dirs) {
60            $dst_file =~ s,/$theme/,/${theme}_tn/,;
61        }
62        $dst_file =~ s,\.svg$,.png,;
63        update_svg_thumbnail($icon_file,$dst_file);
64    }
65}
66
67# ------------------------------------------------------------------
68# ARGS:
69#   gets an string with the svg image
70# RETURNS: ($x,$y) the x/y entents of this svg FIle
71sub get_svg_size_of_imge($){
72    my $image_string=shift;
73    my ($x,$y)=(200,200);
74    if ( $image_string=~ m/viewBox=\"([\-\d\.]+)\s+([\-\d\.]+)\s+([\-\d\.]+)\s+([\-\d\.]+)\s*\"/){
75        my ( $x0,$y0,$x1,$y1 ) = ($1,$2,$3,$4);
76        #print STDERR "         ( $x0,$y0,$x1,$y1)" if $VERBOSE;
77        $x0=0 if $x0>0;
78        $y0=0 if $y0>0;
79        $x=int(2+$x1-$x0);
80        $y=int(2+$y1-$y0);
81    } elsif ( $image_string=~ m/height=\"([\-\d\.]+)\"/ ){
82        $y=int(2+$1);
83        if ( $image_string=~ m/width=\"([\-\d\.]+)\"/ ){
84            $x=int(2+$1);
85        }
86    } else {
87        warn "No Size information found using $x/$y\n";
88    }
89    # Limit used memory of Image::Magic
90    $x=4000 if $x>4000;
91    $y=4000 if $y>4000;
92    return ($x,$y);
93}
94
95#############################################################################
96#
97# Create/Update Thumbnail for svg
98sub update_svg_thumbnail($$){
99    my $icon_svg = shift;
100    my $icon_svt = shift;
101
102    #print STDERR "update_svg_thumbnail($icon_svg       $icon_svt)\n";
103
104    if ( ! -s $icon_svg ) {
105        die "Icon '$icon_svg' not found\n";
106    }
107#    print STDERR "update_svg_thumbnail($type,$icon_svg):\t-->  $icon_svt\n" if $VERBOSE;
108
109    my $mtime_svt = (stat($icon_svt))[9]||0;
110    my $mtime_svg  = (stat($icon_svg))[9]||0; 
111     if ( $mtime_svt >  $mtime_svg) { # Up to Date
112         return;
113     } else {
114#       print "time_diff($icon_svg)= ".($mtime_svt -  $mtime_svg)."\n";
115     }
116
117    my $image_string = File::Slurp::slurp($icon_svg);
118    my ($x,$y)=get_svg_size_of_imge( $image_string);
119
120    print STDERR "Updating $icon_svg\t-->  $icon_svt\t";
121    print STDERR " => '${x}x$y' \n" if $VERBOSE;;
122    eval { # in case image::magic dies
123        my $image = Image::Magick->new( size => "${x}x$y");;
124        my $rc = $image->Read($icon_svg);
125        warn "$rc" if "$rc";
126        $rc = $image->Sample(geometry => "32x32+0+0");
127        # For debugging the svg pictures; you can use this line
128        #$rc = $image->Sample(geometry => "128x128+0+0") if $x>128 || $y>128;
129        warn "ERROR: $rc" if "$rc";
130       
131        $rc = $image->Transparent(color=>"white");
132        warn "ERROR: $rc" if "$rc";
133
134        my $dir=dirname($icon_svt);
135        if ( ! -d $dir ) {
136            mkpath($dir) || warn ("Cannot create Directory: '$dir'");
137        } 
138
139        $rc = $image->Write($icon_svt);
140        warn "ERROR: $rc" if "$rc";
141    };
142    warn "ERROR: $@" if $@;
143    $COUNT_FILES_CONVERTED++;
144
145}
Note: See TracBrowser for help on using the repository browser.