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