#!/usr/local/bin/perl5 -w # Program collecting the xpm-cards to a huge pixmap. # Not very robust. $inDir = "xpm"; $outFile = "all-cards.xpm"; $cardWidth = 71; $cardHeight = 96; $charsPerPixel = 1; $width = 4 * $cardWidth; $height = 15 * $cardHeight; @image = (); %colorCodeOfDescr = ( "c white" => ".", "s None c None" => " " ); %colorDescrOfCode = ( "." => "c white", " " => "s None c None" ); $numColors = 2; sub addColor { my($line) = @_; my($code, $descr) = ("", ""); my($ret) = ""; $_ = $line; ($code, $descr) = /\"(.)\s+([^\"]*)/; $descr =~ s/\s+/ /g; $ret = $colorCodeOfDescr{"$descr"}; if (!$ret) { while ($colorDescrOfCode{"$code"}) { if (ord($code) < ord("a")) { $code = "a"; } else { $code = chr(ord($code) + 1); } } $colorCodeOfDescr{"$descr"} = $code; $colorDescrOfCode{"$code"} = $descr; $ret = $code; ++$numColors; } return $ret; } sub initImage { my($q) = 0; my($code) = ""; $code = &addColor("\" s None c None\""); for ($q = 0; $q < $height; $q++) { $image[$q] = "$code" x $width; } } sub readXpmFile { my($filename, $x, $y) = @_; my($line) = ""; my($w, $h, $nc, $cpp) = (0, 0, 0, 0); my($q) = 0; my(%colorRemap) = (); print "$filename\n"; open(F, $filename) || die "unable to open $filename\n"; while () { last if (/\"\s*\d+\s+\d+\s+\d+\s+\d+\s*\"/); } ($w, $h, $nc, $cpp) = /\"\s*(\d+)\s+(\d+)\s+(\d+)\s+(\d+)\s*\"/; die "size fault\n" if ($w != $cardWidth || $h != $cardHeight || $cpp != $charsPerPixel); $q = 0; while ($q < $nc) { $_ = ; next if (!/\s*\"/); ($origCode) = /\"(.)/; ($newCode) = &addColor($_); $colorRemap{"$origCode"} = $newCode; ++$q; } $q = 0; while ($q < $h) { $_ = ; next if (!/\s*\"/); ($line) = /\s*\"([^\"]*)/; for ($w = 0; $w < length($line); $w++) { substr($line, $w, 1) = $colorRemap{substr($line, $w, 1)}; } substr($image[$y * $cardHeight + $q], $x * $cardWidth, $w) = $line; ++$q; } close(F); } sub writeXpmFile { my($q) = 0; open(F, ">$outFile") || die "unable to write $outFile\n"; print F "/* XPM */\n"; print F "static char *allCards[] = {\n"; print F "/* width height num_colors chars_per_pixel */\n"; print F "\" $width $height $numColors"; print F " $charsPerPixel\",\n"; print F "/* colors */\n"; foreach $code (keys %colorDescrOfCode) { print F "\"$code $colorDescrOfCode{$code}\",\n"; } print F "/* pixels */\n"; for ($q = 0; $q < $height; $q++) { print F "\"$image[$q]\""; print F "," if ($q < $height - 1); print F "\n"; } print F "};\n"; close(F); } &initImage; $q = 0; for ($q = 0; $q < 13; $q++) { &readXpmFile(sprintf("$inDir/clubs-%02d.xpm", $q + 1), 0, $q); &readXpmFile(sprintf("$inDir/diamonds-%02d.xpm", $q + 1), 1, $q); &readXpmFile(sprintf("$inDir/hearts-%02d.xpm", $q + 1), 2, $q); &readXpmFile(sprintf("$inDir/spades-%02d.xpm", $q + 1), 3, $q); } for ($q = 0; $q < 4; $q++) { $filename = sprintf("$inDir/backs-%02d.xpm", $q + 1); last if (!-f $filename); &readXpmFile($filename, $q, 13); } for ($q = 0; $q < 4; $q++) { $filename = sprintf("$inDir/outline-%02d.xpm", $q + 1); last if (!-f $filename); &readXpmFile($filename, $q, 14); } &writeXpmFile;