On 08/25/2012 06:45 PM, Søren Sandmann Pedersen wrote:

Also note that the linear->sRGB scanline store routine is probably
slower with these patches because it now uses a binary search instead
of a simple table lookup. If someone has better suggestions here, I'm
definitely interested.

I would use a set of bits at the top of the floating point number to index a table of linear approximations. Each entry in the table produces an A and B floating point value and the result is Ax+B.

Interesting 32-bit floating point numbers in hex:

        0.0       0x00000000
        0.0031308 0x3b4d2e1c (end of linear part of sRGB)
        1.0       0x3f800000

I would use some if statements to evenly divide the area between just before .0031308 and 1.0 into whatever number of segments you want. Numbers before this go into a single bin for the linear part of sRGB. Zero and all negative numbers go into a bin producing a horizontal line at zero, and 1.0 and above into a bin producing a horizontal line at 255.

The integer part of the floating point result is the 8-bit number. I also very much recommend that the fractional part be used for error diffusion, it is added to the next result, and a random starting point is chosen for each scan line. This will make gradients look much, much nicer.

You can also choose much larger B values such that the resulting floating point answers all have the same exponent. This will allow the 8-bit values to be directly extracted from the resulting floating point.

_______________________________________________
Pixman mailing list
Pixman@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/pixman

Reply via email to