/************************************************************************ ** ** FILE : hakadraw.c ** ** ZWECK : ** ** AUTOR : Michael C. Ancutici ** Universitaet Stuttgart, Fakultaet Informatik ** ** DATUM : 14.03.93 ** *************************************************************************/ #include "hakadraw.h" #include "hawin.h" #include "celltype.h" #include "hakaclip.h" #include "misc.h" #include "hakasetp.h" #include "ka.h" #include "ste.h" #include "tra.h" #include "haka.H" /************************************************************************* ** MAKRO: DrawLine ** ZWECK: zeichnet Linie ** ANMERK: ACHTUNG: nur fuer HaKaDrawXIntern *************************************************************************/ #define DrawLine( x1, y1, x2, y2) \ XDrawLine( MyDisplay, HaGraphPixmap, \ ActualGC, \ x1, y1, \ x2, y2) /************************************************************************* ** FUNKTION: HaKaDrawXIntern ** ZWECK: zeichnet eine Kante in Pixmap ** EINGABE: ** AUSGABE: ** RETURN: ** ANMERK: *************************************************************************/ void HaKaDrawXIntern( StartTyp, StartNr, ZielTyp, ZielNr, e, ActualGC, Pfeil) char StartTyp, ZielTyp; int StartNr, ZielNr; ECKE *e; GC ActualGC; BOOLEAN Pfeil; { KOORDINATE ClipStart, ClipZiel; KOORDINATE *StartKoord, *ZielKoord; if (e) { HaKaClip( ZielTyp, ZielNr, e->x, e->y, &ClipZiel); DrawLine( e->x, e->y, ClipZiel.x, ClipZiel.y); if (Pfeil) HaKaSetPfeil( e->x, e->y, ClipZiel.x, ClipZiel.y, ActualGC); else HaKaSetPunkt( ClipZiel.x, ClipZiel.y, ActualGC); while (e->next) { DrawLine( e->next->x, e->next->y, e->x, e->y); e = e->next; } HaKaClip( StartTyp, StartNr, e->x, e->y, &ClipStart); DrawLine( ClipStart.x, ClipStart.y, e->x, e->y); } else { if (StartTyp == CE_STELLE) { StartKoord = &(SteStelle[ StartNr]->PosStelle); ZielKoord = &(TraTrans[ ZielNr]->PosTrans); } else { StartKoord = &(TraTrans[ StartNr]->PosTrans); ZielKoord = &(SteStelle[ ZielNr]->PosStelle); } HaKaClip( StartTyp, StartNr, ZielKoord->x, ZielKoord->y, &ClipStart); HaKaClip( ZielTyp, ZielNr, StartKoord->x, StartKoord->y, &ClipZiel); DrawLine( ClipStart.x, ClipStart.y, ClipZiel.x, ClipZiel.y); if (Pfeil) HaKaSetPfeil( ClipStart.x, ClipStart.y, ClipZiel.x, ClipZiel.y, ActualGC); else HaKaSetPunkt( ClipZiel.x, ClipZiel.y, ActualGC); } } /************************************************************************* ** FUNKTION: HaKaSTDrawX ** ZWECK: zeichnet ST-Kante in Pixmap ** EINGABE: ** AUSGABE: ** RETURN: ** ANMERK: *************************************************************************/ void HaKaSTDrawX( SNr, TNr, ActualGC) int SNr, TNr; GC ActualGC; { #ifdef HALLO if (KaKante[ SNr][ TNr].NachTrans->NegativKante) /**** KANTE VON TRANS NACH STELLE ZEICHNEN MIT PUNKT AN SPITZE *****/ HaKaDrawXIntern( CE_STELLE, SNr, CE_TRANSITION, TNr, KaKante[ SNr][ TNr].NachTrans->Ecke, ActualGC, FALSE); else /**** KANTE VON STELLE NACH TRANS ZEICHNEN MIT PFEIL ALS SPITZE ****/ HaKaDrawXIntern( CE_STELLE, SNr, CE_TRANSITION, TNr, KaKante[ SNr][ TNr].NachTrans->Ecke, ActualGC, TRUE); #endif HaKaDrawXIntern( CE_STELLE, SNr, CE_TRANSITION, TNr, KaKante[ SNr][ TNr].NachTrans->Ecke, ActualGC, (!(KaKante[ SNr][ TNr].NachTrans->NegativKante))); } /************************************************************************* ** FUNKTION: HaKaSTDraw ** ZWECK: zeichnet ST-Kante in Pixmap und Window ** EINGABE: ** AUSGABE: ** RETURN: ** ANMERK: *************************************************************************/ void HaKaSTDraw( SNr, TNr, ActualGC) int SNr, TNr; GC ActualGC; { #ifdef HALLO if (KaKante[ SNr][ TNr].NachTrans->NegativKante) /**** KANTE VON TRANS NACH STELLE ZEICHNEN MIT PUNKT AN SPITZE *****/ HaKaDrawXIntern( CE_STELLE, SNr, CE_TRANSITION, TNr, KaKante[ SNr][ TNr].NachTrans->Ecke, ActualGC, FALSE); else /**** KANTE VON STELLE NACH TRANS ZEICHNEN MIT PFEIL ALS SPITZE ****/ HaKaDrawXIntern( CE_STELLE, SNr, CE_TRANSITION, TNr, KaKante[ SNr][ TNr].NachTrans->Ecke, ActualGC, TRUE); #endif HaKaDrawXIntern( CE_STELLE, SNr, CE_TRANSITION, TNr, KaKante[ SNr][ TNr].NachTrans->Ecke, ActualGC, (!(KaKante[ SNr][ TNr].NachTrans->NegativKante))); HaKaRedraw(); } /************************************************************************* ** FUNKTION: HaKaTSDrawX ** ZWECK: zeichnet TS-Kante in Pixmap ** EINGABE: ** AUSGABE: ** RETURN: ** ANMERK: *************************************************************************/ void HaKaTSDrawX( SNr, TNr, ActualGC) int SNr, TNr; GC ActualGC; { HaKaDrawXIntern( CE_TRANSITION, TNr, CE_STELLE, SNr, KaKante[ SNr][ TNr].NachStelle->Ecke, ActualGC, TRUE); } /************************************************************************* ** FUNKTION: HaKaTSDraw ** ZWECK: zeichnet TS-Kante in Pixmap und Window ** EINGABE: ** AUSGABE: ** RETURN: ** ANMERK: *************************************************************************/ void HaKaTSDraw( SNr, TNr, ActualGC) int SNr, TNr; GC ActualGC; { HaKaDrawXIntern( CE_TRANSITION, TNr, CE_STELLE, SNr, KaKante[ SNr][ TNr].NachStelle->Ecke, ActualGC, TRUE); HaKaRedraw(); }