{{pkg.description}}
This package provides all 13 fundamental Porter-Duff compositing / blending operators, and utilities to pre/post-multiply alpha. All operators are available for packed ARGB/ABGR 32bit packed ints or RGBA float vectors.
- https://keithp.com/~keithp/porterduff/p253-porter.pdf (original paper)
- https://en.wikipedia.org/wiki/Alpha_compositing#Alpha_blending
- https://ciechanow.ski/alpha-compositing/
- http://www.adriancourreges.com/blog/2017/05/09/beware-of-transparent-pixels/
- http://ssp.impulsetrain.com/porterduff.html
{{meta.status}}
{{repo.supportPackages}}
{{repo.relatedPackages}}
{{meta.blogPosts}}
{{pkg.install}}
{{pkg.size}}
{{pkg.deps}}
{{repo.examples}}
{{pkg.docs}}
import * as pd from "@thi.ng/porter-duff";
// packed int version (premultiplied ARGB)
pd.SRC_OVER_I(0x80800000, 0xcc0cc00)
// automatically premultiply inputs & post-multiply result
pd.porterDuffPInt(pd.SRC_OVER_I, 0x80ff0000, 0xcc00ff00);
// the above is same as:
pd.postmultiplyInt(
pd.SRC_OVER_I(
pd.premultiplyInt(0x80ff0000),
pd.premultiplyInt(0xcc00ff00)
)
)
// premultiplied float version [R,G,B,A]
pd.SRC_OVER_F([1, 0, 0, 0.5], [0, 1, 0, 0.8]);
Integer operators are suffixed with _I
, float versions with _F
.
Consult above diagram for expected results.
CLEAR
SRC
DEST
SRC_OVER
DEST_OVER
SRC_IN
DEST_IN
SRC_OUT
DEST_OUT
SRC_ATOP
DEST_ATOP
XOR
PLUS
New operators (e.g. for blend modes) can be easily defined via
porterDuff
/ porterDuffInt
. Both functions take 2 function arguments
to extract blend coefficients from the src & dest colors:
import { porterDuffInt } from "@thi.ng/porter-duff";
// coefficient functions take the normalized alpha values
// of both colors as arguments, but unused here...
const customOp = porterDuffInt(() => -0.5, () => 1);
The following coefficient functions are included by default (and are used by all standard operators):
ZERO
=> 0ONE
=> 1A
=> alpha of src colorB
=> alpha of dest colorONE_MINUS_A
=> 1 - alpha of src colorONE_MINUS_B
=> 1 - alpha of dest color
The following modifiers are also discussed in the original Porter-Duff paper (linked above).
darken
/darkenInt
dissolve
/dissolveInt
opacity
/opacityInt
All Porter-Duff operators expect colors with pre-multiplied alpha. Premultiplication is also recommended for transparent WebGL textures (especially when using mipmaps). For that purpose the following helpers might be useful:
premultiply
/premultiplyInt
postmultiply
/postmultiplyInt
isPremultiplied
/isPremultipliedInt
Furthermore, existing PD operators can be wrapped with automatic
pre/post-multiplies using porterDuffP
/ porterDuffPInt
(see example
above).
Note: HTML Canvas ImageData
is using non-premultiplied colors.