mirror of
https://github.com/alchemy-fr/Phraseanet.git
synced 2025-10-13 04:53:26 +00:00
236 lines
5.0 KiB
JavaScript
236 lines
5.0 KiB
JavaScript
;
|
|
(function(document){
|
|
|
|
/*****************
|
|
* Canva Object
|
|
*****************/
|
|
var Canva = function(domCanva){
|
|
this.domCanva = domCanva;
|
|
};
|
|
|
|
Canva.prototype = {
|
|
resize : function(elementDomNode){
|
|
var w = elementDomNode.getWidth();
|
|
var maxH = elementDomNode.getHeight();
|
|
|
|
var h = Math.round(w * (1 / elementDomNode.getAspectRatio()));
|
|
|
|
if (h > maxH) {
|
|
var h = maxH;
|
|
var w = Math.round(h * elementDomNode.getAspectRatio());
|
|
}
|
|
|
|
|
|
this.domCanva.setAttribute("width", w);
|
|
this.domCanva.setAttribute("height", h);
|
|
|
|
return this;
|
|
},
|
|
getContext2d : function(){
|
|
|
|
if (this.domCanva.getContext === undefined)
|
|
{
|
|
return G_vmlCanvasManager
|
|
.initElement(this.domCanva)
|
|
.getContext("2d");
|
|
}
|
|
|
|
return this.domCanva.getContext('2d');
|
|
},
|
|
extractImage : function(){
|
|
return this.domCanva.toDataURL("image/png");
|
|
},
|
|
reset : function(){
|
|
var context = this.getContext2d();
|
|
var w = this.getWidth();
|
|
var h = this.getHeight();
|
|
|
|
context.save();
|
|
context.setTransform(1, 0, 0, 1, 0, 0);
|
|
context.clearRect(0, 0, w, h);
|
|
context.restore();
|
|
|
|
return this;
|
|
},
|
|
copy : function(elementDomNode){
|
|
var context = this.getContext2d();
|
|
|
|
context.drawImage(
|
|
elementDomNode.getDomElement()
|
|
, 0
|
|
, 0
|
|
, this.getWidth()
|
|
, this.getHeight()
|
|
);
|
|
|
|
return this;
|
|
},
|
|
getDomElement : function(){
|
|
return this.domCanva;
|
|
},
|
|
getHeight : function(){
|
|
return this.domCanva.offsetHeight;
|
|
},
|
|
getWidth : function(){
|
|
return this.domCanva.offsetWidth;
|
|
}
|
|
};
|
|
|
|
|
|
/******************
|
|
* Image Object
|
|
******************/
|
|
var Image = function(domElement){
|
|
this.domElement = domElement;
|
|
};
|
|
|
|
Image.prototype = {
|
|
getDomElement : function(){
|
|
return this.domElement;
|
|
},
|
|
getHeight : function(){
|
|
return this.domElement.offsetHeight;
|
|
},
|
|
getWidth : function(){
|
|
return this.domElement.offsetWidth;
|
|
}
|
|
};
|
|
|
|
/******************
|
|
* Video Object inherits from Image object
|
|
******************/
|
|
|
|
var Video = function(domElement){
|
|
Image.call(this, domElement);
|
|
this.aspectRatio = domElement.getAttribute('data-ratio') || 1;
|
|
};
|
|
|
|
Video.prototype = new Image();
|
|
Video.prototype.constructor = Video;
|
|
Video.prototype.getCurrentTime = function(){
|
|
return Math.floor(this.domElement.currentTime);
|
|
};
|
|
Video.prototype.getAspectRatio = function(){
|
|
return this.aspectRatio;
|
|
};
|
|
|
|
/******************
|
|
* Cache Object
|
|
******************/
|
|
var Store = function(){
|
|
this.datas = {};
|
|
};
|
|
|
|
Store.prototype = {
|
|
set : function(id, item){
|
|
this.datas[id] = item;
|
|
return this;
|
|
},
|
|
get : function(id){
|
|
if(!this.datas[id]){
|
|
throw 'Unknown ID';
|
|
}
|
|
return this.datas[id];
|
|
},
|
|
remove : function(id) {
|
|
delete this.datas[id];
|
|
},
|
|
getLength : function(){
|
|
var count = 0;
|
|
for (var k in this.datas){
|
|
if (this.datas.hasOwnProperty(k)){
|
|
++count;
|
|
}
|
|
}
|
|
return count;
|
|
}
|
|
};
|
|
|
|
/******************
|
|
* Screenshot Object
|
|
******************/
|
|
var ScreenShot = function(id, canva, video){
|
|
|
|
var date = new Date();
|
|
|
|
canva.resize(video);
|
|
canva.copy(video);
|
|
|
|
this.id = id;
|
|
this.timestamp = date.getTime();
|
|
this.dataURI = canva.extractImage();
|
|
this.videoTime = video.getCurrentTime();
|
|
};
|
|
|
|
ScreenShot.prototype = {
|
|
getId:function(){
|
|
return this.id;
|
|
},
|
|
getDataURI: function(){
|
|
return this.dataURI;
|
|
},
|
|
getTimeStamp: function(){
|
|
return this.timestamp;
|
|
},
|
|
getVideoTime : function(){
|
|
return this.videoTime;
|
|
}
|
|
};
|
|
|
|
/**
|
|
* THUMB EDITOR
|
|
*/
|
|
var ThumbEditor = function(videoId, canvaId){
|
|
|
|
var editorVideo = new Video(document.getElementById(videoId));
|
|
var store = new Store();
|
|
|
|
function getCanva(){
|
|
return document.getElementById(canvaId);
|
|
}
|
|
|
|
return {
|
|
isSupported : function () {
|
|
var elem = document.createElement('canvas');
|
|
|
|
return !! elem.getContext && !! elem.getContext('2d');
|
|
},
|
|
screenshot : function(){
|
|
var screenshot = new ScreenShot(
|
|
store.getLength() + 1,
|
|
new Canva(getCanva()),
|
|
editorVideo
|
|
);
|
|
|
|
store.set(screenshot.getId(), screenshot);
|
|
|
|
return screenshot;
|
|
},
|
|
store : store,
|
|
copy: function(elementDomNode){
|
|
var element = new Image(elementDomNode);
|
|
var editorCanva = new Canva(getCanva());
|
|
editorCanva
|
|
.reset()
|
|
.resize(editorVideo)
|
|
.copy(element);
|
|
},
|
|
getCanvaImage : function(){
|
|
var canva = new Canva(getCanva());
|
|
return canva.extractImage();
|
|
},
|
|
resetCanva : function(){
|
|
var editorCanva = new Canva(getCanva());
|
|
editorCanva.reset();
|
|
},
|
|
getNbScreenshot : function(){
|
|
return store.getLength();
|
|
}
|
|
};
|
|
};
|
|
|
|
document.THUMB_EDITOR = ThumbEditor;
|
|
|
|
})(document);
|
|
|