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

📄 24bit.c

📁 32位操作系统OS/2的MPEG播放机
💻 C
字号:
/* * Copyright (c) 1992 The Regents of the University of California. * All rights reserved. *  * Permission to use, copy, modify, and distribute this software and its * documentation for any purpose, without fee, and without written agreement is * hereby granted, provided that the above copyright notice and the following * two paragraphs appear in all copies of this software. *  * IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY FOR * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE UNIVERSITY OF * CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *  * THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS * ON AN "AS IS" BASIS, AND THE UNIVERSITY OF CALIFORNIA HAS NO OBLIGATION TO * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. */#include "video.h"#include "dither.h"#include "proto.h"/* * We'll define the "ConvertColor" macro here to do fixed point arithmetic * that'll convert from YCrCb to RGB using: *	R = L + 1.40200*Cr; *	G = L - 0.34414*Cb - 0.71414*Cr *	B = L + 1.77200*Cb; * * We'll use fixed point by adding two extra bits after the decimal. */#define BITS	8#define ONE     ((int) 1)#define CONST_SCALE	(ONE << BITS)#define ROUND_FACTOR	(ONE << (BITS-1))/* Macro to convert integer to fixed. */#define UP(x)	(((int)(x)) << BITS)/* Macro to convert fixed to integer (with rounding). */#define DOWN(x)	(((x) + ROUND_FACTOR) >> BITS)/* Macro to convert a float to a fixed */#define FIX(x)  ((int) ((x)*CONST_SCALE + 0.5))#define CLAMP(ll,x,ul)	( ((x)<(ll)) ?(ll):( ((x)>(ul)) ?(ul):(x)))static int *Cb_r_tab, *Cr_g_tab, *Cb_g_tab, *Cr_b_tab;/* *-------------------------------------------------------------- * * InitColorDither -- * *	To get rid of the multiply and other conversions in color *	dither, we use a lookup table. * * Results: *	None. * * Side effects: *	The lookup tables are initialized. * *-------------------------------------------------------------- */voidInitColorDither(){    int CR, CB, i;    Cr_b_tab = (int *)malloc(256*sizeof(int));    Cr_g_tab = (int *)malloc(256*sizeof(int));    Cb_g_tab = (int *)malloc(256*sizeof(int));    Cb_r_tab = (int *)malloc(256*sizeof(int));    for (i=0; i<256; i++) {	CB = CR = i;	CB -= 128; CR -= 128;	Cb_r_tab[i] = FIX(1.40200) * CB;	Cr_g_tab[i] = -FIX(0.34414) * CR;	Cb_g_tab[i] = -FIX(0.71414) * CB;   	Cr_b_tab[i] = FIX(1.77200) * CR;    }}/* *-------------------------------------------------------------- * * ColorDitherImage -- * *	Converts image into 24 bit color. * * Results: *	None. * * Side effects: *	None. * *-------------------------------------------------------------- */voidColorDitherImage(lum, cr, cb, out, rows, cols)  unsigned char *lum;  unsigned char *cr;  unsigned char *cb;  unsigned char *out;  int cols, rows;{    int L, CR, CB;    unsigned int *row1, *row2;    unsigned char *lum2;    int x, y;    unsigned int r, b, g;    int cb_r;    int cr_g;    int cb_g;    int cr_b;    row1 = (unsigned int *)out;    row2 = row1 + cols;    lum2 = lum + cols;    for (y=0; y<rows; y+=2) {	for (x=0; x<cols; x+=2) {	    int R, G, B;	    CR = *cr++;	    CB = *cb++;	    cb_r = Cb_r_tab[CB];	    cr_g = Cr_g_tab[CR];	    cb_g = Cb_g_tab[CB];	    cr_b = Cr_b_tab[CR];	    L = *lum++;	    L = UP(L);	    R = L + cb_r;	    G = L + cr_g + cb_g;	    B = L + cr_b;#ifndef RS6000	    r = CLAMP(0,R,UP(255)) >> BITS;	    g = CLAMP(0,G,UP(255)) & 0xff00;	    b = (CLAMP(0,B,UP(255)) & 0xff00) << BITS;#else	    b = CLAMP(0,B,UP(255)) >> BITS;	    g = CLAMP(0,G,UP(255)) & 0xff00;	    r = (CLAMP(0,R,UP(255)) & 0xff00) << BITS;#endif	    *row1++ = r | g | b;	    L = *lum++;	    L = UP(L);	    R = L + cb_r;	    G = L + cr_g + cb_g;	    B = L + cr_b;#ifndef RS6000	    r = CLAMP(0,R,UP(255)) >> BITS;	    g = CLAMP(0,G,UP(255)) & 0xff00;	    b = (CLAMP(0,B,UP(255)) & 0xff00) << BITS;#else	    b = CLAMP(0,B,UP(255)) >> BITS;	    g = CLAMP(0,G,UP(255)) & 0xff00;	    r = (CLAMP(0,R,UP(255)) & 0xff00) << BITS;#endif	    *row1++ = r | g | b;	    /*	     * Now, do second row.	     */	    L = *lum2++;	    L = UP(L);	    R = L + cb_r;	    G = L + cr_g + cb_g;	    B = L + cr_b;#ifndef RS6000	    r = CLAMP(0,R,UP(255)) >> BITS;	    g = CLAMP(0,G,UP(255)) & 0xff00;	    b = (CLAMP(0,B,UP(255)) & 0xff00) << BITS;#else	    b = CLAMP(0,B,UP(255)) >> BITS;	    g = CLAMP(0,G,UP(255)) & 0xff00;	    r = (CLAMP(0,R,UP(255)) & 0xff00) << BITS;#endif	    *row2++ = r | g | b;	    L = *lum2++;	    L = UP(L);	    R = L + cb_r;	    G = L + cr_g + cb_g;	    B = L + cr_b;#ifndef RS6000	    r = CLAMP(0,R,UP(255)) >> BITS;	    g = CLAMP(0,G,UP(255)) & 0xff00;	    b = (CLAMP(0,B,UP(255)) & 0xff00) << BITS;#else	    b = CLAMP(0,B,UP(255)) >> BITS;	    g = CLAMP(0,G,UP(255)) & 0xff00;	    r = (CLAMP(0,R,UP(255)) & 0xff00) << BITS;#endif	    *row2++ = r | g | b;	}	lum += cols;	lum2 += cols;	row1 += cols;	row2 += cols;    }}

⌨️ 快捷键说明

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