⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 crgc.c

📁 用于nano-x的xlib
💻 C
字号:
#include "nxlib.h"#include <string.h>/* * XSetGCxxx routines * * Many of these routines save a local copy of the value * so that the value can be later queried or used by other * routines that need it without querying the server, which * may not support a query function.  This means that shared * GCs between processes may not work as expected... * * This also means that this library shouldn't call XSetGCxxx * routines to get work done, since the GC save value will * be incorrect. *//* FIXME if these differ from NX defaults, must set at create time*/static XGCValues initial_GC = {	GXcopy,			/* function */	AllPlanes,		/* plane_mask */	0L,			/* foreground */	1L,			/* background */	0,			/* line_width */	LineSolid,		/* line_style */	CapButt,		/* cap_style */	JoinMiter,		/* join_style */	FillSolid,		/* fill_style */	EvenOddRule,		/* fill_rule */	ArcPieSlice,		/* arc_mode */	(Pixmap)0,		/* tile, impossible (unknown) resource */	(Pixmap)0,		/* stipple, impossible (unknown) resource */	0,			/* ts_x_origin */	0,			/* ts_y_origin */	(Font)0,		/* font, impossible (unknown) resource */	ClipByChildren,		/* subwindow_mode */	True,			/* graphics_exposures */	0,			/* clip_x_origin */	0,			/* clip_y_origin */	None,			/* clip_mask */	0,			/* dash_offset */	4			/* dashes (list [4,4]) */};static voidsetupGC(Display * dpy, GC gc, unsigned long valuemask, XGCValues * values){	if (valuemask & GCFunction)		XSetFunction(dpy, gc, values->function);	if (valuemask & GCForeground)		XSetForeground(dpy, gc, values->foreground);	if (valuemask & GCBackground)		XSetBackground(dpy, gc, values->background);	//FIXME add save gc->ext_data values for each of these...	if (valuemask & GCFont)		XSetFont(dpy, gc, values->font);	if (valuemask & GCGraphicsExposures)		XSetGraphicsExposures(dpy, gc, values->graphics_exposures);	if ((valuemask & GCClipXOrigin) && (valuemask & GCClipYOrigin))		XSetClipOrigin(dpy, gc, values->clip_x_origin,		    values->clip_y_origin);	if (valuemask & GCClipMask)		XSetClipMask(dpy, gc, values->clip_mask);	if (valuemask & GCFillStyle)		XSetFillStyle(dpy, gc, values->fill_style);	if ((valuemask & GCTileStipXOrigin) && (valuemask & GCTileStipYOrigin))		XSetTSOrigin(dpy, gc, values->ts_x_origin, values->ts_y_origin);	// FIXME	if (valuemask & (GCLineWidth | GCLineStyle | GCCapStyle | GCJoinStyle))		XSetLineAttributes(dpy, gc, values->line_width,		    values->line_style, values->cap_style, values->join_style);	if (valuemask & GCFillRule)		XSetFillStyle(dpy, gc, values->fill_rule);	if (valuemask & GCTile)		XSetTile(dpy, gc, values->tile);	if (valuemask & GCStipple)		XSetStipple(dpy, gc, values->stipple);	if (valuemask & (GCDashOffset | GCDashList)) {		// FIXME is this correct for values->dashes?		if (values->dashes) {			char d[2];			d[0] = d[1] = values->dashes;			XSetDashes(dpy, gc, values->dash_offset, d, 2);		}	}	if (valuemask & GCSubwindowMode)		XSetSubwindowMode(dpy, gc, values->subwindow_mode);	if (valuemask & GCPlaneMask)		printf("XCreatGC: GCPlaneMask not implemented\n");	if (valuemask & GCArcMode)		printf("XCreatGC: GCArcMode not implemented\n");}/* note: unused Drawable d */GCXCreateGC(Display *dpy, Drawable d, unsigned long valuemask, XGCValues *values){	GC gc;	XGCValues *vp;	if ((gc = (GC) Xmalloc(sizeof(struct _XGC))) == NULL)		return NULL;	if ((vp = (XGCValues *)Xmalloc(sizeof(XGCValues))) == NULL) {		Xfree(gc);		return NULL;	}	gc->ext_data = (XExtData *)vp;	memcpy(vp, &initial_GC, sizeof(initial_GC));	gc->gid = GrNewGC();	/* X11 doesn't draw background, must set on all GrNewGC's*/	GrSetGCUseBackground(gc->gid, GR_FALSE);	/* X11 defaults to fg=black, bg=white, NX is opposite...*/	if (!(valuemask & GCForeground))		XSetForeground(dpy, gc, 0L);	/* black*/	if (!(valuemask & GCBackground))		XSetBackground(dpy, gc, ~0L);	/* white*/	setupGC(dpy, gc, valuemask, values);	return gc;}intXChangeGC(Display *display, GC gc, unsigned long valuemask, XGCValues *values){	setupGC(display, gc, valuemask, values);	return 1;}voidXFlushGC(Display * dpy, GC gc){	printf("XFlushGC called, not synced\n");}GContextXGContextFromGC(GC gc){	return gc->gid;}/*** XSetGCxxx routines ***//* convert an X11 rop to NX rop*/int_nxConvertROP(int Xrop){	switch (Xrop) {	case GXclear:		return GR_MODE_CLEAR;	case GXand:		return GR_MODE_AND;	case GXandReverse:		return GR_MODE_ANDREVERSE;	case GXcopy:		return GR_MODE_COPY;	case GXandInverted:		return GR_MODE_ANDINVERTED;	case GXnoop:		return GR_MODE_NOOP;	case GXxor:		return GR_MODE_XOR;	case GXor:		return GR_MODE_OR;	case GXequiv:		return GR_MODE_EQUIV;	case GXinvert:		return GR_MODE_INVERT;	case GXcopyInverted:		return GR_MODE_COPYINVERTED;	case GXorInverted:		return GR_MODE_ORINVERTED;	case GXnand:		return GR_MODE_NAND;	case GXset:	default:		return GR_MODE_COPY;	}}intXSetFunction(Display *dpy, GC gc, int function){	XGCValues *vp = (XGCValues *)gc->ext_data;	int mode = _nxConvertROP(function);	vp->function = function;	/* must OR in clip mode when GrSetGCMode called*/	if (vp->subwindow_mode == IncludeInferiors)		mode |= GR_MODE_EXCLUDECHILDREN;	GrSetGCMode(gc->gid, mode);	return 1;}intXSetSubwindowMode(Display *dpy, GC gc, int subwindow_mode){	XGCValues *vp = (XGCValues *)gc->ext_data;	int mode;	vp->subwindow_mode = subwindow_mode;	mode = (subwindow_mode == IncludeInferiors)? GR_MODE_EXCLUDECHILDREN: 0;	/* must OR in draw mode when GrSetGCMode called*/	mode |= _nxConvertROP(vp->function);	GrSetGCMode(gc->gid, mode);	return 1;}intXSetForeground(Display *dpy, GC gc, unsigned long foreground){	XGCValues *vp = (XGCValues *)gc->ext_data;	GR_COLOR c = _nxColorvalFromPixelval(dpy, foreground);	vp->foreground = foreground;	GrSetGCForeground(gc->gid, c);//printf("XSetForeground clr %x pix %x\n", (int)c, (int)foreground);	return 1;}intXSetBackground(Display *dpy, GC gc, unsigned long background){	XGCValues *vp = (XGCValues *)gc->ext_data;	GR_COLOR c = _nxColorvalFromPixelval(dpy, background);	vp->background = background;	GrSetGCBackground(gc->gid, c);	return 1;}intXSetFont(Display *dpy, GC gc, Font font){	GrSetGCFont(gc->gid, font);	return 1;}intXSetFillStyle(Display * dpy, GC gc, int fill_style){	unsigned long mode = 0;	switch (fill_style) {	case FillTiled:		mode = GR_FILL_TILE;		break;	case FillStippled:		mode = GR_FILL_STIPPLE;		break;	case FillOpaqueStippled:		mode = GR_FILL_OPAQUE_STIPPLE;		break;	default:		mode = GR_FILL_SOLID;		break;	}	GrSetGCFillMode(gc->gid, mode);	return 1;}intXSetGraphicsExposures(Display * display, GC gc, int graphics){	GrSetGCGraphicsExposure(gc->gid, graphics);	return 1;}intXSetTSOrigin(Display * display, GC gc, int ts_x_origin, int ts_y_origin){	/* FIXME REMOVED for FLTK test/bitmap*/	/* it seems that XSetTSOrigin works differently than nano-X?*/	/**GrSetGCTSOffset(gc->gid, ts_x_origin, ts_y_origin);**/	return 1;}intXSetTile(Display * display, GC gc, Pixmap tile){	GR_WINDOW_INFO wi;	GrGetWindowInfo(tile, &wi);	GrSetGCTile(gc->gid, tile, wi.width, wi.height);	return 1;}intXSetStipple(Display * display, GC gc, Pixmap stipple){	GR_WINDOW_INFO wi;	GR_BITMAP *bitmap;	GrGetWindowInfo(stipple, &wi);	bitmap = GrNewBitmapFromPixmap(stipple, 0, 0, wi.width, wi.height);	GrSetGCStipple(gc->gid, bitmap, wi.width, wi.height);	free(bitmap);	return 1;}intXSetDashes(Display * display, GC gc, int dash_offset,	   _Xconst char *dash_list, int n){	if (dash_offset)		printf("XSetDashes: dash offset not implemented\n");	GrSetGCDash(gc->gid, (char *)dash_list, n);	return 1;}#if 0#define	GXclear			0x0		/* 0 */#define GXand			0x1		/* src AND dst */#define GXandReverse		0x2		/* src AND NOT dst */#define GXcopy			0x3		/* src */#define GXandInverted		0x4		/* NOT src AND dst */#define	GXnoop			0x5		/* dst */#define GXxor			0x6		/* src XOR dst */#define GXor			0x7		/* src OR dst */#define GXnor			0x8		/* NOT src AND NOT dst */#define GXequiv			0x9		/* NOT src XOR dst */#define GXinvert		0xa		/* NOT dst */#define GXorReverse		0xb		/* src OR NOT dst */#define GXcopyInverted		0xc		/* NOT src */#define GXorInverted		0xd		/* NOT src OR dst */#define GXnand			0xe		/* NOT src OR NOT dst */#define GXset			0xf		/* 1 */#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -