Die Japilib bietet folgende Graphic Primitiven, die alle in der momentan gesetzten Vordergrundfarbe ausgeführt werden. Als Zielobjekte sind prinzipiel alle Componenten verwendbar. Da jedoch nur der Canvas ein sg. Dubble Buffering besitzt, ist der Einsatz dieser Funktionen nur innerhalb eines Canvas empfehlenswert.
j_drawpixel(component,x,y);
zeichnet einen Pixel in der Componente an der Position (x,y).
j_drawline(component,x1,y1,x2,y2);
zeichnet eine Linie von Punkt (x1,y1) nach Punkt (x2,y2).
j_drawpolyline(component,nval,*x,*y);
Zeichnet eine Polyline die aus den Punkten der Arrays x und y definiert wird. Die Arrays müssen mindestens nval Elemente besitzen.
j_drawpolygon(component,nval,*x,*y); j_fillpolygon(component,nval,*x,*y);
Zeichnet ein (gefülltes) Polygon die aus den Punkten der Arrays x und y definiert wird. Die Arrays müssen mindestens nval Elemente besitzen. Im Gegensatz zur Polyline werden hier die Endpunkte zusätzlich miteinander verbunden.
j_drawrect(component,x,y,width,height); j_fillrect(component,x,y,width,height);
Zeichnet ein (gefülltes) Rechteck mit der oberen linken Ecke an der Position (x,y). Da Rechteck besitzt die Breite width und die Höhe height.
j_drawroundrect(component,x,y,width,height,r1,r2); j_fillroundrect(component,x,y,width,height,r1,r2);
Zeichnet ein (gefülltes) Rechteck mit der oberen linken Ecke an der Position (x,y). Da Rechteck besitzt die Breite width und die Höhe height. Das Recheck besitzt abgerundete Ecken, die durch die Parameter r1 und r2 definiert werden. r1 bestimmt dabei den horizontalen Radius der Bögen, r2 den vertikalen Radius.
j_drawcircle(component,x,y,r); j_fillcircle(component,x,y,r);
Zeichnet einen (gefüllten) Kreis um den Punkt (x,y) mit dem Radius r.
j_drawoval(component,x,y,r1,r2); j_filloval(component,x,y,r1,r2);
Zeichnet ein (gefülltes) Oval, um den Punkt (x,y) mit den Hauptradien r1 und r2.
j_drawarc(component,x,y,r1,r2,arc1,arc2); j_fillarc(component,x,y,r1,r2,arc1,arc2);
Zeichnet einen (gefüllen) Kreisbogen um den Punkt (x,y) mit den Hauptradien r1 und r2. Der Kreisbogen begint im Startwinkel arc1 und endet am Stopwinkel arc2. Die Winkel sind im Bogenmaß anzugeben.
j_drawstring(component,x,y,str);
Zeichnet den String str an die Position (x,y). Die Position bezeichnet den Anfang derGrundlinie des Strings (linke untere Ecke).
Der folgende Auszug aus einem Beipielprogramm demonstriert diese Graphikprimitiven (siehe Abbildung 5.2):
/* Example graphic.c */ : j_translate(canvas,10,10); j_drawline(canvas,10,10,90,90); j_drawstring(canvas,0,105,"Line"); j_translate(canvas,100,0); j_drawpolygon(canvas,10,x,y); j_drawstring(canvas,0,105,"Polygon"); j_translate(canvas,100,0); j_drawrect(canvas,10,10,80,80); j_drawstring(canvas,0,105,"Rectangle"); j_translate(canvas,100,0); j_drawroundrect(canvas,10,10,80,80,20,20); j_drawstring(canvas,0,105,"RoundRect"); j_translate(canvas,100,0); j_drawcircle(canvas,50,50,40); j_drawstring(canvas,0,105,"Circle"); j_translate(canvas,100,0); j_drawoval(canvas,50,50,40,20); j_drawstring(canvas,0,105,"Oval"); j_translate(canvas,100,0); j_drawarc(canvas,50,50,40,30,113,210); j_drawstring(canvas,0,105,"Arc"); /* Filled */ j_translate(canvas,-600,100); j_drawpolyline(canvas,10,x,y); j_drawstring(canvas,0,105,"Polyline"); j_translate(canvas,100,0); j_fillpolygon(canvas,10,x,y); j_drawstring(canvas,0,105,"FillPolygon"); j_translate(canvas,100,0); j_fillrect(canvas,10,10,80,80); j_drawstring(canvas,0,105,"FillRectangle"); j_translate(canvas,100,0); j_fillroundrect(canvas,10,10,80,80,20,20); j_drawstring(canvas,0,105,"FillRoundRect"); j_translate(canvas,100,0); j_fillcircle(canvas,50,50,40); j_drawstring(canvas,0,105,"FillCircle"); j_translate(canvas,100,0); j_filloval(canvas,50,50,40,20); j_drawstring(canvas,0,105,"FillOval"); j_translate(canvas,100,0); j_fillarc(canvas,50,50,40,30,113,210); j_drawstring(canvas,0,105,"FillArc"); :
Das Beispiel benutzt zudem eine weitere Funktion j_translate() mit der sich der Koordinatenursprung verschieben läßt. Diese Funktion gehört zu einer weiteren Gruppe von Funktionen zu einer erweiterten Graphikausgabe:
j_translate(component,x,y);
Diese Funktion verschiebt den Koordinatenursprung um x Pixel in der Horizontalen und y Pixel in der Vertikalen. Alle folgenden Graphikbefehle beziehen sich nun auf den neuen Koordinatenursprung.
j_cliprect(component,x,y,width,height);
Diese Funktion setzt ein Clipping Rechteck an die Position (x,y) mit der Breite width und der Hoehe height. Das Clipping Rechteck bewirkt, daß im folgenden nur noch in diesem Rechteck graphische Ausgaben erfolgen. Alles was über die Grenzen des Rechecks hinausragt, wird geclipt (abgeschnitten).
j_setxor(component, bool);
Diese Funktion schalten den XOR Modus beim Zeichen ein (bool = J_TRUE) und aus (bool = J_FALSE). Ist der XOR Modus gesetzt, so heben sich zwei identische Zeichenbefehle wieder auf.
Der folgende Auszug aus einer Eventloop demonstriert, wie man mit dem XOR Modus ein Rubberband realisieren kann. Ein Rubberband ist ein variables Rechteck, das man mit gerdrückter Maustaste aufziehen kann. Das Beispiel enthält einen Canvas mit einem Mousepressed- und einem Mousedragged- Listener.
if(obj == pressed) { j_setxor(canvas,J_TRUE); j_drawrect(canvas,startx,starty,x-startx,y-starty); j_getmousepos(pressed,&x,&y); startx=x; starty=y; j_setxor(canvas,J_FALSE); } if(obj == dragged) { j_setxor(canvas,J_TRUE); j_drawrect(canvas,startx,starty,x-startx,y-starty); j_getmousepos(dragged,&x,&y); j_drawrect(canvas,startx,starty,x-startx,y-starty); j_setxor(canvas,J_FALSE); }
Wird die Maus gedrückt (pressed), so wird der XOR Modus eingeschaltet. Dadurch kann ein evtl. bereits vorhandenes altes Rechteck durch Überzeichnen gelöscht werden Die Position der Maus wird gespeichert. Wird die Maus bewegt (dragged), so wird ebenfalls zunächst der XOR Modus gesetzt. Ebenso wird als nächstes ein evtl. vorhandenes Rechteck gelöscht. Danach wird die neue Position der Maus ermittelt und ein neues Rechteck gezeichnet. Durch Löschen des XOR Modus kann nun normal weitergezeichnen werden.