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

  1. /*
  2.         graphic effect lib.
  3.           Y Soft
  4.  
  5.         h. Toda 1994 11 06
  6. */
  7.  
  8. #include <stdio.h>
  9. #include <stdlib.h>
  10. #include <egb.h>
  11. #include "g_eff.h"
  12.  
  13. #define NOERR 0        /* no error */
  14.  
  15. static int mx ;
  16. static int aSen ;
  17. static int mSen ;
  18. static int cMax ;
  19. static int aMax ;
  20. static int x1 ;
  21. static int y1 ;
  22. static int x2 ;
  23. static int y2 ;
  24. static int (*read1)() ;
  25. static int (*write)() ;
  26. static int (*mask)() ;
  27.  
  28. g_ySoftnessFilter( BASICPARA *para, int rate )
  29. {
  30.     unsigned char a[10][4] ;
  31.     int b[10][4] ;
  32.     int i, x, y ;
  33.     int k1, k2 ;
  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.     write = para->write ;
  46.     mask = para->mask ;
  47.  
  48.     k1 = rate >> 3 ;
  49.     k2 = 256 - k1*8 ;
  50.  
  51.     for( y = y1 ; y <= y2 ; y++ )
  52.     {
  53.         for( x=x1 ; x <= x2 ; x++ )
  54.         {
  55.             int total ;
  56.             int r0, g0, b0 ;
  57.  
  58.             read1( x-1, y-1, a[0] ) ;
  59.             read1( x,   y-1, a[1] ) ;
  60.             read1( x+1, y-1, a[2] ) ;
  61.             read1( x-1, y,   a[3] ) ;
  62.             read1( x,   y,   a[4] ) ;
  63.             read1( x+1, y,   a[5] ) ;
  64.             read1( x-1, y+1, a[6] ) ;
  65.             read1( x,   y+1, a[7] ) ;
  66.             read1( x+1, y+1, a[8] ) ;
  67.  
  68.             for( i=0 ; i<9 ; i++ )
  69.                 rgbToYuv( a[i][0], a[i][1], a[i][2],
  70.                           &(b[i][0]), &(b[i][1]), &(b[i][2]), cMax ) ;
  71.  
  72.             total = k1*(       b[0][0]  + b[1][0] + b[2][0] +
  73.                                b[3][0]            + b[5][0] +
  74.                                b[6][0]  + b[7][0] + b[8][0]
  75.                        ) +
  76.                     k2*( b[4][0] ) ;
  77.     
  78.             total = (total + 128) >> 8 ;
  79.             if( total < 0 )total = 0 ;
  80.             if( total > 255 )total = 255 ;
  81.             yuvToRgb( total, b[4][1], b[4][2], &r0, &g0, &b0, cMax ) ;
  82.             a[9][0] = r0 ;
  83.             a[9][1] = g0 ;
  84.             a[9][2] = b0 ;
  85.  
  86.             mixWrite( x, y, a[9], a[4] ) ;
  87.         }
  88.     }
  89.  
  90.     return NOERR ;
  91. }
  92.  
  93. static mixWrite( int x, int y, unsigned char *a, unsigned char *b )
  94. {
  95.     unsigned char c[4] ;
  96.     int mix ;
  97.  
  98.     if( mSen )
  99.     {
  100.         if( mask( x, y ) >= mSen )
  101.             return NOERR ;
  102.     }
  103.  
  104.     mix = mx ;
  105.     if( aSen )
  106.     {
  107.         mix = mix * b[3] / aMax ;
  108.     }
  109.  
  110.     c[0] = ( a[0] * mix + b[0] * ( 256 - mix ) + 0x80 ) >> 8 ;
  111.     c[1] = ( a[1] * mix + b[1] * ( 256 - mix ) + 0x80 ) >> 8 ;
  112.     c[2] = ( a[2] * mix + b[2] * ( 256 - mix ) + 0x80 ) >> 8 ;
  113.     c[3] = b[3] ;
  114.  
  115.     if( mix )
  116.     {
  117.         write( x, y, c ) ;
  118.     }
  119.  
  120.     return NOERR ;
  121. }
  122.  
  123. static rgbToYuv( int r0, int g0, int b0, int *y0, int *u0, int *v0, int max )
  124. {
  125.     int y, cb, cr ;
  126.  
  127.     y  =  19595*r0 + 38470*g0 + 7471*b0 ;
  128.     cb = -11049*r0 - 21699*g0 + 32748*b0 ;
  129.     cr =  32755*r0 -27427*g0 -5328*b0 ;
  130.  
  131.     *y0 = ( ((y/max)*219) >> 16 ) + 16 ;
  132.     *u0 = ( ((cb/max)*224) >> 16 ) + 128 ;
  133.     *v0 = ( ((cr/max)*224) >> 16 ) + 128 ;
  134.  
  135.     if( *y0 < 0 )*y0 = 0 ;
  136.     if( *y0 > 255 )*y0 = 255 ;
  137.     if( *u0 < 0 )*u0 = 0 ;
  138.     if( *u0 > 255 )*u0 = 255 ;
  139.     if( *v0 < 0 )*v0 = 0 ;
  140.     if( *v0 > 255 )*v0 = 255 ;
  141.  
  142.     return NOERR ;
  143. }
  144.  
  145. static yuvToRgb( int y0, int u0, int v0, int *r0, int *g0, int *b0, int max )
  146. {
  147.     y0 = (( y0 - 16 ) * max )/219 ;
  148.     u0 = (( u0 -128 ) * max )/224 ;
  149.     v0 = (( v0 -128 ) * max )/224 ;
  150.  
  151.     *r0 = ( 65536*y0 + 4*u0 + 91920*v0 ) >> 16 ;
  152.     *g0 = ( 65536*y0 - 22569*u0 - 46819*v0 ) >> 16 ;
  153.     *b0 = ( 65536*y0 + 116198*u0 - 9*v0 ) >> 16 ;
  154.  
  155.     if( *r0 < 0 )*r0 = 0 ;
  156.     if( *r0 > max )*r0 = max ;
  157.     if( *g0 < 0 )*g0 = 0 ;
  158.     if( *g0 > max )*g0 = max ;
  159.     if( *b0 < 0 )*b0 = 0 ;
  160.     if( *b0 > max )*b0 = max ;
  161.  
  162.     return NOERR ;
  163. }
  164.  
  165.