#! /usr/bin/perl -w
#
# Render SVG files containing one or more images into an ICO or BMP.
#
# Copyright (C) 2010 Joel Holdsworth
#
# This library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public
# License as published by the Free Software Foundation; either
# version 2.1 of the License, or (at your option) any later version.
#
# This library is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
# Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public
# License along with this library; if not, write to the Free Software
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA

use strict;
use warnings;
use XML::Parser;
use MIME::Base64;
use File::Copy;

# Parse the parameters
my $svgFileName = $ARGV[0];
my $outFileName = $ARGV[1];

die "Cannot open SVG file" unless defined($svgFileName);
die "Cannot open output file" unless defined($outFileName);

$outFileName =~ m/(.*)\.(.*)/;
my $outName = $1;
my $ext = lc($2);
die "Only BMP, ICO and CUR outputs are supported" unless $ext eq "bmp" or $ext eq "ico" or $ext eq "cur";

my $renderedSVGFileName = "$svgFileName.png";
my @pngFiles;

# Get the programs from the environment variables
my $convert = $ENV{"CONVERT"} || "convert";
my $rsvg = $ENV{"RSVG"} || "rsvg";
my @icotool_args = ($ENV{"ICOTOOL"} || "icotool", "--create",
                    $ext eq "cur" ? "--cursor" : "--icon", "-o", $outFileName);

# Be ready to abort
sub cleanup()
{
    unlink $renderedSVGFileName;
    unlink $_ foreach(@pngFiles);
}

$SIG{"INT"} = "cleanup";
$SIG{"HUP"} = "cleanup";
$SIG{"TERM"} = "cleanup";
$SIG{"__DIE__"} = "cleanup";

# run a shell command and die on error
sub shell(@)
{
    my @args = @_;
    system(@args) == 0 or die "@args failed: $?";
}

sub svg_element_start
{
    my($expat, $element, %attr) = @_;

    # Parse the id for icon/bitmap render directives
    my $id = $attr{'id'};
    return unless defined($id);

    my $size = 0;
    my $depth = 0;
    my $width = 0;
    my $height = 0;

    if ($id eq "hotspot")
    {
        push @icotool_args, "--hotspot-x=$attr{x}", "--hotspot-y=$attr{y}";
        return;
    }

    if($ext eq "ico") {
        return unless $id =~ /icon:(\d*)-(\d*)/;
        $size = $1;
        $depth = $2;
    } elsif($ext eq "cur") {
        return unless $id =~ /cursor:(\d*)-(\d*)/;
        $size = $1;
        $depth = $2;
    } elsif($ext eq "bmp") {
        return unless $id =~ /bitmap:(\d*)-(\d*)/;
        $size = $1;
        $depth = $2;
    }

    return unless defined($size) and defined($depth);

    warn "Unexpected depth" unless
        $depth == 1 or $depth == 4 or $depth == 8 or $depth == 24 or $depth == 32;
    my $pngFileName = "$outName-$size-$depth.png";

    if($element eq "svg") {

        if ($ext eq "bmp") {
            if ($depth == 24) {
                shell $convert, $renderedSVGFileName, "+matte", $outFileName;
            } else {
                shell $convert, $renderedSVGFileName, $outFileName;
            }
            cleanup();
            exit(0);
        }

        # The whole file is tagged
        $pngFileName = $renderedSVGFileName;

    } elsif($element eq "rect") {

        # Extract SVG vector images
        my $x = $attr{'x'};
        my $y = $attr{'y'};
        $width = $attr{'width'};
        $height = $attr{'height'};

        if(defined($x) and defined($y)) {
            if($x =~ /\d*/ and $y =~ /\d*/) {
                shell $convert, $renderedSVGFileName, "-crop", "${width}x${height}+$x+$y", "-depth", $depth, $pngFileName;
            }
        }
    } elsif($element eq "image" ) {

        # Extract Base64 encoded PNG data to files
        my $xlinkHref = $attr{'xlink:href'};
        if(defined($xlinkHref)) {
            $xlinkHref =~ /data:image\/png;base64(.*)/;
            my $imageEncodedData = $1;
            if(defined $imageEncodedData) {
                open(FILE, '>' . $pngFileName) or die "$!";
                print FILE decode_base64($imageEncodedData);
                close FILE;
            }
        }
    } else {
        return;
    }

    if ($width >= 128 && $height >= 128)
    {
        push @icotool_args, "--raw=$pngFileName";
    }
    else
    {
        push @icotool_args, $pngFileName;
    }
    push @pngFiles, $pngFileName;
}

# Render the SVG image
my @rsvgCmd;
push(@rsvgCmd, $rsvg);
push(@rsvgCmd, $svgFileName);
push(@rsvgCmd, "-o") if ($rsvg eq "rsvg-convert");
push(@rsvgCmd, $renderedSVGFileName);
shell @rsvgCmd;

# Render the images in the SVG
my $parser = new XML::Parser(
    Handlers => {Start => \&svg_element_start});
$parser->parsefile("$svgFileName");

die "no render directive found in $svgFileName" unless @pngFiles;

shell @icotool_args;

# Delete the intermediate images
cleanup();
