home *** CD-ROM | disk | FTP | other *** search
/ Phoenix Heaven Sunny 2 / APPARE2.BIN / oh_towns / tetujin / src.lzh / G_EFF / YMIDFLT.C < prev    next >
Text File  |  1994-11-16  |  5KB  |  227 lines

  1. /*
  2.         graphic effect lib.
  3.  
  4.         h. Toda 1994 8 22
  5. */
  6.  
  7. #include <stdio.h>
  8. #include <stdlib.h>
  9. #include <egb.h>
  10. #include "g_eff.h"
  11.  
  12. #define NOERR 0        /* no error */
  13.  
  14. static int mx ;
  15. static int aSen ;
  16. static int mSen ;
  17. static int cMax ;
  18. static int aMax ;
  19. static int x1 ;
  20. static int y1 ;
  21. static int x2 ;
  22. static int y2 ;
  23. static int (*read1)() ;
  24. static int (*read2)() ;
  25. static int (*write)() ;
  26. static int (*mask)() ;
  27.  
  28. g_s_c_yFilter( BASICPARA *para, int rate )
  29. {
  30.     unsigned char a[3][4] ;
  31.     int b[3][4] ;
  32.     int add[256] ;
  33.     int i, x, y ;
  34.  
  35.     mx = para->mix ;
  36.     aSen = para->alphaSen ;
  37.     mSen = para->maskSen ;
  38.     cMax = para->colorMax ;
  39.     aMax = para->alphaMax ;
  40.     x1 = para->lupx ;
  41.     y1 = para->lupy ;
  42.     x2 = para->rdwx ;
  43.     y2 = para->rdwy ;
  44.     read1 = para->read1 ;
  45.     read2 = para->read2 ;
  46.     write = para->write ;
  47.     mask = para->mask ;
  48.  
  49.     for( i=0 ; i<256 ; i++ )
  50.     {
  51.         if( i < rate )
  52.             add[i] = 0 ;
  53.         else if( i < rate*3 )
  54.             add[i] = (i-rate)*(i-rate)*(-2*i + 9*rate)/(4*rate*rate) ;
  55.         else if( i < 256 )
  56.             add[i] = i ;
  57.     }
  58.  
  59.     for( y = y1 ; y <= y2 ; y++ )
  60.     {
  61.         for( x=x1 ; x <= x2 ; x++ )
  62.         {
  63.             int del ;
  64.             int r0, g0, b0 ;
  65.  
  66.             read1( x, y, a[0] ) ;
  67.             read2( x, y, a[1] ) ;
  68.  
  69.             for( i=0 ; i<2 ; i++ )
  70.                 rgbToYuv( a[i][0], a[i][1], a[i][2],
  71.                           &(b[i][0]), &(b[i][1]), &(b[i][2]), cMax ) ;
  72.  
  73.             del = b[0][0] - b[1][0] ;
  74.  
  75.             if( del >= 0 )
  76.                 b[2][0] = b[1][0] + add[ del ] ;
  77.             else
  78.                 b[2][0] = b[1][0] - add[ -del ] ;
  79.  
  80.             /* 色相はread領域のデータを取る */
  81.             yuvToRgb( b[2][0], b[0][1], b[0][2], &r0, &g0, &b0, cMax ) ;
  82.             a[2][0] = r0 ;
  83.             a[2][1] = g0 ;
  84.             a[2][2] = b0 ;
  85.             mixWrite( x, y, a[2], a[0] ) ;
  86.         }
  87.     }
  88.  
  89.     return NOERR ;
  90. }
  91.  
  92. g_c_m_yFilter( BASICPARA *para, int rate )
  93. {
  94.     unsigned char a[3][4] ;
  95.     int b[3][4] ;
  96.     int add[256] ;
  97.     int i, x, y ;
  98.  
  99.     mx = para->mix ;
  100.     aSen = para->alphaSen ;
  101.     mSen = para->maskSen ;
  102.     cMax = para->colorMax ;
  103.     aMax = para->alphaMax ;
  104.     x1 = para->lupx ;
  105.     y1 = para->lupy ;
  106.     x2 = para->rdwx ;
  107.     y2 = para->rdwy ;
  108.     read1 = para->read1 ;
  109.     read2 = para->read2 ;
  110.     write = para->write ;
  111.     mask = para->mask ;
  112.  
  113.     for( i=0 ; i<256 ; i++ )
  114.     {
  115.         if( i < rate )
  116.             add[i] = 0 ;
  117.         else if( i < rate*3 )
  118.             add[i] = (i-rate)*(i-rate)*(-2*i + 9*rate)/(4*rate*rate) ;
  119.         else if( i < 256 )
  120.             add[i] = i ;
  121.     }
  122.  
  123.     for( y = y1 ; y <= y2 ; y++ )
  124.     {
  125.         for( x=x1 ; x <= x2 ; x++ )
  126.         {
  127.             int del ;
  128.             int r0, g0, b0 ;
  129.  
  130.             read2( x, y, a[0] ) ;
  131.             read1( x, y, a[1] ) ;
  132.  
  133.             for( i=0 ; i<2 ; i++ )
  134.                 rgbToYuv( a[i][0], a[i][1], a[i][2],
  135.                           &(b[i][0]), &(b[i][1]), &(b[i][2]), cMax ) ;
  136.  
  137.             del = b[0][0] - b[1][0] ;
  138.  
  139.             if( del >= 0 )
  140.                 b[2][0] = b[1][0] + add[ del ] ;
  141.             else
  142.                 b[2][0] = b[1][0] - add[ -del ] ;
  143.  
  144.             /* 色相はread領域のデータを取る */
  145.             yuvToRgb( b[2][0], b[1][1], b[1][2], &r0, &g0, &b0, cMax ) ;
  146.             a[2][0] = r0 ;
  147.             a[2][1] = g0 ;
  148.             a[2][2] = b0 ;
  149.             mixWrite( x, y, a[2], a[1] ) ;
  150.         }
  151.     }
  152.  
  153.     return NOERR ;
  154. }
  155.  
  156. static mixWrite( int x, int y, unsigned char *a, unsigned char *b )
  157. {
  158.     unsigned char c[4] ;
  159.     int mix ;
  160.  
  161.     if( mSen )
  162.     {
  163.         if( mask( x, y ) >= mSen )
  164.             return NOERR ;
  165.     }
  166.  
  167.     mix = mx ;
  168.     if( aSen )
  169.     {
  170.         mix = mix * b[3] / aMax ;
  171.     }
  172.  
  173.     c[0] = ( a[0] * mix + b[0] * ( 256 - mix ) + 0x80 ) >> 8 ;
  174.     c[1] = ( a[1] * mix + b[1] * ( 256 - mix ) + 0x80 ) >> 8 ;
  175.     c[2] = ( a[2] * mix + b[2] * ( 256 - mix ) + 0x80 ) >> 8 ;
  176.     c[3] = b[3] ;
  177.  
  178.     if( mix )
  179.     {
  180.         write( x, y, c ) ;
  181.     }
  182.  
  183.     return NOERR ;
  184. }
  185.  
  186. static rgbToYuv( int r0, int g0, int b0, int *y0, int *u0, int *v0, int max )
  187. {
  188.     int y, cb, cr ;
  189.  
  190.     y  =  19595*r0 + 38470*g0 + 7471*b0 ;
  191.     cb = -11049*r0 - 21699*g0 + 32748*b0 ;
  192.     cr =  32755*r0 -27427*g0 -5328*b0 ;
  193.  
  194.     *y0 = ( ((y/max)*219) >> 16 ) + 16 ;
  195.     *u0 = ( ((cb/max)*224) >> 16 ) + 128 ;
  196.     *v0 = ( ((cr/max)*224) >> 16 ) + 128 ;
  197.  
  198.     if( *y0 < 0 )*y0 = 0 ;
  199.     if( *y0 > 255 )*y0 = 255 ;
  200.     if( *u0 < 0 )*u0 = 0 ;
  201.     if( *u0 > 255 )*u0 = 255 ;
  202.     if( *v0 < 0 )*v0 = 0 ;
  203.     if( *v0 > 255 )*v0 = 255 ;
  204.  
  205.     return NOERR ;
  206. }
  207.  
  208. static yuvToRgb( int y0, int u0, int v0, int *r0, int *g0, int *b0, int max )
  209. {
  210.     y0 = (( y0 - 16 ) * max )/219 ;
  211.     u0 = (( u0 -128 ) * max )/224 ;
  212.     v0 = (( v0 -128 ) * max )/224 ;
  213.  
  214.     *r0 = ( 65536*y0 + 4*u0 + 91920*v0 ) >> 16 ;
  215.     *g0 = ( 65536*y0 - 22569*u0 - 46819*v0 ) >> 16 ;
  216.     *b0 = ( 65536*y0 + 116198*u0 - 9*v0 ) >> 16 ;
  217.  
  218.     if( *r0 < 0 )*r0 = 0 ;
  219.     if( *r0 > max )*r0 = max ;
  220.     if( *g0 < 0 )*g0 = 0 ;
  221.     if( *g0 > max )*g0 = max ;
  222.     if( *b0 < 0 )*b0 = 0 ;
  223.     if( *b0 > max )*b0 = max ;
  224.  
  225.     return NOERR ;
  226. }
  227.