cvt.c

来自「足球机器人自动程序」· C语言 代码 · 共 242 行

C
242
字号
#include "cvt.h"static inline unsigned char sat(int c) {	return( (c & ~255)? (c<0)?0:255 : c );}void cvt(const unsigned char * restrict py1, unsigned char * restrict pd1) {	const unsigned char *py2 = py1 + W;	const unsigned char *pu = py1 + Y_SIZE;	const unsigned char *pv = pu + U_SIZE;	unsigned char *pd2 = pd1 + W*4;	int y, u, v;	int b, g, r;	int i, j;	for (i=0; i<H_2; ++i) {		for (j=0; j<W_2; ++j) {			u = *(pu++) - 128;			v = *(pv++) - 128;			b = (454*u) >> 8;			g = (183*v + 88*u) >> 8;			r = (359*v) >> 8;			y = *(py1++);			*(pd1++) = sat(y + b);			*(pd1++) = sat(y - g);			*(pd1++) = sat(y + r);			++pd1;			y = *(py1++);			*(pd1++) = sat(y + b);			*(pd1++) = sat(y - g);			*(pd1++) = sat(y + r);			++pd1;			y = *(py2++);			*(pd2++) = sat(y + b);			*(pd2++) = sat(y - g);			*(pd2++) = sat(y + r);			++pd2;			y = *(py2++);			*(pd2++) = sat(y + b);			*(pd2++) = sat(y - g);			*(pd2++) = sat(y + r);			++pd2;		}		py1 = py2;		py2 += W;		pd1 = pd2;		pd2 += W*4;	}}void cvtm(const unsigned char * restrict py1, unsigned char * restrict pd1, const int * restrict mask, int c) {	const unsigned char *py2 = py1 + W;	const unsigned char *pu = py1 + Y_SIZE;	const unsigned char *pv = pu + U_SIZE;	unsigned char *pd2 = pd1 + W*4;	int y, u, v;	int b, g, r;	int i, j;	for (i=0; i<H_2; ++i) {		for (j=0; j<W_2; ++j) {			if (*mask == c) {				++pu;				++pv;				py1 += 2;				py2 += 2;				*(pd1++) = 0;				*(pd1++) = 255;				*(pd1++) = 0;				++pd1;				*(pd1++) = 0;				*(pd1++) = 255;				*(pd1++) = 0;				++pd1;				*(pd2++) = 0;				*(pd2++) = 255;				*(pd2++) = 0;				++pd2;				*(pd2++) = 0;				*(pd2++) = 255;				*(pd2++) = 0;				++pd2;			}			else if (*mask) {				++pu;				++pv;				py1 += 2;				py2 += 2;				*(pd1++) = 255;				*(pd1++) = 255;				*(pd1++) = 255;				++pd1;				*(pd1++) = 255;				*(pd1++) = 255;				*(pd1++) = 255;				++pd1;				*(pd2++) = 255;				*(pd2++) = 255;				*(pd2++) = 255;				++pd2;				*(pd2++) = 255;				*(pd2++) = 255;				*(pd2++) = 255;				++pd2;			}			else {				u = *(pu++) - 128;				v = *(pv++) - 128;				b = (454*u) >> 8;				g = (183*v + 88*u) >> 8;				r = (359*v) >> 8;				y = *(py1++);				*(pd1++) = sat(y + b);				*(pd1++) = sat(y - g);				*(pd1++) = sat(y + r);				++pd1;				y = *(py1++);				*(pd1++) = sat(y + b);				*(pd1++) = sat(y - g);				*(pd1++) = sat(y + r);				++pd1;				y = *(py2++);				*(pd2++) = sat(y + b);				*(pd2++) = sat(y - g);				*(pd2++) = sat(y + r);				++pd2;				y = *(py2++);				*(pd2++) = sat(y + b);				*(pd2++) = sat(y - g);				*(pd2++) = sat(y + r);				++pd2;			}			++mask;		}		py1 = py2;		py2 += W;		pd1 = pd2;		pd2 += W*4;		++mask;	}}void cvtc(const unsigned char * restrict py1, unsigned char * restrict pd1, const int * restrict mask, const int (* restrict rgb)[3]) {	const unsigned char *py2 = py1 + W;	const unsigned char *pu = py1 + Y_SIZE;	const unsigned char *pv = pu + U_SIZE;	unsigned char *pd2 = pd1 + W*4;	int y, u, v;	int b, g, r;	int i, j;	for (i=0; i<H_2; ++i) {		for (j=0; j<W_2; ++j) {			if (*mask) {				++pu;				++pv;				py1 += 2;				py2 += 2;				b = rgb[*mask][0];				g = rgb[*mask][1];				r = rgb[*mask][2];				*(pd1++) = b;				*(pd1++) = g;				*(pd1++) = r;				++pd1;				*(pd1++) = b;				*(pd1++) = g;				*(pd1++) = r;				++pd1;				*(pd2++) = b;				*(pd2++) = g;				*(pd2++) = r;				++pd2;				*(pd2++) = b;				*(pd2++) = g;				*(pd2++) = r;				++pd2;			}			else {				u = *(pu++) - 128;				v = *(pv++) - 128;				b = (454*u) >> 8;				g = (183*v + 88*u) >> 8;				r = (359*v) >> 8;				y = *(py1++);				*(pd1++) = sat(y + b);				*(pd1++) = sat(y - g);				*(pd1++) = sat(y + r);				++pd1;				y = *(py1++);				*(pd1++) = sat(y + b);				*(pd1++) = sat(y - g);				*(pd1++) = sat(y + r);				++pd1;				y = *(py2++);				*(pd2++) = sat(y + b);				*(pd2++) = sat(y - g);				*(pd2++) = sat(y + r);				++pd2;				y = *(py2++);				*(pd2++) = sat(y + b);				*(pd2++) = sat(y - g);				*(pd2++) = sat(y + r);				++pd2;			}			++mask;		}		py1 = py2;		py2 += W;		pd1 = pd2;		pd2 += W*4;		++mask;	}}

⌨️ 快捷键说明

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