npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

context-blender

v1.3.3

Published

Photoshop-style blend modes for HTML Canvas Contexts

Downloads

19

Readme

About

Adobe® Photoshop® has a variety of helpful blend modes for compositing images from multiple RGBA layers. This small library provides the same functionality for HTML Canvas Contexts, with the goal of producing the same results as Photoshop.

Syntax

overContext.blendOnto( underContext, blendMode, offsetOptions );
  - overContext   : A CanvasRenderingContext2D
  - underContext  : A CanvasRenderingContext2D
  - blendMode     : A string with the blend mode to use, e.g. 'screen'
  - offsetOptions : [optional] JS Object with some/all of the following keys:
      destX, destY
      The X/Y location in the 'underContext' to blend onto; both default to 0.

      sourceX, sourceY
      The X/Y location in the 'overContext' to blend from; both default to 0.

      width,height
      The size of the box to blend; both default to 'auto', blending up to the
      right and bottom edges of the 'over' context.

      Width and height may less than specified if there is not enough space
      on the over or under contexts to fit the blend.

Use

In Node.js

First:

npm install context-blender

Will install node-canvas, which requires a working Cairo install. See https://github.com/Automattic/node-canvas#installation for more details.

Then:

// Requires the canvas library and augments it for you
var Canvas = require('context-blender');

var over  = new Canvas(100,100).getContext('2d');
var under = new Canvas(100,100).getContext('2d');

// …drawing something to both canvas contexts, and then:

// Blend all of 'over' onto 'under', starting at the upper left corner
over.blendOnto(under,'screen');

// Blend all of 'over' onto 'under' (again), starting at 17,42 in 'under'
over.blendOnto(under,'multiply',{destX:17,destY:42});

// Blend a 16x16 tile from 'over' onto 'under' (again), starting at 17,42 in 'under'
over.blendOnto(under,'add',{destX:17,destY:42,sourceX:32,sourceY:128,width:16,height:16});

In a Web Browser

// Likely an 'offscreen' (not in the DOM) canvas
var over = someCanvas.getContext('2d');

// Usually a canvas that is shown on the page
var under = anotherCanvas.getContext('2d');

// Blend all of 'over' onto 'under', starting at the upper left corner
over.blendOnto(under,'screen');

// Blend all of 'over' onto 'under' (again), starting at 17,42 in 'under'
over.blendOnto(under,'multiply',{destX:17,destY:42});

// Blend a 16x16 tile from 'over' onto 'under' (again), starting at 17,42 in 'under'
over.blendOnto(under,'add',{destX:17,destY:42,sourceX:32,sourceY:128,width:16,height:16});

Supported Blend Modes

The following blend modes work perfectly (or as nearly as the vagaries of the HTML Canvas allow):

  • normal (or src-over)
  • src-in
  • screen
  • multiply
  • difference
  • exclusion

The following additional blend modes mostly work as intended, but have issues when it comes to dealing with the alpha channel:

  • add (or plus) - Photoshop's "Linear Dodge (add)" blend mode does not perform addition on the opacities of the two layers. I have not yet figured out what it does instead. For now, this mode performs simple numeric addition, the same as the SVG 1.2 "plus" mode.
  • lighten (or lighter) - the result is slightly too dark when the opacity falls and incorrectly 'favors' a higher-opacity source.
  • darken (or darker) - the result is too dark when combining low-opacity regions, and does not properly 'favor' the higher-opacity source.
  • overlay - this is only correct where both the over and under images are 100% opaque; the lower the alpha of either/both images, the more the colors get clamped, resulting in high contrast.
  • hardlight - this is the opposite of "overlay" and experiences similar problems when either image is not fully opaque.
  • colordodge (or dodge) - works correctly only under 100% opacity
  • colorburn (or burn) - works correctly only under 100% opacity
  • softlight
  • luminosity
  • color
  • hue
  • saturation
  • lightercolor
  • darkercolor

Requirements/Browser Support

Should work on any user agent that supplies a CanvasRenderingContext2D along with getImageData and putImageData.

This includes using the node-canvas library under Node.js.

About

This library was created around the need solely for a one-off 'screen' blend mode to match the company-mandated style for bar graphs used internally, previously only available via a Microsoft® Excel® template. Clearly this functionality is useful in more contexts than just my one-off, so I decided to make a framework around it and encourage others to help figure out the formulae. Please, fork this project, add blend modes and/or fix math, and send me pull requests! I feel certain that the resources must exist out there on the equations Photoshop uses in the presence of alpha, but so far I have not found them.

History

v1.3.3 - 2014-Nov-13

  • Fix alpha on all blend modes to exactly match Photoshop.

v1.3.0 - 2014-Nov-12

  • Release as a Node.js module.
  • Add blend modes: softlight, luminosity, color, hue, saturation, lightercolor, darkercolor.
  • Greatly improve the accuracy of many blend modes.

Great thanks to Pixelero for amazing contributions!

v1.2.1 - 2011-Feb-9

  • Improve perf of lighten and darken blend modes.

v1.2.0 - 2010-Dec-14

  • Add blend modes: hardlight, colordodge, colorburn, darken, lighten, exclusion. Thanks gingerbeardman!

v1.1.1 - 2010-Dec-12

  • Improve result of overlay blend mode.

v1.1.0 - 2010-Dec-6

  • Added array blendOnto.supportedBlendModes for enumerating modes.
  • Added object blendOnto.supports for testing if a mode is supported.
  • Test for getImageData() to be present (prevent loading on excanvas).

v1.0 - 2010-Nov-30

  • Initial working release.
  • Supported blend modes: normal, screen, multiply, difference, src-in, add
  • Known broken: overlay, dodge

Reference Material

Contact

To report bugs or request additional features, please use the Context-Blender Issues page for this project.

License

This library is released under an MIT-style license. That generally means that you are free to do almost anything you want with it as long as you give a bit of credit where credit is due. See the LICENSE file included for the actual legal limitations.s and/or fix math, and send me pull requests! I feel certain that the resources must exist out there on the equations Photoshop uses in the presence of alpha, but so far I have not found them.