From 97b7adc55a495a8526994696794c6c97a9d911f4 Mon Sep 17 00:00:00 2001 From: Tamius Han Date: Sat, 27 Jan 2018 22:25:25 +0100 Subject: [PATCH] Fixed autodetection and preserving aspect ratio changes across fullscreen switch. --- js/modules/ArDetect.js | 11 ++-- js/modules/Resizer.js | 134 ++++++----------------------------------- js/run/GlobalVars.js | 3 +- 3 files changed, 28 insertions(+), 120 deletions(-) diff --git a/js/modules/ArDetect.js b/js/modules/ArDetect.js index e6a6a93..4361741 100644 --- a/js/modules/ArDetect.js +++ b/js/modules/ArDetect.js @@ -304,15 +304,16 @@ var _ard_vdraw = function (vid, context, w, h, conf){ } if(!isLetter){ - // tudi če ne zaznamo letterboxa, še vedno poženemo processAr. Lahko, da smo v preteklosti popravili letterbox, to pa moramo - // sedaj razveljaviti - // even if we don't deect letterbox, we still issue processAr in case we adjusted for letterbox earlier and need to exit - // corrected mode. + // Če ne zaznamo letterboxa, kličemo reset. Lahko, da je bilo razmerje stranic popravljeno na roke. Možno je tudi, + // da je letterbox izginil. + // If we don't detect letterbox, we reset aspect ratio to aspect ratio of the video file. The aspect ratio could + // have been corrected manually. It's also possible that letterbox (that was there before) disappeared. if(Debug.debug){ console.log("%c[ArDetect::_ard_vdraw] no edge detected. canvas has no edge.", "color: #aaf"); } - _ard_processAr(vid, w, h); +// _ard_processAr(vid, w, h); + Resizer.reset(); _ard_timer = setTimeout(_ard_vdraw, Settings.arDetect.timer_playing, vid, context, w, h); //no letterbox, no problem return; diff --git a/js/modules/Resizer.js b/js/modules/Resizer.js index 2a223c7..8c0f684 100644 --- a/js/modules/Resizer.js +++ b/js/modules/Resizer.js @@ -71,114 +71,8 @@ var _res_char = function(newAr, video, player){ _res_setVideoAr(new_ar, video, player); } - - -/* Tukaj povemo, kakšno razmerje stranic ima video. -/ Kaj to pomeni: -// Mi rečemo, da ima video razmerje stranic 16:9. Dejanski video -// ima razmerje 4:3. To pomeni, da ima video zgoraj in spodaj črno -// obrobo, ki je nočemo, zato video povečamo toliko, da se ta obroba odreže. -// -// OBROB TUKAJ NE DODAJAMO. -// -// With this function, we specify the aspect ratio of the video. -// What does this mean? -// If we specify that the aspect ratio of a video is 16:9 when video is -// actually 4:3, that means the video has black bars above and below. -// We zoom the video just enough for the black lines to disappear. -// -// WE DO NOT ADD ANY BLACK BORDERS. If we get to a scenario when we'd have to add -// black borders, we do nothing instead. -*/ - -var setVideoAr = function(aspect_ratio, video, player){ - var video_ar = video.width / video.height; - var display_ar = player.width / player.height; - - if(debugmsg){ - console.log("uw::set_video_ar | aspect ratio: " + aspect_ratio + "; video_ar: " + video_ar + "; display_ar: " + display_ar); - console.log("uw::set_video_ar | player dimensions: " + player.width + "x" + player.height + "; video dimensions: " + video.width + "x" + video.height); - } - - if( aspect_ratio*1.1 > video_ar && video_ar > aspect_ratio*0.9 ){ - // Ta hack nas reši problema, ki ga predstavlja spodnji if stavek — če se legit 21:9 videu na 16:9 monitorju - // obreže na 16:9, potem ga s klicem te funkcije ne moremo spremeniti nazaj na 21:9. Vendar pa bi za tak primer - // radi imeli izjemo. - // - // This hack solves the problem that the bottom if statement presents. If we crop a 21:9 video on a 16:9 monitor, - // we can't change it back to 21:9 in this function, even though we kinda want that to happen — so we add an - // exception. - if( debugmsg) - console.log("uw::set_video_ar | ar matches our display ar. resetting"); - - resetCSS(video, player); - return; - } - - // Širina, višina, top, left za nov video - // Width, height, top and left for the new video - var nv = { "w":0, "h":0, "top":0, "left":0 }; - - /* - * // Video hočemo pretvoriti v video z drugačnim razmerjem stranic. - * // To storimo tako, da širino videa nastavimo relativno na višino prikazovalnika, torej: - * // - * // širina = višina_prikazovalnika * razmerje_stranic - * // višina = širina / video_ar - * // - * // - * // - * // ---------------------------------------------------------------------------------------------- - * // - * // In this case, the video is narrower than we want (think 4:3, which we want to make into 16:9) - * // We achieve this by setting video width relative to the display width, so: - * // - * // width = display_height * aspect_ratio - * // height = width / video_ar - * // - */ - - if( video_ar <= aspect_ratio ){ - if(debugmsg){ - console.log("uw::set_video_ar | reached pre-calc. Video is taller than ar. target ar: " + aspect_ratio ); - } - - nv.w = player.height * aspect_ratio; - nv.h = nv.w / video_ar; - - nv.top = (player.height - nv.h)/2; - nv.left = (player.width - nv.w)/2; - } - else{ - if(debugmsg){ - console.log("uw::set_video_ar | reached pre-calc. Video is wider than ar. target ar: " + aspect_ratio ); - } - nv.h = player.width / aspect_ratio; - nv.w = nv.h * video_ar; - - nv.top = (player.height - nv.h)/2; - nv.left = (player.width - nv.w)/2; - } - - if(nv.w > (player.width * 1.1) && nv.h > (player.height * 1.1)) - return; - - this._res_applyCss(nv); -} - -var _res_reset = function(force){ - dimensions = {top: "", left: "", width: "100%", height: "100%"}; - - GlobalVars.video.css({"position": "relative", "width": dimensions.width,"height": dimensions.height,"top": dimensions.top, "left": dimensions.left}); - - if(Debug.debug) - console.log("[Resizer::_res_reset] css applied. Dimensions/pos: w:",dimensions.width,"; h:",dimensions.height,"; top:",dimensions.top,"; left:",dimensions.left); - -// if(force) -// this._currentAr = -1; -} - -// Skrbi za "stare" možnosti, kot na primer "na širino zaslona", "na višino zaslona" in "ponastavi". Približevanje opuščeno. +// 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 _res_legacyAr = function(action){ var vid = GlobalVars.video; @@ -192,6 +86,7 @@ var _res_legacyAr = function(action){ } var fileAr = vid.videoWidth / vid.videoHeight; + GlobalVars.lastAr = {type: "legacy", action: action}; if(action == "fitw"){ _res_setAr( ar > fileAr ? ar : fileAr); @@ -202,10 +97,12 @@ var _res_legacyAr = function(action){ return; } if(action == "reset"){ - _res_setAr(fileAr); + GlobalVars.lastAr = {type: "original"}; + _res_setAr(fileAr); return; } if(action == "autoar"){ + GlobalVars.lastAr = {type: "auto"}; ArDetect.init(); } } @@ -214,7 +111,7 @@ var _res_setAr = function(ar, playerDimensions){ if(Debug.debug) console.log("[Resizer::_res_setAr] trying to set ar. args are: ar->",ar,"; playerDimensions->",playerDimensions); - this._currentAr = ar; + GlobalVars.lastAr = {type: "static", ar: ar}; var vid = GlobalVars.video; @@ -431,10 +328,19 @@ var _res_restore = function(){ // this is true until we verify that css has actually been applied _res_restore_wd = true; - if(this._currentAr > 0) - _res_setAr(this._currentAr); -// else -// _res_setAr_kbd("default"); + if(GlobalVars.lastAr.type == "legacy"){ + _res_legacyAr(GlobalVars.lastAr.action); + } + else if(GlobalVars.lastAr.type == "static"){ + _res_setAr(GlobalVars.lastAr.ar); + } + else if(GlobalVars.lastAr.type == "original"){ + _res_legacyAr("reset"); + } +} + +var _res_reset = function(){ + _res_legacyAr("reset"); } var Resizer = { diff --git a/js/run/GlobalVars.js b/js/run/GlobalVars.js index c06d215..bf67950 100644 --- a/js/run/GlobalVars.js +++ b/js/run/GlobalVars.js @@ -1,5 +1,6 @@ var GlobalVars = { video: null, player: null, - playerDimensions: null + playerDimensions: null, + lastAr: null }