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

📄 devopen.c

📁 神龙卡开发原代码
💻 C
字号:
/* * Copyright (c) 1999, 2000, 2001 Greg Haerr <greg@censoft.com> * Portions Copyright (c) 1991 David I. Bell * Permission is granted to use, distribute, or modify this source, * provided that this copyright notice remains intact. * * Device-independent mid level screen device init routines * * These routines implement the smallest Microwindows engine level * interface to the screen driver.  By setting the NOFONTSORCLIPPING * config option, only these routines will be included, which can * be used to generate a low-level interface to the screen drivers * without dragging in any other GdXXX routines. */#include <stdio.h>#include <stdlib.h>#include "device.h"#include "swap.h"#if MSDOS | ELKS#define NOSTDPAL8#endif/* * The following define can change depending on the window manager * usage of colors and layout of the 8bpp palette devpal8.c. * Color entries below this value won't be overwritten by user * programs or bitmap display conversion tables. */#define FIRSTUSERPALENTRY	24  /* first writable pal entry over 16 color*/       MWPIXELVAL gr_foreground;      /* current foreground color */       MWPIXELVAL gr_background;      /* current background color */       MWBOOL 	gr_usebg;    	    /* TRUE if background drawn in pixmaps */       int 	gr_mode = MWMODE_COPY; 	    /* drawing mode *//*static*/ MWPALENTRY	gr_palette[256];    /* current palette*//*static*/ int	gr_firstuserpalentry;/* first user-changable palette entry*//*static*/ int 	gr_nextpalentry;    /* next available palette entry*/static int	gr_pixtype;	    /* screen pixel format*/static long	gr_ncolors;	    /* screen # colors*//* * Open low level graphics driver */PSDGdOpenScreen(void){	PSD			psd;	MWPALENTRY *		stdpal;	MWSCREENINFO		sinfo;	    	psd = scrdev.Open(&scrdev);	if (!psd)		return NULL;	GdGetScreenInfo(psd, &sinfo);	gr_pixtype = sinfo.pixtype;	gr_ncolors = sinfo.ncolors;	/* assume no user changable palette entries*/	gr_firstuserpalentry = (int)psd->ncolors;	/* set palette according to system colors and devpalX.c*/	switch((int)psd->ncolors) {#if !defined(NOSTDPAL1) /* don't require stdpal1 if not needed */	case 2:		/* 1bpp*/	{		extern MWPALENTRY	mwstdpal1[2];		stdpal = mwstdpal1;	}	break;#endif#if !defined(NOSTDPAL2) /* don't require stdpal2 if not needed */	case 4:		/* 2bpp*/	{		extern MWPALENTRY	mwstdpal2[4];		stdpal = mwstdpal2;	}	break;#endif#if !defined(NOSTDPAL4)	/* don't require stdpal4 if not needed */	case 8:		/* 3bpp - not fully supported*/	case 16:	/* 4bpp*/	{		extern MWPALENTRY	mwstdpal4[16];		stdpal = mwstdpal4;	}	break;#endif#if !defined(NOSTDPAL8) /* don't require large stdpal8 if not needed */	case 256:	/* 8bpp*/	{		extern MWPALENTRY	mwstdpal8[256];#if xxxALPHABLEND		/* don't change uniform palette if alpha blending*/		gr_firstuserpalentry = 256;#else		/* start after last system-reserved color*/		gr_firstuserpalentry = FIRSTUSERPALENTRY;#endif		stdpal = mwstdpal8;	} 	break;#endif	/* !defined(NOSTDPAL8)*/	default:	/* truecolor*/		/* no palette*/		gr_firstuserpalentry = 0;		stdpal = NULL;	}	/* reset next user palette entry, write hardware palette*/	GdResetPalette();	GdSetPalette(psd, 0, (int)psd->ncolors, stdpal);#if xxxALPHABLEND	/* one-time create alpha lookup table for 8bpp systems (takes ~1 sec)*/	if(psd->ncolors == 256)		init_alpha_lookup();#endif#if !NOFONTSORCLIPPING	/* init local vars*/	GdSetMode(MWMODE_COPY);	GdSetForeground(GdFindColor(MWRGB(255, 255, 255)));	/* WHITE*/	GdSetBackground(GdFindColor(MWRGB(0, 0, 0)));		/* BLACK*/	GdSetUseBackground(TRUE);	GdSetFont(GdCreateFont(psd, MWFONT_SYSTEM_VAR, 0, NULL));#if DYNAMICREGIONS	GdSetClipRegion(psd, 		GdAllocRectRegion(0, 0, psd->xvirtres, psd->yvirtres));#else	GdSetClipRects(psd, 0, NULL);#endif /* DYNAMICREGIONS*/#endif /* NOFONTSORCLIPPING*/	/* fill black (actually fill to first palette entry or truecolor 0*/	psd->FillRect(psd, 0, 0, psd->xvirtres-1, psd->yvirtres-1, 0);	return psd;}/* * Close low level graphics driver */void GdCloseScreen(PSD psd){	psd->Close(psd);}/* Set dynamic screen portrait mode, return new mode*/intGdSetPortraitMode(PSD psd, int portraitmode){	/* set portrait mode if supported*/	if (psd->SetPortrait)		psd->SetPortrait(psd, portraitmode);	return psd->portrait;}/* * Return about the screen. */voidGdGetScreenInfo(PSD psd, PMWSCREENINFO psi){	psd->GetScreenInfo(psd, psi);	GdGetButtonInfo(&psi->buttons);	GdGetModifierInfo(&psi->modifiers, NULL);	GdGetCursorPos(&psi->xpos, &psi->ypos);}/* reset palette to empty except for system colors*/voidGdResetPalette(void){	/* note: when palette entries are changed, all 	 * windows may need to be redrawn	 */	gr_nextpalentry = gr_firstuserpalentry;}/* set the system palette section to the passed palette entries*/voidGdSetPalette(PSD psd, int first, int count, MWPALENTRY *palette){	int	i;	/* no palette management needed if running truecolor*/	if(psd->pixtype != MWPF_PALETTE)		return;	/* bounds check against # of device color entries*/	if(first + count > (int)psd->ncolors)		count = (int)psd->ncolors - first;	if(count >= 0 && first < (int)psd->ncolors) {		psd->SetPalette(psd, first, count, palette);		/* copy palette for GdFind*Color*/		for(i=0; i<count; ++i)			gr_palette[i+first] = palette[i];	}}/* get system palette entries, return count*/intGdGetPalette(PSD psd, int first, int count, MWPALENTRY *palette){	int	i;	/* no palette if running truecolor*/	if(psd->pixtype != MWPF_PALETTE)		return 0;	/* bounds check against # of device color entries*/	if(first + count > (int)psd->ncolors)		if( (count = (int)psd->ncolors - first) <= 0)			return 0;	for(i=0; i<count; ++i)		*palette++ = gr_palette[i+first];	return count;}/* * Convert a palette-independent value to a hardware color */MWPIXELVALGdFindColor(MWCOLORVAL c){	/*	 * Handle truecolor displays.  Note that the MWF_PALINDEX	 * bit is ignored when running truecolor drivers.	 */	switch(gr_pixtype) {	case MWPF_TRUECOLOR0888:	case MWPF_TRUECOLOR888:		/* create 24 bit 8/8/8 pixel (0x00RRGGBB) from RGB colorval*/		/*RGB2PIXEL888(REDVALUE(c), GREENVALUE(c), BLUEVALUE(c))*/		return COLOR2PIXEL888(c);	case MWPF_TRUECOLOR565:		/* create 16 bit 5/6/5 format pixel from RGB colorval*/		/*RGB2PIXEL565(REDVALUE(c), GREENVALUE(c), BLUEVALUE(c))*/		return COLOR2PIXEL565(c);	case MWPF_TRUECOLOR555:		/* create 16 bit 5/5/5 format pixel from RGB colorval*/		/*RGB2PIXEL555(REDVALUE(c), GREENVALUE(c), BLUEVALUE(c))*/		return COLOR2PIXEL555(c);	case MWPF_TRUECOLOR332:		/* create 8 bit 3/3/2 format pixel from RGB colorval*/		/*RGB2PIXEL332(REDVALUE(c), GREENVALUE(c), BLUEVALUE(c))*/		return COLOR2PIXEL332(c);	}	/* case MWPF_PALETTE: must be running 1, 2, 4 or 8 bit palette*/	/*	 * Check if color is a palette index.  Note that the index	 * isn't error checked against the system palette, for speed.	 */	if(c & MWF_PALINDEX)		return (c & 0xff);	/* search palette for closest match*/	return GdFindNearestColor(gr_palette, (int)gr_ncolors, c);}/* * Search a palette to find the nearest color requested. * Uses a weighted squares comparison. */MWPIXELVALGdFindNearestColor(MWPALENTRY *pal, int size, MWCOLORVAL cr){	MWPALENTRY *	rgb;	int		r, g, b;	int		R, G, B;	long		diff = 0x7fffffffL;	long		sq;	int		best = 0;	r = REDVALUE(cr);	g = GREENVALUE(cr);	b = BLUEVALUE(cr);	for(rgb=pal; diff && rgb < &pal[size]; ++rgb) {		R = rgb->r - r;		G = rgb->g - g;		B = rgb->b - b;#if 1		/* speedy linear distance method*/		sq = abs(R) + abs(G) + abs(B);#else		/* slower distance-cubed with luminance adjustment*/		/* gray is .30R + .59G + .11B*/		/* = (R*77 + G*151 + B*28)/256*/		sq = (long)R*R*30*30 + (long)G*G*59*59 + (long)B*B*11*11;#endif		if(sq < diff) {			best = rgb - pal;			if((diff = sq) == 0)				return best;		}	}	return best;}#if !VXWORKS#include <unistd.h>#include <fcntl.h>/* * Create .bmp file from framebuffer data * * 1, 4, 8, 16, 24 and 32 bpp supported */#define BI_RGB		0L#define BI_RLE8		1L#define BI_RLE4		2L#define BI_BITFIELDS	3Ltypedef unsigned char	BYTE;typedef unsigned short	WORD;typedef unsigned long	DWORD;typedef long		LONG;#pragma pack(1)/* windows style bmp*/typedef struct {	/* BITMAPFILEHEADER*/	BYTE	bfType[2];	DWORD	bfSize;	WORD	bfReserved1;	WORD	bfReserved2;	DWORD	bfOffBits;	/* BITMAPINFOHEADER*/	DWORD	BiSize;	LONG	BiWidth;	LONG	BiHeight;	WORD	BiPlanes;	WORD	BiBitCount;	DWORD	BiCompression;	DWORD	BiSizeImage;	LONG	BiXpelsPerMeter;	LONG	BiYpelsPerMeter;	DWORD	BiClrUsed;	DWORD	BiClrImportant;} BMPHEAD;#pragma pack()/* r/g/b masks for non-palette bitmaps*/#define RMASK332	0xe0#define GMASK332	0x1c#define BMASK332	0x03#define RMASK555	0x7c00#define GMASK555	0x03e0#define BMASK555	0x001f#define RMASK565	0xf800#define GMASK565	0x07e0#define BMASK565	0x001f#define RMASK888	0xff0000#define GMASK888	0x00ff00#define BMASK888	0x0000ff#if defined(HAVE_FILEIO)static voidputsw(unsigned long dw, FILE *ofp){	/* little-endian storage of shortword*/	putc((unsigned char)dw, ofp);	dw >>= 8;	putc((unsigned char)dw, ofp);}static voidputdw(unsigned long dw, FILE *ofp){	/* little-endian storage of longword*/	putc((unsigned char)dw, ofp);	dw >>= 8;	putc((unsigned char)dw, ofp);	dw >>= 8;	putc((unsigned char)dw, ofp);	dw >>= 8;	putc((unsigned char)dw, ofp);}#endif /* HAVE_FILEIO*//* create .bmp file from framebuffer data*/intGdCaptureScreen(char *path){#if defined(HAVE_FILEIO)	int	ifd, i, j;	FILE *	ofp;	int	cx, cy, extra, bpp, bytespp, ncolors, sizecolortable;	unsigned long rmask, gmask, bmask;	unsigned char *cptr;	unsigned short *sptr;	unsigned long *lptr;	BMPHEAD	bmp;	unsigned char buf[2048*4];	ofp = fopen(path, "wb");	if (!ofp)		return 1;	ifd = open("/dev/fb0", 0);	cx = scrdev.xvirtres;	cy = scrdev.yvirtres;	bpp = scrdev.bpp;	bytespp = (bpp+7)/8;	/* dword right padded*/	extra = (cx*bytespp) & 3;	if (extra)		extra = 4 - extra;	ncolors = (bpp <= 8)? (1<<bpp): 0;	/* color table is either palette or 3 longword r/g/b masks*/	sizecolortable = ncolors? ncolors*4: 3*4;	if (bpp == 24)		sizecolortable = 0;	/* special case 24bpp has no table*/	/* fill out bmp header*/	memset(&bmp, 0, sizeof(bmp));	bmp.bfType[0] = 'B';	bmp.bfType[1] = 'M';	bmp.bfSize = dwswap(sizeof(bmp) + sizecolortable + (long)(cx+extra)*cy*bytespp);	bmp.bfOffBits = dwswap(sizeof(bmp) + sizecolortable);	bmp.BiSize = dwswap(40);	bmp.BiWidth = dwswap(cx);	bmp.BiHeight = dwswap(cy);	bmp.BiPlanes = wswap(1);	bmp.BiBitCount = wswap(bpp);	bmp.BiCompression = dwswap((bpp==16 || bpp==32)? BI_BITFIELDS: BI_RGB);	bmp.BiSizeImage = dwswap((long)(cx+extra)*cy*bytespp);	bmp.BiClrUsed = dwswap((bpp <= 8)? ncolors: 0);	/*bmp.BiClrImportant = 0;*/	/* write header*/	fwrite(&bmp, sizeof(bmp), 1, ofp);	/* write colortable*/	if (sizecolortable) {		if(bpp <= 8) {			/* write palette*/			for(i=0; i<ncolors; i++) {				putc(gr_palette[i].b, ofp);				putc(gr_palette[i].g, ofp);				putc(gr_palette[i].r, ofp);				putc(0, ofp);			}		} else {			/* write 3 r/g/b masks*/			switch (gr_pixtype) {			case MWPF_TRUECOLOR0888:			default:				rmask = RMASK888;				gmask = GMASK888;				bmask = BMASK888;				break;			case MWPF_TRUECOLOR565:				rmask = RMASK565;				gmask = GMASK565;				bmask = BMASK565;				break;			case MWPF_TRUECOLOR555:				rmask = RMASK555;				gmask = GMASK555;				bmask = BMASK555;				break;			case MWPF_TRUECOLOR332:				rmask = RMASK332;				gmask = GMASK332;				bmask = BMASK332;				break;			}			putdw(rmask, ofp);			putdw(gmask, ofp);			putdw(bmask, ofp);		}	}	/* write image data, upside down ;)*/	for(i=cy-1; i>=0; --i) {		long base = sizeof(bmp) + sizecolortable + (long)i*cx*bytespp;		fseek(ofp, base, SEEK_SET);		read(ifd, buf, cx*bytespp);		switch (bpp) {		case 32:			lptr = (unsigned long *)buf;			for(j=0; j<cx; ++j)				putdw(*lptr++, ofp);			break;		case 24:			cptr = (unsigned char *)buf;			for(j=0; j<cx; ++j) {				putc(*cptr++, ofp);				putc(*cptr++, ofp);				putc(*cptr++, ofp);			}			break;		case 16:			sptr = (unsigned short *)buf;			for(j=0; j<cx; ++j)				putsw(*sptr++, ofp);			break;		default:			cptr = (unsigned char *)buf;			for(j=0; j<cx; ++j)				putc(*cptr++, ofp);			break;		}		for(j=0; j<extra; ++j)			putc(0, ofp);		/* DWORD pad each line*/	}	fclose(ofp);	close(ifd);#endif /* HAVE_FILEIO*/	return 0;}#endif /* !VXWORKS*/

⌨️ 快捷键说明

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