#!/usr/bin/perl # # gif2xface -- converts a 48x48 GIF file to an X-Face mail header # # Author: Ricardo Mones Lastra # # URL: http://www.aic.uniovi.es/mones # # This is a hack over the original xbm2face script. The xbm files generated # by some graphic tools (notably The Gimp version 1.2.1) aren't suitable to # feed the compface program. Starting with a GIF and using some filters does # the trick. A little help screen also added. # This requieres giftopnm and pbmtoxbm (both in libgr-progs package). # # The original xbm2face author's comment follows: # # xbm2xface -- converts a 48x48 xbm file to an X-Face mail header # # Author: Jonathan Stigelman # # URL: http://hackvan.com/pub/stig/src/linux/ # FTP: hackvan.com:/pub/stig/src/linux/ # # This is a Perl script that I wrote to convert 48x48 xbm (X bitmap) files # into X-Face: headers suitable for inclusion in RFC822 internet # electronic mail. A 48x48 bitmap is awfully small, but X-Faces are still # good enough for other people to visually establish your identity in # email without having to carefully read your name. # # Basically, it gets you noticed...either as the person with the cool # X-Face or as that jerk with modem noise in all of his email messages. # # People will start looking over your shoulder and say "Hey Cool! How'd # you do that?" When they do, you just send 'em to my URL for this # utility and tell 'em to upgrade to a real mail reader: XEmacs and VM. # # It also requires the 'compface' utility. # sub check_for_help { local($param) = @_; # is a filter, no args must be present if (defined($param)) { print "\n", 'gif2xface -- A filter for converting an 48x48 gif into a xface string', "\n\n" ; print 'Usage: gif2xface < input.gif > output.xface', "\n\n"; exit; } } sub reverse_byte { local($byte) = @_; local($n, $b); for ( $b= $n= 0; $b<8; ++$b) { $n |= (($byte & 1) << (7-$b)); $byte >>= 1; } return($n); } &check_for_help($ARGV[0]); # printf "0x%02x\n", &reverse_byte(0xF0); $ra = rand; $tf = "/tmp/gif2xface.$ra"; open(GP,"|giftopnm|pbmtoxbm>$tf"); while (<>) { print GP $_; } close(GP); open(GP,"<$tf"); ; m/^#define \w+_width (\d+)/ && ($width=$1); ; m/^#define \w+_height (\d+)/ && ($height=$1); ; m/^static.* = \{/ && (( $width == 48 && $height == 48 ) || die $0, ": sorry, xfaces must be 48x48 pixels" ); $| = 1; print "X-Face:"; open(CF,"|compface"); while () { $st=""; while (s/(0x..)(,|\};)\s*//) { $st .= sprintf("0x%02x, ", &reverse_byte(eval($1))); } $_=$st; s/(0x..), 0x(..)/\1\2/g; s/\s*(0x...., 0x...., 0x....)(,|\};)\s/\1,\n/g; print CF $_; } close (CF); close (GP); unlink $tf;