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

📄 scr_x11.c

📁 神龙卡开发原代码
💻 C
📖 第 1 页 / 共 2 页
字号:
	    name = ":0";	if ((x11_dpy = XOpenDisplay(name)) == NULL)	    return -1;	XSetErrorHandler(x11_error);	x11_scr = XDefaultScreen(x11_dpy);	x11_vis = select_visual(x11_dpy, x11_scr);	x11_gc = XDefaultGC(x11_dpy, x11_scr);	for (i = 0; i < COLOR_CACHE_SIZE; i++)	    ccache[i].init = 1;	set_mode(gr_mode);	setup_needed = 0;	return 0;    }    return 0;}/* Note: only single screen */static PSDX11_open(PSD psd){    XSetWindowAttributes attr;    Pixmap cur_empty;    unsigned long valuemask;    unsigned int  event_mask;    XColor color;    Cursor cursor;    /*XEvent ev;*/    PSUBDRIVER subdriver;    int size, linelen;    if (x11_setup_display() < 0)	return NULL;    x11_event_mask = ColormapChangeMask | FocusChangeMask;/*x11_event_mask |= EnterWindowMask | LeaveWindowMask;*/    event_mask = x11_event_mask |                     ExposureMask |	             KeyPressMask |       /* handled by kbd_x11 */	             KeyReleaseMask |     /* handled by kbd_x11 */	             ButtonPressMask |    /* handled by mou_x11 */		     ButtonReleaseMask |  /* handled by mou_x11 */		     PointerMotionMask;   /* handled by mou_x11 */		     #ifdef USE_EXPOSURE    valuemask = CWSaveUnder |      CWEventMask;#else    valuemask = CWSaveUnder |      CWEventMask |      CWBackingStore;#endif        attr.backing_store = Always;     /* auto expose */    attr.save_under    = True;       /* popups ... */    attr.event_mask    = event_mask;    x11_win = XCreateWindow(x11_dpy,			    XDefaultRootWindow(x11_dpy),			    100,             /* x */			    100,             /* y */			    SCREEN_WIDTH,    /* width */			    SCREEN_HEIGHT,   /* height */			    2,               /* border */			    CopyFromParent,  /* depth */			    CopyFromParent,  /* depth */			    x11_vis,         /* Visual */			    valuemask,	     /* valuemask */			    &attr            /* attributes */			    );    /* Create a new empty colormap, the colormap will be     ** filled by lookup_color in the case of     ** GrayScale, PseduoColor and DirectColor,     ** or looked up in the case of      **  StaticGray, StaticColor and TrueColor     */    x11_colormap = XDefaultColormap(x11_dpy, x11_scr);    if (x11_vis->class & 1)	x11_colormap = XCopyColormapAndFree(x11_dpy, x11_colormap);    /* If you need more colors, create it from scratch     *     * x11_colormap = XCreateColormap(x11_dpy, x11_win, x11_vis,     * AllocNone);       *     * or: for same visual etc.     * x11_colormap = XCopyColormapAndFree(x11_dpy, x11_colormap);     */    /* Create an empty (invisible) cursor */    cur_empty = XCreateBitmapFromData(x11_dpy, x11_win, "\0", 1, 1);    cursor = XCreatePixmapCursor(x11_dpy, cur_empty, cur_empty,				 &color, &color, 0, 0);    XDefineCursor(x11_dpy, x11_win, cursor);    XStoreName(x11_dpy, x11_win, "Microwindows");    XMapWindow(x11_dpy, x11_win);    XFlush(x11_dpy);    /*     * The following code insures that the colormap     * is installed before display     */#if 0    XMaskEvent(x11_dpy, x11_event_mask, &ev);    XPutBackEvent(x11_dpy, &ev);#endif    XInstallColormap(x11_dpy, x11_colormap);    psd->xres    = psd->xvirtres    = SCREEN_WIDTH;    psd->yres    = psd->yvirtres    = SCREEN_HEIGHT;    psd->linelen = SCREEN_WIDTH;    psd->planes  = 1;    psd->pixtype = x11_pixtype = MWPIXEL_FORMAT;    switch(psd->pixtype) {    case MWPF_PALETTE:	    psd->bpp = SCREEN_DEPTH;	    break;    case MWPF_TRUECOLOR0888:    default:	    psd->bpp = 32;	    break;    case MWPF_TRUECOLOR888:	    psd->bpp = 24;	    break;    case MWPF_TRUECOLOR565:    case MWPF_TRUECOLOR555:	    psd->bpp = 16;	    break;    case MWPF_TRUECOLOR332:	    psd->bpp = 8;	    break;    }    /* Calculate the correct linelen here */    GdCalcMemGCAlloc(psd, psd->xres, psd->yres, psd->planes,		     psd->bpp, &size, &psd->linelen);        psd->ncolors = psd->bpp >= 24? (1 << 24): (1 << psd->bpp);    psd->flags   = PSF_SCREEN | PSF_HAVEBLIT;    psd->size = 0;    psd->addr = NULL;    psd->portrait = MWPORTRAIT_NONE;    /* create permanent savebits memory device from screen device*/    savebits = *psd;    savebits.flags = PSF_MEMORY | PSF_HAVEBLIT;    /* select a fb subdriver matching our planes and bpp*/    subdriver = select_fb_subdriver(&savebits);    if (!subdriver)	    return NULL;    /* calc size and linelen of savebits alloc*/    /* JHC - Is this redundant now?? */    GdCalcMemGCAlloc(&savebits, savebits.xvirtres, savebits.yvirtres, 0, 0,		&size, &linelen);    savebits.linelen = linelen;    savebits.size = size;    if ((savebits.addr = malloc(size)) == NULL)	return NULL;    set_subdriver(&savebits, subdriver, TRUE);    /* set X11 psd to savebits memaddr for screen->offscreen blits...*/    psd->addr = savebits.addr;    return psd;}static voidX11_close(PSD psd){    /* free savebits memory*/    free(savebits.addr);    XCloseDisplay(x11_dpy);}static voidX11_getscreeninfo(PSD psd,PMWSCREENINFO psi){    psi->rows = psd->yvirtres;    psi->cols = psd->xvirtres;    psi->planes = psd->planes;    psi->bpp = psd->bpp;    psi->ncolors = psd->ncolors;    psi->portrait = psd->portrait;    psi->fonts = NUMBER_FONTS;    psi->xdpcm = (DisplayWidth(x11_dpy,x11_scr)*10)/	    DisplayWidthMM(x11_dpy,x11_scr);    psi->ydpcm = (DisplayHeight(x11_dpy,x11_scr)*10)/	    DisplayHeightMM(x11_dpy,x11_scr);	psi->fbdriver = FALSE;	/* not running fb driver, no direct map*/	psi->pixtype = psd->pixtype;	switch (psd->pixtype) {	case MWPF_TRUECOLOR0888:	case MWPF_TRUECOLOR888:		psi->rmask 	= 0xff0000;		psi->gmask 	= 0x00ff00;		psi->bmask	= 0x0000ff;		break;	case MWPF_TRUECOLOR565:		psi->rmask 	= 0xf800;		psi->gmask 	= 0x07e0;		psi->bmask	= 0x001f;		break;	case MWPF_TRUECOLOR555:		psi->rmask 	= 0x7c00;		psi->gmask 	= 0x03e0;		psi->bmask	= 0x001f;		break;	case MWPF_TRUECOLOR332:		psi->rmask 	= 0xe0;		psi->gmask 	= 0x1c;		psi->bmask	= 0x03;		break;	case MWPF_PALETTE:	default:		psi->rmask 	= 0xff;		psi->gmask 	= 0xff;		psi->bmask	= 0xff;		break;	}}static voidX11_setpalette(PSD psd, int first, int count, MWPALENTRY *pal){    int i;    int n;    for (i = 0; i < count; i++) {	char spec[20];	unsigned short r, g, b;	XColor exact;	XColor def;	r = pal[i].r;	g = pal[i].g;	b = pal[i].b;	sprintf(spec, "#%02x%02x%02x", r, g, b);	XLookupColor(x11_dpy, x11_colormap, spec, &exact, &def);	XAllocColor(x11_dpy, x11_colormap, &def);	 /* DPRINTF("lookup: exact(%d,%d,%d) = %d, def(%d,%d,%d)=%d\n",	   exact.red, exact.green, exact.blue, exact.pixel,	   def.red, def.green, def.blue, def.pixel); */	x11_palette[first+i] = def;    }    n = first + count - 1;    if (n > x11_pal_max)	x11_pal_max = n;}static voidX11_drawpixel(PSD psd, MWCOORD x, MWCOORD y, MWPIXELVAL c){	set_color(c);	set_mode(gr_mode);	XDrawPoint(x11_dpy, x11_win, x11_gc, x, y);	/* draw savebits for readpixel or blit*/	savebits.DrawPixel(&savebits, x, y, c);}static MWPIXELVALX11_readpixel(PSD psd, MWCOORD x, MWCOORD y){	/* read savebits for pixel value, rather than ask X11*/	return savebits.ReadPixel(&savebits,x,y);}static voidX11_drawhline(PSD psd,MWCOORD x1, MWCOORD x2, MWCOORD y, MWPIXELVAL c){	set_color(c);	set_mode(gr_mode);	XDrawLine(x11_dpy, x11_win, x11_gc, x1, y, x2, y);	/* draw savebits for readpixel or blit*/	savebits.DrawHorzLine(&savebits, x1, x2, y, c);}static voidX11_drawvline(PSD psd,MWCOORD x, MWCOORD y1, MWCOORD y2, MWPIXELVAL c){	set_color(c);	set_mode(gr_mode);	XDrawLine(x11_dpy, x11_win, x11_gc, x, y1, x, y2);	savebits.DrawVertLine(&savebits, x, y1, y2, c);}static voidX11_fillrect(PSD psd,MWCOORD x1, MWCOORD y1, MWCOORD x2, MWCOORD y2, MWPIXELVAL c){	set_color(c);	set_mode(gr_mode);	XFillRectangle(x11_dpy, x11_win, x11_gc, x1, y1, (x2-x1)+1, (y2-y1)+1);	/* draw savebits for readpixel or blit*/	savebits.FillRect(&savebits, x1, y1, x2, y2, c);}static voidX11_srccopyblit_screen_to_screen(PMWBLITARGS pb){}static voidX11_blendconstantblit_screen_to_mem(PMWBLITARGS pb){}static voidX11_blit(PSD dstpsd,MWCOORD destx,MWCOORD desty,MWCOORD w,MWCOORD h,	 PSD srcpsd,MWCOORD srcx,MWCOORD srcy, long op){#if ALPHABLEND    unsigned int alpha;#endif    set_mode(gr_mode);    if (dstpsd == srcpsd) {	if (dstpsd->flags & PSF_SCREEN) {	    XCopyArea(x11_dpy, x11_win, x11_win, x11_gc,		      srcx, srcy, w, h, destx, desty);	    /* update screen savebits as well*/	    savebits.Blit(&savebits, destx, desty, w, h,			&savebits, srcx, srcy, op);	}	else	    /* memory to memory blit, use offscreen blitter*/	    dstpsd->Blit(dstpsd, destx, desty, w, h, srcpsd, srcx, srcy, op);    }    else if (dstpsd->flags & PSF_SCREEN) {	XImage* img;	int depth = XDefaultDepth(x11_dpy, x11_scr);	int x, y;	char* data;	/* allocate buffer */	if (depth >= 24)	    data = malloc(w*4*h);	else if (depth > 8) /* 15, 16 */	    data = malloc(w*2*h);	else  /* 1,2,4,8 */	    data = malloc((w*depth+7)/8 * h);	/* copy from offscreen to screen */	img = XCreateImage(x11_dpy, x11_vis, depth, ZPixmap,			   0, data, w, h, 8, 0);#if ALPHABLEND && (MWPIXEL_FORMAT != MWPF_PALETTE)	if ((op & MWROP_EXTENSION) == MWROP_BLENDCONSTANT) {		alpha = op & 0xff;		for (y = 0; y < h; y++) {	  		for (x = 0; x < w; x++) {				MWPIXELVAL c = srcpsd->ReadPixel(srcpsd,srcx+x,srcy+y);				MWPIXELVAL cd = dstpsd->ReadPixel(dstpsd,destx+x,desty+y);				unsigned char nred = ALPHAPIXELRED(c, cd, alpha);				unsigned char ngreen = ALPHAPIXELGREEN(c, cd, alpha);				unsigned char nblue = ALPHAPIXELBLUE(c, cd, alpha);				unsigned long pixel = PIXELVAL_to_pixel(RGB2PIXEL(nred, ngreen, nblue), srcpsd->pixtype);				XPutPixel(img, x, y, pixel);				/* update screen savebits*/				savebits.DrawPixel(&savebits, destx+x, desty+y, RGB2PIXEL(nred, ngreen, nblue));	    		}		}	}	else {    		MWPIXELVAL c = 0;		unsigned long pixel;		for (y = 0; y < h; y++) {	    		for (x = 0; x < w; x++) {				if (op == MWROP_COPY)					c = srcpsd->ReadPixel(srcpsd,srcx+x,srcy+y);				else {					c = applyOpR(op,						srcpsd->ReadPixel(srcpsd,srcx+x,srcy+y),						dstpsd->ReadPixel(dstpsd,destx+x,desty+y));					pixel = PIXELVAL_to_pixel(c, srcpsd->pixtype);					XPutPixel(img, x, y, pixel);				}				pixel = PIXELVAL_to_pixel(c, srcpsd->pixtype);				XPutPixel(img, x, y, pixel);				/* update screen savebits*/				savebits.DrawPixel(&savebits, destx+x, desty+y, c);			}		}	}#else	for (y = 0; y < h; y++) {	    for (x = 0; x < w; x++) {		MWPIXELVAL c = srcpsd->ReadPixel(srcpsd,srcx+x,srcy+y);		unsigned long pixel = PIXELVAL_to_pixel(c, srcpsd->pixtype);		XPutPixel(img, x, y, pixel);		/* update screen savebits*/		savebits.DrawPixel(&savebits, destx+x, desty+y, c);	    }	}#endif	XPutImage(x11_dpy, x11_win, x11_gc, img, 0, 0, destx, desty, w, h);	XDestroyImage(img);    }    else if (srcpsd->flags & PSF_SCREEN) {	int x, y;#if ALPHABLEND && (MWPIXEL_FORMAT != MWPF_PALETTE)	if ((op & MWROP_EXTENSION) == MWROP_BLENDCONSTANT) {		alpha = op & 0xff;		for (y = 0; y < h; y++) {	  		for (x = 0; x < w; x++) {				MWPIXELVAL c = srcpsd->ReadPixel(srcpsd,srcx+x,srcy+y);				MWPIXELVAL cd = dstpsd->ReadPixel(dstpsd,destx+x,desty+y);				unsigned char nred = ALPHAPIXELRED(c, cd, alpha);				unsigned char ngreen = ALPHAPIXELGREEN(c, cd, alpha);				unsigned char nblue = ALPHAPIXELBLUE(c, cd, alpha);				dstpsd->DrawPixel(dstpsd, destx+x, desty+y, RGB2PIXEL(nred, ngreen, nblue));			}		}	}	else {		/* copy from screen to offscreen,		 * emulated by copy from offscreen bits, no alpha		 */		for (y = 0; y < h; y++) {			for (x = 0; x < w; x++) {					MWPIXELVAL c = srcpsd->ReadPixel(srcpsd,srcx+x,srcy+y);				dstpsd->DrawPixel(dstpsd, destx+x, desty+y, c);			}		}	}#else	/* copy from screen to offscreen, emulated by copy from offscreen bits*/	for (y = 0; y < h; y++) {	    for (x = 0; x < w; x++) {			MWPIXELVAL c = srcpsd->ReadPixel(srcpsd,srcx+x,srcy+y);		dstpsd->DrawPixel(dstpsd, destx+x, desty+y, c);	    }	}#endif    }}/* perform pre-select() duties*/static voidX11_preselect(PSD psd){	XFlush(x11_dpy);}

⌨️ 快捷键说明

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