📄 rgb.h
字号:
/* ***** BEGIN LICENSE BLOCK ***** * Source last modified: $Id: rgb.h,v 1.3.8.1 2004/07/09 01:59:56 hubbe Exp $ * * Portions Copyright (c) 1995-2004 RealNetworks, Inc. All Rights Reserved. * * The contents of this file, and the files included with this file, * are subject to the current version of the RealNetworks Public * Source License (the "RPSL") available at * http://www.helixcommunity.org/content/rpsl unless you have licensed * the file under the current version of the RealNetworks Community * Source License (the "RCSL") available at * http://www.helixcommunity.org/content/rcsl, in which case the RCSL * will apply. You may also obtain the license terms directly from * RealNetworks. You may not use this file except in compliance with * the RPSL or, if you have a valid RCSL with RealNetworks applicable * to this file, the RCSL. Please see the applicable RPSL or RCSL for * the rights, obligations and limitations governing use of the * contents of the file. * * Alternatively, the contents of this file may be used under the * terms of the GNU General Public License Version 2 or later (the * "GPL") in which case the provisions of the GPL are applicable * instead of those above. If you wish to allow use of your version of * this file only under the terms of the GPL, and not to allow others * to use your version of this file under the terms of either the RPSL * or RCSL, indicate your decision by deleting the provisions above * and replace them with the notice and other provisions required by * the GPL. If you do not delete the provisions above, a recipient may * use your version of this file under the terms of any one of the * RPSL, the RCSL or the GPL. * * This file is part of the Helix DNA Technology. RealNetworks is the * developer of the Original Code and owns the copyrights in the * portions it created. * * This file, and the files included with this file, is distributed * and made available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY * KIND, EITHER EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS * ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET * ENJOYMENT OR NON-INFRINGEMENT. * * Technology Compatibility Kit Test Suite(s) Location: * http://www.helixcommunity.org/content/tck * * Contributor(s): * * ***** END LICENSE BLOCK ***** */#ifndef __RGB_H__#define __RGB_H__ 1#ifdef __cplusplusextern "C" {#endif/* * RGB formats supported: * * RGB32 - 32-bit 8:8:8 RGB * BGR32 - 32-bit 8:8:8 RGB (R&B swapped) * RGB24 - 24-bit 8:8:8 RGB * RGB565 - 16-bit 5:6:5 RGB * RGB555 - 16-bit 5:5:5 RGB * RGB8 - 8-bit palettized RGB */#define RGB32_ID 0#define BGR32_ID 1#define RGB24_ID 2#define RGB565_ID 3#define RGB555_ID 4#define RGB8_ID 5#define RGB_FORMATS 6/* * Generic format ID: */#define ID(f) f##_ID/* * Bytes per pixel (bpp) constants: */#define RGB32_BPP 4#define BGR32_BPP 4#define RGB24_BPP 3#define RGB565_BPP 2#define RGB555_BPP 2#define RGB8_BPP 1/* * Generic pixel depth: */#define BPP(f) f##_BPP/* * Internal pixel representations. * We will use 3 different types of temporary pixel variables * based on the following classification: * 1. Pixels with power of 2-aligned depth and bit-packed RGB fields: * RGB32,BGR32,RGB565,RGB555 - use 1 full register to store RGB fields * (we will use name RGBX for generalized macros dealing * with these formats) * 2. Pixels with misaligned depth: * RGB24 - use 3 8-bit registers to store R,G,and B components * 3. Paletized pixels: * RGB8 - use 1 full register to store palette index */#define RGBX_PIXEL(a) register unsigned int a##_rgb#define RGB32_PIXEL(a) RGBX_PIXEL(a)#define BGR32_PIXEL(a) RGBX_PIXEL(a)#define RGB24_PIXEL(a) register unsigned char a##_b, a##_g, a##_r#define RGB565_PIXEL(a) RGBX_PIXEL(a)#define RGB555_PIXEL(a) RGBX_PIXEL(a)#define RGB8_PIXEL(a) register unsigned int a##_idx/* * Generic pixel declaration: */#define PIXEL(f,a) f##_PIXEL(a)/* * Load/store/copy pixel macros: * (s/d - source/destination pointers; sa/da - source/dest. pixel vars) */#define RGBX_LOAD(s,a,t) a##_rgb=*(t*)(s)#define RGBX_STORE(d,a,t) *(t*)(d)=a##_rgb#define RGBX_COPY(da,sa) da##_rgb=sa##_rgb#define RGB32_LOAD(s,a) RGBX_LOAD(s,a,unsigned int)#define RGB32_STORE(d,a) RGBX_STORE(d,a,unsigned int)#define RGB32_COPY(da,sa) RGBX_COPY(da,sa)#define BGR32_LOAD(s,a) RGBX_LOAD(s,a,unsigned int)#define BGR32_STORE(d,a) RGBX_STORE(d,a,unsigned int)#define BGR32_COPY(da,sa) RGBX_COPY(da,sa)#define RGB24_LOAD(s,a) a##_b=(s)[0], a##_g=(s)[1], a##_r=(s)[2]#define RGB24_STORE(d,a) (d)[0]=a##_b, (d)[1]=a##_g, (d)[2]=a##_r#define RGB24_COPY(da,sa) da##_b=sa##_b, da##_g=sa##_g, da##_r=sa##_r#define RGB565_LOAD(s,a) RGBX_LOAD(s,a,unsigned short)#define RGB565_STORE(d,a) RGBX_STORE(d,a,unsigned short)#define RGB565_COPY(da,sa) RGBX_COPY(da,sa)#define RGB555_LOAD(s,a) RGBX_LOAD(s,a,unsigned short)#define RGB555_STORE(d,a) RGBX_STORE(d,a,unsigned short)#define RGB555_COPY(da,sa) RGBX_COPY(da,sa)#define RGB8_LOAD(s,a) a##_idx=(s)[0]#define RGB8_STORE(d,a) (d)[0]=a##_idx#define RGB8_COPY(da,sa) da##_idx=sa##_idx/* * Generic pixel load/store/copy macros: */#define LOAD(f,s,a) f##_LOAD(s,a)#define STORE(f,d,a) f##_STORE(d,a)#define COPY(f,da,sa) f##_COPY(da,sa)/* * R,G,B fields bit-packing: * (RGB32,BGR32,RGB565,and RGB555 formats only) */#define RGB32_R_START 16#define RGB32_R_BITS 8#define RGB32_G_START 8#define RGB32_G_BITS 8#define RGB32_B_START 0#define RGB32_B_BITS 8#define BGR32_R_START 0#define BGR32_R_BITS 8#define BGR32_G_START 8#define BGR32_G_BITS 8#define BGR32_B_START 16#define BGR32_B_BITS 8#define RGB565_R_START 11#define RGB565_R_BITS 5#define RGB565_G_START 5#define RGB565_G_BITS 6#define RGB565_B_START 0#define RGB565_B_BITS 5#define RGB555_R_START 10#define RGB555_R_BITS 5#define RGB555_G_START 5#define RGB555_G_BITS 5#define RGB555_B_START 0#define RGB555_B_BITS 5/* * Generic bit-packing macros: */#define START(f,x) f##_##x##_START#define BITS(f,x) f##_##x##_BITS/* * Fields extraction/assignment macros. * * Here we will largely rely on compiler's ability to get rid of * unexecuted branches and glue subsequent constant shifts and * masks together. This assumption works well for MSVC, Watcom, * and Zortech (Symantec) compilers, but some others may fail. * * If you are using compiler not listed above, please check the * assembly output to make sure that the code is well optimized. * If the compiler leaves comparisons and multiple shifts/masks * in places of RGBX_GET_X() and RGBX_SET(), you would have to * reimplement and optimize all these instances manually, using * the appropriate pixel/field-type related constants. */#define NORM(s) ((s) & 0x1F) /* shuts compiler up */#define RGBX_GET_X(f,x,a) \ ((START(f,x)+BITS(f,x)<8) \ ? ((a##_rgb << NORM(8-(START(f,x)+BITS(f,x)))) & (0x100-(1U<<(8-BITS(f,x))))) \ : ((a##_rgb >> NORM((START(f,x)+BITS(f,x))-8)) & (0x100-(1U<<(8-BITS(f,x))))))#define RGBX_X(f,x,v) \ ((START(f,x)+BITS(f,x)<8) \ ? (((v) & (0x100-(1U<<(8-BITS(f,x))))) >> NORM(8-(START(f,x)+BITS(f,x)))) \ : (((v) & (0x100-(1U<<(8-BITS(f,x))))) << NORM((START(f,x)+BITS(f,x))-8)))#define RGBX_SET(f,a,r,g,b) \ a##_rgb = RGBX_X(f,R,r) | RGBX_X(f,G,g) | RGBX_X(f,B,b)#define RGB32_GET_R(a) RGBX_GET_X(RGB32,R,a)#define RGB32_GET_G(a) RGBX_GET_X(RGB32,G,a)#define RGB32_GET_B(a) RGBX_GET_X(RGB32,B,a)#define RGB32_SET(a,r,g,b) RGBX_SET( RGB32,a,r,g,b)#define BGR32_GET_R(a) RGBX_GET_X(BGR32,R,a)#define BGR32_GET_G(a) RGBX_GET_X(BGR32,G,a)#define BGR32_GET_B(a) RGBX_GET_X(BGR32,B,a)#define BGR32_SET(a,r,g,b) RGBX_SET( BGR32,a,r,g,b)#define RGB24_GET_R(a) (a##_r)#define RGB24_GET_G(a) (a##_g)#define RGB24_GET_B(a) (a##_b)#define RGB24_SET(a,r,g,b) a##_b=(b), a##_g=(g), a##_r=(r)#define RGB565_GET_R(a) RGBX_GET_X(RGB565,R,a)#define RGB565_GET_G(a) RGBX_GET_X(RGB565,G,a)#define RGB565_GET_B(a) RGBX_GET_X(RGB565,B,a)#define RGB565_SET(a,r,g,b) RGBX_SET( RGB565,a,r,g,b)#define RGB555_GET_R(a) RGBX_GET_X(RGB555,R,a)#define RGB555_GET_G(a) RGBX_GET_X(RGB555,G,a)#define RGB555_GET_B(a) RGBX_GET_X(RGB555,B,a)#define RGB555_SET(a,r,g,b) RGBX_SET( RGB555,a,r,g,b)#define RGB8_GET_R(a) PAL_GET_R(a##_idx)#define RGB8_GET_G(a) PAL_GET_G(a##_idx)#define RGB8_GET_B(a) PAL_GET_B(a##_idx)#define RGB8_SET(a,r,g,b) a##_idx=PMAP_GET(r,g,b)/* * Generic field extraction/assignment macros: */#define GET_R(f,a) f##_GET_R(a)#define GET_G(f,a) f##_GET_G(a)#define GET_B(f,a) f##_GET_B(a)#define SET(f,a,r,g,b) f##_SET(a,r,g,b)/* * Generic pixel-format converter: * (sf/sa - source pixel format/name; df/da - dest. pixel format/name) */#define CONVERT(df,da,sf,sa) SET(df,da,GET_R(sf,sa),GET_G(sf,sa),GET_B(sf,sa))/* * Generic pixel load and convert macro: */#define LOAD_CONVERT(df,da,sf,s) \ /* do we have the same format? */ \ if (ID(df) == ID(sf)) { \ /* just load pixel */ \ LOAD(df,s,da); \ } else { \ /* load & convert pixel: */ \ PIXEL(sf,sa); \ LOAD(sf,s,sa); \ CONVERT(df,da,sf,sa); \ }/* * Get the average value of two pixels: * (da=(sa+sb)/2) */#define RGBX_AVERAGE(f,da,sa,sb) \ da##_rgb = (((sa##_rgb^sb##_rgb)>>1) \ & (((1U<<(START(f,R)+BITS(f,R)-1))-(1U<<START(f,R))) \ |((1U<<(START(f,G)+BITS(f,G)-1))-(1U<<START(f,G))) \ |((1U<<(START(f,B)+BITS(f,B)-1))-(1U<<START(f,B)))))\ + (sa##_rgb&sb##_rgb)#define RGB32_AVERAGE(da,sa,sb) RGBX_AVERAGE(RGB32,da,sa,sb)#define BGR32_AVERAGE(da,sa,sb) RGBX_AVERAGE(BGR32,da,sa,sb)#define RGB24_AVERAGE(da,sa,sb) \ SET(RGB24,da,((GET_R(RGB24,sa)+GET_R(RGB24,sb))>>1), \ ((GET_G(RGB24,sa)+GET_G(RGB24,sb))>>1), \ ((GET_B(RGB24,sa)+GET_B(RGB24,sb))>>1))#define RGB565_AVERAGE(da,sa,sb) RGBX_AVERAGE(RGB565,da,sa,sb)#define RGB555_AVERAGE(da,sa,sb) RGBX_AVERAGE(RGB555,da,sa,sb)#define RGB8_AVERAGE(da,sa,sb) \ SET(RGB8,da,((GET_R(RGB8,sa)+GET_R(RGB8,sb))>>1), \ ((GET_G(RGB8,sa)+GET_G(RGB8,sb))>>1), \ ((GET_B(RGB8,sa)+GET_B(RGB8,sb))>>1))/* * Generic two pixels' average: */#define AVERAGE(f,da,sa,sb) f##_AVERAGE(da,sa,sb)/* * Loads a pixel and averages it with another one: * (da = (sa+[s])/2) */#define LOAD_AVERAGE(f,da,sa,s) \ { \ /* load & convert pixel: */ \ PIXEL(f,sb); \ LOAD(f,s,sb); \ AVERAGE(f,da,sa,sb); \ }#ifdef __cplusplus}#endif#endif /* __RGB_H__ */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -