Difference in Mac and Windows versions of setGradientFill/fillEllipse when both alpha channel and RGB gradient used

screenshot

Image 1 is basic image generated on Windows (software renderer).

Image 2 is generated on Windows by the following lines following the base image generation:

gd = ColourGradient(Colour(0x3bffffff), innerFlatRect.getCentreX(), innerFlatRect.getCentreY(),
    Colour(0x00000000), innerFlatRect.getCentreX(), innerFlatRect.getBottom(), true);

g.setGradientFill(gd);
g.fillEllipse(innerFlatRect);

Image 3 is basic image generated on Mac (Core Graphics renderer)

Image 4 is generated on Mac by the same lines as above following the base image generation.

You may see the same lines lead to different image on Mac and Windows.

Image 5 is generated on Mac by instead of Colour(0x00000000), Colour(0x00ffffff) was used.

Also on Windows both Colour(0x00000000) and Colour(0x00ffffff) lead to the same result.

As you may see there’s a problem or difference in implementation when both alpha channel and RGB gradients are used at the same time.

JUCE 5.4.7

I’m not really sure but you’ve might stumbled on a bug?

Try adding the following line:

jassert (CGColorSpaceGetNumberOfComponents(colourSpace) == 4);

To:

static CGGradientRef createGradient (const ColourGradient& g, CGColorSpaceRef colourSpace)

In juce_mac_CoreGraphicsContext.mm

It’ll fail. (at least on my machine).
For testing purposes try setting CGColorSpaceRef to be from:

CGColorSpaceCreateWithName (kCGColorSpaceSRGB);

Would be interesting to know if it helped on your case.
(another approach less nice is to premultiply the Colours).

2 Likes

There’s no difference between CGColorSpaceCreateWithName (kCGColorSpaceSRGB) or rgbColourSpace, in both cases CGColorSpaceGetNumberOfComponents(colourSpace) returns 3 in createGradient().