home *** CD-ROM | disk | FTP | other *** search
- #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);
- }
-