Joel Holdsworth : tools: Modified the ICO render script to also render BMPs .
Alexandre Julliard
julliard at winehq.org
Mon May 17 09:39:28 CDT 2010
Module: wine
Branch: master
Commit: 465e653940e767637cff9cfac559ffbd0f57f648
URL: http://source.winehq.org/git/wine.git/?a=commit;h=465e653940e767637cff9cfac559ffbd0f57f648
Author: Joel Holdsworth <joel at airwebreathe.org.uk>
Date: Sun May 16 23:07:57 2010 +0100
tools: Modified the ICO render script to also render BMPs.
---
Make.rules.in | 8 +--
tools/{buildicon => buildimage} | 81 +++++++++++++++++++++++++++++---------
2 files changed, 65 insertions(+), 24 deletions(-)
diff --git a/Make.rules.in b/Make.rules.in
index cc6d602..3f5d18e 100644
--- a/Make.rules.in
+++ b/Make.rules.in
@@ -63,7 +63,7 @@ IDLFLAGS = $(INCLUDES) $(DEFS) $(EXTRAIDLFLAGS)
TARGETFLAGS = @TARGETFLAGS@
MKINSTALLDIRS= $(TOPSRCDIR)/tools/mkinstalldirs -m 755
WINAPI_CHECK = $(TOPSRCDIR)/tools/winapi/winapi_check
-BUILDICON = $(TOPSRCDIR)/tools/buildicon
+BUILDIMAGE = $(TOPSRCDIR)/tools/buildimage
C2MAN = $(TOPSRCDIR)/tools/c2man.pl
RUNTEST = $(TOPSRCDIR)/tools/runtest
WINEBUILD = $(TOOLSDIR)/tools/winebuild/winebuild$(TOOLSEXT)
@@ -190,12 +190,10 @@ filter: dummy
LC_ALL=C sed -e 's, at bindir\@,$(bindir),g' -e 's, at dlldir\@,$(dlldir),g' -e 's, at PACKAGE_STRING\@, at PACKAGE_STRING@,g' $< >$@ || ($(RM) $@ && false)
.svg.ico:
- CONVERT="$(CONVERT)" ICOTOOL="$(ICOTOOL)" RSVG="$(RSVG)" $(BUILDICON) $< $@
+ CONVERT="$(CONVERT)" ICOTOOL="$(ICOTOOL)" RSVG="$(RSVG)" $(BUILDIMAGE) $< $@
.svg.bmp:
- $(RSVG) $< $<.png
- $(CONVERT) $<.png -alpha off $@
- $(RM) $<.png
+ CONVERT="$(CONVERT)" ICOTOOL="$(ICOTOOL)" RSVG="$(RSVG)" $(BUILDIMAGE) $< $@
# Rules for IDL files
diff --git a/tools/buildicon b/tools/buildimage
similarity index 61%
rename from tools/buildicon
rename to tools/buildimage
index eae13dc..b307497 100755
--- a/tools/buildicon
+++ b/tools/buildimage
@@ -1,6 +1,6 @@
#! /usr/bin/perl -w
#
-# Render SVG files containing multiple images
+# Render SVG files containing one or more images into an ICO or BMP.
#
# Copyright (C) 2010 Joel Holdsworth
#
@@ -22,17 +22,21 @@ use strict;
use warnings;
use XML::Parser;
use MIME::Base64;
+use File::Copy;
# Parse the parameters
my $svgFileName = $ARGV[0];
-my $icoFileName = $ARGV[1];
+my $outFileName = $ARGV[1];
+
die "Cannot open SVG file" unless defined($svgFileName);
-die "Cannot open ICO file" unless defined($icoFileName);
+die "Cannot open output file" unless defined($outFileName);
-my $renderedSVGFileName = "$svgFileName.ico";
-$icoFileName =~ m/(.*)\.ico/;
-my $icoName = $1;
+$outFileName =~ m/(.*)\.(.*)/;
+my $outName = $1;
+my $ext = lc($2);
+die "Only BMP and ICO outputs are supported" unless $ext eq "bmp" or $ext eq "ico";
+my $renderedSVGFileName = "$svgFileName.png";
my @pngFiles;
# Get the programs from the environment variables
@@ -40,6 +44,7 @@ my $convert = $ENV{"CONVERT"} || "convert";
my $rsvg = $ENV{"RSVG"} || "rsvg";
my $icotool = $ENV{"ICOTOOL"} || "icotool";
+# Be ready to abort
sub cleanup()
{
unlink $renderedSVGFileName;
@@ -62,19 +67,35 @@ sub svg_element_start
{
my($expat, $element, %attr) = @_;
- # Parse the id for icon format
+ # Parse the id for icon/bitmap render directives
my $id = $attr{'id'};
return unless defined($id);
- return unless $id =~ /icon:(\d*)-(\d*)/;
- my $size = $1;
- my $depth = $2;
+
+ my $size = 0;
+ my $depth = 0;
+
+ if($ext eq "ico") {
+ return unless $id =~ /icon:(\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 icon depth" unless
- $depth == 4 or $depth == 8 or $depth == 32;
- my $pngFileName = "$icoName-$size-$depth.png";
+ $depth == 4 or $depth == 8 or $depth == 24 or $depth == 32;
+ my $pngFileName = "$outName-$size-$depth.png";
- if($element eq "rect") {
+ if($element eq "svg") {
+
+ # The whole file is tagged
+ copy($renderedSVGFileName, $pngFileName) or die "File could not be copied";
+
+ } elsif($element eq "rect") {
# Extract SVG vector images
my $x = $attr{'x'};
@@ -116,12 +137,34 @@ my $parser = new XML::Parser(
Handlers => {Start => \&svg_element_start});
$parser->parsefile("$svgFileName");
-# Die if no render directives were found
-die "No render directives found in icon" unless(@pngFiles);
+# If no render directives were found, take the full image as-is
+unless(@pngFiles) {
+ my $pngFileName = "bmp$renderedSVGFileName";
+ copy($renderedSVGFileName, $pngFileName) or die "File could not be copied";
+ push(@pngFiles, $pngFileName);
+}
+
+# Combine the renderings into the output file
+if($ext eq "ico") {
+
+ # Place images into the ICO
+ shell $icotool, "-c", "-o", $outFileName, @pngFiles;
+
+} elsif($ext eq "bmp") {
+
+ # Only the first image becomes the final BMP
+ my $pngFile = $pngFiles[0];
+ $pngFile =~ /.*-\d*-(\d*)\.png/;
+ my $depth = $1;
-# Combine them into an ICO file
-shell $icotool, "-c", "-o", $icoFileName, @pngFiles;
+ # Convert it into a bmp
+ if($depth == 24) {
+ shell $convert, "png:$pngFile", "+matte", $outFileName;
+ } else {
+ shell $convert, "png:$pngFile", $outFileName;
+ }
+
+}
# Delete the intermediate images
-unlink $renderedSVGFileName;
-unlink $_ foreach(@pngFiles);
+cleanup();
More information about the wine-cvs
mailing list