| 1 import "dart:html" as q;import "dart:math" as JB;import "dart:typed_data" as aB;
class bB{static const cB="Chrome";static const dB="Firefox";final XB;final m
inimumVersion;const bB(this.XB,[this.minimumVersion]);}class eB{const eB();}clas
s fB{final name;const fB(this.name);}class gB{const gB();}class hB{const hB();}
class iB{var u;iB( g){u=YB(g);} YB( g){var h=new q.CanvasElement(width:g.width,h
eight:g.height);var i=h.getContext('2d');i.drawImage(g,0,0);return i.getImageDat
a(0,0,h.width,h.height);} PB( g, h){var j=new q.CanvasElement(width:g,height:h);
var i=j.getContext('2d');return i.createImageData(g,h);} QB(){var h=u.data;for(v
ar g=0;g<h.length;g+= 4){var i=h[g];var j=h[g+1];var k=h[g+2];var l=(0.2126*i).t
oInt()+(0.7152*j).toInt()+(0.0722*k).toInt();h[g]=h[g+1]=h[g+2]=l;}return u;} WB
( i){var h=u.data;for(var g=0;g<h.length;g+= 4){h[g]+=i;h[g+1]+=i;h[g+2]+=i;}ret
urn u;} threshold( k){var h=u.data;for(var g=0;g<h.length;g+= 4){var i=h[g];var
l=h[g+1];var m=h[g+2];var j=(0.2126*i+0.7152*l+0.0722*m>=k)?255:0;h[g]=h[g+1]=h[
g+2]=j;}return u;} KB( CB,[ IB=false]){var LB=IB?1:0;var s=(JB.sqrt(CB.length).t
oInt());var DB=s~/2;var k=u.data;var g=u.width;var BB=u.height;var EB=PB(g,BB);v
ar h=EB.data;for(var l=0;l<BB;l++ ){for(var j=0;j<g;j++ ){var FB=0.0,GB=0.0,HB=0
.0,v=0.0;var m=(l*g+j)*4;for(var n=0;n<s;n++ ){for(var i=0;i<s;i++ ){var MB=JB.m
in(BB-1,JB.max(0,l+n-DB));var NB=JB.min(g-1,JB.max(0,j+i-DB));var t=(MB*g+NB)*4;
var o=CB[(n*s+i)];FB+= k[t]*o;GB+= k[t+1]*o;HB+= k[t+2]*o;v+= k[t+3]*o;}}h[m]=FB
.toInt();h[m+1]=GB.toInt();h[m+2]=HB.toInt();h[m+3]=(v+LB*(255-v)).toInt();}}ret
urn EB;} ZB( o, n){var k=QB();var i=OB(k,n);var m=OB(k,o);var h=PB(i.width,i.hei
ght);for(var g=0;g<h.data.length;g+= 4){var j=i.data[g].abs();h.data[g]=j.toInt(
);var l=m.data[g].abs();h.data[g+1]=l.toInt();h.data[g+2]=((j+l)/4).toInt();h.da
ta[g+3]=255;}return h;} OB( CB, GB,{ opaque: false}){var LB=opaque?1:0;var t=(JB
.sqrt(GB.length).toInt());var IB=t~/2;var k=CB.data;var g=CB.width;var n=CB.heig
ht;var HB=new RB(new aB.Float32List(g*n*4),g,n);var h=HB.data;for(var l=0;l<n;l+
+ ){for(var j=0;j<g;j++ ){var EB=0.0,FB=0.0,DB=0.0,BB=0.0;var m=(l*g+j)*4;for(va
r s=0;s<t;s++ ){for(var i=0;i<t;i++ ){var MB=JB.min(n-1,JB.max(0,l+s-IB));var NB
=JB.min(g-1,JB.max(0,j+i-IB));var v=(MB*g+NB)*4;var o=GB[(s*t+i)];EB+= k[v]*o;FB
+= k[v+1]*o;DB+= k[v+2]*o;BB+= k[v+3]*o;}}h[m]=EB;h[m+1]=FB;h[m+2]=DB;h[m+3]=(BB
+LB*(255-BB));}}return HB;}}class RB{final data;final width,height;RB(this.data
,this.width,this.height);} main(){final l=40;final o=128;final t=[0,-1,0,-1,5,-1
,0,-1,0];final n=[1/9,1/9,1/9,1/9,1/9,1/9,1/9,1/9,1/9];final s=[-1,0,1,-2,0,2,-1
,0,1];final m=[-1,-2,-1,0,0,0,1,2,1];var g=q.query('.orig');q.window.onLoad.list
en((h)=>SB(g));q.query('[name = "grayscale"]').onClick.listen((h)=>AB('grayscale
',()=>new iB(g).QB()));q.query('[name = "brightness"]').onClick.listen((h)=>AB('
brightness',()=>new iB(g).WB(l)));q.query('[name = "threshold"]').onClick.listen
((h)=>AB('threshold',()=>new iB(g).threshold(o)));q.query('[name = "sharpen"]').
onClick.listen((h)=>AB('sharpen',()=>new iB(g).KB(t)));q.query('[name = "blur"]'
).onClick.listen((h)=>AB('blur',()=>new iB(g).KB(n)));q.query('[name = "sobel"]'
).onClick.listen((h)=>AB('sobel',()=>new iB(g).ZB(s,m)));q.query('[name = "custo
m"]').onClick.listen((h)=>AB('custom',(){var j=q.query('#customMatrix').queryAll
('input');var k=new List();for(var i=0;i<j.length;i++ ){k.add(double.parse(j[i].
value));}return new iB(g).KB(k,true);}));} SB( j){var i=q.queryAll('canvas');for
(var h=0;h<i.length;h++ ){var g=i[h];g.parent.insertBefore(j.clone(true),g);g.cl
asses.add('hide');}} TB( h){var g=q.query('#${h}');g.classes.remove('show');g.cl
asses.add('hide');g.previousElementSibling.classes.remove('hide');g.previousElem
entSibling.classes.add('show');g.parent.query('button').text='apply ${h} filter'
;} UB( i, h){var g=q.query('#${i}');g.width=h.width;g.height=h.height;g.getConte
xt('2d') as q.CanvasRenderingContext2D..putImageData(h,0,0);g.previousElementSib
ling.classes.remove('show');g.previousElementSibling.classes.add('hide');g.class
es.remove('hide');g.classes.add('show');g.parent.query('button').text='remove ${
i} filter';}typedef VB(); AB( g, h){if(q.query('#${g}').previousElementSibling.
classes.contains('hide')){TB(g);}else{UB(g,h());}} |