#include <stdlib.h>
#include <exec/types.h>

#ifndef INLINE
#define INLINE /**/
#endif

#define DOHAM \
  ULONG DeltaR,DeltaG,DeltaB,DeltaL,LastR,LastG,LastB,r,g,b,l,m; \
  LastR = LastG = LastB = 0; \
  do { \
    r=*R,r>>=SHIFT_HAM; g=*G,g>>=SHIFT_HAM; b=*B,b>>=SHIFT_HAM; \
    l = 11 * r; l += 16 * g; l += 5 * b; l >>= 5; \
    DeltaL = abs(l - b); DeltaL += abs(l - g); DeltaL += abs(l - r); \
    b -= LastB; b = abs(b); g -= LastG; g = abs(g); r -= LastR; r = abs(r); \
    DeltaR = g + b; DeltaG = r + b; DeltaB = r + g; \
    b = DeltaB; g = DeltaG; r = DeltaR; \
    if (r > DeltaL && g > DeltaL && b > DeltaL) { \
      LastR = LastG = LastB = l; \
    } \
    else { \
      if (g <= r) { \
        if (g <= b) { \
          LastG = (l=*G,l>>=SHIFT_HAM); m = MODIFY_GREEN; \
        } \
        else { \
          LastB = (l=*B,l>>=SHIFT_HAM); m = MODIFY_BLUE; \
        } \
      } \
      else { \
        if (r <= b) { \
          LastR = (l=*R,l>>=SHIFT_HAM); m = MODIFY_RED; \
        } \
        else { \
          LastB = (l=*B,l>>=SHIFT_HAM); m = MODIFY_BLUE; \
        } \
      } \
      l |= m; \
    } \
  } while (*Line++=l,R+=PixelPlus,G+=PixelPlus,B+=PixelPlus,--Width)

INLINE
VOID CreateHAM6Line(UBYTE *R,UBYTE *G,UBYTE *B,UBYTE *Line,LONG PixelPlus,ULONG Width)
{ enum { SHIFT_HAM=4,MODIFY_RED=0x20,MODIFY_GREEN=0x30,MODIFY_BLUE=0x10 };
  DOHAM; }

INLINE
VOID CreateHAM8Line(UBYTE *R,UBYTE *G,UBYTE *B,UBYTE *Line,LONG PixelPlus,ULONG Width)
{ enum { SHIFT_HAM=2,MODIFY_RED=0x80,MODIFY_GREEN=0xC0,MODIFY_BLUE=0x40 };
  DOHAM; }
