"HTML5 рдзрдорд╛рдХрд╛ рдХреИрдорд░рд╛ рдбреЗрдореЛ" рдкрд░ рдЖрдзрд╛рд░рд┐рдд рдЬрд╝реЗрди рдлреНрд░реЗрдорд╡рд░реНрдХ рдореЗрдВ getUserMedia рдФрд░ <рдХреИрдирд╡рд╛рд╕> рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг



рд╕рдВрд╕реНрдХрд░рдг 2012.1 рдХреЗ рд╕рд╛рде рд╢реБрд░реВ, рдПрдореНрдмреЗрдбреЗрдб ZEN рдШрдЯрдХ <рдХреИрдирд╡рд╛рд╕> рдХреИрд╢реЗ DBMS рдореЗрдВ рджрд┐рдЦрд╛рдИ рджрд┐рдпрд╛ рд╣реИред
рдиреЛрдЯ: рдпрд╣рд╛рдВ Cach├й DBMS рдХрд╛ рдореБрдлреНрдд рдПрдХрд▓-рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕рдВрд╕реНрдХрд░рдг рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдВ ред

рдФрд░ рдУрдкреЗрд░рд╛ 12 рдХреА рдирд╡реАрдирддрдо рд░рд┐рд▓реАрдЬ рдореЗрдВ , getUserMedia рдлрд╝рдВрдХреНрд╢рди ( WebRTC 1.0 : рд░рд┐рдпрд▓-рдЯрд╛рдЗрдо рдХрдореНрдпреБрдирд┐рдХреЗрд╢рди рдмрд┐рдЯрд╡реАрди рдмреНрд░реЙрд╡рд░реНрд╕) рдХреЗ рд▓рд┐рдП рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рд╕рдорд░реНрдерди рдерд╛, рдЬреЛ рдореАрдбрд┐рдпрд╛-рдЬрдирд░реЗрдЯ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдЙрдкрдХрд░рдгреЛрдВ, рдЬреИрд╕реЗ рдХрд┐ рд╡реЗрдмрдХреИрдо рдХреЛ рдПрдХреНрд╕реЗрд╕ рдХрд░рдирд╛ рд╕рдВрднрд╡ рдмрдирд╛рддрд╛ рд╣реИред
рдиреЛрдЯ: рдбреЗрд╕реНрдХрдЯреЙрдк рдФрд░ рдореЛрдмрд╛рдЗрд▓ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ getUserMedia / Stream API рд╕рдорд░реНрдерди рдХреА рд╕рд╛рд░рд╛рдВрд╢ рддрд╛рд▓рд┐рдХрд╛ ред

рдЗрди рджреЛрдиреЛрдВ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, Cach├й DBMS рдореЗрдВ рдирд┐рд░реНрдорд┐рдд ZEN рдлреНрд░реЗрдорд╡рд░реНрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рдПрдХ рдбреЗрдореЛ рдХреЛ рдЖрдзрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рдЪреБрдирд╛ рдЧрдпрд╛ рдерд╛: HTML5 рдзрдорд╛рдХрд╛ рдХреИрдорд░рд╛ рдбреЗрдореЛ ред
рдиреЛрдЯ: рдореВрд▓ рдбреЗрдореЛ рдСрдирд▓рд╛рдЗрди рд╣реИ ред

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЪрд╛рд░ рдХреИрдирд╡рд╕ рдХреЛ <рдХреИрдирд╡рд╛рд╕> рдШрдЯрдХ рдХреЗ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдкрд┐рдХреНрд╕реЗрд▓ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡реЗрдмрдХреИрдо рд╕реЗ рдЖрдЙрдЯрдкреБрдЯ рд╡реАрдбрд┐рдпреЛ рдХреЗ рд▓рд┐рдП рдХреЛрдб рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рдерд╛ред

рдХреЛрдб рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛:

  1. рдХреИрдЪ 2012.2 рд░рд┐рд▓реАрдЬ рдХреИрдВрдбрд┐рдбреЗрдЯ (рдпреВрдирд┐рдХреЛрдб, x64);
  2. рдУрдкреЗрд░рд╛ 12.00 рд░рд┐рд▓реАрдЬрд╝;
  3. рдХреНрд░реЛрдо 21 рдмреАрдЯрд╛ред

рдиреЛрдЯ: WebRTC рдХреЛ Chrome рдмреНрд░рд╛рдЙрдЬрд╝рд░ 18.0.1008 рдФрд░ рдмрд╛рдж рдХреЗ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдореЗрдВ рдкреЗрдЬ рдкрд░ рд╕рдХреНрд╖рдо рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ : рдЭрдВрдбреЗ рдпрд╛ рдХреНрд░реЛрдо: // рдЭрдВрдбреЗ


ZEN рдкреЗрдЬ рдХреНрд▓рд╛рд╕ рдХреЛрдб
рдХреНрд▓рд╛рд╕ рдХрд╛ рдбреЗрдореЛ редcamcanvas% ZEN.Component.page рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рддрд╛ рд╣реИ
{

рдкреИрд░рд╛рдореАрдЯрд░ JSINCLUDES STRING рдХреЗ рд░реВрдк рдореЗрдВ = "zenCSLM.js" ;

/// рдЗрд╕ рд╕реНрдЯрд╛рдЗрд▓ рдмреНрд▓реЙрдХ рдореЗрдВ рдкреЗрдЬ рдХреЗ рд▓рд┐рдП CSS рд╕реНрдЯрд╛рдЗрд▓ рдкрд░рд┐рднрд╛рд╖рд╛ рд╣реИред
XData рд╕реНрдЯрд╛рдЗрд▓
{
< style type = "text / css" >
* {
рдорд╛рд░реНрдЬрд┐рди: 0;
рдЧрджреНрджреА: 0;
}
{{
рд░рдВрдЧ: # 99f;
}
# рдкреЗрдЬ {
рдкреГрд╖реНрдарднреВрдорд┐: # 000;
рд░рдВрдЧ: #fff;
font-family: 'Helvetica Neue', 'Free Sans', 'Deja Vu Sans', Arial, Helvetica, sans-serif;
рдорд╛рд░реНрдЬрд┐рди: 0px;
рдЧрджреНрджреА: 0px;
}
# рдореЗрди {
рд░рдВрдЧ: #fff;
рд╕реАрдорд╛: рдареЛрд╕ 2px # c00;
рд╕реАрдорд╛-рддреНрд░рд┐рдЬреНрдпрд╛: 1em;
рд▓рд╛рдЗрди-рдКрдБрдЪрд╛рдИ: 1.5;
рдорд╛рд░реНрдЬрд┐рди: 2em рдСрдЯреЛ;
рдЧрджреНрджреА: 1em;
рдЪреМрдбрд╝рд╛рдИ: 50%;
}
# рд╡рд░реНрд╖ {
рдкреГрд╖реНрдарднреВрдорд┐: # 3af;
рд░рдВрдЧ: # 777;
}
</ рд╢реИрд▓реА >
}

XData рд╕рд╛рдордЧреНрд░реА [ XMLNamespace = " www.intersystems.com/zen" ]
{
< рдкреЗрдЬ xmlns = " www.intersystems.com/zen" рд╢реАрд░реНрд╖рдХ = "рдПрдЪрдЯреАрдПрдордПрд▓ 5 рдбреЗрдореЛ & quot; рд╡рд┐рд╕реНрдлреЛрдЯ рдХреИрдорд░рд╛ рдФрд░ quot;" рдЖрдИрдбреА = "рдкреЗрдЬ" >
< рдЯрд╛рдЗрдорд░
рдЖрдИрдбреА = "рдЯрд╛рдЗрдорд░"
рдЯрд╛рдЗрдордЖрдЙрдЯ = "0"
ontimeout = "zenPage.processFrame ();"
/>
< html
рдЖрдИрдбреА = "рдореБрдЦреНрдп"
рд╕рдВрд░реЗрдЦрд┐рдд рдХрд░реЗрдВ = "рдХреЗрдВрджреНрд░"
рдЫрд┐рдкрд╛ рд╣реБрдЖ = "рд╕рддреНрдп" >
< рд╡реАрдбрд┐рдпреЛ
рдЖрдИрдбреА = "рд╕реЛрд░реНрд╕рд╡рд┐рдж"
рдСрдЯреЛрдкреНрд▓реЗ = "рдСрдЯреЛрдкреНрд▓реЗ"
рдЫрд┐рдкрд╛ рд╣реБрдЖ = "рд╕рддреНрдп"
> рдХреНрд╖рдорд╛ рдХрд░реЗрдВ, рдЖрдкрдХрд╛ рдмреНрд░рд╛рдЙрдЬрд╝рд░ & lt рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ ; рд╡реАрдбрд┐рдпреЛ & gt; ред рдХреГрдкрдпрд╛ <a href = "en.opera.com/download/"> рдУрдкреЗрд░рд╛ </ a > </ рд╡реАрдбрд┐рдпреЛ > рдЖрдЬрд╝рдорд╛рдПрдВ
</ html >
< рд░реЗрдбрд┐рдпреЛрд╕реЗрдЯ
id = "rs"
рд╕рдВрд░реЗрдЦрд┐рдд рдХрд░реЗрдВ = "рдХреЗрдВрджреНрд░"
рдЫрд┐рдкрд╛ рд╣реБрдЖ = "рд╕рддреНрдп"
рдкреНрд░рджрд░реНрд╢рдирд╡рд╛рджреА = "рд╕рд╛рдорд╛рдиреНрдп, рдЙрднрд░рд╛, рд▓рд╛рд▓, рдЙрд▓рдЯрд╛, рдореЛрдиреЛрдХреНрд░реЛрдо"
valueList = "filterNormal, filterEmboss, filterRed, filterInversed, filterGrayscale"
рдорд╛рди = "рдлрд╝рд┐рд▓реНрдЯрд░рдиреЙрд░реНрдорд▓"
onchange = "zenPage.changeFilter (zenThis.getValue ());"
/>
< рдХреИрдирд╡рд╕ рдЖрдИрдбреА = "рдЖрдЙрдЯрдкреБрдЯ" рдЫрд┐рдкрд╛ рд╣реБрдЖ = "рд╕рдЪ" />
< рдХреИрдирд╡рд╛рд╕ рдЖрдИрдбреА = "рд╕реЛрд░реНрд╕рдХреЙрдкреА" рдЫрд┐рдкреА = "рд╕рдЪ" />
</ рдкреГрд╖реНрда >
}

рдХреНрд▓рд╛рдЗрдВрдЯрдореЗрдереЙрдб рдЪреЗрдВрдЬрдлрд╝рд┐рд▓реНрдЯрд░ ( рд╕реНрдЯреНрд░реИрдлрд╝рдВрдХреНрд╢рди ) [ рднрд╛рд╖рд╛ = рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ]
{
eval ( "рдлрд╝рд┐рд▓реНрдЯрд░ = 'рдпрд╣ред" + strFunction + "();" " );
}

ClientMethod рдлрд╝рд┐рд▓реНрдЯрд░ рдЕрд╕рд╛рдорд╛рдиреНрдп () [ рднрд╛рд╖рд╛ = рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ]
{
}

ClientMethod рдлрд╝рд┐рд▓реНрдЯрд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ () [ рднрд╛рд╖рд╛ = рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ]
{

var imageData = copy.getImageData ( 0 , 0 , copycanvas. рдЙрдкрд▓рдмреНрдзрддрд╛, copycanvas.ight);
var data = imageData.data;

var рдореАрдбрд┐рдпрд╛ = (рдбреЗрдЯрд╛ [ 0 ] + рдбреЗрдЯрд╛ [ 1 ] + рдбреЗрдЯрд╛ [ 2 ]) / 3 >> 0 ;

рдбреЗрдЯрд╛ [ 0 ] = рдореАрдбрд┐рдпрд╛;
рдбреЗрдЯрд╛ [ 1 ] = рдореАрдбрд┐рдпрд╛;
рдбреЗрдЯрд╛ [ 2 ] = рдореАрдбрд┐рдпрд╛;

( var i = 4 , len = data.length; рдореИрдВ < len; i + = 4 ) {1
рдореАрдбрд┐рдпрд╛ = 255- (рдбреЗрдЯрд╛ [i] + рдбреЗрдЯрд╛ [i +1 ] + рдбреЗрдЯрд╛ [i +2 ]) / 3 >> 0 ;

data [i] = рдореАрдбрд┐рдпрд╛;
рдбреЗрдЯрд╛ [i +1 ] = рдореАрдбрд┐рдпрд╛;
data [i +2 ] = рдореАрдбрд┐рдпрд╛;
}
copy.putImageData (imageData, 0 , 0 );
}

ClientMethod filterGrayscale () [ рднрд╛рд╖рд╛ = рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ]
{

var imageData = copy.getImageData ( 0 , 0 , copycanvas. рдЙрдкрд▓рдмреНрдзрддрд╛, copycanvas.ight);
var data = imageData.data;

рдХреЗ рд▓рд┐рдП ( var i = 0 , len = data.length; рдореИрдВ < рд▓реЗрди; рдореИрдВ + = 4 ) {1
var Media = (рдбреЗрдЯрд╛ [i] + рдбреЗрдЯрд╛ [i +1 ] + рдбреЗрдЯрд╛ [i +2 ]) / 3 >> 0 ;

data [i] = рдореАрдбрд┐рдпрд╛;
рдбреЗрдЯрд╛ [i +1 ] = рдореАрдбрд┐рдпрд╛;
data [i +2 ] = рдореАрдбрд┐рдпрд╛;
}
copy.putImageData (imageData, 0 , 0 );
}

ClientMethod рдлрд╝рд┐рд▓реНрдЯрд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ () [ рднрд╛рд╖рд╛ = рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ]
{

var imageData = copy.getImageData ( 0 , 0 , copycanvas. рдЙрдкрд▓рдмреНрдзрддрд╛, copycanvas.ight);
var data = imageData.data;

рдХреЗ рд▓рд┐рдП ( var i = 0 , len = data.length; рдореИрдВ < рд▓реЗрди; рдореИрдВ + = 4 ) {1
рдбреЗрдЯрд╛ [i +1 ] = 0 ;
рдбреЗрдЯрд╛ [i +2 ] = 0 ;
}
copy.putImageData (imageData, 0 , 0 );
}

ClientMethod рдлрд╝рд┐рд▓реНрдЯрд░ Emboss () [ рднрд╛рд╖рд╛ = рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ]
{
var imageData = copy.getImageData ( 0 , 0 , copycanvas. рдЙрдкрд▓рдмреНрдзрддрд╛, copycanvas.ight);
var data = imageData.data;

var рдореАрдбрд┐рдпрд╛ = (рдбреЗрдЯрд╛ [ 0 ] + рдбреЗрдЯрд╛ [ 1 ] + рдбреЗрдЯрд╛ [ 2 ]) / 3 >> 0 ;
рдбреЗрдЯрд╛ [ 0 ] = рдореАрдбрд┐рдпрд╛;
рдбреЗрдЯрд╛ [ 1 ] = рдореАрдбрд┐рдпрд╛;
рдбреЗрдЯрд╛ [ 2 ] = рдореАрдбрд┐рдпрд╛;

рдореАрдбрд┐рдпрд╛ = (рдбреЗрдЯрд╛ [ рек ] + рдбреЗрдЯрд╛ [ рел ] + рдбреЗрдЯрд╛ [ рем ]) / рей >> реж ;
рдбреЗрдЯрд╛ [ 4 ] = рдореАрдбрд┐рдпрд╛;
рдбреЗрдЯрд╛ [ 5 ] = рдореАрдбрд┐рдпрд╛;
рдбреЗрдЯрд╛ [ 6 ] = рдореАрдбрд┐рдпрд╛;

( var i = 8 , len = data.length; рдореИрдВ < len; i + = 4 ) {1
рдореАрдбрд┐рдпрд╛ = (рдбреЗрдЯрд╛ [i] + рдбреЗрдЯрд╛ [i +1 ] + рдбреЗрдЯрд╛ [i +2 ]) / 3 >> 0 ;

data [i] = рдореАрдбрд┐рдпрд╛;
рдбреЗрдЯрд╛ [i +1 ] = рдореАрдбрд┐рдпрд╛;
data [i +2 ] = рдореАрдбрд┐рдпрд╛;

data [i -8 ] = (data [i -8 ] + 255- рдореАрдбрд┐рдпрд╛) / 2 >> 0 ;
data [i -7 ] = (data [i -7 ] + 255- рдореАрдбрд┐рдпрд╛) / 2 >> 0 ;
data [i -6 ] = (data [i -6 ] + 255- рдореАрдбрд┐рдпрд╛) / 2 >> 0 ;

}
copy.putImageData (imageData, 0 , 0 );
}

ClientMethod processFrame () [ рднрд╛рд╖рд╛ = рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ]
{
рдЕрдЧрд░ ( isNaN (video.duration)) {
рдЕрдЧрд░ (SOURCERECT. рдЙрдкрд▓рдмреНрдзрддрд╛ == 0 ) {
SOURCERECT = {x: 0 , y: 0 , width: video.videoWidth, height: video.videoHeight};
copycanvas.width = video.videoWidth;
copycanvas.height = video.videoHeight;


TILE_WIDTH = copycanvas.width / 16 ;
Tile_HEIGHT = copycanvas.height / 16 ;
TILE_CENTER_WIDTH = TILE_WIDTH / 2 >> 0 ;
TILE_CENTER_HEIGHT = TILE_HEIGHT / 2 >> 0 ;

рдпрд╣ .createTiles ();
zenSetProp ( 'рдЖрдЙрдЯрдкреБрдЯ' , 'рдЫрд┐рдкрд╛ рд╣реБрдЖ' , рдЧрд▓рдд);
zenSetProp ( 'rs' , 'рдЫрд┐рдкрд╛ рд╣реБрдЖ' , рдЧрд▓рдд);
}
}
// рдХреЙрдкреА рдЯрд╛рдЗрд▓
copy.drawImage (рд╡реАрдбрд┐рдпреЛ, 0 , 0 );
eval (рдлрд╝рд┐рд▓реНрдЯрд░);
draw.clearRect (PAINTX, PAINTY, PAINTWIDTH, PAINTHEIGHT);

рдХреЗ рд▓рд┐рдП ( var i = 0 , len = рдЯрд╛рдЗрд▓реНрд╕.рд▓рд┐рдлреНрдЯрд┐рдВрдЧ; рдореИрдВ < рд▓реЗрди; рдореИрдВ ++ ) {
var рдЯрд╛рдЗрд▓ = рдЯрд╛рдЗрд▓реЗрдВ [i];
рдЕрдЧрд░ (рдЯрд╛рдЗрд▓.рдлреЛрд░реНрд╕ > 0.0001 ) {
// рд╡рд┐рд╕реНрддрд╛рд░
var рдмрд▓ = рдЯрд╛рдЗрд▓.рдлреЛрд░реНрд╕;
рдЯрд╛рдЗрд▓рдореВрд╡реАрдПрдХреНрд╕рдПрдХреНрд╕рдПрдХреНрд╕ = = рдмрд▓;
рдЯрд╛рдЗрд▓ред рд▓реЛрд╡реЗ * = рдмрд▓;
рдЯрд╛рдИрдо.рдУрд╡рд░рд░реЛрдЯреЗрд╢рди * = рдмрд▓;
рдЯрд╛рдЗрд▓.рдЯреНрд░реИрдХрдПрдХреНрд╕ + = рдЯрд╛рдЗрд▓.рдУрдПрдордПрдХреНрд╕рдПрдХреНрд╕;
рдЯрд╛рдЗрд▓ ред рд╕рдордХрд╛рд▓рд┐рдХ + = рдЯрд╛рдЗрд▓ред
рдЯрд╛рдЗрд▓.рдЯреНрд░реЛрдЯреЗрд╢рди + = рдЯрд╛рдЗрд▓ред
рдЯрд╛рдЗрд▓.рдЯреНрд░реЛрдЯреЗрд╢рди % = 360 ;
рдЯрд╛рдЗрд▓.рдлреЛрд░реНрд╕ * = 0.9 ;
if (рдЯрд╛рдЗрд▓ред рд╕рдорд╛рдВрддрд░ X <= 0 || рдЯрд╛рдЗрд▓ред рд╕рдорд╛рдВрддрд░ X > = PAINTWIDTH) {
рдЯрд╛рдЗрд▓рдореВрд╡реАрдПрдХреНрд╕рдПрдХреНрд╕рдПрдХреНрд╕ = = -1 ;
}
рдЕрдЧрд░ (рдЯрд╛рдЗрд▓ред рд╕рдорд╛рдВрддрд░ <= 0 || рдЯрд╛рдЗрд▓ред рд╕рдорд╛рдВрддрд░ > = рдкреЗрдВрдЯрд╛рдЗрдЯ) {
рдЯрд╛рдЗрд▓ред рд▓реЛрд╡реЗ * = -1 ;
}
} рдФрд░ рдЕрдЧрд░ (рдЯрд╛рдЗрд▓.рдЯреНрд░реЛрдЯреЗрд╢рди ! = 0 || рдЯрд╛рдЗрд▓.рдХреНрд░рд┐рдХреЗрдЯрдПрдХреНрд╕ ! = рдЯрд╛рдЗрд▓.рдСрд░реНрдЧрд┐рдирдПрдХреНрд╕ || рдЯрд╛рдЗрд▓.рдХреНрд░рд╛рдВрддрд┐ ред! = рдЯрд╛рдЗрд▓.рдУрд░рд┐рдЬрд┐рди) {!!
// рдкрддрди
var diffx = (рдЯрд╛рдЗрд▓ .originX - рдЯрд╛рдЗрд▓.currentX) * 0.2 ;
var diffy = (рдЯрд╛рдЗрд▓.originY - рдЯрд╛рдЗрд▓.currentY) * 0.2 ;
var diffRot = ( 0- рдЯрд╛рдЗрд▓.рдЯреНрд░реЛрдЯреЗрд╢рди) * 0.2 ;

рдпрджрд┐ ( рдпрд╣ред рд╕рдорд╕рд╛рдордпрд┐рдХ (diffx) < 0.5 ) {
рдЯрд╛рдЗрд▓.рдХреНрд░рд┐рдХреЗрдЯрдПрдХреНрд╕ = рдЯрд╛рдЗрд▓.рдУрд░рд┐рдЬрд┐рдирдПрдХреНрд╕;
} {
рдЯрд╛рдЗрд▓ ред рд╕рдорд╛рдирд╛рдВрддрд░ x + = diffx;
}
рдпрджрд┐ ( рдпрд╣ред рд╕рдВрдкреВрд░реНрдг) (рд╡рд┐рд╕рд░рд┐рдд) < 0.5 ) {
рдЯрд╛рдЗрд▓.рдХреНрд░рд╛рдВрддрд┐ = рдЯрд╛рдЗрд▓.рдУрд░рд┐рдЬрд┐рди;
} {
рдЯрд╛рдЗрд▓ ред рд╕рдордХрд╛рд▓рд┐рдХ + = рд╡рд┐рд╕рд░рд┐рдд;
}
рдЕрдЧрд░ ( рдпрд╣ .abolute (diffRot) < 0.5 ) {
рдЯрд╛рдИрд▓.рдЯреНрд░реЛрдЯреЗрд╢рди = 0 ;
} {
рдЯрд╛рдЗрд▓.рдЯреНрд░реЛрдЯреЗрд╢рди + = diffRot;
}
} {
рдЯрд╛рдЗрд▓.рдлреЛрд░реНрд╕ = 0 ;
}
draw.save ();
draw.translate (рдЯрд╛рдЗрд▓.currentX, рдЯрд╛рдЗрд▓.currentY);
draw.rotate (рдЯрд╛рдЗрд▓.рд░реЛрдЯреЗрд╢рди * RAD);
draw.drawImage (copycanvas, рдЯрд╛рдЗрд▓.videoX, рдЯрд╛рдЗрд▓.videoY, TILE_WIDTH, TILE_HEIGHT, - TILE_CENTER_WIDTH, - TILE_CENTER -HEIGHT, TILE_WIDTH, TILE_HEIGHT);
draw.restore ();
}
zen ( 'рдЯрд╛рдЗрдорд░' ) .startTimer ();
}

рдХреНрд▓рд╛рдЗрдВрдЯрдореЗрдереЛрдб рд╕рдХреНрд╕реЗрд╕рдХреЙрд▓рдмреИрдХ ( рд╕реНрдЯреНрд░реАрдо ) [ рднрд╛рд╖рд╛ = рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ]
{
// рдХреИрдорд░реЗ рд╕реЗ рд╕реНрдЯреНрд░реАрдо рдХреЗ рд╕рд╛рде рд╡реАрдбрд┐рдпреЛ рддрддреНрд╡ рдХреЗ рд╕реНрд░реЛрдд рдХреЛ рдмрджрд▓реЗрдВ
video.src = window.URL.createObjectURL (рдзрд╛рд░рд╛) || рдзрд╛рд░рд╛;
video.play ();
}

ClientMethod рддреНрд░реБрдЯрд┐рдХреЙрд▓рдмреИрдХ ( рддреНрд░реБрдЯрд┐ ) [ рднрд╛рд╖рд╛ = рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ]
{
}

/// рд╡реНрдпрдХреНрддрд┐рдЧрдд рдЯрд╛рдЗрд▓реНрд╕ рдХреЗ рд▓рд┐рдП рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░
ClientMethod рдЯрд╛рдЗрд▓ () [ рднрд╛рд╖рд╛ = рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ]
{
рдпрд╣ .originX = 0 ;
рдпрд╣ .originY = 0 ;
рдпрд╣ред currentX = 0 ;
рдпрд╣ред currentY = 0 ;
рдпрд╣ .rotation = 0 ;
рдпрд╣ .force = 0 ;
рдпрд╣ .z = 0 ;
рдпрд╣ .moveX = 0 ;
рдпрд╣ред moveY = 0 ;
рдпрд╣ .MoveRotation = 0 ;
рдпрд╣ .videoX = 0 ;
рдпрд╣ .videoY = 0 ;
}

/// рдорда рд╕реЗ рдЕрдзрд┐рдХ рддреЗрдЬрд╝
ClientMethod рдирд┐рд░рдкреЗрдХреНрд╖ ( x ) [ рднрд╛рд╖рд╛ = рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ]
{
рд╡рд╛рдкрд╕реА (x <0 ; - x : x);
}

ClientMethod zindexSort (
рдП ,
рдмреА ) [ рднрд╛рд╖рд╛ = рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ]
{
рд╡рд╛рдкрд╕реА (a.force - b.force);
}

/// рдХреИрдирд╡рд╛рд╕ рдХреНрд▓рд┐рдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреНрд▓рд┐рдХ / рдорд╛рдЙрд╕ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ
рдХреНрд▓рд╛рдЗрдВрдЯрдореЗрдереЛрдб рдбреНрд░реЙрдкрдмреЙрдореНрдм (
рдШрдЯрдирд╛,
obj ) [ рднрд╛рд╖рд╛ = рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ]
{
event.preventDefault ();
var рдкреЙрдЬрд╝ = 0 ;
var рдкреЙрд╕реА = 0 ;
var e = рдШрдЯрдирд╛ || window.event;

рдпрджрд┐ (e.touches) {
posx = event.touches [ 0 ] .pageX;
posy = event.touches [ 0 ] .pageY;
} рдФрд░ рдЕрдЧрд░ (e.pageX || e.pageY) {
posx = e.pageX;
рдкреЙрд╕реА = e.pageY;
} рдФрд░ рдЕрдЧрд░ (e.clientX || e.clientY) {
posx = e.clientX + ZLM.getPageXOffset () + document.documentElement.scrollLeft;
posy = e.clientY + ZLM.getPageYOffset () + document.documentElement.scrollyop;
}
var рдХреИрдирд╡рд╕рдПрдХреНрд╕ = рдкреЙрдХреНрд╕ - obj.offsetLeft;
var рдХреИрдирд╡рд╛рд╕рд╡рд╛рдИ = рдкреЙрд╕реА - obj.offsetTop;
рдпрд╣ .explode (рдХреИрдирд╡рд╛рд╕рдПрдХреНрд╕, рдХреИрдирд╡рд╛рд╕рд╡рд╛рдИ);
}

ClientMethod рд╡рд┐рд╕реНрдлреЛрдЯ (
рдПрдХреНрд╕,
y ) [ рднрд╛рд╖рд╛ = рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ]
{
рдХреЗ рд▓рд┐рдП ( var i = 0 , len = рдЯрд╛рдЗрд▓реНрд╕.рд▓рд┐рдлреНрдЯрд┐рдВрдЧ; рдореИрдВ < рд▓реЗрди; рдореИрдВ ++ ) {
var рдЯрд╛рдЗрд▓ = рдЯрд╛рдЗрд▓реЗрдВ [i];

var xdiff = рдЯрд╛рдЗрд▓ . currentX - x;
var ydiff = рдЯрд╛рдЗрд▓.рд╡рд░реНрддрдорд╛рди - y;
var dist = Math.sqrt (xdiff * xdiff + ydiff * ydiff);
var rnd = Math.random ();

var рд░реИрдВрдбрд░реЗрдВрдЬ = 180+ ( рд░реИрдВрдб * 10 );
var рд╢реНрд░реЗрдгреА = randRange - dist;
var рдмрд▓ = 3 * (рд░реЗрдВрдЬ / рд░реИрдВрдбрд░реЗрдВрдЬ);
рдЕрдЧрд░ (рдмрд▓ > рдЯрд╛рдЗрд▓.рдлреЛрд░реНрд╕) {
рдЯрд╛рдЗрд▓.рдлреЛрд░реНрд╕ = рдмрд▓;
var рд░реЗрдбрд┐рдпрди = Math.atan2 (ydiff, xdiff);
рдЯрд╛рдЗрд▓.moveX = Math.cos (рд░реЗрдбрд┐рдпрди);
рдЯрд╛рдЗрд▓ред рд▓реЛрд╡реЗ = рдорда.рд╕рд┐рди (рд░реЗрдбрд┐рдпрди);
рдЯрд╛рдЗрд▓.рдкреБрдирд░рд╡реГрджреНрдзрд┐ = 0.5 - рд░реИрдВрдб ;
}
}
рдЯрд╛рдИрд▓реНрд╕.рд╕реЛрд░реНрдЯ (рдЬрд╝рд┐рдиреНрдбреЗрдХреНрд╕рд╕реЛрд░реНрдЯ);
рдпрд╣ .processFrame ();
}

ClientMethod createTiles () [ рднрд╛рд╖рд╛ = рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ]
{
var рдСрдлрд╕реЗрдЯX = (TILE_CENTER_WIDTH + (PAINTWIDTH - SOURCERECT. рдЙрдкрд▓рдмреНрдзрддрд╛) / 2 >> 0 );
var рдСрдлрд╕реЗрдЯ = (TILE_CENTER_HEIGHT + (PAINTHEIGHT - SOURCERECT.height) / 2 >> 0 );
var y = 0 ;
рдЬрдмрдХрд┐ (y < SOURCERECT.height) {
var x = 0 ;
рдЬрдмрдХрд┐ (x < SOURCERECT. рдЙрдкрд▓рдмреНрдзрддрд╛) {
var рдЯрд╛рдЗрд▓ = рдирдпрд╛ рдпрд╣ .Tile ();
рдЯрд╛рдЗрд▓.рд╡рд┐рдбрд┐рдпреЛ рдПрдХреНрд╕ = рдПрдХреНрд╕;
рдЯрд╛рдЗрд▓.рд╡рд┐рдбрд┐рдпреЛ = рд╡рд╛рдИ;
рдЯрд╛рдЗрд▓.рдУрд░рд┐рдЧрд┐рдирдПрдХреНрд╕ = рдСрдлрд╕реЗрдЯрдПрдХреНрд╕ + рдПрдХреНрд╕;
рдЯрд╛рдЗрд▓.рдУрд░рд┐рдЬрд┐рди = рдСрдлрд╕реЗрдЯ + рд╡рд╛рдИ;
рдЯрд╛рдЗрд▓.рдХреНрд░рд┐рдХреЗрдЯрдПрдХреНрд╕ = рдЯрд╛рдЗрд▓.рдУрд░рд┐рдЬрд┐рдирдПрдХреНрд╕;
рдЯрд╛рдЗрд▓.рдХреНрд░рд╛рдВрддрд┐ = рдЯрд╛рдЗрд▓.рдУрд░рд┐рдЬрд┐рди;
рдЯрд╛рдИрд▓реНрд╕.рдкрд╢ (рдЯрд╛рдЗрд▓);
x + = TILE_WIDTH;
}
y + = TILE_HEIGHT;
}
}

ClientMethod onloadHandler () [ рднрд╛рд╖рд╛ = рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ]
{
TILE_WIDTH = 32 ;
TILE_HEIGHT = 24 ;
TILE_CENTER_WIDTH = TILE_WIDTH / 2 ;
TILE_CENTER_HEIGHT = TILE_HEIGHT / 2 ;
рд╕реНрд░реЛрдд = {x: 0 , y: 0 , рдЪреМрдбрд╝рд╛рдИ: 0 , рдКрдВрдЪрд╛рдИ: 0 };
PAINTX = 0 ;
рдкреЗрдВрдЯреА = 0 ;
PAINTWIDTH = ZLM.getViewportWidth ();
PAINTHEIGHT = ZLM.getViewportHeight ();

RAD = Math.PI / 180 ;

рдЯрд╛рдЗрд▓реНрд╕ = [];
рдлрд╝рд┐рд▓реНрдЯрд░ = 'this.filterNormal ();' ;
рд╡реАрдбрд┐рдпреЛ = document.getElementById ( 'sourcevid' );
рдХреЙрдкреАрдХрд╛рдирд╡рд╛рд╕ = рдЬрд╝реЗрди ( ' рд╕реЛрд░реНрд╕рдХреЙрдкреА ' ) .findElement ( 'рдХреИрдирд╡рд╛рд╕' );
copy = zen ( 'sourcecopy' ) .getContext ();

var outputcanvas = zen ( 'output' ) .findElement ( 'рдХреИрдирд╡рд╛рд╕' );
draw = zen ( 'output' ) .getContext ();
outputcanvas.width = PAINTWIDTH;
outputcanvas.height = PAINTHEIGHT -20 ;
var mouse_down = ( рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдореЗрдВ 'createTouch' ? 'ontouchstart' : 'onmousedown' );
outputcanvas [mouse_down] = function (рдШрдЯрдирд╛) {
zenPage.dropBomb (рдШрдЯрдирд╛, рдпрд╣ );
};

// GetUserMedia рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХреИрдорд░реЗ рд╕реЗ рд╕реНрдЯреНрд░реАрдо рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ
navigator.getUserMedia = navigator.getUserMedia || рдиреЗрд╡рд┐рдЧреЗрдЯрд░ редwebkitGetUserMedia || рдиреЗрд╡рд┐рдЧреЗрдЯрд░.mozGetUserMedia || navigator.msGetUserMedia;
window.URL = window.URL || window.webkitURL || window.mozURL || window.msURL;
рдЕрдЧрд░ (navigator.getUserMedia) {
// рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЗ рд▓рд┐рдП рдпрд╣ рд╕реБрдВрджрд░ рд╣реИрдХ @kanasansoft рд╕реЗ рд╣реИ:
// http://www.kanasansoft.com/weblab/2012/06/arguments_of_getusermedia.html
var gumOptions = {video: true, toString: function () { return 'video' ;}};
navigator.getUserMedia (gumOptions, this .successCallback, рдпрд╣ .errorCallback);

zen ( 'рдЯрд╛рдЗрдорд░' ) .setProperty ( 'рдЯрд╛рдЗрдордЖрдЙрдЯ' , 33 );
zen ( 'рдЯрд╛рдЗрдорд░' ) .startTimer ();
} {
zenSetProp ( 'рдореБрдЦреНрдп' , 'рд╕рд╛рдордЧреНрд░реА' , 'рдУрд╣, рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдХрд╛ рдмреНрд░рд╛рдЙрдЬрд╝рд░ getUMMedia рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред <br> рдХреГрдкрдпрд╛ <a href="http://en.opera.com/download/"> рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВ] рдРрд╕рд╛ рд╕рдорд░реНрдерди </a> рд╣реИ ;);
zenSetProp ( 'рдореБрдЦреНрдп' , 'рдЫрд┐рдкрд╛ рд╣реБрдЖ' , рдЧрд▓рдд);
}
}

}

Demo.camcanvas рд╡рд░реНрдЧ рдХреЗ рд╕реНрд░реЛрдд ред

рдЖрдпрд╛рдд рд╕реНрд░реЛрдд рдХреЛрдб, рдЗрд╕реЗ рд╕рдВрдХрд▓рд┐рдд рдХрд░реЗрдВ рдФрд░ рдЙрджрд╛рд╣рд░рдг рдЪрд▓рд╛рдПрдБ


рд╕реНрд░реЛрдд рдХреЛрдб (рдкрд░рд┐рдпреЛрдЬрдирд╛, рдХрдХреНрд╖рд╛рдПрдВ, рдбреЗрдЯрд╛, рдЖрджрд┐) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:


рдпреЗ рд╕рднреА рдЙрдкрдХрд░рдг рдХреИрдЪ рд▓реЙрдиреНрдЪрд░ рдореЗрдиреВ рд╕реЗ рдЙрдкрд▓рдмреНрдз рд╣реИрдВред

рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд▓рд┐рдП, Cach├й Studio рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЙрджрд╛рд╣рд░рдг рдЪрд▓рд╛рдПрдВ ред
рдиреЛрдЯ: рдЙрдкрд░реЛрдХреНрдд рд╕рднреА рдЙрдкрдХрд░рдг рд░реВрд╕реА рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рддрдм, рдореЗрдиреВ рдЖрдЗрдЯрдо рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддреЗ рд╕рдордп, рдЙрдирдХреЗ рдЕрдВрдЧреНрд░реЗрдЬреА рд╕рдВрд╕реНрдХрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

рддреЛ:

  1. рдЦреБрд▓рд╛ рдХреИрдЪ рд╕реНрдЯреВрдбрд┐рдпреЛ ;
  2. USER рдХреНрд╖реЗрддреНрд░ рдХрд╛ рдЪрдпрди рдХрд░реЗрдВ: рдлрд╝рд╛рдЗрд▓> рдирд╛рдо рдмрджрд▓реЗрдВ рдпрд╛ (F4);
  3. рдлрд╝рд╛рдЗрд▓ рдЖрдпрд╛рдд рд╡рд┐рдЬрд╝рд╛рд░реНрдб рдкреНрд░рд╛рд░рдВрдн рдХрд░реЗрдВ: рдЙрдкрдХрд░рдг-> рд╕реНрдерд╛рдиреАрдп рдЖрдпрд╛рдд рдХрд░реЗрдВ (Ctrl + I);
  4. рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдЪрдпрди рдХрд░реЗрдВ "source.xml";
  5. рдмреЙрдХреНрд╕ рд╕рдВрдХрд▓рд┐рдд рдЖрдпрд╛рддрд┐рдд рдЖрдЗрдЯрдо рдХреА рдЬрд╛рдБрдЪ рдХрд░реЗрдВ рдФрд░ рдареАрдХ рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ;
  6. рд╣рдорд╛рд░реА рдХрдХреНрд╖рд╛ рдХреЗ рд╕реНрд░реЛрдд рдХреЛрдб рдХреЛ рдЦреЛрд▓реЗрдВред рд╡рд░реНрдЧ рдХреЗ рдкреЗрдбрд╝ рд╕реЗ camcanvas ;


    рд╡реГрджреНрдзрд┐

  7. рд╡реЗрдм рдкреЗрдЬ рдкрд░ рдЬрд╛рдПрдВ: рджреЗрдЦреЗрдВ-> рд╡реЗрдм рдкреЗрдЬ рдпрд╛ (F5)ред

рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, рд╣рдорд╛рд░реЗ рдкреЗрдЬ рдХрд╛ рд▓рд┐рдВрдХ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛:
  http: // localhost: xxxx / csp / user / Demo.camcanvas.cls 
, рдЬрд╣рд╛рдВ xxxx рд╡рд╣ рдкреЛрд░реНрдЯ рд╕рдВрдЦреНрдпрд╛ рд╣реИ рдЬрд┐рд╕реЗ рд╣рдордиреЗ Cach├й DBMS рдХреЛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рддреЗ рд╕рдордп рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд┐рдпрд╛ рдерд╛, рдЬрд┐рд╕ рдкрд░ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд Apache рд╡реЗрдм рд╕рд░реНрд╡рд░ рдЪрд▓реЗрдЧрд╛ред

PS: Demo.camcanvas рдХреНрд▓рд╛рд╕ рдХреЛ рдЖрд╕рд╛рдиреА рд╕реЗ CSP (Cach├й Server Pages) рддрдХрдиреАрдХ рдореЗрдВ рдмрджрд▓рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

Source: https://habr.com/ru/post/In145427/


All Articles