firmware/contrib/conv_bmp2_chararray.pl
author slime@unimatrix01.gamma-quadrant.de
Tue, 29 Jan 2008 22:31:52 +0100
changeset 2 2f55e5dd591d
permissions -rw-r--r--
inital checkin
slime@2
     1
#!/usr/bin/perl -w
slime@2
     2
slime@2
     3
use strict;
slime@2
     4
slime@2
     5
my $input_file = $ARGV[0] || "text.bmp";
slime@2
     6
slime@2
     7
###################################################
slime@2
     8
slime@2
     9
my $buffer = '';
slime@2
    10
slime@2
    11
open(F, $input_file) or die $!;
slime@2
    12
binmode(F);
slime@2
    13
while(my $temp = <F>){$buffer .= $temp;}
slime@2
    14
close(F);
slime@2
    15
slime@2
    16
# read header
slime@2
    17
# 0  2  UINT    bfType;
slime@2
    18
# 2  4  DWORD   bfSize;
slime@2
    19
# 6  2  UINT    bfReserved1;
slime@2
    20
# 8  2  UINT    bfReserved2;
slime@2
    21
# 10 4  DWORD   bfOffBits;
slime@2
    22
slime@2
    23
my $header = substr($buffer, 0, 14);
slime@2
    24
$buffer = substr($buffer, 14);
slime@2
    25
slime@2
    26
# read info
slime@2
    27
# 0  4  DWORD   biSize;
slime@2
    28
# 4  4  LONG    biWidth;
slime@2
    29
# 8  4  LONG    biHeight;
slime@2
    30
# 12 2  WORD    biPlanes;
slime@2
    31
# 14 2  WORD    biBitCount;
slime@2
    32
# 16 4  DWORD   biCompression;
slime@2
    33
# 20 4  DWORD   biSizeImage;
slime@2
    34
# 24 4  LONG    biXPelsPerMeter;
slime@2
    35
# 28 4  LONG    biYPelsPerMeter;
slime@2
    36
# 32 4  DWORD   biClrUsed;
slime@2
    37
# 36 4  DWORD   biClrImportant;
slime@2
    38
slime@2
    39
my $info = substr($buffer, 0, 40);
slime@2
    40
my $bits = substr($buffer, 40);
slime@2
    41
slime@2
    42
my ($bitcount) = unpack('v', substr($info, 14, 2));
slime@2
    43
my ($compress) = unpack('i', substr($info, 16, 4));
slime@2
    44
my ($size_x) = unpack('i', substr($info, 4, 4));
slime@2
    45
my ($size_y) = unpack('i', substr($info, 8, 4));
slime@2
    46
slime@2
    47
unless ($bitcount == 24){
slime@2
    48
	die "can only operate on 24 bit bitmaps (this is $bitcount bit)";
slime@2
    49
}
slime@2
    50
unless ($compress == 0){
slime@2
    51
	die "can only operate on uncompressed bitmaps";
slime@2
    52
}
slime@2
    53
slime@2
    54
####################################################
slime@2
    55
slime@2
    56
slime@2
    57
my $line_shift = $size_x * 3;
slime@2
    58
$line_shift += ($size_x % 4);
slime@2
    59
slime@2
    60
slime@2
    61
print "/*Bitmap-Size: $size_x x $size_y */\n";
slime@2
    62
print "/*            |       0      ||       1      ||       2      ||       3      ||       4      ||       5      ||       6      ||       7      ||       8      ||       9      ||       :      ||     (undef)  | */\n";
slime@2
    63
slime@2
    64
my $x;
slime@2
    65
my $y;
slime@2
    66
slime@2
    67
for ($y=$size_y-1; $y >= 0; $y--) {
slime@2
    68
	printf ("/* Row %2d */ \"",($size_y - $y - 1));
slime@2
    69
	for ($x=0; $x <=$size_x-1; $x=$x+8){
slime@2
    70
		my $_8pix = 0;
slime@2
    71
		for my $subx(0..7) {
slime@2
    72
			my $offset = (($x+$subx) * 3) + ($y * $line_shift);
slime@2
    73
			my $b = ord(substr($bits, $offset+0, 1));
slime@2
    74
			my $g = ord(substr($bits, $offset+1, 1));
slime@2
    75
			my $r = ord(substr($bits, $offset+2, 1));
slime@2
    76
			unless (($r == 255) && ($g == 255) && ($b == 255)){
slime@2
    77
				$_8pix += 2 ** (7 - $subx);
slime@2
    78
			}
slime@2
    79
				
slime@2
    80
		}
slime@2
    81
		print "\\x";
slime@2
    82
		print "0" if ($_8pix < 16);
slime@2
    83
		printf ("%x",$_8pix);
slime@2
    84
	}
slime@2
    85
	print "\"\n";
slime@2
    86
}