diff --git a/packages/core/src/composite/composite-modes.js b/packages/core/src/composite/composite-modes.js index c54c77072..2b9ce96ad 100644 --- a/packages/core/src/composite/composite-modes.js +++ b/packages/core/src/composite/composite-modes.js @@ -42,6 +42,26 @@ export function multiply(src, dst, ops = 1) { return { r, g, b, a }; } +export function add(src, dst, ops = 1) { + src.a *= ops; + + const a = dst.a + src.a - dst.a * src.a; + + const sra = src.r * src.a; + const sga = src.g * src.a; + const sba = src.b * src.a; + + const dra = dst.r * dst.a; + const dga = dst.g * dst.a; + const dba = dst.b * dst.a; + + const r = (sra + dra) / a; + const g = (sga + dga) / a; + const b = (sba + dba) / a; + + return { r, g, b, a }; +} + export function screen(src, dst, ops = 1) { src.a *= ops; diff --git a/packages/core/src/constants.js b/packages/core/src/constants.js index 7e0a5ff20..af819d622 100644 --- a/packages/core/src/constants.js +++ b/packages/core/src/constants.js @@ -14,6 +14,7 @@ export const VERTICAL_ALIGN_BOTTOM = 32; export const BLEND_SOURCE_OVER = 'srcOver'; export const BLEND_DESTINATION_OVER = 'dstOver'; export const BLEND_MULTIPLY = 'multiply'; +export const BLEND_ADD = 'add'; export const BLEND_SCREEN = 'screen'; export const BLEND_OVERLAY = 'overlay'; export const BLEND_DARKEN = 'darken'; diff --git a/packages/core/types/jimp.d.ts b/packages/core/types/jimp.d.ts index 5d93d15ee..2406f512f 100644 --- a/packages/core/types/jimp.d.ts +++ b/packages/core/types/jimp.d.ts @@ -30,6 +30,7 @@ export interface JimpConstructors { BLEND_SOURCE_OVER: string; BLEND_DESTINATION_OVER: string; BLEND_MULTIPLY: string; + BLEND_ADD: string; BLEND_SCREEN: string; BLEND_OVERLAY: string; BLEND_DARKEN: string; diff --git a/packages/jimp/README.md b/packages/jimp/README.md index 36399abb8..720c7ed38 100644 --- a/packages/jimp/README.md +++ b/packages/jimp/README.md @@ -344,6 +344,7 @@ The following modes can be used for compositing two images together. mode defaul Jimp.BLEND_SOURCE_OVER; Jimp.BLEND_DESTINATION_OVER; Jimp.BLEND_MULTIPLY; +Jimp.BLEND_ADD; Jimp.BLEND_SCREEN; Jimp.BLEND_OVERLAY; Jimp.BLEND_DARKEN;