iosimage-processingporter-duff

Implementing Porter-Duff compositing operations in iOS


Are there Porter-Duff compositing operations in iOS SDK?

The base 12 Porter-Duff compositing operations. enter image description here


Solution

  • iOS CoreGraphics framework supports following types of blending mode including Porter-Duff.

    typedef CF_ENUM (int32_t, CGBlendMode) {
        /* Available in Mac OS X 10.4 & later. */
        kCGBlendModeNormal,
        kCGBlendModeMultiply,
        kCGBlendModeScreen,
        kCGBlendModeOverlay,
        kCGBlendModeDarken,
        kCGBlendModeLighten,
        kCGBlendModeColorDodge,
        kCGBlendModeColorBurn,
        kCGBlendModeSoftLight,
        kCGBlendModeHardLight,
        kCGBlendModeDifference,
        kCGBlendModeExclusion,
        kCGBlendModeHue,
        kCGBlendModeSaturation,
        kCGBlendModeColor,
        kCGBlendModeLuminosity,
    
        /* Available in Mac OS X 10.5 & later. R, S, and D are, respectively,
           premultiplied result, source, and destination colors with alpha; Ra,
           Sa, and Da are the alpha components of these colors.
    
           The Porter-Duff "source over" mode is called `kCGBlendModeNormal':
             R = S + D*(1 - Sa)
    
           Note that the Porter-Duff "XOR" mode is only titularly related to the
           classical bitmap XOR operation (which is unsupported by
           CoreGraphics). */
    
        kCGBlendModeClear,                  /* R = 0 */
        kCGBlendModeCopy,                   /* R = S */
        kCGBlendModeSourceIn,               /* R = S*Da */
        kCGBlendModeSourceOut,              /* R = S*(1 - Da) */
        kCGBlendModeSourceAtop,             /* R = S*Da + D*(1 - Sa) */
        kCGBlendModeDestinationOver,        /* R = S*(1 - Da) + D */
        kCGBlendModeDestinationIn,          /* R = D*Sa */
        kCGBlendModeDestinationOut,         /* R = D*(1 - Sa) */
        kCGBlendModeDestinationAtop,        /* R = S*(1 - Da) + D*Sa */
        kCGBlendModeXOR,                    /* R = S*(1 - Da) + D*(1 - Sa) */
        kCGBlendModePlusDarker,             /* R = MAX(0, (1 - D) + (1 - S)) */
        kCGBlendModePlusLighter             /* R = MIN(1, S + D) */
    };
    

    The following Apple developer link which demonstrate how to achieve Porter-Duff blending.

    https://developer.apple.com/library/ios/samplecode/QuartzDemo/Listings/QuartzDemo_QuartzBlendingViewController_m.html

    Hope this helps.