1#!/usr/bin/perl
2#
3# gif2xface -- converts a 48x48 GIF file to an X-Face mail header
4#
5# Author:  Ricardo Mones <ricardo@mones.org>
6#
7#   This is a hack over the original xbm2face script. The xbm files generated
8#   by some graphic tools (notably The Gimp version 1.2.1) aren't suitable to
9#   feed the compface program. Starting with a GIF and using some filters does
10#   the trick. A little help screen also added.
11#   This requieres giftopnm and pbmtoxbm (both in libgr-progs package).
12#
13#   The original xbm2face author's comment follows:
14#
15# xbm2xface -- converts a 48x48 xbm file to an X-Face mail header
16#
17# Author:  Jonathan Stigelman <Stig@hackvan.com>
18#
19# URL:     http://hackvan.com/pub/stig/src/linux/
20# FTP:	   hackvan.com:/pub/stig/src/linux/
21#
22#   This is a Perl script that I wrote to convert 48x48 xbm (X bitmap) files
23#   into X-Face: headers suitable for inclusion in RFC822 internet
24#   electronic mail.  A 48x48 bitmap is awfully small, but X-Faces are still
25#   good enough for other people to visually establish your identity in
26#   email without having to carefully read your name.
27#
28#   Basically, it gets you noticed...either as the person with the cool
29#   X-Face or as that jerk with modem noise in all of his email messages.
30#
31#   People will start looking over your shoulder and say "Hey Cool!  How'd
32#   you do that?"  When they do, you just send 'em to my URL for this
33#   utility and tell 'em to upgrade to a real mail reader: XEmacs and VM.
34#
35# It also requires the 'compface' utility.
36#
37
38sub check_for_help {
39  local($param) = @_;
40
41  # is a filter, no args must be present
42  if (defined($param))
43  {
44    print "\n", 'gif2xface -- A filter for converting an 48x48 gif into a xface string', "\n\n" ;
45    print 'Usage:  gif2xface < input.gif > output.xface', "\n\n";
46    exit;
47  }
48}
49
50sub reverse_byte {
51    local($byte) = @_;
52    local($n, $b);
53    for ( $b= $n= 0; $b<8; ++$b) {
54	$n |= (($byte & 1) << (7-$b));
55	$byte >>= 1;
56    }
57    return($n);
58}
59
60
61&check_for_help($ARGV[0]);
62
63# printf "0x%02x\n", &reverse_byte(0xF0);
64
65$ra = rand;
66$tf = "/tmp/gif2xface.$ra";
67open(GP,"|giftopnm|pbmtoxbm>$tf");
68
69while (<>) {
70  print GP $_;
71}
72close(GP);
73open(GP,"<$tf");
74<GP>;
75m/^#define \w+_width (\d+)/ && ($width=$1);
76<GP>;
77m/^#define \w+_height (\d+)/ && ($height=$1);
78<GP>;
79m/^static.* = \{/ && (( $width == 48 && $height == 48 )
80		      || die $0, ": sorry, xfaces must be 48x48 pixels" );
81
82$| = 1; print "X-Face:";
83
84open(CF,"|compface");
85
86while (<GP>) {
87    $st="";
88    while (s/(0x..)(,|\};)\s*//) {
89	$st .= sprintf("0x%02x, ", &reverse_byte(eval($1)));
90    }
91    $_=$st;
92    s/(0x..), 0x(..)/\1\2/g;
93    s/\s*(0x...., 0x...., 0x....)(,|\};)\s/\1,\n/g;
94    print CF $_;
95}
96close (CF);
97close (GP);
98unlink $tf;
99