How soft-proofing is implemented in PhotoFlow

Since there had been some discussion about soft-proofing lately on this forum, I though it would be useful to document and explain how we are dealing with this aspect in PhotoFlow.

I say we because I got a lot of help from @Elle and others, with ideas, suggestions, debugging and much more.

In PhotoFlow, the colorspace conversions are handled as part of the editing flow, so image data can be in different colorspaces (abbreviated as CS in the following) at different stages (read: layers) of the editing process.

The final step is the conversion from the last used CS to the display profile, before visualisation in the preview window.

So, a normal color workflow looks like this:

input CS -> CS 1 -> CS 2 -> ... -> CS N -> display profile

When soft-proofing, there is one additional color profile conversion that is inserted between the last CS and the display profile:

input CS -> CS 1 -> CS 2 -> ... -> CS N -> soft-proof profile -> display profile

If not specified otherwise, the soft-proofing profile -> display profile conversion will use the relative colorimetric rendering intent.
Few options control the way the image data is converted from the last CS to the soft-proof profile, and then to the display profile:

  • black-point compensation (BPC): controls wether BPC is applied to the CS N -> soft-proof profile conversion.
    In general this option is activated, in particular when converting to a printer profile that has a black level
    higher than zero. This avoids having the darkest tones being clipped in the conversion.
  • clip negative/positive: when the soft-proofed profile is a matrix profile that allows unbounded conversions (like sRGB), this controls wether the out-of-gamut pixels should be clipped or not. Except for very special cases, this two options should be kept active for soft-proofing.
  • gamut warning: when activated, the pixels that are outside of the gamut of the soft-proofing profile will be marked with a gray color
  • simulate black ink: when activated, the black point compensation in the soft-proofing profile -> display profile conversion
    is disabled, and the darkest tone in the preview will match as good as possible the black level of the proofed profile.
  • simulate paper color: when activated, the soft-proofing profile -> display profile conversion will be performed with absolute colorimetric intent (and therefore no BPC by definition). This option tries to simulate not only the black level of the paper, but also the paper’s white point.
  • **adaptation state: ** this slider allows to adjust the level of chromatic adaptation applied in the absolute colorimetric conversions. This way, partial adaptation can also be simulated.

Here is how the soft-proofing dialog looks like in PhotoFlow:

One last note concerns the way the gamut warning is generated. Instead of using LCMS2 built-in gamut warning, a custom code is used.
During our tests, we realised that a different approach is needed when soft-proofing matrix-based compared to LUT-based ones.

The gamut warning is generated by comparing the output of two parallel colorspace conversion chains:

CS N -> soft-proof profile -> CS REF

For LUT-based profiles, the reference colorspace CS REF is Lab, and the comparison is based on the delta-E 1976 metric.
For matrix-based profiles, the reference colorspace is linear ACES and the comparison is based on the direct numerical difference between RGB values. The advantage of this approach is that the resulting gamut comparison gives results that are independent of the gamma encoding of the input and soft-proof profiles.

Hope this could help other projects as well…


Not quite ready to do it yet in rawproc (presently wrestling with the autotools pig), but this definitely will help. Basic color management was a head-hurter, but now that it’s in it makes perfect sense. Still need to buy a colorimeter to profile my monitor so I know the transform flow is correct, but saving with one of Ms Stone’s SRGB profiles after editing in ProPhoto produces a pleasing image in most venues I’ve tried.


I’ve been using photoflow quite a bit recently and had hoped to try out the soft proofing described here, however I have not been able to find it. I’m using version 20170401 on a mac. After a good search around I’m wondering if it is not implemented in this version?

It is not yet implemented in the Mac version. Actually, the described soft-proofing code is only available from sources when compiling the “linear-gamma” git branch.

I am trying to get a new release of the current stable branch as soon as possible, after which the soft-proofing code will be merged in the standard development version…

1 Like

Thanks for the quick response!