rgb.h
上传用户:zhongxx05
上传日期:2007-06-06
资源大小:33641k
文件大小:11k
源码类别:

Symbian

开发平台:

C/C++

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