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

INLINE
VOID CreateHAM6Line(UBYTE *R,UBYTE *G,UBYTE *B,UBYTE *Line,LONG PixelPlus,ULONG Width)
{ enum { SHIFT_HAM6=4,MODIFY_RED6=0x20,MODIFY_GREEN6=0x30,MODIFY_BLUE6=0x10 };
  ULONG DeltaR,DeltaG,DeltaB,DeltaL,LastR,LastG,LastB,r,g,b,l,m;

  LastR = LastG = LastB = 0;

  do {

    r=*R,r>>=SHIFT_HAM6; g=*G,g>>=SHIFT_HAM6; b=*B,b>>=SHIFT_HAM6;

    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_HAM6); m = MODIFY_GREEN6;
        }
        else {
          LastB = (l=*B,l>>=SHIFT_HAM6); m = MODIFY_BLUE6;
        }
      }
      else {
        if (r <= b) {
          LastR = (l=*R,l>>=SHIFT_HAM6); m = MODIFY_RED6;
        }
        else {
          LastB = (l=*B,l>>=SHIFT_HAM6); m = MODIFY_BLUE6;
        }
      }

      l |= m;
    }

  } while (*Line++=l,R+=PixelPlus,G+=PixelPlus,B+=PixelPlus,--Width);
}

INLINE
VOID CreateHAM8Line(UBYTE *R,UBYTE *G,UBYTE *B,UBYTE *Line,LONG PixelPlus,ULONG Width)
{ enum { SHIFT_HAM8=2,MODIFY_RED8=0x80,MODIFY_GREEN8=0xC0,MODIFY_BLUE8=0x40 };
  ULONG DeltaR,DeltaG,DeltaB,DeltaL,LastR,LastG,LastB,r,g,b,l,m;

  LastR = LastG = LastB = 0;

  do {

    r=*R,r>>=SHIFT_HAM8; g=*G,g>>=SHIFT_HAM8; b=*B,b>>=SHIFT_HAM8;

    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_HAM8); m = MODIFY_GREEN8;
        }
        else {
          LastB = (l=*B,l>>=SHIFT_HAM8); m = MODIFY_BLUE8;
        }
      }
      else {
        if (r <= b) {
          LastR = (l=*R,l>>=SHIFT_HAM8); m = MODIFY_RED8;
        }
        else {
          LastB = (l=*B,l>>=SHIFT_HAM8); m = MODIFY_BLUE8;
        }
      }

      l |= m;
    }

  } while (*Line++=l,R+=PixelPlus,G+=PixelPlus,B+=PixelPlus,--Width);
}
