From 65b410a436c2e035464ff59789bedf296cba6cd0 Mon Sep 17 00:00:00 2001 From: gingerbeardman Date: Tue, 14 Dec 2010 16:59:33 +0000 Subject: [PATCH] removed old images to make way for multiple image sets --- README.md | 19 ++++++++++-- context_blender.js | 59 +++++++++++++++++++++++++++++--------- test/multi_add.png | Bin 4498 -> 0 bytes test/multi_difference.png | Bin 4416 -> 0 bytes test/multi_dodge.png | Bin 4887 -> 0 bytes test/multi_multiply.png | Bin 4821 -> 0 bytes test/multi_normal.png | Bin 3345 -> 0 bytes test/multi_overlay.png | Bin 4733 -> 0 bytes test/multi_screen.png | Bin 4717 -> 0 bytes test/multi_src-in.png | Bin 458 -> 0 bytes test/over.png | Bin 408 -> 0 bytes test/under.png | Bin 598 -> 0 bytes 12 files changed, 62 insertions(+), 16 deletions(-) mode change 100644 => 100755 context_blender.js delete mode 100644 test/multi_add.png delete mode 100644 test/multi_difference.png delete mode 100644 test/multi_dodge.png delete mode 100644 test/multi_multiply.png delete mode 100644 test/multi_normal.png delete mode 100644 test/multi_overlay.png delete mode 100644 test/multi_screen.png delete mode 100644 test/multi_src-in.png delete mode 100644 test/over.png delete mode 100644 test/under.png diff --git a/README.md b/README.md index e341418..7456f07 100644 --- a/README.md +++ b/README.md @@ -50,7 +50,7 @@ The following blend modes work perfectly (or as nearly as the [vagaries of the H * `multiply` * `difference` -These blend modes mostly work as intended: +These blend modes mostly work as intended, but have issues when it comes to dealing with the alpha channel: * `src-in` - the output of this blend mode is slightly different from the effect of applying the transparency of one layer as a mask to another; the difference only appears @@ -66,21 +66,34 @@ These blend modes mostly work as intended: of either/both images, the more the colors get high contrast. * ![comparison of result versus intended for add blend mode](http://phrogz.net/tmp/context-blender_overlay.png) -These blend modes are known to be broken: + * `hardlight` - this is the opposite of "overlay" and same caveats apply * `colordodge` (or `dodge`) * ![comparison of result versus intended for dodge blend mode](http://phrogz.net/tmp/context-blender_dodge.png) + * `colorburn` (or `burn`) + + * `darken` + + * `lighten` + + * `exclusion` + ## Requirements/Browser Support Tested on Safari v5.0, Chrome v8, and FF v3.6. Should work on any user agent that supplies a `CanvasRenderingContext2D` along with `getImageData` and `putImageData`. - ## 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. +## Reference Material +[PDF Blend Modes: Addendum (January 23, 2006)](http://www.adobe.com/content/dam/Adobe/en/devnet/pdf/pdfs/pdf_reference_archives/blend_modes.pdf) PDF +[SVG Compositing 1.2, Part 1: Primer](http://dev.w3.org/SVG/modules/compositing/master/SVGCompositingPrimer.html) +[Custom blend modes for Flash 10](http://www.lostinactionscript.com/blog/index.php/2009/05/26/custom-blend-modes-for-flash-10/) blog post +[Blend Modes in Delphi](http://www.pegtop.net/delphi/articles/blendmodes/) blog post + ### 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. \ No newline at end of file diff --git a/context_blender.js b/context_blender.js old mode 100644 new mode 100755 index 7699525..41290d6 --- a/context_blender.js +++ b/context_blender.js @@ -68,8 +68,8 @@ if (window.CanvasRenderingContext2D && CanvasRenderingContext2D.prototype.getIma dst[px+1] = (sGA + dGA - 2 * Math.min( sGA*dA, dGA*sA )) * demultiply; dst[px+2] = (sBA + dBA - 2 * Math.min( sBA*dA, dBA*sA )) * demultiply; break; - - // ******* Slightly different from Photoshop + + // ******* Slightly different from Photoshop, where alpha is concerned case 'src-in': // Only differs from Photoshop in low-opacity areas dA2 = sA*dA; @@ -113,20 +113,53 @@ if (window.CanvasRenderingContext2D && CanvasRenderingContext2D.prototype.getIma // dst[px+2] = ( (sBA < 0.5) ? (2 * dBA * sBA) : (1 - 2 * (1 - sBA) * (1 - dBA)) ) * demultiply; break; - // ******* BROKEN + case 'hardlight': + // opposite of overlay, same caveats apply as to how well it works + dst[px ] = (sRA<=0.5) ? (2*dst[px ]*sRA/dA) : 255 - (2 - 2*sRA/sA) * (255-dst[px ]); + dst[px+1] = (sGA<=0.5) ? (2*dst[px+1]*sGA/dA) : 255 - (2 - 2*sGA/sA) * (255-dst[px+1]); + dst[px+2] = (sBA<=0.5) ? (2*dst[px+2]*sBA/dA) : 255 - (2 - 2*sBA/sA) * (255-dst[px+2]); + break; + case 'colordodge': case 'dodge': - if (src[px ]==255 && dRA==0) dst[px ] = sRA*(1-dA) * demultiply; - else if (src[px ]==255) dst[px ] = (sA*dA + sRA*(1-dA) + dRA*(1-sA)) * demultiply; - else if (sRAFMGivCf^O2I7Qi|+uk1S2f7Zw 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 z zHk6nrJaELcJCE|M$WnxcWfeMGXwfKf(dj}u9oFn1{~vcU zQ>6@7FB2NB5#eZsaIrf0I9@74uGV0W<|j+^{9E}&@)T-KkPsu$117rF;+-p>pq*EB zQA346?gSA=bLN|$JW;RBgnxo*t#0Pb%bGV+|CY*&U03;3@T((oQ2rfc;PaPkezr#K z)w2uFJRRX!b5SF}72^Ow*a1+yCSC0vHMX0gdUk7GlM*)cSQ>Rg@Pw&qy*(L!!Daor z{Pt--paI?B;9Df2`g~vamTIl@f349SO3f4n*3;RnUq*HZA7(aaZK)y)M+8yfD&=+z zP5F3_7m;>>`tmz&Zf*i_peIn~Iyyv&AvGM53enSh`BkdG$d;^kdUS8Xs?)X<5fk;q z=x_SniJq94YGnvkf~N1DDB42-TysCF-IR@<;QZ$WW)ou}cgdMh-SUFH<&LkPF~~o6 j^96wb|KXa#$>AnpDKSX-2haY=!eL|SU{QD0H|>7_o6EHq diff --git a/test/multi_difference.png b/test/multi_difference.png deleted file mode 100644 index e372142ed0c3705744761b38af2fc5da27bbc60e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4416 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 B zHt=&<1@pz4tq+1M&@%GrA9rUkT(eD~g5})!Yf4Z8(0XYk60eVXW5RD>=2M8OVB=#s z8W-66{smDzh~bo2$Y0gxyz2C*z~7O{?U(KEst*vU^`n>d>Cj3RzkeblP`z$Xc|@L+ z>pJdM*y3MZgOndVE|vmW#->$lE%`^Ov{03sETx9{;XGKe8<_Mq6=Y;hy;^VJEl z`JK^Gb7muftvqFV;+eK3!)za&*Lmh&j!S%Y1d;E2MdqPHqbzuq#G56-nJex5KAiFkT5TI>OtD3P>xxRNp@V=Wim$1;yKi z4*@HRcEOA#QGfW5J_62j}(ghkckzj{cgFO#5dNIq%RT(i%o*NY&z8Y5hn4TU> z(kU(Coj3;?!)`TSX<*$s24mcOF;D%!TB`qNgH<`%PJ9Bp^w?Bl)4M@mfjTHze@2|^ zvLrw#`y>!Khv~(qMXX=tVJ@J3xg+cAjT)u3!+^ya*rn3glI)4(hoo;5OQ7TNof(@b zDNi|FC0~M0fKI85So5R1Yy*(9JOlylu>VUO`Eeev;7O70Y-8QjbN#S_mnU$_smlHB zV#IGPEYnp_@6h+1xUwO8$@=Iw-9(|Vri*4xJ^cI{Vc!1xfp|3aka72e23tBK5*ABi z@L4ka8o_3oOE`(!lt~8Tkqm6Ddo|||qaX(UaE#V)#S0q;FHCH&S;d=9WUB=v;JBgk z*pahiFD3)8oS?sbHF{@qwNkz##ZTq9;oy~b?@Rp|pOSdmM_iv9aoUM>%GA hbW~>j5f?WXWPhK)vwP>&f&ZzvV8+(xDQ8{p{0F$hg~0#- diff --git a/test/multi_normal.png b/test/multi_normal.png deleted file mode 100644 index 2bfa561a2d2947eaa13350ad7eb250e4dd7f05f6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3345 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 izIZ^HpJR^jb1fsAL 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 diff --git a/test/multi_screen.png b/test/multi_screen.png deleted file mode 100644 index 7d4c2d9ba797491aaa0c532014706658acb826ac..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4717 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 A@Bjb+ diff --git a/test/multi_src-in.png b/test/multi_src-in.png deleted file mode 100644 index 24f3140196f81997a0dc0e740a6a4792d38bf540..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 458 zcmeAS@N?(olHy`uVBq!ia0vp^y&%lN1|+-Uel7)4k|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*9U+7;`*b978H@y}5Ijv)MqT;bMfQ5YYwfmwQoEvm%rTo(QpWi;NtBjrg^Jh-{x2L;O|Li%FpM5J-T9tj) z(hB{@k$RkdLcEI{O*+^vDo6=HSq&LbmP<1_OF;@E#(43A@bxR@N4p-$WlS@@pfg*a zx6Z$V4W38>BiVy6r9?{Ar^7i?BXw&l!kyDz+m5$F)GG3W}Bw4giqz{c7r zK9lol(>`qeafzUf*bREgQu&X%Q~loCIFPei-Z6G diff --git a/test/under.png b/test/under.png deleted file mode 100644 index df1c3b91843ed2c58fe82741c1841c508705af3b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 598 zcmeAS@N?(olHy`uVBq!ia0vp^y&%lN1|+-Uel7)4k|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*9U+7=L)WIEGZ*dUNMC?_mWV)_@6C5oV_|6esU|$@Y=`#G>at z4eS0a(6p7~6|!5)yS(9ofvw5*V1=dj!o4%wQkF_i4?f`2Jd>nZ}#&d|TF(t!he%rT}snS#1Y}pdc4`ujg_+Q}$ zT8=FLmeZJbn|g>;j{gTWlX?Em)lSum5;9WSN-~rVy_HLoYH6!lcyTV!ANz}bZcKg!{FC{EN#`$B~s?_18d polOfTN^Yt~!{3urrXH%5-2_Z144$rjF6*2UngHg}0H6Q>