Using atom.blend_mode = BLEND_SUBTRACT or BLEND_MULTIPLY defaults to BLEND_DEFAULT when using the web client.
Though the canvas 2D rendering context spec is missing a globalCompositeOperation of "darker", the effect can still be achieved. Use context.getImageData() to get a chunk of the image in the form of an array. The array is ordered such that the pixel data follows this indexing pattern:
r1,g1,b1,a1,r2,g2,b2,a2, ... rN,gN,bN,aN
You can then subtract the pixel data from the higher layered atom from the pixel data of the lower layered atom:
function subtractImageData(imageDataLow, imageDataHigh){
for(var/I = 0; I < imageDataLow.length; I+=4){
var/highAlpha = imageDataHigh[I+3]
imageDataLow[I ] -= imageDataHigh[I ]*highAlpha
imageDataLow[I+1] -= imageDataHigh[I+1]*highAlpha
imageDataLow[I+2] -= imageDataHigh[I+2]*highAlpha
}
return imageDataLow
};
When you're all done, use context.putImageData(). The same could be done to achieve BLEND_MULTIPLY
...
My current project takes place in a cave underground, and lighting is a huge part of it. I'm using BLEND_SUBTRACT with three overlays (rgb) to remove the light which is /not/ falling on the object. This allows me to give the effect of adding light to an object, instead of adding shadow. Here's how it looks in DS vs the Web Client:


Proper subtractive blending doesn't appear to have much support. I'm not sure why.
Implementing blend modes at a low level isn't really something we're prepared to do, though, since we do all our rendering through StageXL. While with JIT this might not be a performance killer (at least not with an optimized loop), I don't know if there's anywhere that StageXL would easily let us hook in to handle this ourselves.