diff options
author | Pixel <pixel@nobis-crew.org> | 2010-06-15 00:59:57 -0700 |
---|---|---|
committer | Pixel <pixel@nobis-crew.org> | 2010-06-15 00:59:57 -0700 |
commit | eed0eb6a476d54ce19aeff137984aa981d9e3976 (patch) | |
tree | 807891636efd2f87dcbd261e971216269973ae07 /iup/src/mot/iupmot_draw.c | |
parent | ccc8261e4d48de89da4ddfe7b55e378ae0cd6f47 (diff) |
Upgrading to iup 3.1
Diffstat (limited to 'iup/src/mot/iupmot_draw.c')
-rw-r--r-- | iup/src/mot/iupmot_draw.c | 188 |
1 files changed, 188 insertions, 0 deletions
diff --git a/iup/src/mot/iupmot_draw.c b/iup/src/mot/iupmot_draw.c new file mode 100644 index 0000000..83a6d09 --- /dev/null +++ b/iup/src/mot/iupmot_draw.c @@ -0,0 +1,188 @@ +/** \file + * \brief Draw Functions + * + * See Copyright Notice in "iup.h" + */ + +#include <stdlib.h> +#include <stdio.h> +#include <string.h> +#include <memory.h> + +#include <Xm/Xm.h> +#include <X11/Xlib.h> + +#include "iup.h" + +#include "iup_attrib.h" +#include "iup_class.h" +#include "iup_str.h" +#include "iup_object.h" +#include "iup_image.h" +#include "iup_draw.h" + +#include "iupmot_drv.h" +#include "iupmot_color.h" + + +struct _IdrawCanvas{ + Ihandle* ih; + int w, h; + + Window wnd; + Pixmap pixmap; + GC pixmap_gc, gc; +}; + +static void motDrawGetGeometry(Display *dpy, Drawable wnd, int *_w, int *_h, int *_d) +{ + Window root; + int x, y; + unsigned int w, h, b, d; + XGetGeometry(dpy, wnd, &root, &x, &y, &w, &h, &b, &d); + *_w = w; + *_h = h; + *_d = d; +} + +IdrawCanvas* iupDrawCreateCanvas(Ihandle* ih) +{ + IdrawCanvas* dc = calloc(1, sizeof(IdrawCanvas)); + int depth; + + dc->wnd = XtWindow(ih->handle); + dc->gc = XCreateGC(iupmot_display, dc->wnd, 0, NULL); + + motDrawGetGeometry(iupmot_display, dc->wnd, &dc->w, &dc->h, &depth); + + dc->pixmap = XCreatePixmap(iupmot_display, dc->wnd, dc->w, dc->h, depth); + dc->pixmap_gc = XCreateGC(iupmot_display, dc->pixmap, 0, NULL); + + return dc; +} + +void iupDrawKillCanvas(IdrawCanvas* dc) +{ + XFreeGC(iupmot_display, dc->pixmap_gc); + XFreePixmap(iupmot_display, dc->pixmap); + XFreeGC(iupmot_display, dc->gc); + + free(dc); +} + +void iupDrawUpdateSize(IdrawCanvas* dc) +{ + int w, h, depth; + motDrawGetGeometry(iupmot_display, dc->wnd, &w, &h, &depth); + + if (w != dc->w || h != dc->h) + { + XFreeGC(iupmot_display, dc->pixmap_gc); + XFreePixmap(iupmot_display, dc->pixmap); + + dc->pixmap = XCreatePixmap(iupmot_display, dc->wnd, dc->w, dc->h, depth); + dc->pixmap_gc = XCreateGC(iupmot_display, dc->pixmap, 0, NULL); + } +} + +void iupDrawFlush(IdrawCanvas* dc) +{ + XCopyArea(iupmot_display, dc->pixmap, dc->wnd, dc->gc, 0, 0, dc->w, dc->h, 0, 0); +} + +void iupDrawGetSize(IdrawCanvas* dc, int *w, int *h) +{ + if (w) *w = dc->w; + if (h) *h = dc->h; +} + +void iupDrawParentBackground(IdrawCanvas* dc) +{ + unsigned char r=0, g=0, b=0; + char* color = iupBaseNativeParentGetBgColorAttrib(dc->ih); + iupStrToRGB(color, &r, &g, &b); + iupDrawRectangle(dc, 0, 0, dc->w-1, dc->h-1, r, g, b, 1); +} + +void iupDrawRectangle(IdrawCanvas* dc, int x1, int y1, int x2, int y2, unsigned char r, unsigned char g, unsigned char b, int filled) +{ + XSetForeground(iupmot_display, dc->pixmap_gc, iupmotColorGetPixel(r, g, b)); + if (filled) + XFillRectangle(iupmot_display, dc->pixmap, dc->pixmap_gc, x1, y1, x2-x1+1, y2-y1+1); + else + XDrawRectangle(iupmot_display, dc->pixmap, dc->pixmap_gc, x1, y1, x2-x1+1, y2-y1+1); +} + +void iupDrawLine(IdrawCanvas* dc, int x1, int y1, int x2, int y2, unsigned char r, unsigned char g, unsigned char b) +{ + XSetForeground(iupmot_display, dc->pixmap_gc, iupmotColorGetPixel(r, g, b)); + XDrawLine(iupmot_display, dc->pixmap, dc->pixmap_gc, x1, y1, x2, y2); +} + +void iupDrawArc(IdrawCanvas* dc, int x1, int y1, int x2, int y2, double a1, double a2, unsigned char r, unsigned char g, unsigned char b, int filled) +{ + XSetForeground(iupmot_display, dc->pixmap_gc, iupmotColorGetPixel(r, g, b)); + if (filled) + { + XSetArcMode(iupmot_display, dc->pixmap_gc, ArcPieSlice); + XFillArc(iupmot_display, dc->pixmap, dc->pixmap_gc, x1, y1, x2-x1+1, y2-y1+1, iupROUND(a1*64), iupROUND((a2 - a1)*64)); + } + else + XDrawArc(iupmot_display, dc->pixmap, dc->pixmap_gc, x1, y1, x2-x1+1, y2-y1+1, iupROUND(a1*64), iupROUND((a2 - a1)*64)); +} + +void iupDrawPolygon(IdrawCanvas* dc, int* points, int count, unsigned char r, unsigned char g, unsigned char b, int filled) +{ + int i; + XPoint* pnt = (XPoint*)malloc(count*sizeof(XPoint)); /* XPoint uses short for coordinates */ + + for (i = 0; i < count; i++) + { + pnt[i].x = (short)points[2*i]; + pnt[i].y = (short)points[2*i+1]; + } + + XSetForeground(iupmot_display, dc->pixmap_gc, iupmotColorGetPixel(r, g, b)); + if (filled) + XFillPolygon(iupmot_display, dc->pixmap, dc->pixmap_gc, pnt, count, Complex, CoordModeOrigin); + else + XDrawLines(iupmot_display, dc->pixmap, dc->pixmap_gc, pnt, count, CoordModeOrigin); + + free(pnt); +} + +void iupDrawSetClipRect(IdrawCanvas* dc, int x1, int y1, int x2, int y2) +{ + XRectangle rect; + rect.x = (short)x1; + rect.y = (short)y1; + rect.width = (unsigned short)(x2-x1+1); + rect.height = (unsigned short)(y2-y1+1); + XSetClipRectangles(iupmot_display, dc->pixmap_gc, 0, 0, &rect, 1, Unsorted); +} + +void iupDrawResetClip(IdrawCanvas* dc) +{ + XSetClipMask(iupmot_display, dc->pixmap_gc, None); +} + +void iupDrawText(IdrawCanvas* dc, const char* text, int len, int x, int y, unsigned char r, unsigned char g, unsigned char b) +{ + XFontStruct* xfont = (XFontStruct*)IupGetAttribute(dc->ih, "XFONTSTRUCT"); + XSetForeground(iupmot_display, dc->pixmap_gc, iupmotColorGetPixel(r, g, b)); + XSetFont(iupmot_display, dc->pixmap_gc, xfont->fid); + XDrawString(iupmot_display, dc->pixmap, dc->pixmap_gc, x, y-xfont->ascent, text, len); +} + +void iupDrawImage(IdrawCanvas* dc, const char* name, int make_inactive, int x, int y) +{ + int img_w, img_h, bpp; + Pixmap pixmap = (Pixmap)iupImageGetImage(name, dc->ih, make_inactive); + if (!pixmap) + return; + + /* must use this info, since image can be a driver image loaded from resources */ + iupdrvImageGetInfo((void*)pixmap, &img_w, &img_h, &bpp); + + XCopyArea(iupmot_display, pixmap, dc->pixmap, dc->pixmap_gc, 0, 0, img_w, img_h, x, y); +} |