rgb.h
上传用户:dangjiwu
上传日期:2013-07-19
资源大小:42019k
文件大小:14k
源码类别:

Symbian

开发平台:

Visual C++

  1. /* ***** BEGIN LICENSE BLOCK *****
  2.  * Source last modified: $Id: rgb.h,v 1.2.42.1 2004/07/09 02:00:18 hubbe Exp $
  3.  * 
  4.  * Portions Copyright (c) 1995-2004 RealNetworks, Inc. All Rights Reserved.
  5.  * 
  6.  * The contents of this file, and the files included with this file,
  7.  * are subject to the current version of the RealNetworks Public
  8.  * Source License (the "RPSL") available at
  9.  * http://www.helixcommunity.org/content/rpsl unless you have licensed
  10.  * the file under the current version of the RealNetworks Community
  11.  * Source License (the "RCSL") available at
  12.  * http://www.helixcommunity.org/content/rcsl, in which case the RCSL
  13.  * will apply. You may also obtain the license terms directly from
  14.  * RealNetworks.  You may not use this file except in compliance with
  15.  * the RPSL or, if you have a valid RCSL with RealNetworks applicable
  16.  * to this file, the RCSL.  Please see the applicable RPSL or RCSL for
  17.  * the rights, obligations and limitations governing use of the
  18.  * contents of the file.
  19.  * 
  20.  * Alternatively, the contents of this file may be used under the
  21.  * terms of the GNU General Public License Version 2 or later (the
  22.  * "GPL") in which case the provisions of the GPL are applicable
  23.  * instead of those above. If you wish to allow use of your version of
  24.  * this file only under the terms of the GPL, and not to allow others
  25.  * to use your version of this file under the terms of either the RPSL
  26.  * or RCSL, indicate your decision by deleting the provisions above
  27.  * and replace them with the notice and other provisions required by
  28.  * the GPL. If you do not delete the provisions above, a recipient may
  29.  * use your version of this file under the terms of any one of the
  30.  * RPSL, the RCSL or the GPL.
  31.  * 
  32.  * This file is part of the Helix DNA Technology. RealNetworks is the
  33.  * developer of the Original Code and owns the copyrights in the
  34.  * portions it created.
  35.  * 
  36.  * This file, and the files included with this file, is distributed
  37.  * and made available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY
  38.  * KIND, EITHER EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS
  39.  * ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES
  40.  * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET
  41.  * ENJOYMENT OR NON-INFRINGEMENT.
  42.  * 
  43.  * Technology Compatibility Kit Test Suite(s) Location:
  44.  *    http://www.helixcommunity.org/content/tck
  45.  * 
  46.  * Contributor(s):
  47.  * 
  48.  * ***** END LICENSE BLOCK ***** */
  49. #ifndef __RGB_H__
  50. #define __RGB_H__   1
  51. #ifdef __cplusplus
  52. extern "C" {
  53. #endif
  54. #define I420_ID             0
  55. #define YV12_ID             1
  56. #define YUY2_ID             2
  57. #define UYVY_ID             3
  58. #define YUV_FORMATS         4
  59. /*
  60.  * RGB formats supported:
  61.  *
  62.  *  RGB32   - 32-bit 8:8:8 RGB
  63.  *  BGR32   - 32-bit 8:8:8 RGB (R&B swapped)
  64.  *  RGB24   - 24-bit 8:8:8 RGB
  65.  *  RGB565  - 16-bit 5:6:5 RGB
  66.  *  RGB555  - 16-bit 5:5:5 RGB
  67.  *  RGB444  - 16-bit 4:4:4 RGB (embedded devices)
  68.  *  RGB8    -  8-bit palettized RGB
  69.  */
  70. #define RGB32_ID            0
  71. #define BGR32_ID            1
  72. #define RGB24_ID            2
  73. #define RGB565_ID           3
  74. #define RGB555_ID           4
  75. #define RGB444_ID           5
  76. #define RGB8_ID             6
  77. #define RGB_FORMATS         7
  78. /*
  79.  * Generic format ID:
  80.  */
  81. #define ID(f)               f##_ID
  82. /*
  83.  * Bytes per pixel (bpp) constants:
  84.  */
  85. #define RGB32_BPP           4
  86. #define BGR32_BPP           4
  87. #define RGB24_BPP           3
  88. #define RGB565_BPP          2
  89. #define RGB555_BPP          2
  90. #define RGB444_BPP          2
  91. #define RGB8_BPP            1
  92. /*
  93.  * Generic pixel depth:
  94.  */
  95. #define BPP(f)              f##_BPP
  96. /*
  97.  * Our internal RGB8 palette tables:
  98.  */
  99. #ifndef PAL_MAIN
  100. #define PAL_EXTERN extern
  101. #else
  102. #define PAL_EXTERN /**/
  103. #endif
  104. PAL_EXTERN unsigned int  palette[1U << 8];     /* input image palette */
  105. PAL_EXTERN unsigned char pmap[1U << (4+4+4)];  /* output image palette map */ /* Flawfinder: ignore */
  106. /*
  107.  * Some palette-related macros
  108.  */
  109. #if BYTE_ORDER == LITTLE_ENDIAN
  110. #define PAL_GET_R(idx)      *((unsigned char *)(palette+idx)+0)
  111. #define PAL_GET_G(idx) *((unsigned char *)(palette+idx)+1)
  112. #define PAL_GET_B(idx)      *((unsigned char *)(palette+idx)+2)
  113. #else /* BYTE_ORDER != LITTLE_ENDIAN */
  114. #define PAL_GET_R(idx)      *((unsigned char *)(palette+idx)+3)
  115. #define PAL_GET_G(idx) *((unsigned char *)(palette+idx)+2)
  116. #define PAL_GET_B(idx)      *((unsigned char *)(palette+idx)+1)
  117. #endif
  118. #define PAL_SET(idx,r,g,b) palette[idx] = (r<<16) | (g<<8) | b
  119. #define PMAP_GET(r,g,b) pmap[(((r)&0xF0)<<4) | ((g)&0xF0) | ((b)>>4)]
  120. #define PMAP_SET(idx,r,g,b) pmap[(((r)&0xF0)<<4) | ((g)&0xF0) | ((b)>>4)] = idx
  121. /*
  122.  * Internal pixel representations.
  123.  * We will use 3 different types of temporary pixel variables
  124.  * based on the following classification:
  125.  *  1. Pixels with power of 2-aligned depth and bit-packed RGB fields:
  126.  *      RGB32,BGR32,RGB565,RGB555,RGB444 - use 1 full register to store RGB fields
  127.  *      (we will use name RGBX for generalized macros dealing
  128.  *       with these formats)
  129.  *  2. Pixels with misaligned depth:
  130.  *      RGB24 - use 3 8-bit registers to store R,G,and B components
  131.  *  3. Paletized pixels:
  132.  *      RGB8 - use 1 full register to store palette index
  133.  */
  134. #define RGBX_PIXEL(a)       register unsigned int a##_rgb
  135. #define RGB32_PIXEL(a)      RGBX_PIXEL(a)
  136. #define BGR32_PIXEL(a)      RGBX_PIXEL(a)
  137. #define RGB24_PIXEL(a)      register unsigned char a##_b, a##_g, a##_r
  138. #define RGB565_PIXEL(a)     RGBX_PIXEL(a)
  139. #define RGB555_PIXEL(a)     RGBX_PIXEL(a)
  140. #define RGB444_PIXEL(a)     RGBX_PIXEL(a)
  141. #define RGB8_PIXEL(a)       register unsigned int a##_idx
  142. /*
  143.  * Generic pixel declaration:
  144.  */
  145. #define PIXEL(f,a)          f##_PIXEL(a)
  146. /*
  147.  * Load/store/copy pixel macros:
  148.  * (s/d - source/destination pointers; sa/da - source/dest. pixel vars)
  149.  */
  150. #define RGBX_LOAD(s,a,t)    a##_rgb=*(t*)(s)
  151. #define RGBX_STORE(d,a,t)   *(t*)(d)=a##_rgb
  152. #define RGBX_COPY(da,sa)    da##_rgb=sa##_rgb
  153. #define RGB32_LOAD(s,a)     RGBX_LOAD(s,a,unsigned int)
  154. #define RGB32_STORE(d,a)    RGBX_STORE(d,a,unsigned int)
  155. #define RGB32_COPY(da,sa)   RGBX_COPY(da,sa)
  156. #define BGR32_LOAD(s,a)     RGBX_LOAD(s,a,unsigned int)
  157. #define BGR32_STORE(d,a)    RGBX_STORE(d,a,unsigned int)
  158. #define BGR32_COPY(da,sa)   RGBX_COPY(da,sa)
  159. #define RGB24_LOAD(s,a)     a##_b=(s)[0], a##_g=(s)[1], a##_r=(s)[2]
  160. #define RGB24_STORE(d,a)    (d)[0]=a##_b, (d)[1]=a##_g, (d)[2]=a##_r
  161. #define RGB24_COPY(da,sa)   da##_b=sa##_b, da##_g=sa##_g, da##_r=sa##_r
  162. #define RGB565_LOAD(s,a)    RGBX_LOAD(s,a,unsigned short)
  163. #define RGB565_STORE(d,a)   RGBX_STORE(d,a,unsigned short)
  164. #define RGB565_COPY(da,sa)  RGBX_COPY(da,sa)
  165. #define RGB555_LOAD(s,a)    RGBX_LOAD(s,a,unsigned short)
  166. #define RGB555_STORE(d,a)   RGBX_STORE(d,a,unsigned short)
  167. #define RGB555_COPY(da,sa)  RGBX_COPY(da,sa)
  168. #define RGB444_LOAD(s,a)    RGBX_LOAD(s,a,unsigned short)
  169. #define RGB444_STORE(d,a)   RGBX_STORE(d,a,unsigned short)
  170. #define RGB444_COPY(da,sa)  RGBX_COPY(da,sa)
  171. #define RGB8_LOAD(s,a)      a##_idx=(s)[0]
  172. #define RGB8_STORE(d,a)     (d)[0]=a##_idx
  173. #define RGB8_COPY(da,sa)    da##_idx=sa##_idx
  174. /*
  175.  * Generic pixel load/store/copy macros:
  176.  */
  177. #define LOAD(f,s,a)         f##_LOAD(s,a)
  178. #define STORE(f,d,a)        f##_STORE(d,a)
  179. #define COPY(f,da,sa)       f##_COPY(da,sa)
  180. /*
  181.  * R,G,B fields bit-packing:
  182.  * (RGB32,BGR32,RGB565,and RGB555 formats only)
  183.  */
  184. #define RGB32_A_START       24
  185. #define RGB32_A_BITS        8
  186. #define RGB32_R_START       16
  187. #define RGB32_R_BITS        8
  188. #define RGB32_G_START       8
  189. #define RGB32_G_BITS        8
  190. #define RGB32_B_START       0
  191. #define RGB32_B_BITS        8
  192. #define BGR32_R_START       0
  193. #define BGR32_R_BITS        8
  194. #define BGR32_G_START       8
  195. #define BGR32_G_BITS        8
  196. #define BGR32_B_START       16
  197. #define BGR32_B_BITS        8
  198. #define RGB565_R_START      11
  199. #define RGB565_R_BITS       5
  200. #define RGB565_G_START      5
  201. #define RGB565_G_BITS       6
  202. #define RGB565_B_START      0
  203. #define RGB565_B_BITS       5
  204. #define RGB555_R_START      10
  205. #define RGB555_R_BITS       5
  206. #define RGB555_G_START      5
  207. #define RGB555_G_BITS       5
  208. #define RGB555_B_START      0
  209. #define RGB555_B_BITS       5
  210. #define RGB444_R_START      8
  211. #define RGB444_R_BITS       4
  212. #define RGB444_G_START      4
  213. #define RGB444_G_BITS       4
  214. #define RGB444_B_START      0
  215. #define RGB444_B_BITS       4
  216. /*
  217.  * Generic bit-packing macros:
  218.  */
  219. #define START(f,x)          f##_##x##_START
  220. #define BITS(f,x)           f##_##x##_BITS
  221. /*
  222.  * Fields extraction/assignment macros.
  223.  *
  224.  * Here we will largely rely on compiler's ability to get rid of
  225.  * unexecuted branches and glue subsequent constant shifts and
  226.  * masks together. This assumption works well for MSVC, Watcom,
  227.  * and Zortech (Symantec) compilers, but some others may fail.
  228.  *
  229.  * If you are using compiler not listed above, please check the
  230.  * assembly output to make sure that the code is well optimized.
  231.  * If the compiler leaves comparisons and multiple shifts/masks
  232.  * in places of RGBX_GET_X() and RGBX_SET(), you would have to
  233.  * reimplement and optimize all these instances manually, using
  234.  * the appropriate pixel/field-type related constants.
  235.  */
  236. #define NORM(s) ((s) & 0x1F) /* shuts compiler up */
  237. #define RGBX_GET_X(f,x,a)   
  238.     ((START(f,x)+BITS(f,x)<8)   
  239.     ? ((a##_rgb << NORM(8-(START(f,x)+BITS(f,x)))) & (0x100-(1U<<(8-BITS(f,x))))) 
  240.     : ((a##_rgb >> NORM((START(f,x)+BITS(f,x))-8)) & (0x100-(1U<<(8-BITS(f,x))))))
  241. #define RGBX_X(f,x,v)       
  242.     ((START(f,x)+BITS(f,x)<8)   
  243.     ? (((v) & (0x100-(1U<<(8-BITS(f,x))))) >> NORM(8-(START(f,x)+BITS(f,x))))   
  244.     : (((v) & (0x100-(1U<<(8-BITS(f,x))))) << NORM((START(f,x)+BITS(f,x))-8)))
  245. #define RGBX_SET(f,a,r,g,b) 
  246.     a##_rgb = RGBX_X(f,R,r) | RGBX_X(f,G,g) | RGBX_X(f,B,b)
  247. #define RGB32_GET_A(a)      RGBX_GET_X(RGB32,A,a)
  248. #define RGB32_GET_R(a)      RGBX_GET_X(RGB32,R,a)
  249. #define RGB32_GET_G(a)      RGBX_GET_X(RGB32,G,a)
  250. #define RGB32_GET_B(a)      RGBX_GET_X(RGB32,B,a)
  251. #define RGB32_SET(a,r,g,b)  RGBX_SET(  RGB32,a,r,g,b)
  252. #define BGR32_GET_R(a)      RGBX_GET_X(BGR32,R,a)
  253. #define BGR32_GET_G(a)      RGBX_GET_X(BGR32,G,a)
  254. #define BGR32_GET_B(a)      RGBX_GET_X(BGR32,B,a)
  255. #define BGR32_SET(a,r,g,b)  RGBX_SET(  BGR32,a,r,g,b)
  256. #define RGB24_GET_R(a)      (a##_r)
  257. #define RGB24_GET_G(a)      (a##_g)
  258. #define RGB24_GET_B(a)      (a##_b)
  259. #define RGB24_SET(a,r,g,b)  a##_b=(b), a##_g=(g), a##_r=(r)
  260. #define RGB565_GET_R(a)     RGBX_GET_X(RGB565,R,a)
  261. #define RGB565_GET_G(a)     RGBX_GET_X(RGB565,G,a)
  262. #define RGB565_GET_B(a)     RGBX_GET_X(RGB565,B,a)
  263. #define RGB565_SET(a,r,g,b) RGBX_SET(  RGB565,a,r,g,b)
  264. #define RGB555_GET_R(a)     RGBX_GET_X(RGB555,R,a)
  265. #define RGB555_GET_G(a)     RGBX_GET_X(RGB555,G,a)
  266. #define RGB555_GET_B(a)     RGBX_GET_X(RGB555,B,a)
  267. #define RGB555_SET(a,r,g,b) RGBX_SET(  RGB555,a,r,g,b)
  268. #define RGB444_GET_R(a)     RGBX_GET_X(RGB444,R,a)
  269. #define RGB444_GET_G(a)     RGBX_GET_X(RGB444,G,a)
  270. #define RGB444_GET_B(a)     RGBX_GET_X(RGB444,B,a)
  271. #define RGB444_SET(a,r,g,b) RGBX_SET(  RGB444,a,r,g,b)
  272. #define RGB8_GET_R(a)       PAL_GET_R(a##_idx)
  273. #define RGB8_GET_G(a)       PAL_GET_G(a##_idx)
  274. #define RGB8_GET_B(a)       PAL_GET_B(a##_idx)
  275. #define RGB8_SET(a,r,g,b)   a##_idx=PMAP_GET(r,g,b)
  276. /*
  277.  * Generic field extraction/assignment macros:
  278.  */
  279. #define GET_A(f,a)          f##_GET_A(a)
  280. #define GET_R(f,a)          f##_GET_R(a)
  281. #define GET_G(f,a)          f##_GET_G(a)
  282. #define GET_B(f,a)          f##_GET_B(a)
  283. #define SET(f,a,r,g,b)      f##_SET(a,r,g,b)
  284. /*
  285.  * Generic pixel-format converter:
  286.  * (sf/sa - source pixel format/name; df/da - dest. pixel format/name)
  287.  */
  288. #define CONVERT(df,da,sf,sa) SET(df,da,GET_R(sf,sa),GET_G(sf,sa),GET_B(sf,sa))
  289. /*
  290.  * Generic pixel load and convert macro:
  291.  */
  292. #define LOAD_CONVERT(df,da,sf,s)            
  293.     /* do we have the same format? */       
  294.     if (ID(df) == ID(sf)) {                 
  295.         /* just load pixel */               
  296.         LOAD(df,s,da);                      
  297.     } else {                                
  298.         /* load & convert pixel: */         
  299.         PIXEL(sf,sa);                       
  300.         LOAD(sf,s,sa);                      
  301.         CONVERT(df,da,sf,sa);               
  302.     }
  303. /*
  304.  * Get the average value of two pixels:
  305.  * (da=(sa+sb)/2)
  306.  */
  307. #define RGBX_AVERAGE(f,da,sa,sb)    
  308.     da##_rgb = (((sa##_rgb^sb##_rgb)>>1)    
  309.         & (((1U<<(START(f,R)+BITS(f,R)-1))-(1U<<START(f,R)))  
  310.           |((1U<<(START(f,G)+BITS(f,G)-1))-(1U<<START(f,G)))  
  311.           |((1U<<(START(f,B)+BITS(f,B)-1))-(1U<<START(f,B)))))
  312.         + (sa##_rgb&sb##_rgb)
  313. #define RGB32_AVERAGE(da,sa,sb) RGBX_AVERAGE(RGB32,da,sa,sb)
  314. #define BGR32_AVERAGE(da,sa,sb) RGBX_AVERAGE(BGR32,da,sa,sb)
  315. #define RGB24_AVERAGE(da,sa,sb) 
  316.     SET(RGB24,da,((GET_R(RGB24,sa)+GET_R(RGB24,sb))>>1),    
  317.                  ((GET_G(RGB24,sa)+GET_G(RGB24,sb))>>1),    
  318.                  ((GET_B(RGB24,sa)+GET_B(RGB24,sb))>>1))
  319. #define RGB565_AVERAGE(da,sa,sb) RGBX_AVERAGE(RGB565,da,sa,sb)
  320. #define RGB555_AVERAGE(da,sa,sb) RGBX_AVERAGE(RGB555,da,sa,sb)
  321. #define RGB444_AVERAGE(da,sa,sb) RGBX_AVERAGE(RGB444,da,sa,sb)
  322. #define RGB8_AVERAGE(da,sa,sb)  
  323.     SET(RGB8,da,((GET_R(RGB8,sa)+GET_R(RGB8,sb))>>1),       
  324.                 ((GET_G(RGB8,sa)+GET_G(RGB8,sb))>>1),       
  325.                 ((GET_B(RGB8,sa)+GET_B(RGB8,sb))>>1))
  326. /*
  327.  * Generic two pixels' average:
  328.  */
  329. #define AVERAGE(f,da,sa,sb) f##_AVERAGE(da,sa,sb)
  330. /*
  331.  * Loads a pixel and averages it with another one:
  332.  * (da = (sa+[s])/2)
  333.  */
  334. #define LOAD_AVERAGE(f,da,sa,s)             
  335.     {                                       
  336.         /* load & convert pixel: */         
  337.         PIXEL(f,sb);                        
  338.         LOAD(f,s,sb);                       
  339.         AVERAGE(f,da,sa,sb);                
  340.     }
  341. #ifdef __cplusplus
  342. }
  343. #endif
  344. #endif /* __RGB_H__ */