Changeset 549
- Timestamp:
- Apr 29, 2011, 12:24:43 AM (11 years ago)
- Location:
- abuse/trunk/src/imlib
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
abuse/trunk/src/imlib/pcxread.cpp
r523 r549 16 16 #include "specs.h" 17 17 18 enum PCX_type { not_PCX, PCX_8, PCX_24 }; 19 18 20 struct PCX_header_type 19 21 { … … 25 27 char filter[58]; 26 28 } PCX_header; 29 30 int read_PCX_header(FILE *fp) 31 { 32 if (!fread(&PCX_header.manufactururer,1,1,fp)) return 0; 33 if (!fread(&PCX_header.version,1,1,fp)) return 0; 34 if (!fread(&PCX_header.encoding,1,1,fp)) return 0; 35 if (!fread(&PCX_header.bits_per_pixel,1,1,fp)) return 0; 36 PCX_header.xmin=read_uint16(fp); 37 PCX_header.ymin=read_uint16(fp); 38 PCX_header.xmax=read_uint16(fp); 39 PCX_header.ymax=read_uint16(fp); 40 PCX_header.hres=read_uint16(fp); 41 PCX_header.vres=read_uint16(fp); 42 if (!fread(PCX_header.palette,1,48,fp)) return 0; 43 if (!fread(&PCX_header.reserved,1,1,fp)) return 0; 44 if (!fread(&PCX_header.color_planes,1,1,fp)) return 0; 45 PCX_header.bytes_per_line=read_uint16(fp); 46 PCX_header.palette_type=read_uint16(fp); 47 if (!fread(PCX_header.filter,1,58,fp)) return 0; 48 return 1; 49 } 27 50 28 51 int write_PCX_header(FILE *fp) … … 47 70 } 48 71 72 PCX_type PCX_file_type(char const *filename) 73 { 74 FILE *fp=fopen(filename,"rb"); 75 if (!fp) 76 return not_PCX; 77 78 if (!read_PCX_header(fp)) 79 { 80 fclose(fp); 81 return not_PCX; 82 } 83 fclose(fp); 84 if (PCX_header.manufactururer!=10) 85 return not_PCX; 86 if (PCX_header.color_planes==3 && PCX_header.bits_per_pixel==8) 87 return PCX_24; 88 else if (PCX_header.color_planes==1 && PCX_header.bits_per_pixel==8) 89 return PCX_8; 90 else return not_PCX; 91 } 92 93 void read_PCX_line(FILE *fp, unsigned char *start, short skip, int width) 94 { 95 int c,n=0,i; 96 97 do 98 { 99 c=fgetc(fp)&0xff; 100 if ((c&0xc0)==0xc0) 101 { 102 i=c&0x3f; 103 c=fgetc(fp); 104 while (i--) 105 { 106 *start=c; 107 start+=skip; 108 n++; 109 } 110 } 111 else 112 { 113 *start=c; 114 start+=skip; 115 n++; 116 } 117 } while (n<width); 118 } 119 120 image *read_PCX(char const *filename, palette *&pal) 121 { 122 if (PCX_file_type(filename)!=PCX_8) return NULL; 123 FILE *fp=fopen(filename,"rb"); 124 read_PCX_header(fp); 125 126 image *im=new image(vec2i(PCX_header.xmax-PCX_header.xmin+1, 127 PCX_header.ymax-PCX_header.ymin+1)); 128 int y; 129 for (y=0;y<im->Size().y;y++) 130 read_PCX_line(fp,im->scan_line(y),1,PCX_header.bytes_per_line); 131 unsigned char palette_confirm; 132 if (!fread(&palette_confirm,1,1,fp) || palette_confirm!=12) 133 { 134 pal=new palette; 135 pal->defaults(); 136 } 137 else 138 { 139 pal=new palette; 140 fread(pal->addr(),1,256*3,fp); 141 } 142 fclose(fp); 143 return im; 144 } 145 49 146 void write_PCX(image *im, palette *pal, char const *filename) 50 147 { -
abuse/trunk/src/imlib/pcxread.h
r494 r549 16 16 17 17 void write_PCX(image *im, palette *pal, char const *filename); 18 image *read_PCX(char const *filename, palette *&pal); 18 19 19 20 #endif
Note: See TracChangeset
for help on using the changeset viewer.