1
0
mirror of https://git.code.sf.net/p/fuse-emulator/fuse synced 2026-01-27 01:41:34 +03:00
Files
fuse/ui/xlib/xstatusbar.pl
Stuart Brady c5473ecdc2 Add static to functions where appropriate
Legacy-ID: 5270
2015-05-26 02:59:36 +00:00

273 lines
7.9 KiB
Perl

#!/usr/bin/perl
die "usage: $0 <file>" unless @ARGV >= 1;
my $maxh = 0;
my $o = 0;
my $stat = 0;
my $add_pixmap = '';
my (%pxm, %map_map);
my @pxm;
my $check_mask = '';
my $do_icon = 0;
print "/*\n This file generated from ../gtk/pixmaps.c with xstatusbar.pl\n" .
"*/\n\n";
my $pixmaps = shift;
#xpm_read('abc_pixmap.dat', 'abc');
$do_icon = 1;
xpm_read($pixmaps, 'icon');
foreach( sort keys %pxm ) {
print $pxm{$_} . "\n";
push @pxm, $_ if($_ !~ /_mask$/);
}
#my $n = 0;
#foreach( @pxm ) {
# print "#define " . uc($_) . " $n\n";
# $n++;
#}
#print "\nstatic void *pixmaps[]= {\n";
#foreach( @pxm ) {
# print " \&$_, " . (defined($map_map{$_ . '_mask'}) ? "\&" . $map_map{$_ . '_mask'} : "NULL") . ",\n";
#}
#print "};\n";
my $xstates = join(', ', keys %xstates);
my $idx = 1000;
my $w;
foreach(sort keys %xoverlay) {
$idx--;
$w = 900 if /^tape/;
$w = 800 if /^mdr/;
$w = 700 if /^disk/;
$w = 600 if /^pause/;
$w = 500 if /^mouse/;
$overlay{sprintf('%04d', $idx - $w)} = $_;
# print sprintf('%04d', $idx - $w) . " $_\n";
}
foreach(sort keys %overlay) {
my $n = $overlay{$_};
my $N = uc $n;
$overlay .= <<EOS;
switch( ${n}_state ) {
case UI_STATUSBAR_STATE_ACTIVE:
x = ${N}_ACTIVE_OFF; w = ${N}_ACTIVE_W; h = ${N}_ACTIVE_H;
break;
case UI_STATUSBAR_STATE_INACTIVE:
x = ${N}_INACTIVE_OFF; w = ${N}_INACTIVE_W; h = ${N}_INACTIVE_H;
break;
case UI_STATUSBAR_STATE_NOT_AVAILABLE:
w = 0;
break;
}
if( w ) xstatusbar_put_icon( x, w, h );
EOS
}
print "#define PIXMAPS_W $offset\n#define PIXMAPS_H $maxh\n\n";
print <<EOS;
static ui_statusbar_state $xstates;
static int status_updated;
static int icon_size = 0;
static void
xstatusbar_add_pixmap(int x, int pw, int h, libspectrum_word *colors)
{
int y = 3 * DISPLAY_SCREEN_HEIGHT;
x *= icon_size;
for( ; h > 0; h-- ) {
int w = pw;
for( ; w > 0; w-- ) {
int i;
for( i = icon_size; i > 0; i-- ) {
xdisplay_putpixel( x, y, colors);
if( icon_size > 1 )
xdisplay_putpixel( x, y + 1, colors);
if( icon_size > 2 )
xdisplay_putpixel( x, y + 2, colors);
x++;
}
colors++;
}
x -= pw * icon_size; y += icon_size;
}
}
/* put status icons to X(Shm)Image extra area */
void
xstatusbar_init( int size )
{
if( icon_size == size )
return;
icon_size = size;
$add_pixmap}
static void
xstatusbar_put_icon( int x, int w, int h )
{
static int dx = 0;
static int dy = 0;
w *= icon_size; x *= icon_size; h *= icon_size;
if( x < 0 || dx == 0 ) {
dx = ( DISPLAY_ASPECT_WIDTH - 2 ) * xdisplay_current_size;
dy = ( DISPLAY_SCREEN_HEIGHT - 2 ) * xdisplay_current_size - PIXMAPS_H * icon_size;
return;
}
dx -= w;
if( shm_used ) {
#ifdef X_USE_SHM
/* FIXME: should wait for an ShmCompletion event here */
XShmPutImage( display, xui_mainWindow, gc, image, x, 3 * DISPLAY_SCREEN_HEIGHT, dx, dy, w, h, True );
#endif /* #ifdef X_USE_SHM */
} else {
XPutImage( display, xui_mainWindow, gc, image, x, 3 * DISPLAY_SCREEN_HEIGHT, dx, dy, w, h );
}
dx -= 4; /* 4px space */
}
void
xstatusbar_overlay( void )
{
int x = 0, w = 0, h;
xstatusbar_put_icon( -1, 0, 0 );
$overlay
status_updated = 0;
}
EOS
#static char* <variable_name>[] = {
#<Values>
#<Colors>
#<Pixels>
#<Extensions>
sub xpm_read() {
my $st = '<variable_name>';
my( $var_name, $width, $height, $colors, $depth, $char, $dim, $w, $h );
my %colors;
my $col;
my $def;
my $do = $_[1];
my $mask;
local $offset = 0;
open FILE, '<', $_[0];
while(<FILE>) {
s!/\*.*\*/!!g;
if( $st eq '<variable_name>' ) {
#static char * <pixmap_name>[] = {
if( /\s*(static\s+)?char\s*\*\s*([^[]+)\[/ ) {
$var_name = $2;
next if($var_name =~ /tape_marker/);
next if($var_name =~ /pause/);
next if($var_name =~ /mouse/);
$var_name =~ s/gtkpixmap/pixmap/;
%colors = ();
$def = '';
$col = 'AA';
$mask = $do eq 'icon' ? 'add mask' : ( $var_name =~ /_mask$/ ? 'mask' : 'no mask');
$st = '<Values>'
}
} elsif( $st eq '<Values>' ) {
#<width><height><numcolors><cpp> [ <x_hotspot><y_hotspot> ] [ XPMEXT ]
if( /\s*\x22\s*(\d+)\s+(\d+)\s+(\d+)\s+(\d+)/ ) {
($width, $height, $colors, $depth) = ($1, $2, $3, $4);
($w, $h) = ($width + 1, $height);
# $dim = "$width, $height, \n";
$maxh = $height if( $do_icon && $mask ne 'mask' && $height > $maxh );
$st = '<Colors>'
}
} elsif( $st eq '<Colors>' ) {
#<character> { <key> <color> } { <key> <color> }
if( /\s*\x22\s*([ -~])\s+c\s+(\x23[0-9a-fA-F]{6}|None)/ ) {
if( substr( $2, 0, 1 ) eq '#' ) {
$_ = '0x' . sprintf('%04x',
((hex( substr( $2, 1, 2 ) ) >> 3) << 11) +
((hex( substr( $2, 3, 2 ) ) >> 2) << 5) +
((hex( substr( $2, 5, 2 ) ) >> 3))
);
# $colors{$1} .= sprintf('%04x', $_ );
$def .= "#define $col $_,\n";
$colors{$1} = $col;
$mask{$1} = '1,';
$col++;
} else {
$colors{$1} = '__';
$mask{$1} = '0,';
$def = "#define __ 0x0,\n" . $def;
}
$colors--;
$st = '<Pixels>' if( !$colors ) ;
}
} elsif( $st eq '<Pixels>' ) {
#<width><height><numcolors><cpp> [ <x_hotspot><y_hotspot> ] [ XPMEXT ]
if( /\s*\x22(.{$w})/ ) {
$pxm{$var_name} .= ' ' . join( ' ', map { $colors{chr($_)} } unpack("C[$w]") ) . "\n" if( $mask ne 'mask');
# $pxm{$var_name . '_mask'} .= ' ' . join( ' ', map { $mask{chr($_)} } unpack("C[$w]") ) . "\n" if( $mask eq 'add mask');
# $pxm{$var_name} .= ' ' . join( ' ', map { $mask{chr($_)} } unpack("C[$w]") ) . "\n" if( $mask eq 'mask');
$h--;
if( !$h ) {
$st = '<variable_name>';
if( $mask ne 'no mask') {
my $mask_name = $mask eq 'mask' ? $var_name : $var_name . '_mask';
$_ = $pxm{$mask_name};
if( ! /0/ ) {
if( $mask eq 'add mask') {
delete( $pxm{$var_name . '_mask'});
}
if( $mask eq 'mask') {
delete( $pxm{$var_name} );
next;
}
} elsif ($check_mask =~ /\n([^=]+?)=$_=/) {
$map_map{$mask_name} = $1;
if( $mask eq 'add mask') {
delete( $pxm{$var_name . '_mask'});
}
if( $mask eq 'mask') {
delete( $pxm{$var_name} );
next;
}
} else {
$map_map{$mask_name} = $mask_name;
$check_mask .= "\n" . $mask_name . "=$_=";
}
}
my $defdim = "#define " . uc($var_name) . "_OFF $offset\n" .
"#define " . uc($var_name) . "_W $width\n" .
"#define " . uc($var_name) . "_H $height";
if( $do eq 'icon' ) {
$add_pixmap .= " xstatusbar_add_pixmap( " . uc($var_name) . "_OFF, " . uc($var_name) . "_W, " . uc($var_name) . "_H, ${var_name});\n";
my $name = $var_name;
$name =~ s/_(in)?active$//i;
$xstates{"${name}_state"} = 1;
$xoverlay{$name} = 1;
}
$offset += $width if( $do eq 'icon' );
$pxm{$var_name} = "$def\n$defdim\nstatic libspectrum_word ${var_name}[] = {\n$dim" . $pxm{$var_name} if( $mask ne 'mask');
$def =~ s/\x23define (..).*/#undef $1/g;
$pxm{$var_name} .= "};\n\n$def" if( $mask ne 'mask');
$pxm{$var_name . '_mask'} = "static libspectrum_byte ${var_name}_mask[] = {\n" . $pxm{$var_name . '_mask'} if( $mask eq 'add mask' and defined( $pxm{$var_name . '_mask'} ) );
$pxm{$var_name} = "static libspectrum_byte ${var_name}[] = {\n" . $pxm{$var_name} if( $mask eq 'mask');
$pxm{$var_name . '_mask'} .= "};\n" if( $mask ne 'no mask' and defined( $pxm{$var_name . '_mask'} ));
$maxh = $h if( $do_icon && $mask ne 'mask' && $h > $maxh );
}
}
}
}
close FILE;
};