view oldchsool/sprites.pl @ 71:a87eb778f225

Improvements to the MinGW crossbuild. Should now build with default tools from Debian mingw packages, though you need Win32 version of libSDL with the necessary headers and so on in addition. 64-bit builds not tested and probably won't work. Tested on Debian 7.0, earlier won't work. binutils-mingw-w64-i686 gcc-mingw-w64-i686 mingw-w64-i686-dev
author Matti Hamalainen <ccr@tnsp.org>
date Tue, 14 Aug 2012 03:08:10 +0300
parents acb5694e93d9
children
line wrap: on
line source

#!/usr/bin/perl
##!/opt/bin/perl5

#   color=>grayscale palettes:
#
#   0x00,0x08,0x80,0x88,0x87,0x78,0x77,0x7f,0xf7,0xff

###########################

$spritz="sprite*allbmps[]={";

$wrct=0;
sub wr
{
   printf("0x%x,",$_[0]);
   $wrct+=5;
   if($wrct>=70){printf("\n");$wrct=0;}
}

sub wrrle
{
   my ($ch,$cnt)=($_[0],$_[1]);

   if($cnt==0){return;}
   
   $z=-1;
   for($i=0;$i<7;$i++){if($cpal[$i] eq $ch){$z=$i;}}

   if($z==-1)
   {
      $cpal[$cpalidx]=$ch;
      $cpalidx++;
      if($cpalidx==7){$cpalidx=0;}
      wr((7<<5)|$cnt);
      if($pal{ord($ch)} eq '') { print "/* ERROR - $ch */"; }
      print $pal{ord($ch)}.",";
      $sz+=3;
   }
    else
   {
      wr(($z<<5)|$cnt);
      $sz++;
   }
}

sub bitmap
{
   $bmpname=$_[0];
   $sz=0;

   @colors=split('/',$_[1]);
   foreach(@colors)
   {
      ($ch,$col,$msk)=split(':',$_);
      $pal{ord($ch)}="0x".$col.",0x".$msk;
   }

   @lines=split("\n",$_[2]);
   $xdim=0;$ydim=0;

   foreach(@lines)
   {
      if(length($_)>$xdim) { $xdim=length($_); }
   }

   print "u8*".$bmpname."_pict,".$bmpname."_mask;\n";
   print "u8 ".$bmpname."_cmpr[]={\n";
   $ydim=0;

   @cpal=('å','å','å','å','å','å','å');$cpalidx=0;
   $repch="å";$repcnt=0;
   foreach(@lines)
   {
      for($x=0;$x<$xdim;$x++)
      {
         $ch=substr($_,$x,1);
         if($ch eq "") { $ch=" "; }

         if($ch eq $repch)
         {
            $repcnt++;
            if($repcnt==31){$repcnt=0;wrrle($repch,31);}
         }
          else
         {
            wrrle($repch,$repcnt);
            $repch=$ch;$repcnt=1;
         }
      }
      $ydim++;
   }
   wrrle($repch,$repcnt);
   print "};\n";
   print "sprite $bmpname ={ $xdim,$ydim,(char*)$sz,$bmpname"."_cmpr};\n\n";

   $spritz .= '&'.$bmpname.',';
}

&bitmap('oldsk',' :00:ff/o:88:00/;:67:00/b:78:00/x:ff:00',<<EOD);
        ;;;;;;
      bbb;;;;;;
     bbbb;;;;;;b;
 ;  b;;;;;;;;;bbb;  ;
;;;;;xxxxxx;;;;;;;;;;;;
;;;;;x;;;;x;xxxxxx;;;;
;;;; x;xx;x;x;;;;x;;;
 ;;  x;;;;x;x;xx;x;;
     xxxxxx;x;;;;x
       ;;;;;xxxxxx
      ;;;;;;;;;;
     bbb;o;o;;bbb
     bbbbbbbbbbbbb
      bbbbbbbbbb
       bbbbbbbbb
       bbbbbbbb
        bb bbbb
        bb bbb
           bb
           b
EOD
# ppppppppppppp  ppppp         ppppp  pppppppppppppp
# ppppppppppppp  ppppp         ppppp  pppppppppppppp
# ppppp   ppppp  ppppp         ppppp  ppppp    ppppp
# ppppp   ppppp  ppppp         ppppp  ppppp    ppppp
# ppppppppppppp  ppppp   ppp   ppppp  pppppppppppppp
# ppppppppppppp  ppppp   ppp   ppppp  pppppppppppppp
# ppppp          ppppp   ppp   ppppp  ppppp
# ppppp          ppppppppppppppppppp  ppppp
# ppppp          ppppppppppppppppppp  ppppp
#
&bitmap('bdash0',' :00:ff/b:44:00/*:77:00/b:6e:00/w:55:00',<<EOD);


      wwww
    wwwwwwww
  ww  wwwwww
  ww  wwwwww
    wwwwww
      wwww
      ****
    **wwww
      ****
    bbwwwwbbbb
  bb          ww
  bb          ww
wwww

EOD
&bitmap('bdash1',' :00:ff/b:44:00/*:77:00/b:6e:00/w:55:00',<<EOD);


    wwww
  wwwwwwww
ww  wwwwww
ww  wwwwww
  wwwwww
    wwww
    ****
  **wwww
    ****
  bbwwwwbb  
  bb    bb
  bb    bbww
wwww      ww

EOD
&bitmap('bdash2',' :00:ff/b:44:00/*:77:00/b:6e:00/w:55:00',<<EOD);



      wwww
    wwwwwwww
  ww  wwwwww
  ww  wwwwww
    wwwwww
      wwww
      ****
    **wwww
      ****
      wwww
      bbbb
      bbbbww
    wwww  ww

EOD
&bitmap('bdash3',' :00:ff/b:44:00/*:77:00/b:6e:00/w:55:00',<<EOD);



      wwww
    wwwwwwww
  ww  wwwwww
  ww  wwwwww
    wwwwww
      wwww
      ****
    **wwww
      ****
      wwww
    bbbbbbbb
    bbbbbb  ww
  wwww      ww

EOD
&bitmap('bdash4',' :00:ff/b:44:00/*:77:00/b:6e:00/w:55:00',<<EOD);


    ww    ww
    ww    ww
  ww  wwww  ww
  ww  wwww  ww
    wwwwwwww
      wwww
    wwwwwwww
  ww  ****  ww
  **  wwww  **
      ****
      wwww
    bb****bb
    bb    bb
    ww    bb
  wwww    wwww
EOD
&bitmap('brick0',' :00:00/w:93:00/*:77:00',<<EOD);
wwwwwwwwwwwwwwww
wwwwwwwwwwwwwwww
ww    wwww    ww
wwww  wwwwww  ww
ww**  wwww**  ww
wwwwwwwwwwwwwwww
wwwwwwwwwwwwwwww
wwwwwwwwwwwwwwww
wwwwwwwwwwwwwwww
wwwwwwwwwwwwwwww
wwwwwwwwwwwwwwww
ww    wwww    ww
wwww  wwwwww  ww
ww**  wwww**  ww
wwwwwwwwwwwwwwww
wwwwwwwwwwwwwwww
EOD
&bitmap('brick1',' :00:00/w:ff:00/*:77:00/x:88:00',<<EOD);
www   wwwwwwwwww
**x   ww********
*xx   ww*xxx**xx
                

wwwwwwwwww   www
*********w   ww*
xx*xx**xxx   ww*
                

wwwwww   wwwwwww
*****x   ww*****
*****x   ww*****
*xx*xx   ww*xxx*


EOD
&bitmap('pelush1',' :00:ff/r:44:00/Y:66:00/y:38:00/.:11:00/W:77:00',<<EOD);
   yyyyyyyy
      yy
  rrrrrrrrr
 rrrrrrrrrrrrrr
 YYYYYY.....
WWWWWW...WW.
WWWWWWW.....
WWWWWWWWWWWW
WWWWWWWWWWWWWW
WWWWWWWWWWWWWWWW
WWWWWW
WWWWWWWW
WWWWWWWWWWW  rr
 WWWWWWWWWWWWWW
  WWWWWWWWWW
    WWWWWW
EOD
&bitmap('pelush0',' :00:ff/r:44:00/Y:66:00/y:38:00/.:11:00/W:77:00',<<EOD);
    yyyyyy
      yy
  rrrrrrrrr
 rrrrrrrrrrrrrr
 YYYYYY.....
WWWWWW...WW.
WWWWWWW.....
WWWWWWWWWWWW
WWWWWWWWWWWWWW
WWWWWWWWWWWWWWWW
WWWWWW
WWWWWW
WWWWWWW
 WWWWWWW     rr
 WWWWWWWWWWWWWW
  WWWWWWWWWWW
EOD
&bitmap('pelush2',' :00:ff/r:44:00/Y:66:00/y:38:00/.:11:00/W:77:00',<<EOD);
    yyyy
     yy
  rrrrrrrr
 rrrrrrrrrrrrr
 YYYYYYYYYY
WWWWW......
WWWWWWWWWWW
WWWWWWWWWWW
WWWWWWWWWWWWW
WWWWWWWWWWWWWWW
WWWWW
WWWWWWWWWWWWWWW
WWWWWWWWWWWWWW
 WWWWWWWWWWW
  WWWWWWW
 
EOD
&bitmap('boulder','.:00:ff/x:33:00/y:37:00/;:88:00',<<EOD);
................
......xxxxx.....
.....xxxxxxx....
....xxxyyyyxx...
...xxxxxxxyxx...
...;xxxxxxyyyx..
..xxxxxxxxxxyx..
..xxxxxxxxxxxxx.
.xxxxxxxxxxxxxx.
.xxxxxxxxxxxxxx.
.;xxxxxxxyxyxyx.
.;xxxxxxxxyxyx..
..;xxxxxxxxyxy..
..;xxxxxxxyxy...
...;xxxxxxxyx...
....;xxxxxxx....
EOD
&bitmap('splat0',' :00:ff/b:44:00/B:4c:00',<<EOD);



          bb
  
      bbbbb
 bb   bb 
     bbbbb
   bbBBBBBbb
   bbBBBBBBbb b
    bbbbbbbb b
   bbbbbbbb
     bbbb
  bbbb

bb
EOD
&bitmap('splat1',' :00:ff/b:44:00/B:cc:00',<<EOD);
bbbb

    bbb
     bbbbbb
    bbbbbbb
   bbbbbbbbb
 bbBbbbBbbbb
  bbbbbbBbbbb
  bbbBBBBBbbbb
  bBBBBBBBBbbbb
  BbBBBBBbbbb
 bbbbBBBbbbb
 bbbbbbbbbb
  bbbbbbbb


EOD
&bitmap('splat2',' :00:ff/b:4c:00/B:ce:00/x:ee:00',<<EOD);
   bbbbbb
  bbbbbxbbb
 bbbbbbbbbbb
 bbbbbbxBBbbb
 bbbbBBxBBbbb
bbbbBBBxBbbbbb
bbbxBBxxxbbxbb
bxbxBxxxbbbxb
bbbbbBBxBBbbbb
bbbBBBBxBBBbbbb
 bBbBBBxBbbbb
 bbbbBBBbbbbb
 bbbbbbbbbbb
  bbbbbxbb
    bbbb
EOD
&bitmap('splat3',' :00:ff/b:6e:00/B:66:00/x:ee:00',<<EOD);
   bbbbbb
 bbbbbbbbbb
bbbbbbbbbbbbb
bbbbbb  BBbbbb
bbbb     b bbb
bbbb      bbbb
bbbx      bxbb
bxb       bbxb
bbbb       bbb
bbbBB    bbbbb
bbBbBBBxBbbbbb
bbbbbbbbbbbbb
 bbbbbbbbbbb
  bbbbbxbb
    bbbbb
EOD
&bitmap('splat4',' :00:ff/b:40:00/x:04:00',<<EOD);
   bbb bb
 b  bb bb 
bbb       bb
         b  
bb      b bbb
bb          bb
           bb
              
b           bb
  b       bbb
b  b  b    bb
bbbb    bb bb
      bbbb
  bbbbbxbb
    bbbbb
EOD
&bitmap('tietzka',' :00:ff/*:77:ff/B:99:ff/w:66:ff/!:ff:ff',<<EOD);


 ********
 *BBBBBB*  
 *BBBBBB* **** 
 *BBBBBB* *!!*
 ******** ****
  ******  ****
   ****   ****
wwwwwwwwwwwwwww
 wwwww  wwwww
  www    www
  www    www
EOD


&bitmap('pelu','n:44:00/-:00:ff/ :00:ff/@:87:00/.:11:82/x:44:00/Z:e6:00/o:ff:00',<<EOD);
--------------------------------
          nnnnnnnnnnn
              nn
              nn
     xxxxxxxxxxxxx
         xxxxxxxxxx
         ....ZZZZZZ
         .....@@@@@
         .o...@@@@@
         ....@@@@@@@
         @@@@@@@@@@@
       @@@@@@@@@@@@@
     @@@@@@@@@@@@@@@
              @@@@
     xx    @@@@@@@
     @@@@@@@@@@@@@
       @@@@@@@@@@@
         @@@@@@@@@
         @@@@@@@@@
           @@@@@@
            @@@@@
             @@@@
EOD

print <<JOOH;
void decompress_bitmap(u8*dpic,u8*dmask,u8*s,int count)
{
   u8 pal[7],palm[7],palidx=0;
   u8 col,msk,rep,*s1=s+count;

   while(s<s1)
   {
      u8 a=*s++;

      rep=a&31;
      col=a>>5;
      
      if(col==7){pal[palidx]=col=*s++;palm[palidx]=msk=*s++;palidx++;if(palidx==7)palidx=0;}
            else{msk=palm[col];col=pal[col];}

      if(rep)
      for(;rep;rep--){*dpic++=col;*dmask++=msk;}
   }
}
JOOH

print $spritz,"NULL };\n";

print <<JOOH2
void decompress_allbmp()
{
   u8*d,*d2;
   sprite**s=allbmps;
   while(*s)
   {
      d=malloc((*s)->width*(*s)->height*sizeof(u8));
      d2=malloc((*s)->width*(*s)->height*sizeof(u8));
      decompress_bitmap(d,d2,(*s)->mask,(int)((*s)->pict));
      (*s)->pict=d;
      (*s)->mask=d2;
      s++;
   }
}
JOOH2