/* Program for drawing Assorted Boxes */ /* (C)Copyright 1988 by Lars Thuring */ /* May be freely distributed and used for any purpose as long as the Copyright notice is left unchanged. */ /* 20 feb 1988 V0.1 Created */ /* 21 feb 1988 V0.2 Coordinates from subroutine, May call itself for better boxes */ /* 28 feb 1988 V0.3 GetCoords: perspective box */ /* 10 mar 1988 V0.4 Doesn't destroy command string, Passing of text to be printed, BackPen & FrontPen selectable, Box 3 */ /* 24 apr 1988 V0.5 k*=10+mode[i++]-'0'; doesn't compile correct */ /* 16 may 1988 V0.6 Bug; JAM1 -> JAM2; Solid background colour option added; F, C & J options affect target rp; Very persistant "bug"; adjust i-- after Adigit() */ #include #include /*#define DEBUG */ #define XOFF 0 #define YOFF 1 #define HSPACE 3 #define VSPACE 3 VOID MakeBox(); /* Purpose of this ... */ SHORT GetBoxCoordinates(); /* Spinoff product */ /* No Globals */ VOID MakeBox(rp,x,y,w,h,mode) /* Draw a selected box in rp */ struct RastPort *rp; /* Rastport for controlling para's */ SHORT x,y, /* Offsets into raster */ w,h; /* Size of (inner) box */ UBYTE *mode; /* String with drawing options */ { BOOL Adigit(); /* Return TRUE if ASCII digit */ int i,j,k, /* trash */ DrawDone=FALSE, /* Flag for one draw only per call */ Solid=FALSE; /* Default no fill background */ UBYTE *BoxTypes="0123", /* Allowed boxtypes */ *p=NULL; /* Flag and pointer */ UBYTE FrontPen=AUTOFRONTPEN,BackPen=AUTOBACKPEN; /* Default defaults */ SHORT DrawMode = (SHORT) rp->DrawMode; struct Border MyBorder; /* Use as stencil */ SHORT xy[15][2], /* Max number of turning points */ Count=0; /* Default is n */ struct IntuiText MyText; /* Stencil for text */ /* Here we go */ #ifdef DEBUG printf("entry string = %s.\n", mode); #endif if (NOT( j=strlen(mode))) /* Return if nothing to work with */ return; if (k=strinstr(mode,']')) /* Is a text passed ? */ { /* Then set parameters not supplied */ if (h == 0) h = rp->TxHeight+HSPACE*2-1; if (w == 0) w = (strlen(mode)-k)*rp->TxWidth+VSPACE*2-1; } /* Then get caller wishes */ for(i=0;iDrawMode = (BYTE) DrawMode; break; case 'F': /* Select new FrontPen */ k=0; while (Adigit(mode[++i])) /* if followed by ASCII digit */ k=k*10+mode[i]-'0'; /* Add digit */ FrontPen=k; /* Future: check against rp */ SetAPen( rp, FrontPen); i--; break; case 'J': /* The other DrawMode */ DrawMode=JAM2; rp->DrawMode = (BYTE) DrawMode; break; case 'S': /* Fill in background (Solid) */ Solid=TRUE; break; case ']': /* Then rest is text */ p=mode+i+1; /* Pointer to text */ DrawDone=TRUE; /* Skip rest */ break; default: /* Boxes ? */ if (k=strinstr(BoxTypes, mode[i])) { Count=GetBoxCoordinates(&xy[0][0],w,h,k-1,NULL); MakeBox(rp,x,y,w,h,mode+i+1); /* Get next before end */ DrawDone=TRUE; } break; } } /* Now render background, text and box, if any */ if (Solid) /* Fill background with solid colour */ { rp->DrawMode = (BYTE) DrawMode; RectFill(rp, x,y, x+w,y+h); } if (p) /* Print text if one was passed */ { MyText.LeftEdge = VSPACE; MyText.TopEdge = HSPACE; MyText.FrontPen = FrontPen; MyText.BackPen = BackPen; MyText.DrawMode = DrawMode; MyText.ITextFont = NULL; MyText.IText = p; MyText.NextText = NULL; PrintIText(rp,&MyText,x,y); } if (Count) /* Don't draw if not got anything */ { MyBorder.LeftEdge = 0; MyBorder.TopEdge = 0; MyBorder.FrontPen = FrontPen; MyBorder.BackPen = BackPen; MyBorder.DrawMode = DrawMode; MyBorder.Count = Count; MyBorder.XY = &xy[0][0]; MyBorder.NextBorder = NULL; DrawBorder(rp,&MyBorder,x,y); /* */ } } /* End of MakeBox */ SHORT GetBoxCoordinates(xy,w,h,func,Size) /* Set Coordinates for Boxes */ SHORT (*xy)[2]; /* Where to store Coordinates */ SHORT w,h; /* Size of (inner) box */ SHORT Size; /* + size */ int func; /* Selected Box */ { SHORT Count=0; switch (func) { case 1: /* 1 - Dropshadow */ xy[0][XOFF] = w+1, xy[0][YOFF] = 3; xy[1][XOFF] = w+1, xy[1][YOFF] = h+1; xy[2][XOFF] = 3, xy[2][YOFF] = h+1; xy[3][XOFF] = 3, xy[3][YOFF] = h+2; xy[4][XOFF] = w+2, xy[4][YOFF] = h+2; xy[5][XOFF] = w+2, xy[5][YOFF] = 3; xy[6][XOFF] = w+3, xy[6][YOFF] = 3; xy[7][XOFF] = w+3, xy[7][YOFF] = h+3; xy[8][XOFF] = 3, xy[8][YOFF] = h+3; Count=9; break; case 2: /* 2 - Perspective box */ xy[0][XOFF] = 1, xy[0][YOFF] = -1; xy[1][XOFF] = w/10, xy[1][YOFF] = -h/8; xy[2][XOFF] = w*9/10, xy[2][YOFF] = -h/8; xy[3][XOFF] = w-1, xy[3][YOFF] = -1; Count=4; break; case 3: /* 3 - As 2 but fixed depth */ xy[0][XOFF] = 1, xy[0][YOFF] = -1; xy[1][XOFF] = 3, xy[1][YOFF] = -3; xy[2][XOFF] = w-3, xy[2][YOFF] = -3; xy[3][XOFF] = w-1, xy[3][YOFF] = -1; Count=4; break; case -1: /* = special */ Count=9; /* Current max Count possible */ break; case 0: default: /* - Box */ xy[0][XOFF] = 0, xy[0][YOFF] = 0; xy[1][XOFF] = w, xy[1][YOFF] = 0; xy[2][XOFF] = w, xy[2][YOFF] = h; xy[3][XOFF] = 0, xy[3][YOFF] = h; xy[4][XOFF] = 0, xy[4][YOFF] = 1; /* else 0,0 twice */ Count=5; break; } return(Count); } /* End of GetBoxCoordinates() */