Blend Modes

In PSPDFKit 7.6 for iOS, we introduced the ability to set blend modes for annotations. Blend modes let you decide how different layers of color will interact with each other and what the end result will be. One of the main use cases for this is to increase the legibility of markup annotations covering text. You can check out this Wikipedia entry to learn more about blend modes and their use.

Blend Modes Supported by PSPDFKit Annotations

Name Description Example
Normal Uses only the color of the annotation and ignores the background color.
Multiply Multiplies the background content color with the annotation color.
Screen Inverse values of the color component of both the annotation and background contents are multiplied with each other.
Overlay The annotation color is laid over the background content color, and it’s either multiplied or screened based on the background content color.
Darken The background content color is replaced with the annotation color if the annotation color is darker.
Lighten The background content color is replaced with the annotation color if the annotation color is lighter.
Color Dodge The annotation color is reflected by brightening the color of the background content.
Color Burn The annotation color is reflected by darkening the color of the background content.
Soft Light Darkening or lightening of colors is based on the background content color. The effect is similar to that of shining a diffuse spotlight on background content.
Hard Light Multiplies or screens the colors, depending on the background content color. The effect is similar to that of shining a harsh spotlight on the background content.
Difference The darker color of the background content color and the annotation color is subtracted from the lighter color.
Exclusion This is the same effect as difference but with low contrast.

iOS References

Name Enumeration Case
Normal kCGBlendModeNormal
Multiple kCGBlendModeMultiply
Screen kCGBlendModeScreen
Overlay kCGBlendModeOverlay
Darken kCGBlendModeDarken
Lighten kCGBlendModeLighten
Color Dodge kCGBlendModeColorDodge
Color Burn kCGBlendModeColorBurn
Soft Light kCGBlendModeSoftLight
Hard Light kCGBlendModeHardLight
Difference kCGBlendModeDifference
Exclusion kCGBlendModeExclusion

Supported Annotations

The blendMode is a property defined on Annotation, and PSPDFKit supports blend modes on a few selected annotations. All types of ink, shape, markup, and free text annotations support blend modes. Stamp and image annotations support blend modes only via the use of the blend mode API. Other annotations — such as the redaction, sound, and link annotations — do not support styling with blend modes.

How to Use Blend Modes

Blend modes work like any other style property on annotations: They can be applied onto any annotation (with the exception of the annotation types mentioned in the previous section) by using the API or via the UI.

API Usage

Blend modes can easily be used on supported annotations by simply setting the blendMode property on Annotation:

let inkAnnotation = InkAnnotation()
// Set other required properties.
inkAnnotation.blendMode = .multiply
PSPDFInkAnnotation *inkAnnotation = [PSPDFInkAnnotation new];
// Set other required properties.
inkAnnotation.blendMode = kCGBlendModeMultiply;

UI Usage

The blend mode can also be changed via the UI using the annotation inspector (AnnotationStyleViewController). You can enable blend mode selection for annotation types by customizing the annotation inspector. This can be achieved by adding the blendMode key to the propertiesForAnnotations array for the desired annotation:

let configuration = PDFConfiguration { builder in
  var annotationProperties = builder.propertiesForAnnotations

  annotationProperties[.ink] = [[AnnotationStyle.Key.blendMode, AnnotationStyle.Key.lineWidth, AnnotationStyle.Key.color]]
  annotationProperties[.underline] = [[AnnotationStyle.Key.blendMode, AnnotationStyle.Key.alpha]]
  annotationProperties[.line] = [[AnnotationStyle.Key.blendMode, AnnotationStyle.Key.color]]

  builder.propertiesForAnnotations = annotationProperties
PSPDFConfiguration *configuration = [PSPDFConfiguration configurationWithBuilder: ^(PSPDFConfigurationBuilder *builder) {
  NSMutableDictionary *annotationProperties = [builder.propertiesForAnnotations mutableCopy];

  annotationProperties[PSPDFAnnotationStringInk] = @[@[PSPDFAnnotationStyleKeyBlendMode, PSPDFAnnotationStyleKeyLineWidth, PSPDFAnnotationStyleKeyColor]];
  annotationProperties[PSPDFAnnotationStringUnderline] = @[@[PSPDFAnnotationStyleKeyBlendMode, PSPDFAnnotationStyleKeyAlpha]];
  annotationProperties[PSPDFAnnotationStringLine] = @[@[PSPDFAnnotationStyleKeyBlendMode, PSPDFAnnotationStyleKeyColor]];

  builder.propertiesForAnnotations = annotationProperties;

The blend mode style option is, by default, only configured for ink annotations. You can also remove the blend mode style option for ink annotations by modifying the propertiesForAnnotations dictionary and removing the .blendMode key from it.

PDF Storage

The annotation blend mode is not a standard key of the annotation dictionary in a PDF. Instead, PSPDFKit uses the defined blend mode when generating an annotation’s appearance stream. The blend mode is encoded into the appearance stream drawing commands, from where PSPDFKit can also later decode it. Third-party PDF viewers that support annotation appearance stream rendering should be able to honor the set blend mode. If, however, the annotation is modified in a third-party editor or viewer, the annotation stream could be regenerated by that editor. In that case, the blend mode setting might be lost.