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

📄 color.c

📁 这是一个同样来自贝尔实验室的和UNIX有着渊源的操作系统, 其简洁的设计和实现易于我们学习和理解
💻 C
字号:
#include "vnc.h"#include "vncv.h"enum {	RGB12 = CHAN4(CIgnore, 4, CRed, 4, CGreen, 4, CBlue, 4),	BGR12 = CHAN4(CIgnore, 4, CBlue, 4, CGreen, 4, CRed, 4),	BGR8 = CHAN3(CBlue, 2, CGreen, 3, CRed, 3),};void (*cvtpixels)(uchar*, uchar*, int);static voidchan2fmt(Pixfmt *fmt, ulong chan){	ulong c, rc, shift;	shift = 0;	for(rc = chan; rc; rc >>=8){		c = rc & 0xFF;		switch(TYPE(c)){		case CRed:			fmt->red = (Colorfmt){(1<<NBITS(c))-1, shift};			break;		case CBlue:			fmt->blue = (Colorfmt){(1<<NBITS(c))-1, shift};			break;		case CGreen:			fmt->green = (Colorfmt){(1<<NBITS(c))-1, shift};			break;		}		shift += NBITS(c);	}}/* * convert 32-bit data to 24-bit data by skipping * the last of every four bytes.  we skip the last * because we keep the server in little endian mode. */static voidcvt32to24(uchar *dst, uchar *src, int npixel){	int i;	for(i=0; i<npixel; i++){		*dst++ = *src++;		*dst++ = *src++;		*dst++ = *src++;		src++;	}}/* * convert RGB12 (x4r4g4b4) into CMAP8 */static uchar rgb12[16*16*16];static voidmkrgbtab(void){	int r, g, b;	for(r=0; r<16; r++)	for(g=0; g<16; g++)	for(b=0; b<16; b++)		rgb12[r*256+g*16+b] = rgb2cmap(r*0x11, g*0x11, b*0x11);}static voidcvtrgb12tocmap8(uchar *dst, uchar *src, int npixel){	int i, s;	for(i=0; i<npixel; i++){		s = (src[0] | (src[1]<<8)) & 0xFFF;		*dst++ = rgb12[s];		src += 2;	}}/* * convert BGR8 (b2g3r3, default VNC format) to CMAP8  * some bits are lost. */static uchar bgr8[256];static voidmkbgrtab(void){	int i, r, g, b;	for(i=0; i<256; i++){		b = i>>6;		b = (b<<6)|(b<<4)|(b<<2)|b;		g = (i>>3) & 7;		g = (g<<5)|(g<<2)|(g>>1);		r = i & 7;		r = (r<<5)|(r<<2)|(r>>1);		bgr8[i] = rgb2cmap(r, g, b);	}}static voidcvtbgr332tocmap8(uchar *dst, uchar *src, int npixel){	uchar *ed;	ed = dst+npixel;	while(dst < ed)		*dst++ = bgr8[*src++];}voidchoosecolor(Vnc *v){	int bpp, depth;	ulong chan;	bpp = screen->depth;	if((bpp / 8) * 8 != bpp)		sysfatal("screen not supported");	depth = screen->depth;	chan = screen->chan;	if(bpp == 24){		if(verbose)			fprint(2, "24bit emulation using 32bpp\n");		bpp = 32;		cvtpixels = cvt32to24;	}	if(chan == CMAP8){		if(bpp12){			if(verbose)				fprint(2, "8bit emulation using 12bpp\n");			bpp = 16;			depth = 12;			chan = RGB12;			cvtpixels = cvtrgb12tocmap8;			mkrgbtab();		}else{			if(verbose)				fprint(2, "8bit emulation using 6bpp\n");	/* 6: we throw away 1 r, g bit */			bpp = 8;			depth = 8;			chan = BGR8;			cvtpixels = cvtbgr332tocmap8;			mkbgrtab();		}	}	v->bpp = bpp;	v->depth = depth;	v->truecolor = 1;	v->bigendian = 0;	chan2fmt(v, chan);	if(v->red.max == 0 || v->green.max == 0 || v->blue.max == 0)		sysfatal("screen not supported");	if(verbose)		fprint(2, "%d bpp, %d depth, 0x%lx chan, %d truecolor, %d bigendian\n",			v->bpp, v->depth, screen->chan, v->truecolor, v->bigendian);	/* send information to server */	vncwrchar(v, MPixFmt);	vncwrchar(v, 0);	/* padding */	vncwrshort(v, 0);	vncwrpixfmt(v, &v->Pixfmt);	vncflush(v);}

⌨️ 快捷键说明

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