[cairo] Re: Linear colorspace not a good idea

Bill Spitzak spitzak at d2.com
Tue Mar 14 12:15:17 PST 2006

Russell Shaw wrote:

> ...Isn't all colour graphics currently stored as linear light-intensity 
> luminence?

No. Almost everything that is stored as integers is in sRGB intensity. 
And it appears the majority of data stored in floating point is in sRGB, 
due to people who don't understand this when writing the files, far too 
many renderers convert texture maps or other images by dividing the 
integer data by a constant, resulting in images that are effectively 
sRGB, no matter how accurate and linear their lighting calculations are.

> To get linear intensity out the CRT vs intensity into the camera, the tube
> gamma must be the inverse of the camera gamma, so y2 = 1/y1.

I believe when television was developed, they added circuitry to the 
cameras so that it's gamma was the inverse of the tube. They decided 
that the receiver should be as cheap as possible and all compensation 
should be in the camera. As far as I know, the electron gun is the main 
non-linear part. The phosphere is linear, the amplifiers are linear, and 
the D->A converters used to output from the computer to analog are linear.

> I'm not sure of "device space". Is this the nonlinear luminance data of an
> uncompensated camera?


>> First is that there is a huge supply of icons that have been designed 
>> to be composited in sRGB space and will have bad edges otherwise when 
>> put atop the background they are designed for.
> I'd correct any icons to assume a linear camera and CRT (y1=y2=1.0).

The problem is with partially-transparent parts. I have discoverd in my 
attempts to make a linear-math compositing program that dealing with 
images designed for GUI is almost impossible and I had to add switches 
to composite in sRGB space.

The problem is that the stored image will try to achieve the color C 
when composited atop the color B, by storing, in the same image, *many* 
variations of color A and alpha a such that C=A+B(1-a) in sRGB. This is 
especially true of hand-painted overlays from Photoshop, but it is also 
true of many painted and CG icons edges, icons designed to be 
transparent, and the output of matte-pulling functions. It does not 
appear to be possible to correctly composite these images except by 
converting back to sRGB and doing the sum in sRGB space.

> There's too many "programmers" clueless about gamma and there's no sense
> in propagating their mistakes.

I agree but I'm afraid it may be impossible in this case. All that will 
happen is people will say "I can't use Cairo because all the edges of my 
icons designed for XP look really bad."

> Black and white still looks black and white regardless of the intensity
> data being linear or nonlinear. I don't see where the difference would
> come from.

The problem is not the black and white pixels, but the 50% gray pixel 
that indicates it is half-covered by the graphic. In linear space this 
is correctly emitting half the light as the white pixel. Unfortunatly a 
person looking at that pixel would think it is about 3/4 as bright as 
the white one and thus 3/4 filled with white. Thus an antialised black 
graphic looks thinner than an antialiased white graphic. The effect is 
highest when the graphic is 1 or 2 pixels thick, and quickly goes to 
zero when the graphic approaches 10 pixels thick.

In sRGB the 50% gray pixel, though much darker than 50% as bright as the 
white one, *looks* half-filled. Now thin graphics seem to match. But as 
the graphic gets thicker, the incorrect brightness becomes more 
important, so by the time it is 10 pixels thick, the linear antialiasing 
is better.

> Precisely define "device space". Is it linear intensity of effective
> camera gamma=1.0, or is it the nonlinear data from an uncompensated camera?

It's the non-linear data.

More information about the cairo mailing list