/usr/bin/icontool-render is in icontool 0.1.0-0ubuntu2.
This file is owned by root:root, with mode 0o755.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 | #!/usr/bin/perl -w
# -*- Mode: perl; indent-tabs-mode: nil; c-basic-offset: 4 -*-
#############################################################################
## Copyright (C) 2008-2009 Rodney Dawes
##
## Authors: Rodney Dawes <dobey@gnome.org>
##
## This program is free software: you can redistribute it and/or modify it
## under the terms of the GNU General Public License version 2, as published
## by the Free Software Foundation.
##
## This program is distributed in the hope that it will be useful, but
## WITHOUT ANY WARRANTY; without even the implied warranties of
## MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR
## PURPOSE. See the GNU General Public License for more details.
##
## You should have received a copy of the GNU General Public License along
## with this program. If not, see <http://www.gnu.org/licenses/>.
use strict;
use XML::Simple;
use Getopt::Long;
my $PACKAGE = "icontool";
my $VERSION = "0.1.0";
my $inkscape = "inkscape";
my $sizeonly;
my $outdir = "";
my $dirall;
############################################################################
my @default_getopt_config = ("permute", "pass_through", "bundling",
"no_auto_abbrev", "no_ignore_case");
Getopt::Long::Configure (@default_getopt_config);
GetOptions ("size|s=s" => \$sizeonly,
"inkscape|i=s" => \$inkscape,
"output-dir|o=s" => \$outdir,
"directory|d=s" => \$dirall);
############################################################################
$outdir =~ s|[/]?$|/|g if ($outdir ne "");
sub render_icons {
my $filename = shift;
my $svgdata = XML::Simple::XMLin ($filename,
keyattr => [ qw() ],
forcearray => [ qw(g rect text) ]);
foreach my $icon (@{$svgdata->{g}}) {
my $name;
my $context;
foreach my $plate (@{$icon->{g}}) {
if (defined $plate->{'inkscape:label'} &&
$plate->{'inkscape:label'} =~ m/plate(.*)/) {
# Error out if the 'plate' layer is visible
# This is to prevent background squares from appearing
# inside the rendered PNG files
if (defined $plate->{style} &&
$plate->{style} ne "display:none") {
die "ERROR: $filename: Plate layer not hidden.\n";
}
# Get the icon's name and context so we can render it
# in the right location on disk
foreach my $text (@{$plate->{text}}) {
if (defined $text->{'inkscape:label'} &&
$text->{'inkscape:label'} eq "icon-name") {
$name = $text->{tspan}->{content};
} elsif (defined $text->{'inkscape:label'} &&
$text->{'inkscape:label'} eq "context") {
$context = $text->{tspan}->{content};
}
}
# Grab the rectangle inside the plate and tell
# Inkscape to render the area to our PNG file
foreach my $box (@{$plate->{rect}}) {
if (defined $box->{'inkscape:label'}) {
my $size = $box->{'inkscape:label'};
my $dir = "$outdir$size/$context";
# Skip this box if the size isn't the requested size
next if (defined $sizeonly && $size ne $sizeonly);
if (! -d $dir) {
system ("mkdir -p $dir");
}
# Only redirect STDOUT as STDERR is useful here
my $cmd = "$inkscape -i $box->{id} -e $dir/$name.png $filename > /dev/null";
# Print the context/name.png string to STDOUT
# We are doing this until a better cache method can
# be implemented, to avoid having to use redirection
print "$context/$name.png\n";
system ($cmd);
}
}
}
}
}
}
sub usage {
print "Usage: icontool-render [OPTIONS] <SVGFILE>
-d, --directory=<dir> Render all SVGs in <dir>
-i, --inkscape=<path> Path to inkscape binary to use
-o, --output=<dirname> Directory to output PNGs to
-s, --size=<size> Size to render from <SVGFILE>
";
exit 1;
}
if (defined $ARGV[0]) {
render_icons ($ARGV[0]);
} elsif (defined $dirall) {
opendir (DIR, $dirall) || die ("ERROR: Failed to open directory: $dirall");
my @filelist = readdir (DIR);
closedir (DIR);
foreach my $file (@filelist) {
next if ($file eq "." || $file eq "..");
render_icons ("$dirall/$file") if ($file =~ m/^(.*).svg[z]?$/);
}
} else {
usage ();
}
|