int GGI_X_drawvline_draw(ggi_visual *vis, int x, int y, int h) { ggi_x_priv *priv; priv = GGIX_PRIV(vis); y = GGI_X_WRITE_Y; GGI_X_LOCK_XLIB(vis); XDrawLine(priv->disp, priv->drawable, priv->gc, x, y, x, y+h-1); GGI_X_MAYBE_SYNC(vis); GGI_X_UNLOCK_XLIB(vis); return 0; }
int GGI_X_drawvline_slave_draw(ggi_visual *vis, int x, int y, int h) { ggi_x_priv *priv; priv = GGIX_PRIV(vis); LIBGGICLIP_XYH(vis, x, y, h); GGI_X_CLEAN(vis, x, y, 1, h); priv->slave->opdraw->drawvline_nc(priv->slave, x, y, h); y = GGI_X_WRITE_Y; GGI_X_LOCK_XLIB(vis); XDrawLine(priv->disp, priv->drawable, priv->gc, x, y, x, y+h-1); GGI_X_MAYBE_SYNC(vis); GGI_X_UNLOCK_XLIB(vis); return 0; }
int GGI_X_setorigin_child(struct ggi_visual *vis, int x, int y) { ggi_x_priv *priv; priv = GGIX_PRIV(vis); if (x < 0) return GGI_EARGINVAL; if (y < 0) return GGI_EARGINVAL; if (x > LIBGGI_VIRTX(vis) - LIBGGI_X(vis)) return GGI_EARGINVAL; if (y > LIBGGI_VIRTY(vis) - LIBGGI_Y(vis)) return GGI_EARGINVAL; vis->origin_x = x; vis->origin_y = y; XMoveWindow(priv->disp, priv->win, -x, - y - priv->pf_offset); GGI_X_MAYBE_SYNC(vis); return 0; }
int GGI_X_fillscreen_draw(ggi_visual *vis) { ggi_x_priv *priv; XGCValues gcValue; GC gc; priv = GGIX_PRIV(vis); DPRINT("X_fillscreen_draw enter!\n"); GGI_X_LOCK_XLIB(vis); /* XXX: What is priv->gc ? is it appropriate to use that here? */ gcValue.foreground = LIBGGI_GC(vis)->fg_color; gcValue.background = LIBGGI_GC(vis)->fg_color; gcValue.function = GXcopy; gc = XCreateGC( priv->disp, priv->drawable, GCForeground | GCBackground | GCFunction, &gcValue); if (LIBGGI_GC(vis)->cliptl.x > 0 || LIBGGI_GC(vis)->cliptl.y > 0 || LIBGGI_GC(vis)->clipbr.x < LIBGGI_VIRTX(vis) || LIBGGI_GC(vis)->clipbr.y < LIBGGI_VIRTY(vis)) { int y; /* Note: GGI_X_WRITE_Y is a macro that makes use * of the value stored in y. */ y = LIBGGI_GC(vis)->cliptl.y; y = GGI_X_WRITE_Y; /* CLIPSIZE macro is defined above in * GGI_X_fillscreen_slave_draw() */ XFillRectangle(priv->disp, priv->drawable, gc, LIBGGI_GC(vis)->cliptl.x, y, CLIPSIZE(x), CLIPSIZE(y) ); } else { XFillRectangle(priv->disp, priv->drawable, gc, 0, 0, LIBGGI_VIRTX(vis), LIBGGI_VIRTY(vis) ); } GGI_X_MAYBE_SYNC(vis); GGI_X_UNLOCK_XLIB(vis); DPRINT_LIBS("X_fillscreen_draw exit!\n"); return 0; }
int GGI_X_setdisplayframe_child(struct ggi_visual *vis, int num) { ggi_x_priv *priv; struct gii_xwin_cmddata_set_page_offset data; priv = GGIX_PRIV(vis); if (_ggi_db_find_frame(vis, num) == NULL) return GGI_EARGINVAL; vis->d_frame_num = num; priv->pf_offset = num*LIBGGI_VIRTY(vis); XMoveWindow(priv->disp, priv->win, -vis->origin_x, - vis->origin_y - priv->pf_offset); GGI_X_MAYBE_SYNC(vis); data.yoffset=priv->pf_offset; ggControl(priv->inp->channel, GII_CMDCODE_SET_PAGE_OFFSET, &data); return 0; }
int GGI_X_putvline_draw(ggi_visual *vis, int x, int y, int h, const void *data) { XImage *ximg; ggi_x_priv *priv; priv = GGIX_PRIV(vis); GGI_X_LOCK_XLIB(vis); #warning 1,2,4-bit support needed. ximg = _ggi_x_create_ximage( vis, (char*)data, 1, h); if (ximg == NULL) return GGI_ENOMEM; XPutImage(priv->disp, priv->drawable, priv->gc, ximg, 0, 0, x, GGI_X_WRITE_Y, 1, (unsigned)h); #ifndef HAVE_XINITIMAGE XFree(ximg); #else free(ximg); #endif GGI_X_MAYBE_SYNC(vis); GGI_X_UNLOCK_XLIB(vis); return 0; }
int GGI_X_fillscreen_slave_draw(ggi_visual *vis) { ggi_x_priv *priv; XGCValues gcValue; GC gc; priv = GGIX_PRIV(vis); DPRINT("X_fillscreen_slave_draw enter!\n"); GGI_X_LOCK_XLIB(vis); /* XXX: What is priv->gc ? is it appropriate to use that here? */ gcValue.foreground = LIBGGI_GC(vis)->fg_color; gcValue.background = LIBGGI_GC(vis)->fg_color; gcValue.function = GXcopy; gc = XCreateGC( priv->disp, priv->drawable, GCForeground | GCBackground | GCFunction, &gcValue); if (LIBGGI_GC(vis)->cliptl.x > 0 || LIBGGI_GC(vis)->cliptl.y > 0 || LIBGGI_GC(vis)->clipbr.x < LIBGGI_VIRTX(vis) || LIBGGI_GC(vis)->clipbr.y < LIBGGI_VIRTY(vis)) { int y; DPRINT("X_fillscreen_slave_draw small clip!\n"); GGI_X_CLEAN(vis, LIBGGI_GC(vis)->cliptl.x, LIBGGI_GC(vis)->cliptl.y, LIBGGI_GC(vis)->clipbr.x-LIBGGI_GC(vis)->cliptl.x, LIBGGI_GC(vis)->clipbr.y-LIBGGI_GC(vis)->cliptl.y); DPRINT("X_fillscreen_slave_draw calling opdraw->fillscreen\n"); priv->slave->opdraw->fillscreen(priv->slave); /* What is this? y is set twice? which value is * proper? Answer: GGI_X_WRITE_Y is a macro that makes * use of the value stored in y. */ y = LIBGGI_GC(vis)->cliptl.y; y = GGI_X_WRITE_Y; #define CLIPSIZE(xy) \ (unsigned)LIBGGI_GC(vis)->clipbr.xy-LIBGGI_GC(vis)->cliptl.xy XFillRectangle(priv->disp, priv->drawable, gc, LIBGGI_GC(vis)->cliptl.x, y, CLIPSIZE(x), CLIPSIZE(y) ); } else { DPRINT("X_fillscreen_slave_draw large clip!\n"); GGI_X_CLEAN(vis, 0, 0, LIBGGI_VIRTX(vis), LIBGGI_VIRTY(vis)); DPRINT("X_fillscreen_slave_draw calling opdraw->fillscreen\n"); priv->slave->opdraw->fillscreen(priv->slave); XFillRectangle(priv->disp, priv->drawable, gc, 0, 0, LIBGGI_VIRTX(vis), LIBGGI_VIRTY(vis) ); } GGI_X_MAYBE_SYNC(vis); XFreeGC(priv->disp, gc); GGI_X_UNLOCK_XLIB(vis); return GGI_OK; }