/**************/ /* piirra.c */ /****************************************************************************/ int cwprintf(char *s) { if ( wherex() == MAX_X && wherey() == MAX_Y ) return 0; return cprintf(s); } /****************************************************************************/ void piirra_laatikko(laatikko_tyyppi *tila, int oletus_lev) /* ** Piirret„„n tila-muuttujan osoittama laatikko. ** Jos koko.x == 0, niin k„ytet„„n oletus_lev ** Jos koko.y == 0, niin korkeus on 1. ** Varsin paljon ty”t„ menee siihen, ettei piirret„ n„yt”n ulkopuolelle ** ja siihen, ettei rullata n„ytt”„ jos laatikon jokin osa sattuu n„yt”n ** oikeaan alakulmaan */ { int i,x,y,x_lev,y_kork; x = tila->vasen_yla.x; y = tila->vasen_yla.y; x_lev = tila->koko.x; y_kork = tila->koko.y; if ( x_lev == 0 ) { x_lev = oletus_lev; tila->koko.x = x_lev; } if ( y_kork == 0 ) { y_kork = 1; tila->koko.y = y_kork; } if ( ( x_lev < 0 ) || ( y_kork < 0 ) ) return; /*----------------------------------------------------------------*/ /* Maalataan ikkunan sisus taustav„rill„: */ window(max(1,tila->vasen_yla.x), max(1,tila->vasen_yla.y), min(MAX_X,tila->vasen_yla.x+x_lev-1), min(MAX_Y,tila->vasen_yla.y+y_kork-1)); clrscr(); window(1,1,MAX_X,MAX_Y); /*----------------------------------------------------------------*/ /* Yl„viiva: ------------------------------------------------- */ if ( ( x > MIN_X ) && ( y > MIN_Y ) ) { gotoxy(x-1,y-1); cwprintf("Ú"); /* vasen yl„kulma */ } if ( y > MIN_Y ) for (i=x; i<=min(x+x_lev-1,MAX_X); i++) { gotoxy(i,y-1); cwprintf("Ä"); /* yl„viiva */ } if ( ( x+x_lev <= MAX_X ) && ( y > MIN_Y ) ) { gotoxy(x+x_lev,y-1); cwprintf("¿"); /* oikea yl„kulma */ } /*----------------------------------------------------------------*/ /* Keskiviivat: | | */ for (i=y; i<=min(y+y_kork-1,MAX_Y); i++) { if ( x > MIN_X ) { gotoxy(x-1,i); cwprintf("³"); /* vasen tolppa */ } if ( x+x_lev <= MAX_X ) { gotoxy(x+x_lev,i); cwprintf("³"); /* oikea tolppa */ } } /*----------------------------------------------------------------*/ /* Alaviiva: ------------------------------------------------- */ y = y+y_kork; if ( ( x > MIN_X ) && ( y <= MAX_Y ) ) { gotoxy(x-1,y); cwprintf("À"); /* vasen alakulma */ } if ( y <= MAX_Y ) for (i=x; i<=min(x+x_lev-1,MAX_X); i++) { gotoxy(i,y); cwprintf("Ä"); /* alaviiva */ } if ( ( x+x_lev <= MAX_X ) && ( y <= MAX_Y ) ) { gotoxy(x+x_lev,y); cwprintf("Ù"); /* oikea alakulma */ } } /****************************************************************************/ void tulosta_jono_laatikkoon( laatikko_tyyppi *tila, char *st ) { char s[200]; int pit=strlen(st),lev,kork,y,eteen,peraan,x_jalj; lev = min(tila->koko.x,sizeof(s)-1); kork = tila->koko.y; /* Keskitet„„n y-suunta: */ y = tila->vasen_yla.y; if ( kork > 1 ) y += (kork-1)/2; gotoxy(tila->vasen_yla.x,y); /* Keskitet„„n teksti: */ if ( pit > lev ) { /* Jos teksti liian leve„, katkaistaan loppu: */ strncpy(s,st,lev); s[lev]=0; } else { eteen = (lev-pit)/2; peraan = lev-pit-eteen; sprintf(s,"%*s%s%*s",eteen,"",st,peraan,""); } x_jalj = MAX_X - wherex() + 1; if ( wherey() == MAX_Y ) x_jalj--; /* Ettei rullaa!!! */ if ( x_jalj < strlen(s) ) s[x_jalj]=0; cprintf(s); } /****************************************************************************/ void nayta_laskuri(laskuri_tyyppi *laskuri) { char s[200]; textcolor(BLACK); textbackground(CYAN); gotoxy(laskuri->tila.vasen_yla.x,laskuri->tila.vasen_yla.y); sprintf(s,laskuri->format,laskuri->arvo); tulosta_jono_laatikkoon(&laskuri->tila,s); } /****************************************************************************/ void piirra_nappula(nappain_tyyppi *nappula) { textcolor(BLACK); textbackground(YELLOW); piirra_laatikko(&nappula->nappain,strlen(nappula->teksti)); tulosta_jono_laatikkoon(&nappula->nappain,nappula->teksti); } /****************************************************************************/ void piirra_laskuri(laskuri_tyyppi *laskuri) { textcolor(BLUE); textbackground(CYAN); piirra_laatikko(&laskuri->tila,1); nayta_laskuri(laskuri); }