With a second thought, I think it would do perfectly with simply averaging ALL channels, R, G, B, and A, for this cross-fade effect.
So I am reformulating my questions as follows: How do I produce the blending mode when the foreground and background colors are averaged channel-wise, for all channels, including the alpha channel? Thanks On Sun, Sep 27, 2009 at 4:25 PM, Oleg Krupnov <oleg.krup...@gmail.com> wrote: > Paul, thanks for such an exhaustive answer! > > Here are answers to your questions: > 1. My case is the simple one -- I'm rendering all text layers at once. > 2. Yes and no. As I said, I am implementing the cross-fade effect, > when one text fades out and another text fades in. The texts can be of > the same color (simplest case) or of different color (different shades > of gray), and their alphas change during the fading animation. The > problem is that the semi-transparent areas of text, when overlapping, > produce brighter pixels, the annoying "flash" effect, I'm trying to > get rid of. > > My further research shows that kCGBlendModeLighten does not seem to > apply to the alpha channel. Namely, colors are indeed composited using > the lighten rule, but then the resulting color is alpha blended with > the background as usual, so that two overlapping semitransparent > pixels still produce a more opaque pixel, which is undesirable > > Am I missing the clue how to make kCGBlendModeLighten apply to the > alpha channel as well? > > I have come to the following workaround: I fill the text layers with > opaque black background. In this case the kCGBlendModeLighten works > perfectly, as expected. > > Unfortunately, I am not fully satisfied with this solution, because I > need the background of the text layers to be half-transparent as well. > This returns me to the question of how to make kCGBlendModeLighten to > the alpha channel. > > You said I could "average the color components but max the alphas." > How can I do this? Thanks! > > > On Sun, Sep 27, 2009 at 3:45 AM, Paul M <l...@no-tek.com> wrote: >> This is a multi-pass operation - you wont find a single >> blend mode that will do this in any simple manner. >> >> First question: Are you doing this all in one hit, or sequentially, >> ie, rendering the first layer of text then adding subsequent >> layers later? >> Second question: is the text all the same colour and have the >> same alpha component? >> >> If you're rendering all the text layers at once, you need to first >> combine the text layers, then composite over the background. In the >> simple case you describe, I imagine you'll need to average the colour >> components but max the alphas. This should give you the results you >> asked for. >> >> If you need to comosite different layers at different times, it >> becomes a lot more complex. >> If your text is not all the same colour then you need access to all >> the previous layers so that they may be combined as above and the >> composite redone. >> If your text is all the same colour then you can write the alpha from >> the first layer into the composite so that this may be extracted and >> used later in the 2nd and subsequent composites. The process for >> these later composites gets pretty gnarley, and you're really better >> of keeping a reference to the preceeding layers if that's at all >> possible. >> >> >> paulm >> >> >> On 27/09/2009, at 12:17 AM, Oleg Krupnov wrote: >> >>> Thanks! >>> >>> It seemed exactly what I need but I've found that it doesn't work as >>> expected. The interpolated semi-transparent parts of the rendered text >>> still appears brighter than it should. >>> >>> Namely, consider drawing white text on black background, and then >>> drawing the same white text one more time over the first one. >>> >>> Suppose that when a letter is rasterized, one of the resulting >>> interpolated pixels is semitransparent white, with alpha = 50%. After >>> alpha blending with the black background, the pixel becomes a 50% gray >>> pixel. >>> >>> Now when the second text is drawn on top, there will be also the same >>> semitransparent white pixel with alpha = 50% at the same location. >>> What result I'd like to achieve would be to have the same 50% gray >>> pixel at this location. However, with kCGBlendModeLighten mode, what I >>> think what's happening is that the system picks pure white as the >>> lighter of two colors: 50% gray of the background and pure white >>> (without taking into account the alpha of the new pixel), and then >>> applies the usual alpha blending rule, which results in 75% gray. >>> >>> Is there a workaround? Or am I doing something wrong? Thanks! >>> >>> On Tue, Sep 22, 2009 at 7:23 PM, David Duncan <david.dun...@apple.com> >>> wrote: >>>> >>>> On Sep 22, 2009, at 6:22 AM, Oleg Krupnov wrote: >>>> >>>>> Hi, >>>>> >>>>> I'd like to draw in a graphics context in such a compositing mode: >>>>> >>>>> R = MAX(S, D) >>>>> >>>>> i.e. out of two colors (source and destination), the maximum color >>>>> (channel-wise) was chosen. This is basically equivalent to ORing the >>>>> colors. >>>> >>>> >>>> This is the Lighten blend mode (kCGBlendModeLighten). There doesn't >>>> appear >>>> to be a corresponding NS composting mode, and I'm not sure why, but you >>>> can >>>> easily get a CGContext from an NSGraphicsContext by asking it for its >>>> graphicsPort, so this shouldn't be hard to integrate. >>>> -- >>>> David Duncan >>>> Apple DTS Animation and Printing >>>> >>>> >>> _______________________________________________ >>> >>> Cocoa-dev mailing list (Cocoa-dev@lists.apple.com) >>> >>> Please do not post admin requests or moderator comments to the list. >>> Contact the moderators at cocoa-dev-admins(at)lists.apple.com >>> >>> Help/Unsubscribe/Update your Subscription: >>> http://lists.apple.com/mailman/options/cocoa-dev/list%40no-tek.com >>> >>> This email sent to l...@no-tek.com >>> >> >> > _______________________________________________ Cocoa-dev mailing list (Cocoa-dev@lists.apple.com) Please do not post admin requests or moderator comments to the list. Contact the moderators at cocoa-dev-admins(at)lists.apple.com Help/Unsubscribe/Update your Subscription: http://lists.apple.com/mailman/options/cocoa-dev/archive%40mail-archive.com This email sent to arch...@mail-archive.com