home *** CD-ROM | disk | FTP | other *** search
/ Amiga Tools 2 / Amiga Tools 2.iso / tex / specialhost / source / filter.c < prev    next >
Encoding:
C/C++ Source or Header  |  1995-03-15  |  2.2 KB  |  145 lines

  1. /*
  2. **    SpecialHost for PasTeX
  3. **
  4. **    Copyright © by Olaf Barthel & Georg Heßmann
  5. */
  6.  
  7. #include "Global.h"
  8.  
  9. VOID __regargs
  10. BrightnessFilter(UBYTE *Table,LONG Scale)
  11. {
  12.     if(Scale == -100)
  13.         memset(Table,0,256);
  14.     else
  15.     {
  16.         LONG i;
  17.  
  18.         if(Scale != 0)
  19.         {
  20.             LONG Value;
  21.  
  22.             if(Scale > 0)
  23.             {
  24.                 Scale = (255 * Scale) / 100;
  25.     
  26.                 for(i = 0 ; i < 256 ; i++)
  27.                 {
  28.                     if((Value = ((LONG)Table[i]) + Scale) >= 255)
  29.                         Table[i] = 255;
  30.                     else
  31.                         Table[i] = Value;
  32.                 }
  33.             }
  34.             else
  35.             {
  36.                 Scale = (255 * (-Scale)) / 100;
  37.     
  38.                 for(i = 0 ; i < 256 ; i++)
  39.                 {
  40.                     if((Value = ((LONG)Table[i]) - Scale) <= 0)
  41.                         Table[i] = 0;
  42.                     else
  43.                         Table[i] = Value;
  44.                 }
  45.             }
  46.         }
  47.     }
  48. }
  49.  
  50. VOID __regargs
  51. ContrastFilter(UBYTE *Table,LONG Scale)
  52. {
  53.     if(Scale != 0)
  54.     {
  55.         LONG Delta,i;
  56.  
  57.         if(Scale < 0)
  58.         {
  59.             Scale += 100;
  60.     
  61.             for(i = 0 ; i < 128 ; i++)
  62.             {
  63.                 if((Delta = ((127 - (LONG)Table[i]) * Scale) / 100) > 127)
  64.                     Delta = 127;
  65.                 else
  66.                 {
  67.                     if(Delta < 0)
  68.                         Delta = 0;
  69.                 }
  70.     
  71.                 Table[i] = 127 - Delta;
  72.     
  73.                 if((Delta = (((LONG)Table[i + 128] - 128) * Scale) / 100) > 127)
  74.                     Delta = 127;
  75.                 else
  76.                 {
  77.                     if(Delta < 0)
  78.                         Delta = 0;
  79.                 }
  80.     
  81.                 Table[i + 128] = 128 + Delta;
  82.             }
  83.         }
  84.         else
  85.         {
  86.             LONG Greatest,Smallest;
  87.  
  88.             if((Greatest = (LONG)Table[255 - (127 * Scale) / 100] - 128) < 1)
  89.                 Greatest = 1;
  90.  
  91.             if((Smallest = 127 - (127 * Scale) / 100) < 1)
  92.                 Smallest = 1;
  93.  
  94.             for(i = 0 ; i < 128 ; i++)
  95.             {
  96.                 if((Delta = (128 * (127 - (LONG)Table[i])) / Smallest) > 127)
  97.                     Delta = 127;
  98.                 else
  99.                 {
  100.                     if(Delta < -127)
  101.                         Delta = -127;
  102.                 }
  103.  
  104.                 Table[i] = 127 - Delta;
  105.  
  106.                 if((Delta = (128 * ((LONG)Table[i + 128] - 128)) / Greatest) > 127)
  107.                     Delta = 127;
  108.                 else
  109.                 {
  110.                     if(Delta < -127)
  111.                         Delta = -127;
  112.                 }
  113.     
  114.                 Table[i + 128] = 128 + Delta;
  115.             }
  116.         }
  117.     }
  118. }
  119.  
  120. VOID __regargs
  121. GammaFilter(UBYTE *Table,LONG Scale)
  122. {
  123.     if(Scale == -100)
  124.         memset(Table,0,256);
  125.     else
  126.     {
  127.         if(Scale != 0)
  128.         {
  129.             register float    Gamma,Max;
  130.             register LONG    Value,i;
  131.  
  132.             Gamma    = 100.0 / (float)(Scale + 100);
  133.             Max    = 255.0;
  134.  
  135.             for(i = 0 ; i < 256 ; i++)
  136.             {
  137.                 if((Value = (LONG)(Max * pow((float)Table[i] / Max,Gamma) + 0.5)) >= 255)
  138.                     Table[i] = 255;
  139.                 else
  140.                     Table[i] = Value;
  141.             }
  142.         }
  143.     }
  144. }
  145.