AWARE [SYSTEMS] Imaging expertise for the Delphi developer
AWare Systems, Imaging expertise for the Delphi developer, Home TIFF and LibTiff Mailing List Archive

LibTiff Mailing List

TIFF and LibTiff Mailing List Archive
January 2004

Previous Thread
Next Thread

Previous by Thread
Next by Thread

Previous by Date
Next by Date

Contact

The TIFF Mailing List Homepage
This list is run by Frank Warmerdam
Archive maintained by AWare Systems



Valid HTML 4.01!



Thread

2004.01.14 12:01 "COLORMAP and byte padding", by Stephan Assmus
2004.01.14 15:07 "Re: COLORMAP and byte padding", by Frank Warmerdam
2004.01.14 16:18 "Re: COLORMAP and byte padding", by Gerben Vos
2004.01.14 16:43 "Re: COLORMAP and byte padding", by Joris Van Damme
2004.01.14 17:13 "Re: COLORMAP and byte padding", by Gerben Vos
2004.01.14 17:17 "Re: COLORMAP and byte padding", by Joris Van Damme
2004.01.14 17:26 "Re: COLORMAP and byte padding", by Andy Cave
2004.01.14 17:36 "Re: COLORMAP and byte padding", by Joris Van Damme
2004.01.14 17:24 "Re: COLORMAP and byte padding", by Phillip Crews
2004.01.14 18:18 "Re: COLORMAP and byte padding", by Marti Maria
2004.01.14 19:02 "Re: COLORMAP and byte padding", by Andy Cave
2004.01.14 19:36 "Re: COLORMAP and byte padding", by Marti Maria
2004.01.14 19:48 "Re: COLORMAP and byte padding", by Andy Cave
2004.01.15 17:24 "Re: COLORMAP and byte padding", by Marti Maria
2004.01.15 17:37 "Re: COLORMAP and byte padding", by Andy Cave
2004.01.15 00:05 "Re: COLORMAP and byte padding", by Chris Cox

2004.01.14 18:18 "Re: COLORMAP and byte padding", by Marti Maria

Hi,

> For the perfectionists who are wondering: multiplying by 257 works perfectly. In
> effect, it makes the least significant byte a copy of the most significant byte 
> of the 16-bit value. In C:
>
> uint16val = ((uint8val << 8) | uint8val);
>
> Note that when reducing the 16-bit value to 8-bit, you could divide by 257 
> and round, but it's way faster to simply take the upper byte (the same as 
> an integer division by 256, truncating everything after the decimal point). 
> Don't divide by 256 and round, because you will end up 1 too high in 
> 50% of the cases. In C:
>
> uint8val = (uint16val >> 8);
>

Yep, that is fast, but unfortunately can give significant errors, since that 
is same than dividing by 256.

Here are a couple of macros that does the trick. 

#define RGB_8_TO_16(rgb) (WORD) ((((WORD) (rgb)) << 8)|(rgb))
#define RGB_16_TO_8(rgb) (BYTE) ((((rgb) * 65281 + 8388608) >> 24) & 0xFF)


Regards,
Marti Maria
The little cms project
http://www.littlecms.com
marti@littlecms.com