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;
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.