Форматы Хранения Графических данных, страница 2

pd->y=pip->ky*pp->y+pip->sy;

}

#define PIC_FILL    0x30

#define PIC_END         0x60

#define PIC_COLOR   0xB0

#define PIC_FILL0   0xD0

#define PIC_MOVE    0xA0

#define PIC_DRAW    0xA2

#define PIC_FONT    0xA7

#define PIC_TEXT    0xA8

#define PIC_SIZE    0xAC

#define BUFFLEN   21700

int l=0;

char buffer [BUFFLEN], *b;

int checkEnd(int rest)

{     if (l<rest) /* Всю строку разобрали. */

{ /* Читаем еще порцию в буфер. */

switch(rest)

{

case 1: b=buffer;

l=fread(b,BUFFLEN,1,fp);

break;

case 2: buffer[0]=b[0];

b=buffer+1;

l=fread(b+l,BUFFLEN-1,1,fp);

break;

}

return l==0;

}

return 0;

}

/* Читаем номер команды (один байт). */

int pic_getop(char **b,unsigned char *op)

{  if (checkEnd(1)) return 1;

*op=(*b)[0]; (*b)++; l-=1;

return 0;

}

#define GetByte(buf,byte) pic_getop(buf,byte)

/* Читаем координату. */

int pic_getCoord(char **b,struct Point *pp)

{  unsigned char r;

union charInt x,y;

if (checkEnd(2)) return 1;

x.i=(unsigned)((unsigned int*) (*b))[0];

r=x.c[0]; x.c[0]=x.c[1]; x.c[1]=r;

pp->x=x.i;

(*b)+=2; l-=2;

if (checkEnd(2)) return 1;

y.i=(unsigned)((unsigned int*) (*b))[0];

r=y.c[0]; y.c[0]=y.c[1]; y.c[1]=r;

pp->y=y.i;

(*b)+=2; l-=2;

return 0;

}

/* Определяем размеры реего рисунка в файле *.РIС. */

int PICGetSize(char *fname, struct Rect *size)

{  unsigned char op,n,c,nFont;

struct Point pp,textSize;

int first=1,k;

fp=fopen(fname,"rb");

if (fp==NULL)

{  MessageBox(NULL, "He открылся файл: %s !!!",fname, MB_OK);

return 0;

}

b=buffer;

l=fread(b,1,BUFFLEN,fp);

b+=17;

l-=17;

for(;;)

{   if (pic_getop(&b,&op)) break;

if ((op&0xF0)==PIC_END) break;

switch (op)

{   case PIC_MOVE: case PIC_DRAW:

pic_getCoord(&b, &pp);

if (first)

{first=0;}

else

{  size->minx=min(size->minx,pp.x);

size->maxx=max(size->maxx,pp.x);

size->maxy=max(size->maxy,pp.y);

}

break;

case PIC_FILL: case PIC_FILL0:

pic_getop(&b, &n);

for (k=0; k<=n; k++)

{  pic_getCoord(&b,&pp);

if (first)

{first=0;

size->minx=pp.x;

size->maxx=pp.x;

size->miny=pp.y;

size->miny=pp.y;  //??????????????

}

else

{size->minx=min(size->minx,pp.x);

size->miny=min(size->miny,pp.y);

size->maxx=max(size->maxx,pp.x);

size->maxy=max(size->maxy,pp.y);

}

break; 

case PIC_FONT:

GetByte(&b,&nFont);

break;

case PIC_TEXT:

c='a';

GetByte(&b,&c);

while (c!='\0') GetByte(&b, &c);

break;

case PIC_SIZE:

pic_getCoord(&b,&textSize);

break;

}

}

fclose(fp);

return 1;

}

void Line(HDC hDC, int x0, int y0, int x1, int y1);

/* Отрисовка файла. */

int PICWrite(char *fname,struct Rect *size)

{   HBRUSH hbr;

LOGBRUSH lbr;

unsigned flclr = FillColor;

unsigned char op,n,c,nFont;

int color,rest,k;

struct Point

pp,

cp,

cpd,pd,

textSize;

struct Rect win,vp;

struct Pipe pip;

char cc[2];

pip.vp.minx=0;

pip.vp.maxx=639;

pip.vp.miny=0;

pip.vp.maxy=349;

pip.win.minx=0;

pip.win.maxx=size->maxx;

pip.win.miny=0;

pip.win.maxy=size->maxy;

eval(&pip);

cp.x=0;

cp.y=0;

fp=fopen(fname, "rb");

if (fp==NULL)

{  MessageBox(NULL, "He открылся файл: %s !!!",fname, MB_OK);

return 0;

}

b=buffer;

l=fread(b,1,BUFFLEN,fp);

b+=17; l-=17;

for(;;)

{   if (pic_getop(&b,&op)) break;

if ((op&0xF0)==PIC_COLOR)

{color=op&0x0F;

int a = (color&0x8);

int c = 0;

if(color&0x1)

{     if(a) c = 0xff;

else  c = 0x7f;

}

if(color&0x2)

{     if(a) c |= 0xff00;