Thanks for your reply, it is quite satisfactory.

Le quartidi 14 fructidor, an CCXIII, Marti a écrit :
> Well, this is actually the ICC encoding, as defined in the ICC spec.

Ok. I did not know that ICC went into such details.

>  // Convert them to "normal" floating point Lab 
>  // range L*(0 -> 100) ab*(-128.0 -> +127.996)
> 
>    Lab.L = 
>    Lab.a  =   ... do the scaling here using L100, a100, b100...
>    Lab.b = 
> 
>   // From floating point to 16-bits ICC encoding
>    cmsFloat2LabEncoded(wIn, &Lab);

As far as I can see in the source, the role cmsFloat2LabEncoded is to (1)
clamp the values of L, a and b, and (2) encode them as unsigned 16-bits
integers, with 0 -> 0, 65535 -> 100 for L and 0 -> -128, 65535 -> 128-1/256
for a and b.

Is it safe to assume that this encoding will be kept, and so just write:

        wIn[0] = L100 * 257;
        wIn[1] = a100 * 65535 / 100;
        wIn[2] = b100 * 65535 / 100;

(with maybe some tweaks to have proper rounding)?

> That's all. You can now use cmsDoTransform() directly. Of course this 
> will call your function for each color, so if you want performance you
> may need to optimize the code as much as possible. 

Of course. By the way, I understand that the "normal" Lab decoder is just a
pointer to a function that happens to be the default function. In that case,
there is no overhead in using a custom decoder instead of the builtin one.
Am I right ?

Regards,

-- 
  Nicolas George

Attachment: signature.asc
Description: Digital signature

Reply via email to