color.c

C:\home\SVGCats_src\src\color.c

[目次 | 関数]

目次

関数一覧


   1|/**************************************************************************
   2|  1. <<< 色 (Color) >>> 
   3|
   4|・色コード。RGB カラーコード、YUV カラーコード。
   5|・BPP の変換や、RGB-YUV 変換をします。
   6|・色の厳密さ(量子化の度合)は、bpp (Bit Per Pixel) という単位です。
   7|**************************************************************************/
   8|
   9|#include "mixer_precomp.h"  /* Auto precompiled header, Look at mixer-... folder */
  10|// #pragma hdrstop
  11|
  12|#if defined(USES_MXP_AUTOINC)
  13| #include "color.ah"  /* Auto include header, Look at mixer-... folder */
  14|#endif
  15|
  16| 
  17|/*--------------------------------------------------------------------*/
  18|/* 2. <<<◆ カラーコード定数 >>> */ 
  19|/*--------------------------------------------------------------------*/
  20|Color  Color_Black( int type, int bpp )
  21|{
  22|  ASSERT( type == Color_RGBType );
  23|
  24|  switch ( bpp ) {
  25|    case  8:  return  Color_RGB8_Black;
  26|    case 16:  return  Color_RGB16_Black;
  27|    case 24:  return  Color_RGB24_Black;
  28|  }
  29|  ASSERT(1);
  30|  return  0;
  31|}
  32|
  33|
  34|Color  Color_Blue( int type, int bpp )
  35|{
  36|  ASSERT( type == Color_RGBType );
  37|
  38|  switch ( bpp ) {
  39|    case  8:  return  Color_RGB8_Blue;
  40|    case 16:  return  Color_RGB16_Blue;
  41|    case 24:  return  Color_RGB24_Blue;
  42|  }
  43|  ASSERT(1);
  44|  return  0;
  45|}
  46|
  47|
  48|Color  Color_Green( int type, int bpp )
  49|{
  50|  ASSERT( type == Color_RGBType );
  51|
  52|  switch ( bpp ) {
  53|    case  8:  return  Color_RGB8_Green;
  54|    case 16:  return  Color_RGB16_Green;
  55|    case 24:  return  Color_RGB24_Green;
  56|  }
  57|  ASSERT(1);
  58|  return  0;
  59|}
  60|
  61|
  62|Color  Color_Red( int type, int bpp )
  63|{
  64|  ASSERT( type == Color_RGBType );
  65|
  66|  switch ( bpp ) {
  67|    case  8:  return  Color_RGB8_Red;
  68|    case 16:  return  Color_RGB16_Red;
  69|    case 24:  return  Color_RGB24_Red;
  70|  }
  71|  ASSERT(1);
  72|  return  0;
  73|}
  74|
  75|
  76|Color  Color_Cyan( int type, int bpp )
  77|{
  78|  ASSERT( type == Color_RGBType );
  79|
  80|  switch ( bpp ) {
  81|    case  8:  return  Color_RGB8_Cyan;
  82|    case 16:  return  Color_RGB16_Cyan;
  83|    case 24:  return  Color_RGB24_Cyan;
  84|  }
  85|  ASSERT(1);
  86|  return  0;
  87|}
  88|
  89|
  90|Color  Color_Mazenta( int type, int bpp )
  91|{
  92|  ASSERT( type == Color_RGBType );
  93|
  94|  switch ( bpp ) {
  95|    case  8:  return  Color_RGB8_Mazenta;
  96|    case 16:  return  Color_RGB16_Mazenta;
  97|    case 24:  return  Color_RGB24_Mazenta;
  98|  }
  99|  ASSERT(1);
 100|  return  0;
 101|}
 102|
 103|
 104|Color  Color_Yellow( int type, int bpp )
 105|{
 106|  ASSERT( type == Color_RGBType );
 107|
 108|  switch ( bpp ) {
 109|    case  8:  return  Color_RGB8_Yellow;
 110|    case 16:  return  Color_RGB16_Yellow;
 111|    case 24:  return  Color_RGB24_Yellow;
 112|  }
 113|  ASSERT(1);
 114|  return  0;
 115|}
 116|
 117|
 118|Color  Color_White( int type, int bpp )
 119|{
 120|  ASSERT( type == Color_RGBType );
 121|
 122|  switch ( bpp ) {
 123|    case  8:  return  Color_RGB8_White;
 124|    case 16:  return  Color_RGB16_White;
 125|    case 24:  return  Color_RGB24_White;
 126|  }
 127|  ASSERT(1);
 128|  return  0;
 129|}
 130|
 131|
 132|Color  Color_Gray( int type, int bpp )
 133|{
 134|  ASSERT( type == Color_RGBType );
 135|
 136|  switch ( bpp ) {
 137|    case  8:  return  Color_RGB8_Gray;
 138|    case 16:  return  Color_RGB16_Gray;
 139|    case 24:  return  Color_RGB24_Gray;
 140|  }
 141|  ASSERT(1);
 142|  return  0;
 143|}
 144|
 145|
 146| 
 147|/*--------------------------------------------------------------------*/
 148|/* 3. <<<◆ (Color_Tester) カラーテスター >>> */ 
 149|/*--------------------------------------------------------------------*/
 150|
 151|/***********************************************************************
 152|  4. <<< [Color_Tester_init] 初期化する >>>
 153|************************************************************************/
 154|void  Color_Tester_init( Color_Tester* m, int bpp )
 155|{
 156|  ASSERT( bpp == 8 || bpp == 16 );
 157|
 158|  m->count = 0;
 159|  m->bpp = bpp;
 160|}
 161|
 162|
 163|/***********************************************************************
 164|  5. <<< [Color_Tester_getNextColor] 次の色を返す >>>
 165|************************************************************************/
 166|Color  Color_Tester_getNextColor( Color_Tester* m )
 167|{
 168|  Color  ret;
 169|
 170|  if ( m->bpp == 8 ) {
 171|    ret = 0xFF - (m->count & 0xFF);
 172|  }
 173|  else {  /* bpp == 16 */
 174|    int  c = m->count % 0x10008;
 175|
 176|    if ( c < 8 )
 177|      ret = Color_RGB3_getRGB16( 7 - c );
 178|    else
 179|      ret = 0xFFFF - (c - 8);
 180|  }
 181|
 182|  m->count ++;
 183|
 184|  return  ret;
 185|}
 186|
 187|
 188| 
 189|/*--------------------------------------------------------------------*/
 190|/* 6. <<<◆ (Color_RGB24) RGB カラー 24bpp >>> */ 
 191|/*--------------------------------------------------------------------*/
 192|
 193|/***********************************************************************
 194| 7. <<< [Color_RGB24_init] 24bpp カラーを得る(関数版)>>>
 195|************************************************************************/
 196|#ifndef NDEBUG
 197|Color_RGB24  Color_RGB24_init( int r, int g, int b )
 198|{
 199|  ASSERT( r >= 0 && r <= 255 );
 200|  ASSERT( g >= 0 && g <= 255 );
 201|  ASSERT( b >= 0 && b <= 255 );
 202|
 203|  return  Color_RGB24_init_m( r, g, b );
 204|}
 205|#endif
 206|
 207|
 208|/**************************************************************************
 209|  8. <<< YUV カラーの Y を得る(0〜255)(固定小数版)[Color_RGB24_getY2()] >>>
 210|***************************************************************************/
 211|int  Color_RGB24_getY2( Color_RGB24 color )
 212|{
 213|  int  y =
 214|      ( ( 306 * (int)Color_RGB24_getR(color) + 512 ) >> 10 )
 215|    + ( ( 601 * (int)Color_RGB24_getG(color) + 512 ) >> 10 )
 216|    + ( ( 117 * (int)Color_RGB24_getB(color) + 512 ) >> 10 );
 217|
 218|  if ( y < 0x00 )  y = 0x00;
 219|  if ( y > 0xFF )  y = 0xFF;
 220|  return  y;
 221|}
 222|
 223|
 224|/**************************************************************************
 225|  9. <<< YUV カラーの U(Cb) を得る(-128〜127)(固定小数版)[Color_RGB24_getU2()] >>>
 226|***************************************************************************/
 227|int  Color_RGB24_getU2( Color_RGB24 color )
 228|{
 229|  int  u =
 230|    - ( ( 172 * (int)Color_RGB24_getR(color) + 512 ) >> 10 )
 231|    - ( ( 340 * (int)Color_RGB24_getG(color) + 512 ) >> 10 )
 232|    + ( ( 512 * (int)Color_RGB24_getB(color) + 512 ) >> 10 );
 233|
 234|  if ( u < -128 )  u = -128;
 235|  if ( u >  127 )  u =  127;
 236|  return  u;
 237|}
 238|
 239|
 240|/**************************************************************************
 241|  10. <<< YUV カラーの V(Cr) を得る(-128〜127)(固定小数版)[Color_RGB24_getV2()] >>>
 242|***************************************************************************/
 243|int  Color_RGB24_getV2( Color_RGB24 color )
 244|{
 245|  int  v =
 246|     ( ( 512 * (int)Color_RGB24_getR(color) + 512 ) >> 10 )
 247|   - ( ( 429 * (int)Color_RGB24_getG(color) + 512 ) >> 10 )
 248|   - ( (  83 * (int)Color_RGB24_getB(color) + 512 ) >> 10 );
 249|
 250|  if ( v < -128 )  v = -128;
 251|  if ( v >  127 )  v =  127;
 252|  return  v;
 253|}
 254|
 255|
 256|/**************************************************************************
 257|  11. <<< RGB カラーから YUV カラーに変換(浮動小数版)[Color_RGB24_getYUV()] >>>
 258|***************************************************************************/
 259|#ifndef  FOR_NO_FLOAT
 260|Color_YUV  Color_RGB24_getYUV( Color_RGB24 color )
 261|{
 262|  return  ( ((int)Color_RGB24_getV( color ) + 0x80) << 16 ) +
 263|          ( ((int)Color_RGB24_getU( color ) + 0x80) << 8 ) +
 264|             (int)Color_RGB24_getY( color );
 265|}
 266|#endif
 267|
 268|
 269| 
 270|/**************************************************************************
 271|  12. <<< [Color_RGB24_makeShadPalet] シェーディングパレット設定用の色の配列を作る >>> 
 272|【引数】
 273|  ・Color_RGB24*  palet;       色の配列(出力、要素数は palet_n 以上を用意)
 274|  ・Color_RGB24  start, end;   シェーディングの開始色、終了色
 275|  ・int  palet_n;            出力する色の数
 276|***************************************************************************/
 277|#ifdef  USES_BRESEN
 278|void  Color_RGB24_makeShadPalet( Color_RGB24* palet,
 279|  Color_RGB24 start, Color_RGB24 end, int palet_n )
 280|{
 281|  int  r, g, b;
 282|  Bresen_Ex  red_plus, green_plus, blue_plus;
 283|  int  palet_diff = palet_n - 1;
 284|  Color_RGB24*  palet_last = palet + palet_diff;
 285|
 286|  ASSERT( palet_n > 0 );
 287|
 288|  r = Color_RGB24_getR( start );
 289|  g = Color_RGB24_getG( start );
 290|  b = Color_RGB24_getB( start );
 291|  Bresen_Ex_init( &red_plus, palet_diff, Color_RGB24_getR( end ) - r );
 292|  Bresen_Ex_init( &green_plus, palet_diff, Color_RGB24_getG( end ) - g );
 293|  Bresen_Ex_init( &blue_plus, palet_diff, Color_RGB24_getB( end ) - b );
 294|
 295|  for (;;) {
 296|    *palet = Color_RGB24_init( r, g, b );
 297|    if ( palet >= palet_last )  break;
 298|
 299|    palet ++;
 300|    r += Bresen_Ex_next( &red_plus );
 301|    g += Bresen_Ex_next( &green_plus );
 302|    b += Bresen_Ex_next( &blue_plus );
 303|  }
 304|}
 305|#endif
 306| 
 307|/*--------------------------------------------------------------------*/
 308|/* 13. <<<◆ (Color_YUV) YUV カラー 24bpp >>> */ 
 309|/*--------------------------------------------------------------------*/
 310|
 311|/**************************************************************************
 312|  14. <<< RGB カラーの Red を得る(固定小数版)[Color_YUV_getR2()] >>>
 313|***************************************************************************/
 314|int  Color_YUV_getR2( Color_YUV color )
 315|{
 316|  int  r =          Color_YUV_getY(color)
 317|         + ( (1436 * Color_YUV_getV(color) + 512) >> 10 );
 318|
 319|  if ( r > 0xFF )  r = 0xFF;
 320|  if ( r < 0x00 )  r = 0x00;
 321|  return  r;
 322|}
 323|
 324|
 325|/**************************************************************************
 326|  15. <<< RGB カラーの Green を得る(固定小数版)[Color_YUV_getG2()] >>>
 327|***************************************************************************/
 328|int  Color_YUV_getG2( Color_YUV color )
 329|{
 330|  int  g =           Color_YUV_getY(color)
 331|         - ( ( 352 * Color_YUV_getU(color) + 512 ) >> 10 )
 332|         - ( ( 731 * Color_YUV_getV(color) + 512 ) >> 10 );
 333|
 334|  if ( g < 0x00 )  g = 0x00;
 335|  if ( g > 0xFF )  g = 0xFF;
 336|  return  g;
 337|}
 338|
 339|
 340|/**************************************************************************
 341|  16. <<< RGB カラーの Blue を得る(固定小数版)[Color_YUV_getB2()] >>>
 342|***************************************************************************/
 343|int  Color_YUV_getB2( Color_YUV color )
 344|{
 345|  int  b =          Color_YUV_getY(color)
 346|         + ( ( 1814 * Color_YUV_getU(color) + 512 ) >> 10 )
 347|         - ( (        Color_YUV_getV(color) + 512 ) >> 10 );
 348|
 349|  if ( b < 0x00 )  b = 0x00;
 350|  if ( b > 0xFF )  b = 0xFF;
 351|  return  b;
 352|}
 353|
 354|
 355|/**************************************************************************
 356|  17. <<< YUV カラーから RGB カラーに変換(浮動小数版)[Color_YUV_getRGB()] >>>
 357|***************************************************************************/
 358|#ifndef  FOR_NO_FLOAT
 359|Color_RGB24  Color_YUV_getRGB( Color_YUV color )
 360|{
 361|  return  ((int)Color_YUV_getR( color ) << 16 ) +
 362|          ((int)Color_YUV_getG( color ) << 8  ) +
 363|           (int)Color_YUV_getB( color );
 364|}
 365|#endif
 366|
 367|
 368| 
 369|/*--------------------------------------------------------------------*/
 370|/* 18. <<<◆ (Color_RGB16) RGB カラー 16bpp >>> */ 
 371|/*--------------------------------------------------------------------*/
 372|
 373|/***********************************************************************
 374| 19. <<< 16bpp カラーを得る [Color_RGB16_init] >>>
 375|************************************************************************/
 376|#ifndef NDEBUG
 377|Color_RGB16  Color_RGB16_init( int r, int g, int b )
 378|{
 379|  ASSERT( r >= 0 && r <= 31 && g >= 0 && g <= 63 && b >= 0 && b <= 31 );
 380|  return  ( ((r) << 11) | ((g) << 5) | (b) );
 381|}
 382|#endif
 383|
 384|
 385|/***********************************************************************
 386| 20. <<< Red を得る(0〜31)[Color_RGB16_getR] >>>
 387|************************************************************************/
 388|#ifndef NDEBUG
 389|int  Color_RGB16_getR( Color_RGB16 color )
 390|{
 391|  ASSERT( color >= 0 && color <= 0xFFFF );
 392|  return  ( (color) >> 11 );
 393|}
 394|#endif
 395| 
 396|/*--------------------------------------------------------------------*/
 397|/* 21. <<<◆ (Color_RGB3) RGB カラー 3bpp >>> */ 
 398|/*--------------------------------------------------------------------*/
 399|
 400|/**************************************************************************
 401|  22. <<< 3bpp(8色) を 8bpp(256色,RRRGGGBB) に変換する [Color_getBps3to8()] >>>
 402|***************************************************************************/
 403|Color  Color_getBps3to8( Color c3 )
 404|{
 405|  Color  c = 0;
 406|
 407|  if ( c3 & 0x4 )  c += 0xE0;
 408|  if ( c3 & 0x2 )  c += 0x1C;
 409|  if ( c3 & 0x1 )  c += 0x03;
 410|
 411|  return  c;
 412|}
 413|
 414|
 415| 
 416|