- From: Torgue Philippe via GitHub <sysbot+gh@w3.org>
- Date: Thu, 08 Sep 2022 21:19:09 +0000
- To: public-css-archive@w3.org
letochagone has just created a new issue for https://github.com/w3c/csswg-drafts: == [css-color-3][css-color-4] where to find the formulas used for color calculations in CSS? == My question is about CSS properties source code for example the opacity property. I wanted to understand how the color is calculated. The method I'm going to describe gives the same RGB values that I get after taking a screenshot and reading the colors. Here is the html & css document, the goal is to understand the color it will display. ``` #div1 { opacity: 0.6; background-color: rgba( 155 , 66 , 200 , 0.5 ); width:200px; height: 200px; } #div2 { background-color: rgba( 0, 77 , 100 , 0.8 ); width: 200px; height: 200px; } <div id="div1" > <div id= "div2"></div> </div> ``` first i calculate the composite color : co co = Cs * as + Cb * ab * ( 1 - as) ao = as + ab * ( 1 - as ) Cs and as is the RGB and alpha of div2 Cb and ab is the RGB and alpha of div1 co = ( 0 , 77/255 , 100/255 ) * 0.8 + ( 155/255 , 66/255 , 200/255 ) * 0.5 * ( 1 - 0.8 ) co = ( 0.06 , 0.267 , 0.392 ) ao = 0.8 + 0.5 * ( 1 - 0.8 ) ao = 0.9 here is the result, it is a premultiplied color : RGBA = ( 0.06 , 0.267 , 0.392 , 0.9) Now I apply the opacity : (*) I multiply the result - the premultiplied color - by the value of the opacity = ( R , G , B , A ) * opacity = ( 0.06 , 0.267 , 0.392 , 0.9) * 0.6 = ( 0.036 , 0.1602 , 0.2352 , 0.54 ) Now, we extract the color component of this pre-multiplied value , we divide ( 0.036 , 0.1602 , 0.2352 ) by 0.54 : ( 0.07 , 0.27 , 0.43 ) and we compose the result with the background color (the white color) : color_screen = ( 0.07 , 0.27 , 0.43 ) * 0.54 + ( 1 , 1 , 1 ) * 1 * ( 1 - 0.54 ) This result corresponds to the one measured after a screenshot Finally, here is my question: it concerns step (*), I applied the opacity on the premultiplied color. And that's what gives me the final result equal to the screenshot. In short : If my result matches the theory : **why is the opacity applied to the premultiplied color ?** here are the two possible schemes, and I wonder why it's the first one that seems to be chosen : **first possibility** 1 : blending, compositing 2 : (r,g,b,a) = premultiplied value after compositing 3 : apply opacity on this premultiplied value : ( r * opacity , g * opacity, g * opacity, a * opacity) **second possibility** 1 : blending, compositing 2 : (r,g,b,a) = premultiplied value after compositing 4 : EXTRACT the color component (r/a, g/a, b/a , a ) 3 : apply opacity on this color : ( r/a * opacity , g/a * opacity, b/a * opacity, a * opacity ) why the first method seems to have been chosen ? **do we have access to the source code of the CSS functions? (in order to understand precisely their role)** (Finally, the question I am asking is not a "bug" that I have noticed, is there another place to ask this type of question?) Please view or discuss this issue at https://github.com/w3c/csswg-drafts/issues/7718 using your GitHub account -- Sent via github-notify-ml as configured in https://github.com/w3c/github-notify-ml-config
Received on Thursday, 8 September 2022 21:19:11 UTC