FreeCalypso > hg > fc-magnetite
diff src/aci2/bmi/Icons/BMP/bmpToHex.c @ 3:93999a60b835
src/aci2, src/condat2: import of g23m/condat source pieces from TCS211
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Mon, 26 Sep 2016 00:29:36 +0000 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/aci2/bmi/Icons/BMP/bmpToHex.c Mon Sep 26 00:29:36 2016 +0000 @@ -0,0 +1,503 @@ +#include <stdlib.h> +#include <stdio.h> + +typedef unsigned char byte; +typedef unsigned char u8; +typedef signed char s8; +typedef signed short s16; +typedef unsigned short u16; +typedef signed long s32; +typedef unsigned long u32; + +typedef FILE* FS_file_handle; + +byte FS_fgetbyte(FS_file_handle file) +{ + return((byte)fgetc(file)); +} + +u16 FS_fget16(FS_file_handle file) +{ + u16 c; + byte l=FS_fgetbyte(file); + byte h=FS_fgetbyte(file); + c=l|(h<<8); + return(c); +} + +u32 FS_fget32(FS_file_handle file) +{ + u32 c; + u16 l=FS_fget16(file); + u16 h=FS_fget16(file); + c=l|(h<<16); + return(c); +} + +s32 FS_fseek(FS_file_handle file, s32 offset, s32 origin) +{ + return(fseek(file,offset,origin)); +} + +typedef struct _bitmap_file_header +{ + u16 file_type; + u32 file_size; + u16 reserved1; + u16 reserved2; + u32 bitmap_offset; + +} bitmap_file_header; + +typedef struct _bitmap_info_header +{ + u32 header_size; + u32 width; + u32 height; + u16 number_of_planes; + u16 bits_per_pixel; + u32 compression; + u32 bitmap_size; + u32 device_width; + u32 device_height; + u32 number_of_colors; + u32 number_of_important_colors; + +} bitmap_info_header; + +byte BMP_palette[256*3]; + +void BMP_write_line(s32 x,s32 y,s32 width,FS_file_handle file,byte *data,s32 pad_bytes,s32 in_color_depth,s32 out_color_depth) +{ s32 i,j,xx,offset=0; + s32 color_index; + s32 w,dd,ii; + byte color; + u16 *data16; + u16 color16; + byte R,G,B; + + switch(out_color_depth) + { case 8: switch(in_color_depth) + { case 8: for(i=0;i<width;i++) + { +#if(0) + data[offset]=FS_fgetbyte(file); + offset++; +#else + color_index=FS_fgetbyte(file); + R=BMP_palette[color_index*3+0]; + G=BMP_palette[color_index*3+1]; + B=BMP_palette[color_index*3+2]; + color=R&0xe0; + color|=(G>>3)&0x1c; + color|=(B>>6)&0x03; + data[offset]=color; + offset++; +#endif + } + break; + } + break; +#if(0) + case 16: data16=(u16*)data; + switch(in_color_depth) + { case 1: w=(width>>3); + if(width&7) w++; + for(i=0;i<w;i++) + { dd=FS_fgetbyte(file); + for(j=0;j<8;j++) + { ii=(i<<3)+j; + if(ii>=width) break; + xx=x+ii; + if((xx>=GFX_clip_x1) && (xx<=GFX_clip_x2)) + { if(dd & (1<<(7-j))) color16=0xffff; + else color16=0; + data16[offset]=color16; + } + offset++; + } + } + break; + + case 4: w=(width>>1); + if(width&1) w++; + for(i=0;i<w;i++) + { dd=FS_fgetbyte(file); + for(j=0;j<2;j++) + { ii=(i<<1)+j; + if(ii>=width) break; + xx=x+ii; + if((xx>=GFX_clip_x1) && (xx<=GFX_clip_x2)) + { color_index=((dd>>((1-j)<<2))&0xf)*3; + PC_READ_PALETTE(BMP_palette,color_index,R,G,B); + PC_RGB_TO_D16(color16,R,G,B); + data16[offset]=color16; + } + offset++; + } + } + break; + + case 8: for(i=0;i<width;i++) + { xx=x+i; + if((xx>=GFX_clip_x1) && (xx<=GFX_clip_x2)) + { color_index=FS_fgetbyte(file)*3; + PC_READ_PALETTE(BMP_palette,color_index,R,G,B); + PC_RGB_TO_D16(color16,R,G,B); + data16[offset]=color16; + } + else + { FS_fgetbyte(file); + } + offset++; + } + break; + + case 24: for(i=0;i<width;i++) + { xx=x+i; + if((xx>=GFX_clip_x1) && (xx<=GFX_clip_x2)) + { B=FS_fgetbyte(file); + G=FS_fgetbyte(file); + R=FS_fgetbyte(file); + PC_RGB_TO_D16(color16,R,G,B); + data16[offset]=color16; + } + else + { FS_fgetbyte(file); + FS_fgetbyte(file); + FS_fgetbyte(file); + } + offset++; + } + break; + } + break; + + case 24: switch(in_color_depth) + { case 1: w=(width>>3); + if(width&7) w++; + for(i=0;i<w;i++) + { dd=FS_fgetbyte(file); + for(j=0;j<8;j++) + { ii=(i<<3)+j; + if(ii>=width) break; + xx=x+ii; + if((xx>=GFX_clip_x1) && (xx<=GFX_clip_x2)) + { if(dd & (1<<(7-j))) color=255; + else color=0; + data[offset+2]=color; + data[offset+1]=color; + data[offset+0]=color; + } + offset+=3; + } + } + break; + + case 4: w=(width>>1); + if(width&1) w++; + for(i=0;i<w;i++) + { dd=FS_fgetbyte(file); + for(j=0;j<2;j++) + { ii=(i<<1)+j; + if(ii>=width) break; + xx=x+ii; + if((xx>=GFX_clip_x1) && (xx<=GFX_clip_x2)) + { color_index=((dd>>((1-j)<<2))&0xf)*3; + PC_READ_PALETTE(BMP_palette,color_index,R,G,B); + PC_WRITE_RGB(data,offset,R,G,B); + } + offset+=3; + } + } + break; + + case 8: for(i=0;i<width;i++) + { xx=x+i; + if((xx>=GFX_clip_x1) && (xx<=GFX_clip_x2)) + { color_index=FS_fgetbyte(file)*3; + PC_READ_PALETTE(BMP_palette,color_index,R,G,B); + PC_WRITE_RGB(data,offset,R,G,B); + } + else + { + FS_fgetbyte(file); + } + offset+=3; + } + break; + + case 24: for(i=0;i<width;i++) + { xx=x+i; + if((xx>=GFX_clip_x1) && (xx<=GFX_clip_x2)) + { B=FS_fgetbyte(file); + G=FS_fgetbyte(file); + R=FS_fgetbyte(file); + PC_WRITE_RGB(data,offset,R,G,B); + } + else + { FS_fgetbyte(file); + FS_fgetbyte(file); + FS_fgetbyte(file); + } + offset+=3; + } + break; + } + break; + + case 32: switch(in_color_depth) + { case 1: w=(width>>3); + if(width&7) w++; + for(i=0;i<w;i++) + { dd=FS_fgetbyte(file); + for(j=0;j<8;j++) + { ii=(i<<3)+j; + if(ii>=width) break; + xx=x+ii; + if((xx>=GFX_clip_x1) && (xx<=GFX_clip_x2)) + { if(dd & (1<<(7-j))) color=255; + else color=0; + data[offset+2]=color; + data[offset+1]=color; + data[offset+0]=color; + } + offset+=4; + } + } + break; + + case 4: w=(width>>1); + if(width&1) w++; + for(i=0;i<w;i++) + { dd=FS_fgetbyte(file); + for(j=0;j<2;j++) + { ii=(i<<1)+j; + if(ii>=width) break; + xx=x+ii; + if((xx>=GFX_clip_x1) && (xx<=GFX_clip_x2)) + { color_index=((dd>>((1-j)<<2))&0xf)*3; + PC_READ_PALETTE(BMP_palette,color_index,R,G,B); + PC_WRITE_RGB(data,offset,R,G,B); + } + offset+=4; + } + } + break; + + case 8: for(i=0;i<width;i++) + { xx=x+i; + if((xx>=GFX_clip_x1) && (xx<=GFX_clip_x2)) + { color_index=FS_fgetbyte(file)*3; + PC_READ_PALETTE(BMP_palette,color_index,R,G,B); + PC_WRITE_RGB(data,offset,R,G,B); + } + else + { FS_fgetbyte(file); + } + offset+=4; + } + break; + + case 24: for(i=0;i<width;i++) + { xx=x+i; + if((xx>=GFX_clip_x1) && (xx<=GFX_clip_x2)) + { B=FS_fgetbyte(file); + G=FS_fgetbyte(file); + R=FS_fgetbyte(file); + PC_WRITE_RGB(data,offset,R,G,B); + } + else + { FS_fgetbyte(file); + FS_fgetbyte(file); + FS_fgetbyte(file); + } + offset+=4; + } + break; + } + break; +#endif + } + for(i=0;i<pad_bytes;i++) + { FS_fgetbyte(file); + } +} + +void BMP_load_file_header(bitmap_file_header *h,FS_file_handle file) +{ + h->file_type=FS_fget16(file); + h->file_size=FS_fget32(file); + h->reserved1=FS_fget16(file); + h->reserved2=FS_fget16(file); + h->bitmap_offset=FS_fget32(file); +} + +void BMP_load_info_header(bitmap_info_header *h,FS_file_handle file) +{ + h->header_size=FS_fget32(file); + h->width=FS_fget32(file); + h->height=FS_fget32(file); + h->number_of_planes=FS_fget16(file); + h->bits_per_pixel=FS_fget16(file); + h->compression=FS_fget32(file); + h->bitmap_size=FS_fget32(file); + h->device_width=FS_fget32(file); + h->device_height=FS_fget32(file); + h->number_of_colors=FS_fget32(file); + h->number_of_important_colors=FS_fget32(file); +} + +byte *b_data; +byte *b_palette; +s32 b_color_depth=8; +s32 b_row_bytes; +s32 b_width; +s32 b_height; +s32 b_size; + +byte BMP_load(s32 x,s32 y,FS_file_handle file) +{ bitmap_file_header file_header; + bitmap_info_header info_header; + s32 ncolors,i,j,k,width,height,offset; + s32 bitmap_size,row_bytes,used_row_bytes,total_bits; + s32 dest_row_bytes,pad_bytes; + + FS_fseek(file,0,SEEK_SET); + BMP_load_file_header(&file_header,file); + + if((file_header.file_type&0xff)!='B') return(0); + if((file_header.file_type>>8)!='M') return(0); + + BMP_load_info_header(&info_header,file); + width=info_header.width; + height=info_header.height; + ncolors=1<<info_header.bits_per_pixel; + + if(info_header.bits_per_pixel==24) + { used_row_bytes=width*3; + } + else + { total_bits=width*info_header.bits_per_pixel; + used_row_bytes=total_bits>>3; /*total_bits/8 */ + if((total_bits%8)>0) used_row_bytes+=1; /* total_bits%8 */ + } + + if((used_row_bytes%4)>0) row_bytes=used_row_bytes+(4-(used_row_bytes%4)); + else row_bytes=used_row_bytes; + if(b_color_depth<=8) + { dest_row_bytes=width/(8/b_color_depth); + if((width%(8/b_color_depth))>0) dest_row_bytes++; + } + else + { dest_row_bytes=width*(b_color_depth/8); + } + bitmap_size=dest_row_bytes*height; + b_width=width; + b_height=height; + b_size=bitmap_size; + b_data=(byte*)malloc(b_size); + b_palette=(byte*)malloc(256*3); + b_row_bytes=dest_row_bytes; + memset(b_data,0,b_size); + if(b_color_depth<=8) + { if(b_palette==NULL) return(0); + } + if(b_data==NULL) + { return(0); + } + if(info_header.bits_per_pixel<=8) + { k=0; + if(b_color_depth<=8) + { + for(i=0;i<ncolors;i++) + { BMP_palette[k+2]=b_palette[k+2]=FS_fgetbyte(file); + BMP_palette[k+1]=b_palette[k+1]=FS_fgetbyte(file); + BMP_palette[k+0]=b_palette[k+0]=FS_fgetbyte(file); + k+=3; + FS_fgetbyte(file); + } + } + else + { for(i=0;i<ncolors;i++) + { BMP_palette[k+2]=FS_fgetbyte(file); + BMP_palette[k+1]=FS_fgetbyte(file); + BMP_palette[k+0]=FS_fgetbyte(file); + k+=3; + FS_fgetbyte(file); + } + } + } + FS_fseek(file,file_header.bitmap_offset,SEEK_SET); + offset=(y+height-1)*b_row_bytes+x; + pad_bytes=row_bytes-used_row_bytes; + + for(j=height-1;j>=0;j--) + { + BMP_write_line(x,(y+j),width,file,&b_data[offset],pad_bytes,info_header.bits_per_pixel,b_color_depth); + + offset-=b_row_bytes; + } + + return(1); +} + +void write_buffer(FILE *file_handle) +{ +#if(1) + s32 i; + fprintf(file_handle,"\n{"); + for(i=0;i<b_size;i++) + { + if((i%32)==0) fprintf(file_handle,"\n"); + fprintf(file_handle,"0x%02X,",b_data[i]); + + } + fprintf(file_handle,"\n};"); +#else + s32 i,j,offset; + char outchars[]={'.','*','#','.','*','#','+','-'}; + + for(j=0;j<b_height;j++) + { + fprintf(file_handle,"\n"); + for(i=0;i<b_width;i++) + { + offset=j*b_width+i; + fprintf(file_handle,"%c",outchars[b_data[offset]%8]); + } + } +#endif +} + +int main(int argc,char *argv[]) +{ + FILE *input_file_handle; + FILE *output_file_handle; + + if(argc<3) + { + printf("\nUsage: converter <input-file> <output-file>"); + exit(0); + } + input_file_handle=fopen(argv[1],"rb"); + if(input_file_handle==NULL) + { + printf("\nInput file %s not found",argv[1]); + exit(0); + } + BMP_load(0,0,input_file_handle); + fclose(input_file_handle); + output_file_handle=fopen(argv[2],"wb"); + if(output_file_handle==NULL) + { + printf("\nUnable to create output file %s",argv[2]); + exit(0); + } + + write_buffer(output_file_handle); + fclose(output_file_handle); + free(b_data); + free(b_palette); + printf("\nWrote bitmap width=%d, height=%d, total=%d bytes",b_width,b_height,b_size); +}