From 0eff38ac06adb09fae30528d2687ff813db1d52e Mon Sep 17 00:00:00 2001 From: Stefan `Sec` Zehl Date: Sat, 14 May 2011 22:11:36 +0200 Subject: [PATCH] decode PK-compressed bitmap fonts --- lcd/decoder.c | 124 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 124 insertions(+) create mode 100644 lcd/decoder.c diff --git a/lcd/decoder.c b/lcd/decoder.c new file mode 100644 index 0000000..7ef07e6 --- /dev/null +++ b/lcd/decoder.c @@ -0,0 +1,124 @@ + +#include +#include + +#define MAXCHR (24*3) +static uint8_t buf[MAXCHR]; + +uint8_t * pk_decode(const uint8_t * data,int*len){ +// int off=0; // Offset into au8FontTable for bytestream + int length=*len; // Length of character bytestream + int height; // Height of character in bytes + uint8_t * bufptr=buf; // Output buffer for decoded character + + height=(font->u8Height-1)/8+1; + + // Local function: Get next nibble. + int ctr=0; // offset for next nibble + int hilo=0; // 0= high nibble next, 1=low nibble next + char gnn(){ // Get next nibble + static int byte; + int val; + hilo=1-hilo; + if(hilo==1){ + byte=data[ctr]; + ctr++; + val=byte>>4; + }else{ + val=byte&0x0f; + }; + return val; + }; + + // Local function: Unpack "long run". + int upl(int off){ // unpack "long" run. + int retval; + + while((retval=gnn())==0){ + off++; + }; + while(off-->0){ +// printf("- rv: %x\n",retval); + retval=retval<<4; + retval+=gnn(); + }; +// printf("> rv: %x\n",retval); + return retval; + }; + + if(data[0]>>4 == 15){ + // This is a raw character! + int preblank,postblank; + const uint8_t *rawptr; + preblank= data[1]; + postblank= data[2]; + rawptr=&data[3]; +// printf("Raw character: pre=%d, post=%d\n",preblank,postblank); + return; + }; + + +#define DNY (12) // Decoder parameter: Fixed value for now. + int repeat=0; // Decoder internal: repeat colum? + int curbit=0; // Decoder internal: current bit (1 or 0) + int pos=0; // Decoder internal: current bit position (0..7) + int nyb; // Decoder internal: current nibble / value + + while(ctrDNY){ + nyb=(16*(nyb-DNY-1))+gnn()+DNY+1; + }else if(nyb==0){ + nyb=upl(1); + nyb+=(16*(13-DNY)+DNY)-16; +// printf("0-decode: %d\n",nyb); + }; + + /* Generate & output bits */ + +// printf("have %d bits. Got %d (%d)-bits...(r=%d)",pos, nyb, curbit,repeat); + while(nyb-->0){ + if(curbit==1){ + *bufptr|=1<<(7-pos); + }else{ + *bufptr&=~(1<<(7-pos)); + }; + pos++; + if(pos==8){ +// printf("BYTE: 0x%02x\n",*bufptr); + bufptr++; + if((bufptr-buf)%height==0){ // End of column? + while(repeat>0){ + for(int y=0;y