Currently, a renderer is expected to do color conversions itself. Our current policy is that ImageOutput does not change the pixel values (except when doing quantization). Whether or not that should be the case is open for debate, but that's the way we've done it thus far.

The dithering should happen at whichever step quantizes (i.e. converts from float to integer). I believe that the way this patch is structured, it will do it identically for tiles and scanlines.

The renderer should only dither if it's presenting final uint8 data to the ImageOutput. If the renderer is sending float data to the ImageOutput (which may have been gamma corrected), the ImageOutput will add dither as part of the conversion to uint8.