home *** CD-ROM | disk | FTP | other *** search
- /*
- Kod úródîowy pochodzi z CyberXXXsrc
- i ksiâûki "Programowanie plików graficznych
- w C/C++" wydawinictwo Translator s.c.
- z moimi drobnymi zmianami.
- */
- #include <exec/types.h>
- #define abs(x) ((x)<0?-(x):(x))
- #define DELTA(x1,x2) abs((x1)-(x2))
- #define NUM_GUNS 3
-
- void RGBtoHAM( UBYTE *rgb,
- UBYTE *ham,
- ULONG width,
- ULONG height,
- BYTE mode)
- {
- UBYTE oRed, oGreen, oBlue;
- UBYTE dRed, dGreen, dBlue;
- UBYTE red, green, blue;
- ULONG xp, yp;
- UBYTE mod_r, mod_g, mod_b, mod;
-
- if(mode)
- {
- mod_r=0x80;
- mod_g=0xC0;
- mod_b=0x40;
- mod=2;
- }
- else
- {
- mod_r=0x20;
- mod_g=0x30;
- mod_b=0x10;
- mod=4;
- }
-
- for (yp=height; yp>0; yp--)
- {
- oRed=0;
- oGreen=0;
- oBlue=0;
-
- for (xp=width; xp>0; xp--)
- {
- red=rgb[0] >> mod;
- green=rgb[1] >> mod;
- blue=rgb[2] >> mod;
- rgb+=3;
-
- if ((red==oRed) && (green==oGreen) && (blue==oBlue))
- {
- switch (xp%NUM_GUNS)
- {
- case 0:
- *ham++=mod_r | red;
- break;
- case 1:
- *ham++=mod_g | green;
- break;
- case 2:
- *ham++=mod_b | blue;
- }
- continue;
- }
-
- dRed=DELTA(red,oRed);
- dGreen=DELTA(green,oGreen);
- dBlue=DELTA(blue,oBlue);
- if (dRed>dGreen)
- {
- if (dRed>dBlue)
- {
- *ham++=mod_r | red;
- oRed=red;
- }
- else
- {
- *ham++=mod_b | blue;
- oBlue=blue;
- }
- }
- else
- {
- if (dGreen>dBlue)
- {
- *ham++=mod_g | green;
- oGreen=green;
- }
- else
- {
- *ham++=mod_b | blue;
- oBlue=blue;
- }
- }
- }
- }
- }
-