this was a thing i asked for long time ago, but never had time to start digging into.
anyway you could look in the LowLevelGraphicaSoftwareRenderer:
template <class DestPixelType, class SrcPixelType>
static void transformedImageRender (Image& destImage,
const Image& sourceImage,
const int destClipX, const int destClipY,
const int destClipW, const int destClipH,
const int srcClipX, const int srcClipY,
const int srcClipWidth, const int srcClipHeight,
double srcX, double srcY,
const double lineDX, const double lineDY,
const double pixelDX, const double pixelDY,
const uint8 alpha,
const Graphics::ResamplingQuality quality,
DestPixelType*,
SrcPixelType*)
this one is the “hot spot” where every image blending function calls (or maybe i’m wrong… jules?). below, you can find the line where it do:
for every pixel. try to write xor, burn, and so on function for the pixel types and then replace the blend with another one. that could be a start just to check if it will work. adding a parameter to that function (specifying a blend mode), then recurse out and parameterize all the other image drawing functions could be straightforward (while maintaining backwards compatibility in the Graphics class).
the only problem could be the path/gradient function filled with images, but they could already rely on transformedImageRender, i don’t know.
anyway if you need some human power to dig into this, i can give as much help as i can !