xwords/xwords4/dawg/palm_mkspecials.pl
2004-06-10 03:27:58 +00:00

111 lines
2.9 KiB
Perl
Executable file

#!/usr/bin/perl
# Copyright 2002 by Eric House
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# This program 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 General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
# Given arguments consisting of triples, first a string and then pbitm
# files representing bitmaps. The format looks like this:
# array [0-n] of { char len;
# char[3] alt txt;
# int16 offsetOfLarge;
# int16 offsetOfSmall;
# }
# array [0-n] of {
# bitmapLargeIfPresent;
# bitmapSmallIfPresent;
# }
#
# In addition, there's padding between bitmaps if needed to get the next
# one to a 2-byte boundary. And the input files are not in PalmOS bitmap
# format, so thay have to get converted into a tmp file before the sizes
# can be known and included in the eventual output.
use strict;
my $tmpfile = "/tmp/tmpout$$";
my $nSpecials = @ARGV / 3;
die "wrong number of args" if (@ARGV % 3) != 0;
my $gOffset = $nSpecials * 8; # sizeof(Xloc_specialEntry)
open TMPFILE, "> $tmpfile";
for ( my $i = 0; $i < $nSpecials; ++$i ) {
my $size;
my $str = shift( @ARGV );
my $len = length($str);
die "string $str too long" if $len > 3;
print $str;
while ( $len < 4 ) {
++$len;
print pack("c", 0 );
}
doOneFile( shift( @ARGV ), \*TMPFILE, \$gOffset );
doOneFile( shift( @ARGV ), \*TMPFILE, \$gOffset );
}
close TMPFILE;
# now append the tempfile
open TMPFILE, "< $tmpfile";
while ( read( TMPFILE, my $buffer, 128 ) ) {
print $buffer;
}
close TMPFILE;
unlink $tmpfile;
exit 0;
sub doOneFile($$$) {
my ( $fil, $fh, $offsetR ) = @_;
my $size = convertBmp($fil, $fh );
if ( ($size % 2) != 0 ) {
++$size;
print $fh pack( "c", 0 );
}
print pack( "n", $size > 0? ${$offsetR} : 0 );
${$offsetR} += $size;
} # doOneFile
sub convertBmp($$) {
my ( $pbitmfile, $fhandle ) = @_;
if ( $pbitmfile eq "/dev/null" ) {
return 0;
} else {
# for some reason I can't get quote marks to print into tmp.rcp using just `echo`
open TMP, "> tmp.rcp";
print TMP "BITMAP ID 1000 \"$pbitmfile\" AUTOCOMPRESS";
close TMP;
`pilrc tmp.rcp`;
print $fhandle `cat Tbmp03e8.bin`;
my $siz = -s "Tbmp03e8.bin";
`rm -f tmp.rcp Tbmp03e8.bin`;
return $siz;
}
}