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

else  c |= 0x7f00;

}

if(color&0x4)

{     if(a) c |= 0xff0000;

else  c |= 0x7f0000;

}

FillColor =  c;

continue;

}

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

switch (op)

{  case PIC_FONT:

GetByte(&b,&nFont);

continue;

case PIC_TEXT:

GetByte(&b,&c);

cc[1]='\0';

c='a';

while (c!='\0')

{  GetByte(&b,&c);

cc[0]=c;

TextOut(hdcComp, textSize.x, textSize.y, cc, 1);

}

continue;

case PIC_SIZE:

pic_getCoord(&b,&textSize);

continue;

}

if (op==PIC_MOVE)

{   pic_getCoord(&b,&cpd);//&cp);

cp = cpd;

continue;

}

if (op==PIC_DRAW)

{   pic_getCoord(&b,&pd);

Line(hdcComp,cp.x/PixelSize, cp.y/PixelSize, (int)pd.x/PixelSize,(int)pd.y/PixelSize);

cp.x=pd.x;

cp.y=pd.y;

continue;

}

if (op==PIC_FILL)

{   pic_getop(&b,&n);

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

{

pic_getCoord(&b,&pd);

Line(hdcComp,cp.x/PixelSize, cp.y/PixelSize, (int)pd.x/PixelSize,(int)pd.y/PixelSize);

cp.x=pd.x;

cp.y=pd.y;

}

continue;

}

if (op==PIC_FILL0)

{   pic_getop(&b,&n);

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

{

pic_getCoord(&b,&pd);

Line(hdcComp,cp.x/PixelSize, cp.y/PixelSize, (int)pd.x/PixelSize,(int)pd.y/PixelSize);

cp.x=pd.x;

cp.y=pd.y;

}

continue;

}     }

fclose(fp);

FillColor = flclr;

return  1;

}

//<-------PIC PROCS

//корректировка отрицательных координат

inline int AdjustC(int c1in[2], int c2in[2])

{     return c2in[0] - c1in[0]/fabs(c1in[1]-c1in[0])*(c2in[1] - c2in[0]);

}

//функция выполняет отсечение линии, заданной координатами(xin[0],yin[0])-(xin[1],yin[1])

inline int ClipLine(int xin[2], int yin[2], int xout[2], int yout[2], int xR, int yB)

{     int xin1[2];

int yin1[2];

int   xin2[2];

int yin2[2];

xin2[0] = xin[0];

xin2[1] = xin[1];

yin2[0] = yin[0];

yin2[1] = yin[1];

if(xin2[0] < 0)

{     if(xin2[1] < 0) return 0;//отрезок полностью отсекается

xin1[0] = xin2[0];

xin1[1] = xin2[1];

yin1[0] = yin2[0];

yin1[1] = yin2[1];

yin2[0] = AdjustC(xin1, yin1);

xin2[0] = 0;

}else if(xin2[0] > xR)

{     if(xin2[1] > xR) return 0;

xin1[0] = xin2[1] - xR;

xin1[1] = xin2[0] - xR;

yin1[0] = yin2[1];

yin1[1] = yin2[0];

yin2[0] = AdjustC(xin1, yin1);

xin2[0] = xR;

}

if(yin2[0] < 0)

{     if(yin2[1] < 0) return 0;//отрезок полностью отсекается

xin1[0] = xin2[0];

xin1[1] = xin2[1];

yin1[0] = yin2[0];

yin1[1] = yin2[1];

xin2[0] = AdjustC(yin1, xin1);

yin2[0] = 0;

}else if(yin2[0] > yB)

{     if(yin2[1] > yB) return 0;

yin1[0] = yin2[1] - yB;

yin1[1] = yin2[0] - yB;

xin1[0] = xin2[1];

xin1[1] = xin2[0];

xin2[0] = AdjustC(yin1, xin1);

yin2[0] = yB;

}

if(xin2[1] < 0)

{     if(xin2[0] < 0) return 0;//отрезок полностью отсекается

xin1[0] = xin2[1];

xin1[1] = xin2[0];

yin1[0] = yin2[1];

yin1[1] = yin2[0];

yin2[1] = AdjustC(xin1, yin1);

xin2[1] = 0;

}else if(xin2[1] > xR)

{     if(xin2[0] > xR) return 0;//отрезок полностью отсекается

xin1[0] = xin2[0] - xR;

xin1[1] = xin2[1] - xR;

yin1[0] = yin2[0];

yin1[1] = yin2[1];

yin2[1] = AdjustC(xin1, yin1);

xin2[1] = xR;

}

if(yin2[1] < 0)

{     if(yin2[0] < 0) return 0;//отрезок полностью отсекается

xin1[0] = xin2[1];

xin1[1] = xin2[0];

yin1[0] = yin2[1];

yin1[1] = yin2[0];

xin2[1] = AdjustC(yin1, xin1);

yin2[1] = 0;

}else if(yin2[1] > yB)

{     if(yin2[0] > yB) return 0;//отрезок полностью отсекается

yin1[0] = yin2[0] - yB;

yin1[1] = yin2[1] - yB;

xin1[0] = xin2[0];

xin1[1] = xin2[1];

xin2[1] = AdjustC(yin1, xin1);

yin2[1] = yB;

}

xout[0] = xin2[0];

xout[1] = xin2[1];