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

📄 colrops.c

📁 [Game.Programming].Academic - Graphics Gems (6 books source code)
💻 C
字号:
/* Copyright (c) 1990 Regents of the University of California */#ifndef lintstatic char SCCSid[] = "@(#)colrops.c 1.3 11/9/90 LBL";#endif/* * Integer operations on COLR scanlines */#include "color.h"#define MAXGSHIFT	15		/* maximum shift for gamma table */static BYTE	g_mant[256], g_nexp[256];static BYTE	g_bval[MAXGSHIFT+1][256];setcolrgam(g)			/* set gamma conversion */double	g;{	extern double	pow();	double	mult;	register int	i, j;					/* compute colr -> gamb mapping */	for (i = 0; i <= MAXGSHIFT; i++) {		mult = pow(0.5, (double)(i+8));		for (j = 0; j < 256; j++)			g_bval[i][j] = 256.0 * pow((j+.5)*mult, 1.0/g);	}					/* compute gamb -> colr mapping */	i = 0;	mult = 256.0;	for (j = 255; j > 0; j--) {		while ((g_mant[j] = mult * pow(j/256.0, g)) < 128) {			i++;			mult *= 2.0;		}		g_nexp[j] = i;	}	g_mant[0] = 0;	g_nexp[0] = COLXS;}colrs_gambs(scan, len)		/* convert scanline of colrs to gamma bytes */register COLR	*scan;int	len;{	register int	i, expo;	while (len-- > 0) {		expo = scan[0][EXP] - COLXS;		if (expo < -MAXGSHIFT) {			if (expo < -MAXGSHIFT-8) {				scan[0][RED] =				scan[0][GRN] =				scan[0][BLU] = 0;			} else {				i = (-MAXGSHIFT-1) - expo;				scan[0][RED] = 				g_bval[MAXGSHIFT][((scan[0][RED]>>i)+1)>>1];				scan[0][GRN] =				g_bval[MAXGSHIFT][((scan[0][GRN]>>i)+1)>>1];				scan[0][BLU] =				g_bval[MAXGSHIFT][((scan[0][BLU]>>i)+1)>>1];			}		} else if (expo > 0) {			if (expo > 8) {				scan[0][RED] =				scan[0][GRN] =				scan[0][BLU] = 255;			} else {				i = (scan[0][RED]<<1 | 1) << (expo-1);				scan[0][RED] = i > 255 ? 255 : g_bval[0][i];				i = (scan[0][GRN]<<1 | 1) << (expo-1);				scan[0][GRN] = i > 255 ? 255 : g_bval[0][i];				i = (scan[0][BLU]<<1 | 1) << (expo-1);				scan[0][BLU] = i > 255 ? 255 : g_bval[0][i];			}		} else {			scan[0][RED] = g_bval[-expo][scan[0][RED]];			scan[0][GRN] = g_bval[-expo][scan[0][GRN]];			scan[0][BLU] = g_bval[-expo][scan[0][BLU]];		}		scan[0][EXP] = COLXS;		scan++;	}}gambs_colrs(scan, len)		/* convert gamma bytes to colr scanline */register COLR	*scan;int	len;{	register int	nexpo;	while (len-- > 0) {		nexpo = g_nexp[scan[0][RED]];		if (g_nexp[scan[0][GRN]] < nexpo)			nexpo = g_nexp[scan[0][GRN]];		if (g_nexp[scan[0][BLU]] < nexpo)			nexpo = g_nexp[scan[0][BLU]];		if (nexpo < g_nexp[scan[0][RED]])			scan[0][RED] = g_mant[scan[0][RED]]					>> (g_nexp[scan[0][RED]]-nexpo);		else			scan[0][RED] = g_mant[scan[0][RED]];		if (nexpo < g_nexp[scan[0][GRN]])			scan[0][GRN] = g_mant[scan[0][GRN]]					>> (g_nexp[scan[0][GRN]]-nexpo);		else			scan[0][GRN] = g_mant[scan[0][GRN]];		if (nexpo < g_nexp[scan[0][BLU]])			scan[0][BLU] = g_mant[scan[0][BLU]]					>> (g_nexp[scan[0][BLU]]-nexpo);		else			scan[0][BLU] = g_mant[scan[0][BLU]];		scan[0][EXP] = COLXS - nexpo;		scan++;	}}shiftcolrs(scan, len, adjust)	/* shift a scanline of colors by 2^adjust */register COLR	*scan;register int	len;register int	adjust;{	while (len-- > 0) {		scan[0][EXP] += adjust;		scan++;	}}normcolrs(scan, len, adjust)	/* normalize a scanline of colrs */register COLR  *scan;int  len;int  adjust;{	register int  c;	register int  shift;	while (len-- > 0) {		shift = scan[0][EXP] + adjust - COLXS;		if (shift > 0) {			if (shift > 8) {				scan[0][RED] =				scan[0][GRN] =				scan[0][BLU] = 255;			} else {				shift--;				c = (scan[0][RED]<<1 | 1) << shift;				scan[0][RED] = c > 255 ? 255 : c;				c = (scan[0][GRN]<<1 | 1) << shift;				scan[0][GRN] = c > 255 ? 255 : c;				c = (scan[0][BLU]<<1 | 1) << shift;				scan[0][BLU] = c > 255 ? 255 : c;			}		} else if (shift < 0) {			if (shift < -8) {				scan[0][RED] =				scan[0][GRN] =				scan[0][BLU] = 0;			} else {				shift = -1-shift;				scan[0][RED] = ((scan[0][RED]>>shift)+1)>>1;				scan[0][GRN] = ((scan[0][GRN]>>shift)+1)>>1;				scan[0][BLU] = ((scan[0][BLU]>>shift)+1)>>1;			}		}		scan[0][EXP] = COLXS - adjust;		scan++;	}}

⌨️ 快捷键说明

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