forked from janantala/angular-adaptive-motion
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathangular-adaptive-motion.min.js
6 lines (6 loc) · 5.05 KB
/
angular-adaptive-motion.min.js
1
2
3
4
5
6
/*!
* angular-adaptive-motion v0.2.0
* The MIT License
* Copyright (c) 2013 Jan Antala
*/
!function(){"use strict";var a=angular.module("adaptive.motion",[]);!function(){for(var a=0,b=["webkit","moz"],c=0;c<b.length&&!window.requestAnimationFrame;++c)window.requestAnimationFrame=window[b[c]+"RequestAnimationFrame"],window.cancelAnimationFrame=window[b[c]+"CancelAnimationFrame"]||window[b[c]+"CancelRequestAnimationFrame"];window.requestAnimationFrame||(window.requestAnimationFrame=function(b){var c=(new Date).getTime(),d=Math.max(0,16-(c-a)),e=window.setTimeout(function(){b(c+d)},d);return a=c+d,e}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(a){clearTimeout(a)})}();var b=function(a,b,c){a/=255,b/=255,c/=255;var d,e,f=Math.max(a,b,c),g=Math.min(a,b,c),h=f,i=f-g;if(e=0===f?0:i/f,f===g)d=0;else{switch(f){case a:d=(b-c)/i+(c>b?6:0);break;case b:d=(c-a)/i+2;break;case c:d=(a-b)/i+4}d/=6}return[d,e,h]};a.provider("$motion",[function(){var a,c=document.createElement("video");c.setAttribute("autoplay","true"),c.setAttribute("width","300");var d=document.createElement("canvas"),e=d.getContext("2d");this.treshold={rgb:150,move:2,bright:300},this.hsvFilter={huemin:0,huemax:.1,satmin:0,satmax:1,valmin:.4,valmax:1},this.setTreshold=function(a){angular.extend(this.treshold,a)},this.setHsvFilter=function(a){angular.extend(this.hsvFilter,a)},this.$get=function(f){var g,h,i,j=this.treshold,k=this.hsvFilter,l=5,m=0,n=0,o={x:0,y:0,d:0},p=function(){if(window.URL=window.URL||window.webkitURL,navigator.getUserMedia=navigator.getUserMedia||navigator.webkitGetUserMedia||navigator.mozGetUserMedia||navigator.msGetUserMedia,!navigator.getUserMedia)throw f.$broadcast("adaptive.motion:onError","getUserMedia() is not supported in your browser"),new Error("getUserMedia() is not supported in your browser");navigator.getUserMedia({audio:!1,video:!0},function(b){f.$broadcast("adaptive.motion:onStart"),h=b,c.src=window.URL.createObjectURL(b),c.addEventListener("play",function(){a=window.requestAnimationFrame(r)})},function(){throw f.$broadcast("adaptive.motion:onError","Access denied!"),new Error("Access denied!")})},q=function(){window.cancelAnimationFrame(a),h&&h.stop(),h=void 0,f.$broadcast("adaptive.motion:onStop")},r=function(){d.width!==c.videoWidth&&(m=Math.floor(c.videoWidth/l),n=Math.floor(c.videoHeight/l),d.width=m,d.height=n);try{e.drawImage(c,0,0,m,n),g=e.getImageData(0,0,m,n),f.$broadcast("adaptive.motion:videoData",g);var b=s(g);i=t(b),a=window.requestAnimationFrame(r)}catch(h){if("NScontextERRORcontextNOTcontextAVAILABLE"!==h.name)throw h;a=window.requestAnimationFrame(r)}},s=function(a){for(var c=e.getImageData(0,0,m,n),d=c.width*c.height,g=4*d,h=0,i=0;n>i;i++)for(var j=0;m>j;j++){g=j+i*m;var l=a.data[h],o=a.data[h+1],p=a.data[h+2],q=a.data[h+3],r=b(l,o,p);(r[0]>k.huemin&&r[0]<k.huemax||r[0]>.59&&r[0]<1)&&r[1]>k.satmin&&r[1]<k.satmax&&r[2]>k.valmin&&r[2]<k.valmax?(c[h]=l,c[h+1]=o,c[h+2]=p,c[h+3]=q):(c.data[h]=255,c.data[h+1]=255,c.data[h+2]=255,c.data[h+3]=255),h=4*g}return f.$broadcast("adaptive.motion:skinData",c),c},t=function(a){var b=e.createImageData(m,n),c=0,d=0,g=0,h=b.width*b.height*4;if(i)for(;(h-=4)>0;){var k=Math.abs(a.data[h]-i.data[h])+Math.abs(a.data[h+1]-i.data[h+1])+Math.abs(a.data[h+2]-i.data[h+2]);k>j.rgb?(b.data[h]=0,b.data[h+1]=0,b.data[h+2]=0,b.data[h+3]=255,g+=1,c+=h/4%m,d+=Math.floor(h/4/b.height)):(b.data[h]=255,b.data[h+1]=255,b.data[h+2]=255,b.data[h+3]=255)}if(g){f.$broadcast("adaptive.motion:edgeData",b);var l={x:c/g,y:d/g,d:g};x(l)}return a},u=function(a){o={x:a.x,y:a.y,d:a.d}},v=0,w=0,x=function(a){v=.9*v+.1*a.d;var b=a.d-v,c=b>j.bright;switch(w){case 0:c&&(w=1,u(a));break;case 2:c||(w=0);break;case 1:var d=a.x-o.x,e=a.y-o.y,g=Math.abs(e)<Math.abs(d)-j.move,h=Math.abs(d)<Math.abs(e)-j.move;g?d<-j.move?f.$broadcast("adaptive.motion:onSwipeRight"):d>j.move&&f.$broadcast("adaptive.motion:onSwipeLeft"):h&&(e>j.move?f.$broadcast("adaptive.motion:onSwipeDown"):e<-j.move&&f.$broadcast("adaptive.motion:onSwipeUp")),w=2}},y=function(a){f.$on("adaptive.motion:onStart",function(b,c){a(c)})},z=function(a){f.$on("adaptive.motion:onStop",function(b,c){a(c)})},A=function(a){f.$on("adaptive.motion:onError",function(b,c){a(c)})},B=function(a){f.$on("adaptive.motion:onSwipeLeft",function(b,c){a(c)})},C=function(a){f.$on("adaptive.motion:onSwipeRight",function(b,c){a(c)})},D=function(a){f.$on("adaptive.motion:onSwipeUp",function(b,c){a(c)})},E=function(a){f.$on("adaptive.motion:onSwipeDown",function(b,c){a(c)})};return{start:function(){p()},stop:function(){q()},onStart:function(a){y(a)},onStop:function(a){z(a)},onError:function(a){A(a)},onSwipeLeft:function(a){B(a)},onSwipeRight:function(a){C(a)},onSwipeUp:function(a){D(a)},onSwipeDown:function(a){E(a)}}}}]),a.directive("adaptiveMotion",["$rootScope",function(a){return{restrict:"A",link:function(b,c,d){var e=c[0],f=e.getContext("2d");"video"===d.adaptiveMotion?a.$on("adaptive.motion:videoData",function(a,b){f.putImageData(b,0,0)}):"skin"===d.adaptiveMotion?a.$on("adaptive.motion:skinData",function(a,b){f.putImageData(b,0,0)}):a.$on("adaptive.motion:edgeData",function(a,b){f.putImageData(b,0,0)})}}}])}();