# Re: ISSUE-2095 (soft-light blend mode): Algorithm for soft-light blend mode [Module: Filters]

From: Anthony Grasso <anthony.grasso@cisra.canon.com.au>
Date: Fri, 13 Feb 2009 11:32:15 +1100
Message-ID: <4994BF8F.1050302@cisra.canon.com.au>
To: Benjamin Otte <otte@gnome.org>
CC: Alex Danilo <alex@abbra.com>, SVG Working Group WG <public-svg-wg@w3.org>

Hi Benjamin,

Benjamin Otte wrote:
>
>
>
> So I've spent the day looking up the bled-mode formulas, implementing
> them and testing them against various applications to make sure
> they're correct. It turns out that not only soft-light, but also
> color-dodge and color-burn are incorrect. I'll post the correct
> versions, taken from the ISO32000 PDF specification at
> to the syntax used in the SVG spec:
>

Thank you very much for taking the time to chase down the PDF specification and
the correct equations! :)

The SVG Working Group raised an issue (ISSUE-2095) about the incorrect Soft
Light blend mode equation [1] and as a result I was assigned an action
(ACTION-2427) [2] to update the SVG Compositing Module [3] with the correct
equations.

Using the equations and links you provided for the PDF specification [4] I have
updated the SVG Compositing Module specification.

I understand how the full alpha Color Dodge and Color Burn were derived from the
PDF specification, however I've miss understood how you derived the Soft Light
equation. Using the PDF specification I attempted to derive the full alpha
equation for Soft Light. This is the equation I derived.

PDF Soft Light
--------------
if 2.Sc <= 1
f(Sc,Dc) = Dc - (1 - 2.Sc).Dc.(1 - Dc)
otherwise if 2.Sc > 1 and 4.Dc <= 1
f(Sc,Dc) = Dc + (2.Sc - 1).((((16.Dc - 12).Dc + 4).Dc) - Dc)
otherwise if 2.Sc > 1 and 4.Dc > 1
f(Sc,Dc) = Dc + (2.Sc - 1).(SQRT(Dc) - Dc)
X        = 1
Y        = 1
Z        = 1

Derived Soft Light with Alpha
-----------------------------
if 2.Sca <= Sa
Dca' = Dca.Sa - (Sa.Da - 2.Sca.Da).Dca.Sa.(Sa.Da - Dca.Sa) + Sca.(1 - Da) +
Dca.(1 - Sa)

otherwise if 2.Sca > Sa and 4.Dca <= Da
Dca' = Dca.Sa + (2.Sca.Da - Sa.Da).((((16.Dsa.Sa - 12).Dsa.Sa + 4).Dsa.Da) -
Dsa.Da) + Sca.(1 - Da) + Dca.(1 - Sa)

otherwise if 2.Sca > Sa and 4.Dca > Da
Dca' = Dca.Sa + (2.Sca.Da - Sa.Da).(SQRT(Dca.Sa) - Dca.Sa) + Sca.(1 - Da) +
Dca.(1 - Sa)

>
> Soft Light:
> if (2.Sca <= Sa)
>   Dca' = Dca.(Sa - (1 - Dca/Da).(2.Sca - Sa)) + Sca.(1 - Da) + Dca.(1 - Sa)
> otherwise if Dca.4 <= Da
>   Dca' = Dca.(Sa + (2.Sca - Sa).((16.Dca/Da - 12).Dca/Da + 3) + Sc.(1
> - Da) + Dca.(1 - Sa)
> otherwise
>   Dca' = (Dca.Sa + (SQRT (Dca/Da).Da - Dca).(2.Sca - Sa)) + Sca.(1 -
> Da) + Dca.(1 - Sa)
>
> For more details about my experiments and wich apps I tested, see
> http://lists.freedesktop.org/archives/cairo/2008-October/015362.html
>
> Cheers,
> Benjamin
>
>

Testing has shown my equation result is different to your equation result -
unfortunately :(

I'm unsure if my derivation is correct, so I guess my question is do you have an
expanded version of your equations or if you have time would it be possible to

Any further information or help you can provide on this issue would be greatly
appreciated.

Kind Regards,

Anthony Grasso

[1] http://www.w3.org/Graphics/SVG/WG/track/issues/2095
[2] http://www.w3.org/Graphics/SVG/WG/track/actions/2427
[3] http://dev.w3.org/SVG/modules/compositing/master/SVGCompositingPrimer.html

> On Thu, Oct 9, 2008 at 12:22 PM, Alex Danilo <alex@abbra.com> wrote:
>> Hi Benjamin,
>>
>>
>>        In that case you should use that as the definitive formula.
>> As I said, we had to try to work it out by help of others reverse
>> engineering work. A pixel by pixel comparison of all input values
>> against the PDF viewer should be used to verify that it's correct.
>>
>>        _But_, as I said before we had to extend the formulas
>> to take into account alpha. There's no alpha in the formulas
>> you quoted, so you will need to derive the correct formulas
>> based on source and destination alpha to give the correct
>> result for the general case. Opaque blends are just a subset
>> of what is needed.
>>
>> Alex
>>
>> --Original Message--:
>>> Adobe has published the blend modes used in PDF at
>>> It defines soft-light as
>>>
>>> if (Sc <= 0.5)
>>>  Dc' = Dc - (1 - 2.Sc).Dc.(1-Dc)
>>> otherwise
>>>  Dc' = Dc + (2.Sc - 1) . (F(Dc) - Dc)
>>>
>>> with
>>> if (x <= 0.25)
>>>  F(x) = ((16.x - 12).x + 4).x
>>> otherwise
>>>  F(x) = x
>>>
>>> which is slightly different from the formula you presented.
>>> It is also easier to implement as it doesn't involve square roots.
>>>
>>> Cheers,
>>> Benjamin
>>>
>>>
>>> On Thu, Oct 9, 2008 at 6:30 AM, Alex Danilo <alex@abbra.com> wrote:
>>>> Hi All,
>>>>
>>>> --Original Message--:
>>>>> ISSUE-2095 (soft-light blend mode): Algorithm for soft-light blend mode [Module: Filters]
>>>>>
>>>>> http://www.w3.org/Graphics/SVG/WG/track/issues/2095
>>>>>
>>>>> Raised by: Doug Schepers
>>>>> On product: Module: Filters
>>>>>
>>>>> Benjamin Otte
>>>>> <http://lists.w3.org/Archives/Public/www-svg/2008Oct/0029.html>:
>>>>> [[
>>>>> I'm in the process of implementing bend modes in the Cairo imaging
>>>>> library[1]. As Cairo is used as the renderer for a wide variety of
>>>>> formats, I wanted to have an as comprehensive list of blend modes as
>>>>> possible. And it turns out that the blend mode algorithms used are
>>>>> almost always equal. However, there is one exception: soft-light. The
>>>>> latest SVG draft specifies a different algorithm than PDF.
>>>>>
>>>>> So I was wondering if it was possible to change the algorithm in SVG
>>>>> to match the one of PDF, as that would solve a lot of problems.
>>>>> ]]
>>>> If there is a discrepancy it is a mistake.
>>>>
>>>> While I was working on this, we had to deduce the functions from various
>>>> sources, since the equations were not  published. The starting point was
>>>> some Japanese site that had reverse engineered the equations from
>>>> looking at Photoshop. We extended the base equations to include
>>>> alpha correctly.
>>>>
>>>> These were always supposed to be compatible with PDF.
>>>>
>>>> Implementing this showed up bugs in compatibility which were fixed
>>>> but probably never made it out to the spec. I believe the correct equations
>>>> are:
>>>>
>>>> if 2.Sca < Sa
>>>>   Dca' = Dca.(Sa + (1 - Dca/Da).(2.Sca - Sa)) + Sca.(1 - Da) + Dca.(1 - Sa)
>>>>  otherwise if 8.Dca <= Da
>>>>   Dca' = Dca.(Sa + (1 - Dca/Da).(2.Sca - Sa).(3 - 8.Dca/Da)) + Sca.(1 - Da) + Dca.(1 - Sa)
>>>>  otherwise
>>>>   Dca' = (Dca.Sa + ((Dca/Da)^(0.5).Da - Dca).(2.Sca - Sa)) + Sca.(1 - Da) + Dca.(1 - Sa)
>>>>
>>>>  Da'  = Sa + Da - Sa.Da
>>>>
>>>> which is different to what is in the latest published spec. Adobe had an action to
>>>> check the equations many years ago which was never acted on. Hopefully the
>>>> above equation is what you expected, if not please point us to the references that
>>>> are causing issues for you.
>>>>
>>>> Thanks,
>>>> Alex
>>>>
>>>>
>>>
>>
>
>
>
>
Received on Friday, 13 February 2009 00:33:07 UTC

This archive was generated by hypermail 2.3.1 : Tuesday, 6 January 2015 21:20:10 UTC