Add arithmetic blend
This commit is contained in:
parent
60e5c3b042
commit
f4db0dbdd4
3 changed files with 47 additions and 2 deletions
2
changelog.d/arithmetic-blend.add
Normal file
2
changelog.d/arithmetic-blend.add
Normal file
|
|
@ -0,0 +1,2 @@
|
||||||
|
Add arithmetic blend ISS function
|
||||||
|
|
||||||
|
|
@ -95,6 +95,32 @@ export const getContrastRatioLayers = (text, layers, bedrock) => {
|
||||||
return getContrastRatio(alphaBlendLayers(bedrock, layers), text)
|
return getContrastRatio(alphaBlendLayers(bedrock, layers), text)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Blending of two solid colors with a user-defined operator: origin +- value
|
||||||
|
*
|
||||||
|
* @param {Object} origin - base color
|
||||||
|
* @param {Object} value - modification argument
|
||||||
|
* @param {string} operator - math operator to use
|
||||||
|
*/
|
||||||
|
export const arithmeticBlend = (origin, value, operator) => {
|
||||||
|
const func = (a, b) => {
|
||||||
|
switch (operator) {
|
||||||
|
case '+':
|
||||||
|
return Math.min(a + b, 255)
|
||||||
|
case '-':
|
||||||
|
return Math.max(a - b, 0)
|
||||||
|
default:
|
||||||
|
return a
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
r: func(origin.r, value.r),
|
||||||
|
g: func(origin.g, value.g),
|
||||||
|
b: func(origin.b, value.b),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This performs alpha blending between solid background and semi-transparent foreground
|
* This performs alpha blending between solid background and semi-transparent foreground
|
||||||
*
|
*
|
||||||
|
|
|
||||||
|
|
@ -1,8 +1,8 @@
|
||||||
import { convert, brightness } from 'chromatism'
|
import { convert, brightness } from 'chromatism'
|
||||||
import { alphaBlend, getTextColor, relativeLuminance } from '../color_convert/color_convert.js'
|
import { alphaBlend, arithmeticBlend, getTextColor, relativeLuminance } from '../color_convert/color_convert.js'
|
||||||
|
|
||||||
export const process = (text, functions, { findColor, findShadow }, { dynamicVars, staticVars }) => {
|
export const process = (text, functions, { findColor, findShadow }, { dynamicVars, staticVars }) => {
|
||||||
const { funcName, argsString } = /\$(?<funcName>\w+)\((?<argsString>[#a-zA-Z0-9-,.'"\s]*)\)/.exec(text).groups
|
const { funcName, argsString } = /\$(?<funcName>\w+)\((?<argsString>[#a-zA-Z0-9-+,.'"\s]*)\)/.exec(text).groups
|
||||||
const args = argsString.split(/ /g).map(a => a.trim())
|
const args = argsString.split(/ /g).map(a => a.trim())
|
||||||
|
|
||||||
const func = functions[funcName]
|
const func = functions[funcName]
|
||||||
|
|
@ -81,6 +81,23 @@ export const colorFunctions = {
|
||||||
return alphaBlend(background, amount, foreground)
|
return alphaBlend(background, amount, foreground)
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
shift: {
|
||||||
|
argsNeeded: 2,
|
||||||
|
documentation: 'Arithmetic blend between two colors',
|
||||||
|
args: [
|
||||||
|
'origin: base color',
|
||||||
|
'value: shift value',
|
||||||
|
'operator: math operator to use (+ or -)'
|
||||||
|
],
|
||||||
|
exec: (args, { findColor }, { dynamicVars, staticVars }) => {
|
||||||
|
const [originArg, valueArg, operatorArg] = args
|
||||||
|
|
||||||
|
const origin = convert(findColor(originArg, { dynamicVars, staticVars })).rgb
|
||||||
|
const value = convert(findColor(valueArg, { dynamicVars, staticVars })).rgb
|
||||||
|
|
||||||
|
return arithmeticBlend(origin, value, operatorArg)
|
||||||
|
}
|
||||||
|
},
|
||||||
boost: {
|
boost: {
|
||||||
argsNeeded: 2,
|
argsNeeded: 2,
|
||||||
documentation: 'If given color is dark makes it darker, if color is light - makes it lighter',
|
documentation: 'If given color is dark makes it darker, if color is light - makes it lighter',
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue