📄 color_packed.c
字号:
/* * colorspace conversion functions * -- packed pixel formats (rgb/gray right now) * * (c) 1998-2001 Gerd Knorr <kraxel@bytesex.org> * */#define NG_PRIVATE#include "config.h"#include <stdio.h>#include <stdlib.h>#include <unistd.h>#include <pthread.h>#include <sys/time.h>#include <sys/types.h>#include "grab-ng.h"/* ------------------------------------------------------------------- *//* RGB conversions */static voidredblue_swap(unsigned char *dest, unsigned char *src, int p){ register unsigned char *s = src; register unsigned char *d = dest; while (p--) { *(d++) = s[2]; *(d++) = s[1]; *(d++) = s[0]; s += 3; }}static voidbgr24_to_bgr32(unsigned char* restrict dest, unsigned char* restrict src, int p){ register unsigned char* restrict s = src; register unsigned char* restrict d = dest; while (p--) { *(d++) = *(s++); *(d++) = *(s++); *(d++) = *(s++); *(d++) = 0; }}static voidbgr24_to_rgb32(unsigned char* restrict dest, unsigned char* restrict src, int p){ register unsigned char* restrict s = src; register unsigned char* restrict d = dest; while (p--) { *(d++) = 0; *(d++) = s[2]; *(d++) = s[1]; *(d++) = s[0]; s +=3; }}static voidrgb32_to_rgb24(unsigned char* restrict dest, unsigned char* restrict src, int p){ register unsigned char* restrict s = src; register unsigned char* restrict d = dest; while (p--) { s++; *(d++) = *(s++); *(d++) = *(s++); *(d++) = *(s++); }}static voidrgb32_to_bgr24(unsigned char* restrict dest, unsigned char* restrict src, int p){ register unsigned char* restrict s = src; register unsigned char* restrict d = dest; while (p--) { s++; d[2] = *(s++); d[1] = *(s++); d[0] = *(s++); d += 3; }}/* 15+16 bpp LE <=> BE */static voidbyteswap_short(unsigned char* restrict dest, unsigned char* restrict src, int p){ register unsigned char* restrict s = src; register unsigned char* restrict d = dest; while (--p) { *(d++) = s[1]; *(d++) = s[0]; s += 2; }}/* ------------------------------------------------------------------- *//* color => grayscale */static voidrgb15_native_gray(unsigned char* restrict dest, unsigned char *s, int p){ int r,g,b; unsigned short* restrict src = (unsigned short*)s; while (p--) { r = (src[0] & 0x7c00) >> 10; g = (src[0] & 0x03e0) >> 5; b = src[0] & 0x001f; *(dest++) = ((3*r + 6*g + b)/10) << 3; src++; }}#if BYTE_ORDER == LITTLE_ENDIANstatic voidrgb15_be_gray(unsigned char* restrict dest, unsigned char* restrict src, int p){ int r,g,b; register unsigned char* restrict d = dest; while (p--) { r = (src[0] & 0x7c) >> 2; g = (src[0] & 0x03) << 3 | (src[1] & 0xe0) >> 5; b = src[1] & 0x1f; *(d++) = ((3*r + 6*g + b)/10) << 3; src += 2; }}#endif#if BYTE_ORDER == BIG_ENDIANstatic voidrgb15_le_gray(unsigned char* restrict dest, unsigned char* restrict src, int p){ int r,g,b; register unsigned char* restrict d = dest; while (p--) { r = (src[1] & 0x7c) >> 2; g = (src[1] & 0x03) << 3 | (src[0] & 0xe0) >> 5; b = src[0] & 0x1f; *(d++) = ((3*r + 6*g + b)/10) << 3; src += 2; }}#endif/* ------------------------------------------------------------------- */static struct ng_video_conv conv_list[] = { { /* ----------------------------------- write GRAY -- */ #if BYTE_ORDER == BIG_ENDIAN NG_GENERIC_PACKED, .fmtid_in = VIDEO_RGB15_BE, .fmtid_out = VIDEO_GRAY, .priv = rgb15_native_gray, }, { NG_GENERIC_PACKED, .fmtid_in = VIDEO_RGB15_LE, .fmtid_out = VIDEO_GRAY, .priv = rgb15_le_gray, }, {#else NG_GENERIC_PACKED, .fmtid_in = VIDEO_RGB15_BE, .fmtid_out = VIDEO_GRAY, .priv = rgb15_be_gray, }, { NG_GENERIC_PACKED, .fmtid_in = VIDEO_RGB15_LE, .fmtid_out = VIDEO_GRAY, .priv = rgb15_native_gray, }, {#endif /* ----------------------------------- write RGB15 -- */ NG_GENERIC_PACKED, .fmtid_in = VIDEO_RGB15_LE, .fmtid_out = VIDEO_RGB15_BE, .priv = byteswap_short, }, { NG_GENERIC_PACKED, .fmtid_in = VIDEO_RGB15_BE, .fmtid_out = VIDEO_RGB15_LE, .priv = byteswap_short, }, { /* ----------------------------------- write RGB16 -- */ NG_GENERIC_PACKED, .fmtid_in = VIDEO_RGB16_LE, .fmtid_out = VIDEO_RGB16_BE, .priv = byteswap_short, }, { NG_GENERIC_PACKED, .fmtid_in = VIDEO_RGB16_BE, .fmtid_out = VIDEO_RGB16_LE, .priv = byteswap_short, }, { /* ----------------------------------- write RGB24 -- */ NG_GENERIC_PACKED, .fmtid_in = VIDEO_BGR24, .fmtid_out = VIDEO_RGB24, .priv = redblue_swap, }, { NG_GENERIC_PACKED, .fmtid_in = VIDEO_RGB24, .fmtid_out = VIDEO_BGR24, .priv = redblue_swap, }, { NG_GENERIC_PACKED, .fmtid_in = VIDEO_RGB32, .fmtid_out = VIDEO_RGB24, .priv = rgb32_to_rgb24, }, { NG_GENERIC_PACKED, .fmtid_in = VIDEO_RGB32, .fmtid_out = VIDEO_BGR24, .priv = rgb32_to_bgr24, }, { /* ----------------------------------- write RGB32 -- */ NG_GENERIC_PACKED, .fmtid_in = VIDEO_BGR24, .fmtid_out = VIDEO_BGR32, .priv = bgr24_to_bgr32, }, { NG_GENERIC_PACKED, .fmtid_in = VIDEO_BGR24, .fmtid_out = VIDEO_RGB32, .priv = bgr24_to_rgb32, }};static const int nconv = sizeof(conv_list)/sizeof(struct ng_video_conv);/* ------------------------------------------------------------------- */void __init packed_init(void){ ng_conv_register(NG_PLUGIN_MAGIC,__FILE__,conv_list,nconv);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -