pixmap.h
上传用户:riyaled888
上传日期:2009-03-27
资源大小:7338k
文件大小:4k
源码类别:

多媒体

开发平台:

MultiPlatform

  1. /*****************************************************************************
  2.  * Common pixel/chroma manipulation routines.
  3.  *****************************************************************************
  4.  * Copyright (C) 2003, 2004 VideoLAN
  5.  * $Id: pixmap.h 6961 2004-03-05 17:34:23Z sam $
  6.  *
  7.  * Author: Rocky Bernstein
  8.  *
  9.  * This program is free software; you can redistribute it and/or modify
  10.  * it under the terms of the GNU General Public License as published by
  11.  * the Free Software Foundation; either version 2 of the License, or
  12.  * (at your option) any later version.
  13.  *
  14.  * This program is distributed in the hope that it will be useful,
  15.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  16.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  17.  * GNU General Public License for more details.
  18.  *
  19.  * You should have received a copy of the GNU General Public License
  20.  * along with this program; if not, write to the Free Software
  21.  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111, USA.
  22.  *****************************************************************************/
  23. #ifndef PIXMAP_H
  24. #define PIXMAP_H 
  25. /** Color and transparency of a pixel or a palette (CLUT) entry 
  26. */
  27. typedef union {
  28.   uint8_t plane[4];
  29.   struct {
  30.     uint8_t y;
  31.     uint8_t v;
  32.     uint8_t u;
  33.     uint8_t t;
  34.   } s;
  35. } ogt_yuvt_t;
  36. /** An undefined or invalid colormap index. */
  37. #define INVALID_CMAP_ENTRY -1
  38. /** Type of a palette/colormap index*/
  39. typedef int16_t cmap_t;
  40. /** Number of entries in RGB palette/colormap*/
  41. #define CMAP_RGB2_SIZE 256
  42. /**
  43.    Force v in the range 0..255. In video_chroma/i420_rgb.c, this
  44.    is macro is called CLIP. FIXME: Combine with that.
  45. */
  46. #define clip_8_bit(v) 
  47.   ((v < 0) ? 0 : (v > 255) ? 255 : v)
  48. /**
  49.    Color conversion from
  50.     http://www.inforamp.net/~poynton/notes/colour_and_gamma/ColorFAQ.html#RTFToC30
  51.     http://people.ee.ethz.ch/~buc/brechbuehler/mirror/color/ColorFAQ.html
  52.  
  53.     Thanks to Billy Biggs <vektor@dumbterm.net> for the pointer and
  54.     the following conversion.
  55.  
  56.     R' = [ 1.1644         0    1.5960 ]   ([ Y' ]   [  16 ])
  57.     G' = [ 1.1644   -0.3918   -0.8130 ] * ([ Cb ] - [ 128 ])
  58.     B' = [ 1.1644    2.0172         0 ]   ([ Cr ]   [ 128 ])
  59.   See also vlc/modules/video_chroma/i420_rgb.h and
  60.   vlc/modules/video_chroma/i420_rgb_c.h for a way to do this in a way
  61.   more optimized for integer arithmetic. Would be nice to merge the
  62.   two routines.
  63.  
  64. */
  65. /**
  66.    Convert a YUV pixel into an RGB pixel.
  67.  */
  68. static inline void
  69. yuv2rgb(const ogt_yuvt_t *p_yuv, uint8_t *p_rgb_out )
  70. {
  71.   
  72.   int i_Y  = p_yuv->s.y - 16;
  73.   int i_Cb = p_yuv->s.v - 128;
  74.   int i_Cr = p_yuv->s.u - 128;
  75.   
  76.   int i_red   = (1.1644 * i_Y) + (1.5960 * i_Cr);
  77.   int i_green = (1.1644 * i_Y) - (0.3918 * i_Cb) - (0.8130 * i_Cr);
  78.   int i_blue  = (1.1644 * i_Y) + (2.0172 * i_Cb);
  79.   
  80.   i_red   = clip_8_bit( i_red );
  81.   i_green = clip_8_bit( i_green );
  82.   i_blue  = clip_8_bit( i_blue );
  83.   
  84. #ifdef WORDS_BIGENDIAN
  85.   *p_rgb_out++ = i_red;
  86.   *p_rgb_out++ = i_green;
  87.   *p_rgb_out++ = i_blue;
  88. #else
  89.   *p_rgb_out++ = i_blue;
  90.   *p_rgb_out++ = i_green;
  91.   *p_rgb_out++ = i_red;
  92. #endif
  93.   
  94. }
  95. /* The byte storage of an RGB pixel. */ 
  96. #define RGB_SIZE 3
  97. #define GREEN_PIXEL 1
  98. #ifdef WORDS_BIGENDIAN
  99. #define RED_PIXEL   0
  100. #define BLUE_PIXEL  2
  101. #else
  102. #define RED_PIXEL   2
  103. #define BLUE_PIXEL  0
  104. #endif
  105. /**
  106.    Store an RGB pixel into the location of p_pixel, taking into
  107.    account the "Endian"-ness of the underlying machine.
  108.    (N.B. Not sure if I've got this right or this is the right thing
  109.    to do.)
  110.  */
  111. static inline void
  112. put_rgb24_pixel(const uint8_t *rgb, /*out*/ uint8_t *p_pixel)
  113. {
  114. #ifdef WORDS_BIGENDIAN
  115.   *p_pixel++;
  116. #endif
  117.   *p_pixel++ = rgb[RED_PIXEL];
  118.   *p_pixel++ = rgb[GREEN_PIXEL];
  119.   *p_pixel++ = rgb[BLUE_PIXEL];
  120. }
  121. /**
  122.    Find the nearest colormap entry in p_vout (assumed to have RGB2
  123.    chroma, i.e. 256 RGB 8bpp entries) that is closest in color to p_rgb.  Set
  124.    out_rgb to the color found and return the colormap index. 
  125.    INVALID_CMAP_ENTRY is returned if there is some error.
  126. */
  127. cmap_t
  128. find_cmap_rgb8_nearest(const vout_thread_t *p_vout, const uint8_t *p_rgb,
  129.                        /*out*/ uint8_t *out_rgb);
  130. /**
  131.    Get the the rgb value for a given colormap entry for p_vout (which is'
  132.    assumed to have RGB2 chroma). 
  133.    
  134.    VLC_FALSE is returned if there was some error.
  135. */
  136. vlc_bool_t
  137. query_color(const vout_thread_t *p_vout, cmap_t i_cmap,
  138.             /*out*/ uint8_t *rgb);
  139. #endif /* PIXMAP_H */
  140. /* 
  141.  * Local variables:
  142.  *  c-file-style: "gnu"
  143.  *  tab-width: 8
  144.  *  indent-tabs-mode: nil
  145.  * End:
  146.  */