home *** CD-ROM | disk | FTP | other *** search
- /*-< Anfang SCREEN.C >------------------------------------*
- * (c) 1990 by Manfred Birnkott & toolbox *
- *--------------------------------------------------------*/
- #include <dos.h>
- #include <conio.h>
- #include <stdlib.h>
- #include "screen.h"
- /*--------------------------------------------------------*
- * Byte-Größe nach rechts rotieren *
- *--------------------------------------------------------*/
- #define rotrb(c,n) (char)((((int)(c)<<8)|(int)(c))>>((n)%8))
- /*--------------------------------------------------------*
- * Grafikzeichen/Grafikcodes umwandeln *
- *--------------------------------------------------------*/
- #define convertgchar(c) convertgbyte(0,c)
- #define convertgcode(c) convertgbyte(1,c)
- /*--------------------------------------------------------*
- * Textmodus bestimmen *
- *--------------------------------------------------------*/
- int gettextmode (void)
- {struct text_info txt;
- gettextinfo(&txt);
- return(txt.currmode);
- }
- /*--------------------------------------------------------*
- * Bildschirm-Basisadresse bestimmen *
- *--------------------------------------------------------*/
- void far *screenbase (void)
- {return((gettextmode()==7)?(void far *)MK_FP(0xb000,0)
- :(void far *)MK_FP(0xb800,0));
- }
- /*--------------------------------------------------------*
- * Bildschirm-Koordinaten auf Gültigkeit prüfen *
- *--------------------------------------------------------*/
- int testscrcoord (int x, int y)
- {extern int WINDOWMODE;
- struct text_info txt;
- gettextinfo(&txt);
- if (WINDOWMODE==0)
- {txt.winleft=txt.wintop=1; txt.winbottom=25;
- txt.winright=(txt.currmode<2)?40:80;
- }
- return((x>=txt.winleft)&&(x<=txt.winright)&&
- (y>=txt.wintop)&&(y<=txt.winbottom));
- }
- /*--------------------------------------------------------*
- * Bildschirm-Koordinaten an Grenzen anpassen *
- *--------------------------------------------------------*/
- void justscrcoord (int *x, int *y)
- {extern int WINDOWMODE;
- struct text_info txt;
- gettextinfo(&txt);
- if (WINDOWMODE==0)
- {txt.winleft=txt.wintop=1; txt.winbottom=25;
- txt.winright=(txt.currmode<2)?40:80;
- }
- *x=max(min(*x,txt.winright),txt.winleft);
- *y=max(min(*y,txt.winbottom),txt.wintop);
- }
- /*--------------------------------------------------------*
- * Grafikzeichen oder Grafikcode konvertieren *
- *--------------------------------------------------------*/
- unsigned char convertgbyte (int mode, unsigned char c)
- {char grcode[40]={0x11,0x51,0xd1,0x73,0x70,0xd0,0xf3,0x33,
- 0xf0,0xc3,0x43,0xc1,0x50,0x05,0x45,0x54,
- 0x15,0x44,0x55,0x1d,0x37,0x0f,0x3c,0xcf,
- 0xfc,0x3f,0xcc,0xff,0xcd,0x47,0xdc,0x74,
- 0x07,0x0d,0x1c,0x34,0x77,0xdd,0x41,0x14
- };
- int i;
- if (mode) /* Grafikcode in Grafikzeichen umwandeln */
- {for (i=0;(i<40)&&(c!=grcode[i]);i++);
- return((i<40)?179+i:0);
- }
- else /* Grafikzeichen in Grafikcode umwandeln */
- return(((c>=179)&&(c<=218))?grcode[c-179]:0);
- }
- /*--------------------------------------------------------*
- * Grafikzeichen überlagern *
- *--------------------------------------------------------*/
- unsigned char overlaygchar (unsigned char c1,
- unsigned char c2)
- {extern int CROSSLINEMODE;
- unsigned char c=0;
- if (CROSSLINEMODE&&(c1>=179)&&(c1<=218))
- c=convertgcode(convertgchar(c1)|convertgchar(c2));
- return((c)?c:c1);
- }
- /*--------------------------------------------------------*
- * Bildschirm-Grafikzeichen glätten *
- *--------------------------------------------------------*/
- void truncategchar (int far *scrbase, int far *ptr,
- int llen)
- {extern int CROSSLINEMODE;
- int i,x,y,x1,y1;
- char c,mask=0x03;
- if ((CROSSLINEMODE==2)&&((c=convertgchar(*ptr))!=0))
- {x1=(ptr-scrbase)%llen+1; y1=(ptr-scrbase)/llen+1;
- /* angrenzende Grafikzeichen */
- for (i=0;i<4;i++) /* betrachten */
- {if (i%2) {x=x1+((i<2)?1:-1); y=y1;}
- else {y=y1+((i<2)?-1:1); x=x1;};
- if ((c&mask)&&((testscrcoord(x,y)==0)||
- ((rotrb(convertgchar(*(scrbase+llen*(y-1)+x-1)),
- 4)&mask)!=(c&mask))))
- c&=mask^0xff; /* Kante abschneiden */
- mask<<=2;
- }
- if ((c=convertgcode(c))!=0) *(char far *)ptr=c;
- }
- }
- /*--------------------------------------------------------*
- * vertikale/horizontale Linie zeichnen (Textmodus) *
- *--------------------------------------------------------*/
- void drawline (int x1, int y1, int x2, int y2)
- {extern unsigned char *TEXTLINESTYLE;
- extern int TEXTLINEATTR;
- char lc;
- int k,len,inc,llen;
- int far *scrbase,
- far *screenpos,
- far *ptr=NULL;
- scrbase=(int far *)screenbase();
- llen=(gettextmode()<2)?40:80;
- /* Start- und Endpunkt auf Gültigkeit überprüfen */
- justscrcoord(&x1,&y1); justscrcoord(&x2,&y2);
- /* horizontal/vertikal festlegen */
- if (x1!=x2) {len=abs(x1-x2)+1; inc=(x1<=x2)?1:-1;
- lc=TEXTLINESTYLE[0];
- }
- else {len=abs(y1-y2)+1; inc=(y1<=y2)?llen:-llen;
- lc=TEXTLINESTYLE[1];
- };
- /* Linie zeichnen */
- screenpos=scrbase+llen*(y1-1)+(x1-1);
- for (k=0;k<len;k++)
- {*screenpos=overlaygchar(lc,*screenpos)|
- (TEXTLINEATTR<<8);
- if (k) truncategchar(scrbase,ptr,llen);
- ptr=screenpos;
- screenpos+=inc;
- }
- if (k) truncategchar(scrbase,ptr,llen);
- }
- /*--------------------------------------------------------*
- * Umriß eines Polygons zeichnen (Textmodus) *
- *--------------------------------------------------------*/
- void drawpolygon (int anz, signed char *coord)
- {int i,k;
- for (i=1,k=0;i<anz;i++,k+=2)
- drawline(coord[k],coord[k+1],coord[k+2],coord[k+3]);
- }
- /*--------------------------------------------------------*
- * Rahmen zeichnen (Textmodus) *
- *--------------------------------------------------------*/
- void drawframe (int x1, int y1, int x2, int y2)
- {extern int SHADOWMODE;
- extern int SHADOWATTR;
- extern int TEXTLINEATTR;
- extern unsigned char *FRAMELINESTYLE;
- int i,k,xl,yl,anz,llen,inc=0,ls=0;
- int far *scrbase,
- far *screenpos,
- far *ptr=NULL;
- /* Eckpunkte unter Berücksichtigung eines eventuell zu */
- /* zu zeichnenden Schattens auf Gültigkeit überprüfen */
- if ((SHADOWMODE)&&(SHADOWMODE<3))
- {yl=-1;
- xl=(SHADOWMODE<2)?-2:+2;
- }
- else xl=yl=0;
- x1+=xl; y1+=yl; justscrcoord(&x1,&y1); x1-=xl; y1-=yl;
- if (SHADOWMODE>2)
- {yl=+1;
- xl=(SHADOWMODE>3)?-2:+2;
- }
- else xl=yl=0;
- x2+=xl; y2+=yl; justscrcoord(&x2,&y2); x2-=xl; y2-=yl;
-
- llen=(gettextmode()<2)?40:80;
- screenpos=(scrbase=(int far *)screenbase())
- +llen*(y1-1)+x1-1;
- /* Rahmen zeichnen */
- if (((xl=x2-x1+1)>1)&&((yl=y2-y1+1)>1))
- {for (i=0;i<8;i++)
- {if (i&1)
- {if (i&2) {anz=yl-2; inc=llen;}
- else {anz=xl-2; inc=1;}
- if (i>4) inc=-inc;
- }
- else anz=1;
- for (k=0;k<anz;k++)
- {screenpos+=inc;
- *screenpos=overlaygchar(FRAMELINESTYLE[ls],
- *screenpos)|(TEXTLINEATTR<<8);
- if (ptr!=NULL) truncategchar(scrbase,ptr,llen);
- ptr=screenpos;
- }
- if (ptr!=NULL) truncategchar(scrbase,ptr,llen);
- ls++;
- }
- /* Schatten zeichnen */
- if (SHADOWMODE)
- {ptr=scrbase+llen*((SHADOWMODE<3)?y1-2:y2)
- +(((SHADOWMODE-1)%3)?x1+1:x1-3);
- for (i=0;i<xl;i++)
- *((char far *)(ptr++)+1)=SHADOWATTR;
- ptr=scrbase+llen*((SHADOWMODE<3)?y1-2:y1-1)
- +(((SHADOWMODE-1)%3)?x2:x1-3);
- for (i=1;i<yl;i++)
- *((char far *)(ptr+1)+1)=
- *((char far *)(ptr+=llen)+1)=SHADOWATTR;
- }
- }
- }
- /*--------------------------------------------------------*
- * Textfenster-Rahmen zeichnen *
- *--------------------------------------------------------*/
- void windowframe (void)
- {extern int WINDOWMODE;
- struct text_info txt;
- if (WINDOWMODE)
- {txt.winleft=txt.wintop=1;
- txt.winbottom=25; txt.winright=80;
- }
- else
- {gettextinfo(&txt);
- txt.winleft--; txt.wintop--;
- txt.winbottom++; txt.winright++;
- }
- drawframe(txt.winleft,txt.wintop,
- txt.winright,txt.winbottom);
- }
- /*-< Ende SCREEN.C >--------------------------------------*/
-