#!/usr/local/bin/perl

$USAGE = "xface2xpm [-t] [-fg <color>] [-bg <color>] [<file>]";

# compface/uncompface
#   ftp://metalab.unc.edu/pub/Linux/apps/graphics/convert/
$UNCOMPFACE = "uncompface";

$T = "c";
$BG = "white";
$FG = "black";
while (@ARGV) {
	$_ = shift @ARGV;
	if (/^-h/) {
		&usage(0);
	} elsif (/^-t/) {
		$T = "s";
		$BG = "none";
	} elsif (/^-bg/) {
		@ARGV || &usage(1);
		$BG = shift @ARGV;
	} elsif (/^-fg/) {
		@ARGV || &usage(1);
		$FG = shift @ARGV;
	} elsif (/^-./) {
		&usage(1);
	} else {
		unshift(@ARGV, $_);
		last;
	}
}

$xf = "";
while(<>) {
#	s/^X-Face://i if ($xf eq "");
	$xf .= $_;
}

pipe(R, W2);
pipe(R2, W);
if (! fork()) {
	close(R);
	close(W);
	open(STDIN, "<&R2");
	open(STDOUT, ">&W2");
	exec $UNCOMPFACE;
	exit 1;
}
close(R2);
close(W2);
print W $xf;
close(W);
while(<R>) {
	while(s/0x(..)(..)//) {
		push(@bm, hex($1), hex($2));
	}
}
close(R);
@bm || exit 1;

$W = 48;
$H = @bm * 8 / $W;	# must be 48
print <<EOF;
/* XPM */
static char *xf[] = {
/* columns rows colors chars-per-pixel */
"$W $H 2 1",
"  $T $BG",
". c $FG",
/* pixels */
EOF
while (@bm) {
	print "\"";
	for (1..6) {
		$x = shift @bm;
		for $i (1 .. 8) {
			print ((($x >> (8-$i)) & 1) ? "." : " ");
		}
	}
	print (@bm ? "\",\n" : "\"\n");
}
print <<EOF;
};
EOF

sub usage {
	local($err) = @_;
	if ($err) {
		print STDERR "$USAGE\n";
	} else {
		print "$USAGE\n";
	}
	exit $err;
}
