2018-05-06 21:32:18 +02:00
// računa velikost videa za približevanje/oddaljevanje
// does video size calculations for zooming/cropping
class Scaler {
// internal variables
// functions
2018-05-18 23:26:20 +02:00
constructor ( videoData ) {
this . conf = videoData ;
2018-05-06 21:32:18 +02:00
}
2018-05-23 00:34:18 +02:00
modeToAr ( mode ) {
2018-05-06 21:32:18 +02:00
// Skrbi za "stare" možnosti, kot na primer "na širino zaslona", "na višino zaslona" in "ponastavi".
// Približevanje opuščeno.
// handles "legacy" options, such as 'fit to widht', 'fit to height' and 'reset'. No zoom tho
var ar ;
2018-05-22 00:19:50 +02:00
if ( ! this . conf . video ) {
2018-05-06 21:32:18 +02:00
if ( Debug . debug ) {
2018-05-22 00:19:50 +02:00
console . log ( "[Scaler.js::modeToAr] No video??" , this . conf . video , "killing videoData" ) ;
2018-05-06 21:32:18 +02:00
}
2018-05-18 23:26:20 +02:00
this . conf . destroy ( ) ;
2018-05-06 21:32:18 +02:00
return null ;
}
2018-05-23 00:34:18 +02:00
if ( ! this . conf . player . dimensions ) {
2018-05-06 21:32:18 +02:00
ar = screen . width / screen . height ;
}
else {
2018-05-23 00:34:18 +02:00
ar = this . conf . player . dimensions . width / this . conf . player . dimensions . height ;
2018-05-06 21:32:18 +02:00
}
// POMEMBNO: GlobalVars.lastAr je potrebno nastaviti šele po tem, ko kličemo _res_setAr(). _res_setAr() predvideva,
// da želimo nastaviti statično (type: 'static') razmerje stranic — tudi, če funkcijo kličemo tu oz. v ArDetect.
//
// IMPORTANT NOTE: GlobalVars.lastAr needs to be set after _res_setAr() is called, as _res_setAr() assumes we're
// setting a static aspect ratio (even if the function is called from here or ArDetect).
2018-05-22 00:19:50 +02:00
var fileAr = this . conf . video . videoWidth / this . conf . video . videoHeight ;
2018-05-06 21:32:18 +02:00
2018-05-13 15:22:28 +02:00
if ( mode == "fitw" ) {
2018-05-06 21:32:18 +02:00
return ar > fileAr ? ar : fileAr ;
}
2018-05-13 15:22:28 +02:00
else if ( mode == "fith" ) {
2018-05-06 21:32:18 +02:00
return ar < fileAr ? ar : fileAr ;
}
2018-05-13 15:22:28 +02:00
else if ( mode == "reset" ) {
2018-05-06 21:32:18 +02:00
if ( Debug . debug ) {
2018-05-13 15:22:28 +02:00
console . log ( "[Scaler.js::modeToAr] Using original aspect ratio -" , fileAr )
2018-05-06 21:32:18 +02:00
}
return fileAr ;
}
return null ;
}
2018-05-23 00:34:18 +02:00
calculateCrop ( mode ) {
2018-05-27 01:29:02 +02:00
2018-05-16 23:26:47 +02:00
2018-05-22 00:19:50 +02:00
if ( ! this . conf . video || this . conf . video . videoWidth == 0 || this . conf . video . videoHeight == 0 ) {
2018-05-16 23:26:47 +02:00
if ( Debug . debug )
2018-05-18 23:26:20 +02:00
console . log ( "[Scaler::calculateCrop] ERROR — no video detected." ) ;
this . conf . destroy ( ) ;
2018-05-16 23:26:47 +02:00
return { error : "no_video" } ;
}
2018-05-27 01:29:02 +02:00
// če je 'ar' string, potem bomo z njim opravili v legacy wrapperju. Seveda obstaja izjema
// if 'ar' is string, we'll handle that in legacy wrapper, with one exception
if ( mode === 'reset' ) {
return { xFactor : 1 , yFactor : 1 }
}
2018-05-06 21:32:18 +02:00
var ar = 0 ;
if ( isNaN ( mode ) ) {
2018-05-18 23:26:20 +02:00
ar = this . modeToAr ( mode ) ;
2018-05-06 21:32:18 +02:00
} else {
ar = mode ;
}
// handle fuckie-wuckies
if ( ! ar ) {
2018-05-16 23:26:47 +02:00
if ( Debug . debug )
console . log ( "[Scaler::calculateCrop] no ar?" , ar , " -- we were given this mode:" , mode ) ;
return { error : "no_ar" , ar : ar } ;
2018-05-06 21:32:18 +02:00
}
if ( Debug . debug )
2018-05-23 00:34:18 +02:00
console . log ( "[Scaler::calculateCrop] trying to set ar. args are: ar->" , ar , "; this.conf.player.dimensions->" , this . conf . player . dimensions . width , "× " , this . conf . player . dimensions . height , "| obj:" , this . conf . player . dimensions ) ;
2018-05-06 21:32:18 +02:00
2018-05-23 00:34:18 +02:00
if ( ( ! this . conf . player . dimensions ) || this . conf . player . dimensions . width === 0 || this . conf . player . dimensions . height === 0 ) {
2018-05-06 21:32:18 +02:00
if ( Debug . debug )
2018-05-23 00:34:18 +02:00
console . log ( "[Scaler::calculateCrop] ERROR — no (or invalid) this.conf.player.dimensions:" , this . conf . player . dimensions ) ;
return { error : "this.conf.player.dimensions_error" } ;
2018-05-06 21:32:18 +02:00
}
// zdaj lahko končno začnemo računati novo velikost videa
// we can finally start computing required video dimensions now:
// Dejansko razmerje stranic datoteke/<video> značke
// Actual aspect ratio of the file/<video> tag
2018-05-22 00:19:50 +02:00
var fileAr = this . conf . video . videoWidth / this . conf . video . videoHeight ;
2018-05-23 00:34:18 +02:00
var playerAr = this . conf . player . dimensions . width / this . conf . player . dimensions . height ;
2018-05-06 21:32:18 +02:00
if ( mode == "default" || ! ar )
ar = fileAr ;
if ( Debug . debug )
2018-05-23 00:34:18 +02:00
console . log ( "[Scaler::calculateCrop] ar is " , ar , ", file ar is" , fileAr , ", this.conf.player.dimensions are " , this . conf . player . dimensions . width , "× " , this . conf . player . dimensions . height , "| obj:" , this . conf . player . dimensions ) ;
2018-05-06 21:32:18 +02:00
var videoDimensions = {
2018-05-24 22:49:32 +02:00
xFactor : 1 ,
yFactor : 1 ,
2018-05-06 21:32:18 +02:00
actualWidth : 0 , // width of the video (excluding pillarbox) when <video> tag height is equal to width
actualHeight : 0 , // height of the video (excluding letterbox) when <video> tag height is equal to height
}
2018-05-24 22:49:32 +02:00
// if(Debug.debug){
// console.log("[Scaler::calculateCrop] Player dimensions?", this.conf.player.dimensions.width, "× ", this.conf.player.dimensions.height, "| obj:", this.conf.player.dimensions);
// }
2018-05-06 21:32:18 +02:00
if ( fileAr < ar ) {
// imamo letterbox zgoraj in spodaj -> spremenimo velikost videa (a nikoli širše od ekrana)
// letterbox -> change video size (but never to wider than monitor width)
2018-05-24 22:49:32 +02:00
videoDimensions . xFactor = Math . min ( ar , playerAr ) / fileAr ;
videoDimensions . yFactor = videoDimensions . xFactor ;
2018-05-06 21:32:18 +02:00
}
2018-05-24 22:49:32 +02:00
else {
2018-05-27 01:29:02 +02:00
videoDimensions . xFactor = fileAr / Math . min ( ar , playerAr ) ;
2018-05-24 22:49:32 +02:00
videoDimensions . yFactor = videoDimensions . xFactor ;
2018-05-06 21:32:18 +02:00
}
if ( Debug . debug ) {
2018-05-24 22:49:32 +02:00
console . log ( "[Scaler::calculateCrop] Crop factor calculated — " , videoDimensions . xFactor ) ;
2018-05-06 21:32:18 +02:00
}
return videoDimensions ;
}
}