Emulsion v0.6.0

0.5.0 put the film simulation on the graphics card and left the RAW decode on the processor, where most of the remaining wait was. This release takes the decode too. The mosaic is read, demosaiced, highlight-recovered and denoised on the card, and nothing between the file and the screen comes back to the processor any more — a frame opens in about a quarter of the time it used to, at 24 megapixels and at 60 alike. Beside that: two colour tools that work on the scene the film is given rather than on the finished print, a denoiser that fits your sensor's own noise instead of asking you to describe it, and highlight recovery of our own, on by default.

Two defaults move the render this time, both deliberately — highlight recovery and the new demosaic. See Changed for what each is worth.

Added

  • Selective, rebuilt from the ground up. A selection is four handles and two feather exponents on each axis of hue, chroma and lightness — so an edge fades rather than stopping at a wall, which is what the old hue bands could not express. Point at the picture to make one: a click with the picker's disc takes the median of every pixel under it, which lands 0.0014 from the truth under heavy chroma noise where a single pixel lands 0.0246. Shift+Scroll sizes the disc. Each shift is a two-anchor ramp over a driver axis, so remapping a hue range, translating it, and split-toning across lightness are the same control saying three different things rather than three modes.
  • Colorize, a second tool beside it. Where Selective rotates and scales a colour, Colorize adds one — by vector addition, which is exact on neutrals and so can tint a grey that has no hue to rotate. Chroma in Selective is a gain, so it can never colorize and never amplifies the chroma noise of a grey; that is this tool's job.
  • A chroma scope for both, drawn as a section through the selection at one stated lightness rather than a projection — so the shape you see is a shape the render actually has. It carries the frame's own colours as a stipple, veils what the band claims, and outlines where the shift sends it.
  • Both tools work on the scene, not on the print. They sit between exposure and the film, so a hue moved there is developed, coupled, printed and scanned as if the subject had been that colour.
  • A quality control for X-Trans decoding (Input ▸ Interpolation). Fujifilm frames decode at draft quality for working and at full quality for exports, which is why a RAF now opens in 0.88 s where it took 5.70.

Changed

  • The RAW decode is ours. The mosaic comes from a Rust decoder, the demosaic is RCD running on the graphics card, and LibRaw stays the authority on the file's colour numbers and the fallback for anything we do not read. A 24.5-megapixel decode went from 1464 ms to 368, and a 60.5-megapixel one from 1830 to 508. The quality algorithms it replaces cost between 1.3 and 2.1 seconds where RCD costs about 20 ms. Canon CR3 reaches the same path — 1.06 s to 0.59 at full resolution — and every other Bayer format LibRaw can read comes with it. This moves the render at full resolution: worst 66 levels, mean 1.04, on about half the frame, which is the size of the gap between any two good demosaics. At the shipping half resolution the two are the same picture. The old algorithms are all still selectable, and the panel marks which side of the bus each one runs on.
  • Highlight recovery is ours, and it ships on. Two modes — a blend of the channels that survived, and an inpaint that reconstructs a blown channel from the two that did not — both running inside the decode's own command buffer. This moves the render: about 16 levels on most of the frame, darker, because highlights that used to be pinned at white now carry values the film's shoulder has something to do with. Switch it off and you get the previous decode back exactly, byte for byte.
  • The denoiser is one operator instead of four. Gaussian, Bilateral, Median and Box are gone; what replaces them is a luminance-guided filter run per chroma channel, on the card. The four were not really a choice — two of them were the same function, none knew anything about your frame, and Bilateral at radius 8 cost 1656 ms on a 6-megapixel frame against Gaussian's 59. Three controls remain — Strength, Radius, Threshold — and the fourth thing the filter needs, your sensor's actual noise, is fitted from the frame rather than asked for. It costs 21–25 ms on a 24-megapixel frame, and the fit happens once per file rather than once per adjustment.
  • HDR compression is exposure fusion now. Three synthetic exposures of one frame blended through a Laplacian pyramid, replacing the gradient-domain operator that was there. The whole algorithm runs on the card and nothing crosses back, so the penalty on an exposure drag went from a flat 65 ms at every resolution to 8 ms at eighth resolution and 17 at full. The two exposure sliders now interfere far less — cross-talk fell from 70% of a slider's own travel to 23% — and the middle of the picture stays put when you move either, which the old anchor could not promise. Its weight width is a control, in stops, and it is the strongest lever the operator has.
  • Grain runs on the card, and it was the last stage that did not. A frame with grain on costs 27 ms where it cost 211, and a grain drag 19–21 ms where it cost 232. The draw is held to the same per-value standard as every other stage now rather than compared statistically, which it could not be before. Its default statistics moved to Gaussian, the only one of the three with a path on the card; the other two remain one click away and all three still deliver the granularity on the datasheet. What Gaussian gives up shows only at high Amount on a coarse stock.
  • Both sharpeners run on the card. A frame with Sharpen on went from 189 ms to 54 and a Sharpen drag from 153 to 25. Capture Sharpen costs 234 ms where it cost 1079, and nothing at all on top of the denoiser, since neither leaves the card.
  • Sharpen's default radius is a quarter narrower — at the old default the halo read as local contrast rather than acutance on a 4000-pixel frame. The old setting is still a slider position.
  • Capture Sharpen's contrast default is 0, which is the "no masking" its source documents: the deconvolution reaches the whole frame and only the clip guard holds anything back. The threshold exists to keep it off flat regions where noise sits alone, and the chroma denoiser now runs immediately before it.

Removed

  • Shadow Inflation. A threshold mask, a blur and a multiplier, shipped off since it was added, and removed rather than carried onto the card.
  • The Rebuild highlight mode, which was LibRaw's and reachable only by sending the whole file back through the slow decode. The new Inpaint mode is what it was there for.

Fixed

  • The viewport aliased whenever the frame was shown smaller than its own size — moire on anything periodic, and grain that crawled as you zoomed. A render texture carries its own reduction chain now, area-averaged in linear light. On a real frame shown at 3.65×, the pixel-scale energy in the viewport fell from 10.0 to 3.87 against a correctly filtered reference's 3.53: the aliasing had been three times the picture's own detail. It costs half a millisecond at 6 megapixels and changes no exported pixel.
  • Auto-exposure moved with the working resolution. The metering thumbnail was taken from the developed frame, so a draft preview at quarter resolution metered differently from the clean render covering it. Metering is taken from the decode itself now and no longer depends on anything the develop does.
  • Canon CR3 files decoded slowly and would not halve. Their odd width made the half-resolution decode decline outright, which sent the whole format back to the slow path at the default working resolution — and the fast demosaic declined on an odd width too, which would have shipped a quality regression.
  • Capture Sharpen's automatic radius had quietly stopped being measured on every file, because the Bayer pattern it reads was matching nothing at all.

Downloads for this version are no longer published. Upgrade to the latest release for binaries.