Skip to content

Instantly share code, notes, and snippets.

@vorlovsky
Last active April 25, 2016 10:47
Show Gist options
  • Save vorlovsky/dc58a1eb9513f36c1b04644aa1ead27e to your computer and use it in GitHub Desktop.
Save vorlovsky/dc58a1eb9513f36c1b04644aa1ead27e to your computer and use it in GitHub Desktop.
Caman.Blender.register("darkerColor", function (rgbaLayer, rgbaParent) {
var LUMINANCE_WEIGHTING = [0.299, 0.587, 0.114];
return (CanvasHelpers.intensity(rgbaLayer, LUMINANCE_WEIGHTING) < CanvasHelpers.intensity(rgbaParent, LUMINANCE_WEIGHTING))
? CanvasHelpers.blend(rgbaParent, rgbaLayer)
: CanvasHelpers.blend(rgbaLayer, rgbaParent);
});
static intensity(rgba, luminanceWeighting)
{
var frgba = CanvasHelpers.rsUnpackColor8888(rgba);
var luminance = CanvasHelpers.dot(frgba, luminanceWeighting);
var intensity = CanvasHelpers.clamp(luminance * 255, 0, 255);
return Math.floor(intensity);
}
static rsUnpackColor8888(rgba) {
return {
r: rgba.r / 255.0,
g: rgba.g / 255.0,
b: rgba.b / 255.0,
a: rgba.a / 255.0
};
}
static clamp(x, min, max) {
if (x < min) {
return min;
}
if (x > max) {
return max;
}
return x;
}
static dot(frgba, luminanceWeighting)
{
return frgba.r * luminanceWeighting[0] +
frgba.g * luminanceWeighting[1] +
frgba.b * luminanceWeighting[2];
}
static blend(rgba1, rgba2) {
return {
r: rgba2.a > 0 ? CanvasHelpers.componentAlpha(rgba1.r, rgba2.r, rgba2.a / 255) : rgba1.r,
g: rgba2.a > 0 ? CanvasHelpers.componentAlpha(rgba1.g, rgba2.g, rgba2.a / 255) : rgba1.g,
b: rgba2.a > 0 ? CanvasHelpers.componentAlpha(rgba1.b, rgba2.b, rgba2.a / 255) : rgba1.b,
a: rgba2.a + rgba1.a * ((255 - rgba2.a) / 255)
};
}
static componentAlpha(c1, c2, opacity) {
return Math.floor(opacity * c2 + (1 - opacity) * c1);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment