Changeset 549


Ignore:
Timestamp:
Apr 29, 2011, 12:24:43 AM (7 years ago)
Author:
Sam Hocevar
Message:

imlib: bring back the old PCX reading code.

Location:
abuse/trunk/src/imlib
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • abuse/trunk/src/imlib/pcxread.cpp

    r523 r549  
    1616#include "specs.h"
    1717
     18enum PCX_type { not_PCX, PCX_8, PCX_24 };
     19
    1820struct PCX_header_type
    1921{
     
    2527  char filter[58];
    2628} PCX_header;
     29
     30int 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}
    2750
    2851int write_PCX_header(FILE *fp)
     
    4770}
    4871
     72PCX_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
     93void 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
     120image *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
    49146void write_PCX(image *im, palette *pal, char const *filename)
    50147{
  • abuse/trunk/src/imlib/pcxread.h

    r494 r549  
    1616
    1717void write_PCX(image *im, palette *pal, char const *filename);
     18image *read_PCX(char const *filename, palette *&pal);
    1819
    1920#endif
Note: See TracChangeset for help on using the changeset viewer.