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

Last change on this file since 10274 was 6505, checked in by joerg, 12 years ago

map-icons: rename thumbnail directories to _png

  • Property svn:executable set to *
File size: 4.7 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_png();
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_png,
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
50##################################################################
51# Get the licence from a svg File
52# RETURNS:
53#     'PD' for PublicDomain
54#     '?'  if unknown
55sub get_svg_license($){
56    my $icon_file=shift;
57    my $icon = XMLin($icon_file,ForceArray => ['description','title','condition']);
58    my $license = $icon->{'metadata'}->{'rdf:RDF'}->{'cc:Work'}->{'cc:license'}->{'rdf:resource'};
59    #print Dumper(\$license);
60    return '?' unless $license; 
61#    $license =~ s,http://web.resource.org/cc/,,;
62#    return "Public Domain" if $license && $license =~ m/Public.*Domain/;
63   
64    return $license;
65}
66
67
68##################################################################
69# create all Thumbnails for one icon-name
70# currently this means svg --> svg_png and japan --> japan_png
71sub create_png()
72{ 
73    my $icon_file = $File::Find::name;
74    my $icon_dir = $File::Find::dir;
75    return if $icon_file =~ m/\.svn/;
76   
77    if ( $icon_file =~ m/\.svg$/ ) {
78        $COUNT_FILES_SEEN++;
79        my $dst_file=$icon_file;
80        for my $theme ( @theme_dirs) {
81            $dst_file =~ s,/$theme/,/${theme}_png/,;
82        }
83        $dst_file =~ s,\.svg$,.png,;
84        update_svg_thumbnail($icon_file,$dst_file);
85    }
86}
87
88# ------------------------------------------------------------------
89# ARGS:
90#   gets an string with the svg image
91# RETURNS: ($x,$y) the x/y entents of this svg FIle
92sub get_svg_size_of_imge($){
93    my $image_string=shift;
94    my ($x,$y)=(200,200);
95    if ( $image_string=~ m/viewBox=\"([\-\d\.]+)\s+([\-\d\.]+)\s+([\-\d\.]+)\s+([\-\d\.]+)\s*\"/){
96        my ( $x0,$y0,$x1,$y1 ) = ($1,$2,$3,$4);
97        #print STDERR "         ( $x0,$y0,$x1,$y1)" if $VERBOSE;
98        $x0=0 if $x0>0;
99        $y0=0 if $y0>0;
100        $x=int(2+$x1-$x0);
101        $y=int(2+$y1-$y0);
102    } elsif ( $image_string=~ m/height=\"([\-\d\.]+)\"/ ){
103        $y=int(2+$1);
104        if ( $image_string=~ m/width=\"([\-\d\.]+)\"/ ){
105            $x=int(2+$1);
106        }
107    } else {
108        warn "No Size information found using $x/$y\n";
109    }
110    # Limit used memory of Image::Magic
111    $x=4000 if $x>4000;
112    $y=4000 if $y>4000;
113    return ($x,$y);
114}
115
116#############################################################################
117#
118# Create/Update Thumbnail for svg
119sub update_svg_thumbnail($$){
120    my $icon_svg = shift;
121    my $icon_svt = shift;
122
123    #print STDERR "update_svg_thumbnail($icon_svg       $icon_svt)\n";
124
125    if ( ! -s $icon_svg ) {
126        die "Icon '$icon_svg' not found\n";
127    }
128#    print STDERR "update_svg_thumbnail($type,$icon_svg):\t-->  $icon_svt\n" if $VERBOSE;
129
130    my $mtime_svt = (stat($icon_svt))[9]||0;
131    my $mtime_svg  = (stat($icon_svg))[9]||0; 
132     if ( $mtime_svt >  $mtime_svg) { # Up to Date
133         return;
134     } else {
135#       print "time_diff($icon_svg)= ".($mtime_svt -  $mtime_svg)."\n";
136     }
137
138    my $license = get_svg_license($icon_svg);
139    my $image_string = File::Slurp::slurp($icon_svg);
140    my ($x,$y)=get_svg_size_of_imge( $image_string);
141
142    print STDERR "Updating $icon_svg\t-->  $icon_svt\t";
143    print STDERR " => '${x}x$y' lic:$license \n" if $VERBOSE;;
144    eval { # in case image::magic dies
145        my $image = Image::Magick->new( size => "${x}x$y");;
146        my $rc = $image->Read($icon_svg);
147        warn "$rc" if "$rc";
148        if ( $icon_svg !~ /incomming/ ) {
149            $rc = $image->Sample(geometry => "32x32+0+0");
150        }
151
152        # For debugging the svg pictures; you can use this line
153        #$rc = $image->Sample(geometry => "128x128+0+0") if $x>128 || $y>128;
154        warn "ERROR: $rc" if "$rc";
155       
156        $rc = $image->Transparent(color=>"white");
157        warn "ERROR: $rc" if "$rc";
158
159        my $dir=dirname($icon_svt);
160        if ( ! -d $dir ) {
161            mkpath($dir) || warn ("Cannot create Directory: '$dir'");
162        } 
163
164        $image->Comment("License: $license") if $license;
165
166        $rc = $image->Write($icon_svt);
167        warn "ERROR: $rc" if "$rc";
168
169    };
170    warn "ERROR: $@" if $@;
171    $COUNT_FILES_CONVERTED++;
172
173}
Note: See TracBrowser for help on using the repository browser.