[ptx] 16 bit and float image support in nona/hugin
    Terje Mathisen 
    terje.mathisen at hda.hydro.com
       
    Tue May  4 08:31:53 BST 2004
    
    
  
ptx-bounces at email-lists.org wrote:
> On Mon, 03 May 2004, Kai-Uwe Behrmann wrote:
> 
> 
>>Am 03.05.04, 18:58 +0200 schrieb Pablo d'Angelo:
>>
>>
>>>Ok, I'll save the tiff files like that. Internally I'll use 8 bit alpha
>>>channels.
>>
>>This or the bit approach, You mentioned, seems to be an clever solution
>>internally.
> 
> 
> Hmm, bits are clumsy to access in C. However, an even better approach to
> store most masks would be a run length encoded image (RLE encoding every
> row separately). For the typical mask the storage would only cost a few
> bytes for every row.
> 
> Now we just need vigra::RLEImage.
I suggest a very simple encoding:
[count][value] pairs stored as unsigned bytes. This could require a few 
extra pairs for very long repeat counts, but at 128:1 compression, it 
really doesn't matter.
If you want to be fancy, then you use the fact that a repeat count of 
zero is impossible: Instead, this means that the next byte will be a 
count of uncompressed bytes following:
[0][count][a,b,c,d,e,...]
I.e. you'd use this for graduated masks where the repeat count averages 
less than two.
Decoding becomes really fast:
   count = *i++;
   mask = *i++;
   if (count) {
     memset(o, mask, count);
     o += count;
   }
   else {
     memcpy(i, o, mask);
     i += mask;
     o += mask;
   }
(Add boundary error checking to taste!)
Terje
-- 
- <Terje.Mathisen at hda.hydro.com>
"almost all programming can be viewed as an exercise in caching"
    
    
More information about the ptX
mailing list