PorterDuff.Mode
public
static
final
enum
PorterDuff.Mode
extends Enum<PorterDuff.Mode>
java.lang.Object | ||
↳ | java.lang.Enum<android.graphics.PorterDuff.Mode> | |
↳ | android.graphics.PorterDuff.Mode |
The name of the parent class is an homage to the work of Thomas Porter and Tom Duff, presented in their seminal 1984 paper titled "Compositing Digital Images". In this paper, the authors describe 12 compositing operators that govern how to compute the color resulting of the composition of a source (the graphics object to render) with a destination (the content of the render target).
"Compositing Digital Images" was published in Computer Graphics Volume 18, Number 3 dated July 1984.
Because the work of Porter and Duff focuses solely on the effects of the alpha channel of the source and destination, the 12 operators described in the original paper are called alpha compositing modes here.
For convenience, this class also provides several blending modes, which similarly define the result of compositing a source and a destination but without being constrained to the alpha channel. These blending modes are not defined by Porter and Duff but have been included in this class for convenience purposes.
Diagrams
All the example diagrams presented below use the same source and destination images:
![]() |
![]() |
The order of drawing operations used to generate each diagram is shown in the following code snippet:
Paint paint = new Paint(); canvas.drawBitmap(destinationImage, 0, 0, paint); PorterDuff.Mode mode = // choose a mode paint.setXfermode(new PorterDuffXfermode(mode)); canvas.drawBitmap(sourceImage, 0, 0, paint);
Alpha compositing modes
![]() Source |
![]() Source Over |
![]() Source In |
![]() Source Atop |
![]() Destination |
![]() Destination Over |
![]() Destination In |
![]() Destination Atop |
![]() Clear |
![]() Source Out |
![]() Destination Out |
![]() Exclusive Or |
Blending modes
![]() Darken |
![]() Lighten |
![]() Multiply |
![]() Screen |
![]() Overlay |
Compositing equations
The documentation of each individual alpha compositing or blending mode below provides the exact equation used to compute alpha and color value of the result of the composition of a source and destination.
The result (or output) alpha value is noted \(\alpha_{out}\). The result (or output) color value is noted \(C_{out}\).
Summary
Enum values | |
---|---|
PorterDuff.Mode |
ADD
|
PorterDuff.Mode |
CLEAR
|
PorterDuff.Mode |
DARKEN
|
PorterDuff.Mode |
DST
|
PorterDuff.Mode |
DST_ATOP
|
PorterDuff.Mode |
DST_IN
|
PorterDuff.Mode |
DST_OUT
|
PorterDuff.Mode |
DST_OVER
|
PorterDuff.Mode |
LIGHTEN
|
PorterDuff.Mode |
MULTIPLY
|
PorterDuff.Mode |
OVERLAY
|
PorterDuff.Mode |
SCREEN
|
PorterDuff.Mode |
SRC
|
PorterDuff.Mode |
SRC_ATOP
|
PorterDuff.Mode |
SRC_IN
|
PorterDuff.Mode |
SRC_OUT
|
PorterDuff.Mode |
SRC_OVER
|
PorterDuff.Mode |
XOR
|
Public methods | |
---|---|
static
PorterDuff.Mode
|
valueOf(String name)
|
static
final
Mode[]
|
values()
|
Inherited methods | |
---|---|
Enum values
ADD
public static final PorterDuff.Mode ADD
\(\alpha_{out} = max(0, min(\alpha_{src} + \alpha_{dst}, 1))\)
\(C_{out} = max(0, min(C_{src} + C_{dst}, 1))\)
CLEAR
public static final PorterDuff.Mode CLEAR
\(\alpha_{out} = 0\)
\(C_{out} = 0\)
DARKEN
public static final PorterDuff.Mode DARKEN
\(\alpha_{out} = \alpha_{src} + \alpha_{dst} - \alpha_{src} * \alpha_{dst}\)
\(C_{out} = (1 - \alpha_{dst}) * C_{src} + (1 - \alpha_{src}) * C_{dst} + min(C_{src}, C_{dst})\)
DST
public static final PorterDuff.Mode DST
\(\alpha_{out} = \alpha_{dst}\)
\(C_{out} = C_{dst}\)
DST_ATOP
public static final PorterDuff.Mode DST_ATOP
\(\alpha_{out} = \alpha_{src}\)
\(C_{out} = \alpha_{src} * C_{dst} + (1 - \alpha_{dst}) * C_{src}\)
DST_IN
public static final PorterDuff.Mode DST_IN
\(\alpha_{out} = \alpha_{src} * \alpha_{dst}\)
\(C_{out} = C_{dst} * \alpha_{src}\)
DST_OUT
public static final PorterDuff.Mode DST_OUT
\(\alpha_{out} = (1 - \alpha_{src}) * \alpha_{dst}\)
\(C_{out} = (1 - \alpha_{src}) * C_{dst}\)
DST_OVER
public static final PorterDuff.Mode DST_OVER
\(\alpha_{out} = \alpha_{dst} + (1 - \alpha_{dst}) * \alpha_{src}\)
\(C_{out} = C_{dst} + (1 - \alpha_{dst}) * C_{src}\)
LIGHTEN
public static final PorterDuff.Mode LIGHTEN
\(\alpha_{out} = \alpha_{src} + \alpha_{dst} - \alpha_{src} * \alpha_{dst}\)
\(C_{out} = (1 - \alpha_{dst}) * C_{src} + (1 - \alpha_{src}) * C_{dst} + max(C_{src}, C_{dst})\)
MULTIPLY
public static final PorterDuff.Mode MULTIPLY
\(\alpha_{out} = \alpha_{src} * \alpha_{dst}\)
\(C_{out} = C_{src} * C_{dst}\)
OVERLAY
public static final PorterDuff.Mode OVERLAY
\(\alpha_{out} = \alpha_{src} + \alpha_{dst} - \alpha_{src} * \alpha_{dst}\)
\(\begin{equation} C_{out} = \begin{cases} 2 * C_{src} * C_{dst} & 2 * C_{dst} \lt \alpha_{dst} \\ \alpha_{src} * \alpha_{dst} - 2 (\alpha_{dst} - C_{src}) (\alpha_{src} - C_{dst}) & otherwise \end{cases} \end{equation}\)
SCREEN
public static final PorterDuff.Mode SCREEN
\(\alpha_{out} = \alpha_{src} + \alpha_{dst} - \alpha_{src} * \alpha_{dst}\)
\(C_{out} = C_{src} + C_{dst} - C_{src} * C_{dst}\)
SRC
public static final PorterDuff.Mode SRC
\(\alpha_{out} = \alpha_{src}\)
\(C_{out} = C_{src}\)
SRC_ATOP
public static final PorterDuff.Mode SRC_ATOP
\(\alpha_{out} = \alpha_{dst}\)
\(C_{out} = \alpha_{dst} * C_{src} + (1 - \alpha_{src}) * C_{dst}\)
SRC_IN
public static final PorterDuff.Mode SRC_IN
\(\alpha_{out} = \alpha_{src} * \alpha_{dst}\)
\(C_{out} = C_{src} * \alpha_{dst}\)
SRC_OUT
public static final PorterDuff.Mode SRC_OUT
\(\alpha_{out} = (1 - \alpha_{dst}) * \alpha_{src}\)
\(C_{out} = (1 - \alpha_{dst}) * C_{src}\)
SRC_OVER
public static final PorterDuff.Mode SRC_OVER
\(\alpha_{out} = \alpha_{src} + (1 - \alpha_{src}) * \alpha_{dst}\)
\(C_{out} = C_{src} + (1 - \alpha_{src}) * C_{dst}\)
XOR
public static final PorterDuff.Mode XOR
\(\alpha_{out} = (1 - \alpha_{dst}) * \alpha_{src} + (1 - \alpha_{src}) * \alpha_{dst}\)
\(C_{out} = (1 - \alpha_{dst}) * C_{src} + (1 - \alpha_{src}) * C_{dst}\)
Public methods
valueOf
public static PorterDuff.Mode valueOf (String name)
Parameters | |
---|---|
name |
String |
Returns | |
---|---|
PorterDuff.Mode |
Content and code samples on this page are subject to the licenses described in the Content License. Java and OpenJDK are trademarks or registered trademarks of Oracle and/or its affiliates.
Last updated 2025-04-17 UTC.
TMZ Celebrity News – Breaking Stories, Videos & Gossip
Looking for the latest TMZ celebrity news? You've come to the right place. From shocking Hollywood scandals to exclusive videos, TMZ delivers it all in real time.
Whether it’s a red carpet slip-up, a viral paparazzi moment, or a legal drama involving your favorite stars, TMZ news is always first to break the story. Stay in the loop with daily updates, insider tips, and jaw-dropping photos.
🎥 Watch TMZ Live
TMZ Live brings you daily celebrity news and interviews straight from the TMZ newsroom. Don’t miss a beat—watch now and see what’s trending in Hollywood.
- Exclusive TMZ interviews and court updates
- Viral celebrity videos and candid photos
- Trending gossip and entertainment news