#include "xlib.h" #include "scheme48.h" extern XDrawPoints(), XDrawLines(), XDrawRectangle(), XFillRectangle(); extern XDrawRectangles(), XFillRectangles(), XDrawArc(), XFillArc(); extern XDrawArcs(), XFillArcs(), XFillPolygon(); s48_value Clear_Area(s48_value Xwindow, s48_value Xdisplay, s48_value x, s48_value y, s48_value w, s48_value h, s48_value e){ Window win = EXTRACT_WINDOW(Xwindow); Display* dpy = EXTRACT_DISPLAY(Xdisplay); XClearArea (dpy, win, (int)s48_extract_integer (x), (int)s48_extract_integer (y), (int)s48_extract_integer (w), (int)s48_extract_integer (h), !S48_FALSE_P(e)); return S48_UNSPECIFIC; } s48_value Copy_Area(s48_value Xdisplay, s48_value srcXdrawable,s48_value Xgcontext,s48_value srcx, s48_value srcy, s48_value width, s48_value height, s48_value destXdrawable, s48_value destx,s48_value desty){ XCopyArea (EXTRACT_DISPLAY(Xdisplay), EXTRACT_DRAWABLE(srcXdrawable), EXTRACT_DRAWABLE(destXdrawable), EXTRACT_GCONTEXT(Xgcontext), (int)s48_extract_integer(srcx), (int)s48_extract_integer(srcy), (int)s48_extract_integer(width), (int)s48_extract_integer(height), (int)s48_extract_integer(destx), (int)s48_extract_integer(desty)); return S48_UNSPECIFIC; } /** REPLACED by NF in Copy_Plane: ... p = (unsigned long)s48_extract_integer (plane); if (p & (p-1)) Primitive_Error ("invalid plane: ~s", plane); ... */ s48_value Copy_Plane(s48_value Xdisplay, s48_value srcXdrawable, s48_value Xgcontext, s48_value plane, s48_value srcx, s48_value srcy, s48_value width, s48_value height, s48_value destXdrawable, s48_value destx, s48_value desty){ // Note: plane must have been set exactly one bit to 1. // For further details, see the man-page. unsigned long p = (unsigned long)s48_extract_integer(plane); XCopyPlane(EXTRACT_DISPLAY(Xdisplay), EXTRACT_DRAWABLE(srcXdrawable), EXTRACT_DRAWABLE(destXdrawable), EXTRACT_GCONTEXT(Xgcontext), (int)s48_extract_integer(srcx), (int)s48_extract_integer(srcy), (int)s48_extract_integer(width), (int)s48_extract_integer(height), (int)s48_extract_integer(destx), (int)s48_extract_integer(desty), (unsigned long)s48_extract_integer(plane)); return S48_UNSPECIFIC; } s48_value Draw_Point(s48_value Xdisplay, s48_value Xdrawable, s48_value Xgcontext, s48_value x, s48_value y){ XDrawPoint(EXTRACT_DISPLAY(Xdisplay), EXTRACT_DRAWABLE(Xdrawable), EXTRACT_GCONTEXT(Xgcontext), (int)s48_extract_integer(x), (int)s48_extract_integer (y)); return S48_UNSPECIFIC; } /* This Function is for internal use only! */ void Vector_To_XPoints(s48_value vec, XPoint* p, int n){ int i; for(i = 0; i < n; i++){ s48_value point = S48_VECTOR_REF(vec, i); p[i].x = (int)s48_extract_integer (S48_CAR (point)); p[i].y = (int)s48_extract_integer (S48_CDR (point)); } } s48_value Draw_Points (s48_value Xdisplay, s48_value Xdrawable, s48_value Xgcontext, s48_value vec, s48_value relative){ // First, create a new XPoint from the vector of pairs... int n = S48_VECTOR_LENGTH(vec); XPoint p[n]; int mode; Vector_To_XPoints(vec, p, n); mode = !S48_EQ_P(relative, S48_FALSE) ? CoordModePrevious : CoordModeOrigin; XDrawPoints(EXTRACT_DISPLAY(Xdisplay), EXTRACT_DRAWABLE(Xdrawable), EXTRACT_GCONTEXT(Xgcontext), p, n, mode); return S48_UNSPECIFIC; } s48_value Draw_Line (s48_value Xdisplay,s48_value Xdrawable, s48_value Xgcontext, s48_value x1, s48_value y1, s48_value x2, s48_value y2){ XDrawLine (EXTRACT_DISPLAY(Xdisplay),EXTRACT_DRAWABLE(Xdrawable), EXTRACT_GCONTEXT(Xgcontext), (int)s48_extract_integer(x1), (int)s48_extract_integer (y1), (int)s48_extract_integer (x2), (int)s48_extract_integer (y2)); return S48_UNSPECIFIC; } s48_value Draw_Lines(s48_value Xdisplay, s48_value Xdrawalbe, s48_value Xgcontext, s48_value vec, s48_value relative){ int n = S48_VECTOR_LENGHT(vec); XPoint p[n]; int mode; Vector_To_Points(vec, p, n); mode = !S48_EQ_P(relative, S48_FALSE) ? CoordModePrevious : CoordModeOrigin; XDrawLines(EXTRACT_DISPLAY(Xdisplay), EXTRACT_DRAWABLE(Xdrawalbe), EXTRACT_GCONTEXT(Xgcontext), p, n, mode); return S48_UNSPECIFIC; } s48_value Draw_Segments (s48_value Xdisplay, s48_value Xdrawable, s48_value Xgcontext, s48_value vec){ int i; int n = S48_VECTOR_LENGTH(vec); XSegment p[n]; for (i = 0; i < n; i++) { s48_value seg = S48_VECTOR_REF(vec, i); p[i].x1 = (int)s48_extract_integer (S48_CAR (seg)); seg = S48_CDR (seg); p[i].y1 = (int)s48_extract_integer (S48_CAR (seg)); seg = S48_CDR (seg); p[i].x2 = (int)s48_extract_integer (S48_CAR (seg)); seg = S48_CDR (seg); p[i].y2 = (int)s48_extract_integer (S48_CAR (seg)); } XDrawSegments (EXTRACT_DISPLAY(Xdisplay), EXTRACT_DRAWABLE(Xdrawable), EXTRACT_GCONTEXT(Xgcontext), p, n); return S48_UNSPECIFIC; } s48_value Draw_Rectangle(s48_value Xdisplay, s48_value Xdrawable, s48_value Xgcontext, s48_value x, s48_value y, s48_value w, s48_value h){ XDrawRectangle (EXTRACT_DISPLAY(Xdisplay), EXTRACT_DRAWABLE(Xdrawable), EXTRACT_GCONTEXT(Xgcontext), (int)s48_extract_integer(x), (int)s48_extract_integer(y), (int)s48_extract_integer(w), (int)s48_extract_integer(h)); return S48_UNSPECIFIC; } s48_value Fill_Rectangle (s48_value Xdisplay, s48_value Xdrawable, s48_value Xgcontext, s48_value x, s48_value y, s48_value w, s48_value h){ XFillRectangle(EXTRACT_DISPLAY(Xdisplay), EXTRACT_DRAWABLE(Xdrawable), EXTRACT_GCONTEXT(Xgcontext), (int)s48_extract_integer(x), (int)s48_extract_integer(y), (int)s48_extract_integer(w), (int)s48_extract_integer(h)); return S48_UNSPECIFIC; } //This Function is for internal use only! void Vector_To_XRectangle(s48_value vec, XRectangle* p, int n){ int i; for (i = 0; i < n; i++){ s48_value rect; rect = S48_VECTOR_REF(vec, i); p[i].x = (int)s48_extract_integer (S48_CAR (rect)); rect = S48_CDR (rect); p[i].y = (int)s48_extract_integer (S48_CAR (rect)); rect = S48_CDR (rect); p[i].width = (int)s48_extract_integer (S48_CAR (rect)); rect = S48_CDR (rect); p[i].height = (int)s48_extract_integer (S48_CAR (rect)); } } s48_value Draw_Rectangles (s48_value Xdisplay, s48_value Xdrawable, s48_value Xgcontext, s48_value vec){ int n = S48_VECTOR_LENGTH(vec); XRectangle p[n]; Vector_To_XRectangle(vec, p, n); XDrawRectangles(EXTRACT_DISPLAY(Xdisplay), EXTRACT_DRAWABLE(Xdrawable), EXTRACT_GCONTEXT(Xgcontext), p, n); return S48_UNSPECIFIC; } s48_value Fill_Rectangles (s48_value Xdisplay, s48_value Xdrawable, s48_value Xgcontext, s48_value vec){ int n = S48_VECTOR_LENGTH(vec); XRectangle p[n]; Vector_To_Rectangle(vec, p, n); XFillRectangles(EXTRACT_DISPLAY(Xdisplay), EXTRACT_DRAWABLE(Xdrawable), EXTRACT_GCONTEXT(Xgcontext), p, n); return S48_UNSPECIFIC; } s48_value Draw_Arc (s48_value Xdisplay, s48_value Xdrawable, s48_value Xgcontext, s48_value x,s48_value y, s48_value w, s48_value h, s48_value a1, s48_value a2){ XDrawArc(EXTRACT_DISPLAY(Xdisplay), EXTRACT_DRAWABLE(Xdrawable), EXTRACT_GCONTEXT(Xgcontext), (int)s48_extract_integer(x), (int)s48_extract_integer(y), (int)s48_extract_integer(w), (int)s48_extract_integer(h), (int)s48_extract_integer(a1), (int)s48_extract_integer(a2)); return S48_UNSPECIFIC; } s48_value Fill_Arc (s48_value Xdisplay, s48_value Xdrawable, s48_value Xgcontext, s48_value x,s48_value y, s48_value w, s48_value h, s48_value a1, s48_value a2){ XFillArc(EXTRACT_DISPLAY(Xdisplay), EXTRACT_DRAWABLE(Xdrawable), EXTRACT_GCONTEXT(Xgcontext), (int)s48_extract_integer(x), (int)s48_extract_integer(y), (int)s48_extract_integer(w), (int)s48_extract_integer(h), (int)s48_extract_integer(a1), (int)s48_extract_integer(a2)); return S48_UNSPECIFIC; } //This Function is for internal use only! void Vector_To_XArc(s48_value vec, XArc* p, int n){ int i; for (i = 0; i < n; i++){ s48_value arc; arc = S48_VECTOR_REF(vec, i); p[i].x = (int)s48_extract_integer (S48_CAR (arc)); arc = S48_CDR (arc); p[i].y = (int)s48_extract_integer (S48_CAR (arc)); arc = S48_CDR (arc); p[i].width = (int)s48_extract_integer (S48_CAR (arc)); arc = S48_CDR (arc); p[i].height = (int)s48_extract_integer (S48_CAR (arc)); arc = S48_CDR (arc); p[i].angle1 = (int)s48_extract_integer (S48_CAR (arc)); arc = S48_CDR (arc); p[i].angle2 = (int)s48_extract_integer (S48_CAR (arc)); } } s48_value Draw_Arcs (s48_value Xdisplay, s48_value Xdrawable, s48_value Xgcontext, s48_value vec){ int n = S48_VECTOR_LENGTH(vec); XArc p[n]; Vector_To_XArc(vec, p, n); XDrawArcs(EXTRACT_DISPLAY(Xdisplay), EXTRACT_DRAWABLE(Xdrawable), EXTRACT_GCONTEXT(Xgcontext), p, n); return S48_UNSPECIFIC; } s48_value Fill_Arcs (s48_value Xdisplay, s48_value Xdrawable, s48_value Xgcontext, s48_value vec){ int n = S48_VECTOR_LENGTH(vec); XArc p[n]; Vector_To_XArc(vec, p, n); XFillArcs(EXTRACT_DISPLAY(Xdisplay), EXTRACT_DRAWABLE(Xdrawable), EXTRACT_GCONTEXT(Xgcontext), p, n); return S48_UNSPECIFIC; } s48_value Fill_Polygon (s48_value Xdisplay, s48_value Xdrawable, s48_value Xgcontext, s48_value vec, s48_value relative, s48_value shape){ int n = S48_VECTOR_LENGTH(vec); int mode; int sh = (int)Symbol_To_Bit(shape, Polyshape_Syms); XPoint p[n]; Vector_To_XPoints(vec, p, n); mode = !S48_EQ_P(relative, S48_FALSE) ? CoordModePrevious : CoordModeOrigin; XFillPolygon(EXTRACT_DISPLAY(Xdisplay), EXTRACT_DRAWABLE(Xdrawable), EXTRACT_GCONTEXT(Xgcontext), p, n, sh, mode); return S48_UNSPECIFIC; } void s48_init_graphics(void) { S48_EXPORT_FUNCTION(Clear_Area); S48_EXPORT_FUNCTION(Copy_Area); S48_EXPORT_FUNCTION(Copy_Plane); S48_EXPORT_FUNCTION(Draw_Point); S48_EXPORT_FUNCTION(Draw_Points); S48_EXPORT_FUNCTION(Draw_Line); S48_EXPORT_FUNCTION(Draw_Lines); S48_EXPORT_FUNCTION(Draw_Segments); S48_EXPORT_FUNCTION(Draw_Rectangle); S48_EXPORT_FUNCTION(Fill_Rectangle); S48_EXPORT_FUNCTION(Draw_Rectangles); S48_EXPORT_FUNCTION(Fill_Rectangles); S48_EXPORT_FUNCTION(Draw_Arc); S48_EXPORT_FUNCTION(Fill_Arc); S48_EXPORT_FUNCTION(Draw_Arcs); S48_EXPORT_FUNCTION(Fill_Arcs); S48_EXPORT_FUNCTION(Fill_Polygon); }