home *** CD-ROM | disk | FTP | other *** search
/ MACD 9 / MACD9.iso / Datatypes / BMPdt / source / CreateHAMLine.c < prev    next >
Encoding:
C/C++ Source or Header  |  1998-08-13  |  2.5 KB  |  100 lines

  1. #include <stdlib.h>
  2. #include <exec/types.h>
  3. #include "compiler.h"
  4.  
  5. INLINE
  6. VOID CreateHAM6Line(UBYTE *R,UBYTE *G,UBYTE *B,UBYTE *Line,LONG PixelPlus,ULONG Width)
  7. { enum { SHIFT_HAM6=4,MODIFY_RED6=0x20,MODIFY_GREEN6=0x30,MODIFY_BLUE6=0x10 };
  8.   ULONG DeltaR,DeltaG,DeltaB,DeltaL,LastR,LastG,LastB,r,g,b,l,m;
  9.  
  10.   LastR = LastG = LastB = 0;
  11.  
  12.   do {
  13.  
  14.     r=*R,r>>=SHIFT_HAM6; g=*G,g>>=SHIFT_HAM6; b=*B,b>>=SHIFT_HAM6;
  15.  
  16.     l = 11 * r; l += 16 * g; l += 5 * b; l >>= 5;
  17.  
  18.     DeltaL = abs(l - b); DeltaL += abs(l - g); DeltaL += abs(l - r);
  19.  
  20.     b -= LastB; b = abs(b); g -= LastG; g = abs(g); r -= LastR; r = abs(r);
  21.  
  22.     DeltaR = g + b; DeltaG = r + b; DeltaB = r + g;
  23.  
  24.     b = DeltaB; g = DeltaG; r = DeltaR;
  25.  
  26.     if (r > DeltaL && g > DeltaL && b > DeltaL) {
  27.       LastR = LastG = LastB = l;
  28.     }
  29.     else {
  30.       if (g <= r) {
  31.         if (g <= b) {
  32.           LastG = (l=*G,l>>=SHIFT_HAM6); m = MODIFY_GREEN6;
  33.         }
  34.         else {
  35.           LastB = (l=*B,l>>=SHIFT_HAM6); m = MODIFY_BLUE6;
  36.         }
  37.       }
  38.       else {
  39.         if (r <= b) {
  40.           LastR = (l=*R,l>>=SHIFT_HAM6); m = MODIFY_RED6;
  41.         }
  42.         else {
  43.           LastB = (l=*B,l>>=SHIFT_HAM6); m = MODIFY_BLUE6;
  44.         }
  45.       }
  46.  
  47.       l |= m;
  48.     }
  49.  
  50.   } while (*Line++=l,R+=PixelPlus,G+=PixelPlus,B+=PixelPlus,--Width);
  51. }
  52.  
  53. INLINE
  54. VOID CreateHAM8Line(UBYTE *R,UBYTE *G,UBYTE *B,UBYTE *Line,LONG PixelPlus,ULONG Width)
  55. { enum { SHIFT_HAM8=2,MODIFY_RED8=0x80,MODIFY_GREEN8=0xC0,MODIFY_BLUE8=0x40 };
  56.   ULONG DeltaR,DeltaG,DeltaB,DeltaL,LastR,LastG,LastB,r,g,b,l,m;
  57.  
  58.   LastR = LastG = LastB = 0;
  59.  
  60.   do {
  61.  
  62.     r=*R,r>>=SHIFT_HAM8; g=*G,g>>=SHIFT_HAM8; b=*B,b>>=SHIFT_HAM8;
  63.  
  64.     l = 11 * r; l += 16 * g; l += 5 * b; l >>= 5;
  65.  
  66.     DeltaL = abs(l - b); DeltaL += abs(l - g); DeltaL += abs(l - r);
  67.  
  68.     b -= LastB; b = abs(b); g -= LastG; g = abs(g); r -= LastR; r = abs(r);
  69.  
  70.     DeltaR = g + b; DeltaG = r + b; DeltaB = r + g;
  71.  
  72.     b = DeltaB; g = DeltaG; r = DeltaR;
  73.  
  74.     if (r > DeltaL && g > DeltaL && b > DeltaL) {
  75.       LastR = LastG = LastB = l;
  76.     }
  77.     else {
  78.       if (g <= r) {
  79.         if (g <= b) {
  80.           LastG = (l=*G,l>>=SHIFT_HAM8); m = MODIFY_GREEN8;
  81.         }
  82.         else {
  83.           LastB = (l=*B,l>>=SHIFT_HAM8); m = MODIFY_BLUE8;
  84.         }
  85.       }
  86.       else {
  87.         if (r <= b) {
  88.           LastR = (l=*R,l>>=SHIFT_HAM8); m = MODIFY_RED8;
  89.         }
  90.         else {
  91.           LastB = (l=*B,l>>=SHIFT_HAM8); m = MODIFY_BLUE8;
  92.         }
  93.       }
  94.  
  95.       l |= m;
  96.     }
  97.  
  98.   } while (*Line++=l,R+=PixelPlus,G+=PixelPlus,B+=PixelPlus,--Width);
  99. }
  100.