X-Git-Url: https://git.heureux-cyclage.org/?a=blobdiff_plain;f=resources%2Fsrc%2Fjquery%2Fjquery.hidpi.js;h=7d308f8e845b5061ed98cbc2a2ae87d8773e3795;hb=425090d4eb0b9de89ad6818f40ab8295368f645e;hp=71b083b640ecc57b83f787ca6f8213421a4455ee;hpb=f93d34fb756b3271cc13b5581316cefa66de5013;p=lhc%2Fweb%2Fwiklou.git diff --git a/resources/src/jquery/jquery.hidpi.js b/resources/src/jquery/jquery.hidpi.js index 71b083b640..7d308f8e84 100644 --- a/resources/src/jquery/jquery.hidpi.js +++ b/resources/src/jquery/jquery.hidpi.js @@ -27,14 +27,15 @@ $.devicePixelRatio = function () { if ( window.devicePixelRatio !== undefined ) { // Most web browsers: - // * WebKit (Safari, Chrome, Android browser, etc) + // * WebKit/Blink (Safari, Chrome, Android browser, etc) // * Opera // * Firefox 18+ + // * Microsoft Edge (Windows 10) return window.devicePixelRatio; } else if ( window.msMatchMedia !== undefined ) { // Windows 8 desktops / tablets, probably Windows Phone 8 // - // IE 10 doesn't report pixel ratio directly, but we can get the + // IE 10/11 doesn't report pixel ratio directly, but we can get the // screen DPI and divide by 96. We'll bracket to [1, 1.5, 2.0] for // simplicity, but you may get different values depending on zoom // factor, size of screen and orientation in Metro IE. @@ -52,6 +53,52 @@ $.devicePixelRatio = function () { } }; +/** + * Bracket a given device pixel ratio to one of [1, 1.5, 2]. + * + * This is useful for grabbing images on the fly with sizes based on the display + * density, without causing slowdown and extra thumbnail renderings on devices + * that are slightly different from the most common sizes. + * + * The bracketed ratios match the default 'srcset' output on MediaWiki thumbnails, + * so will be consistent with default renderings. + * + * @static + * @inheritable + * @return {number} Device pixel ratio + */ +$.bracketDevicePixelRatio = function ( baseRatio ) { + if ( baseRatio > 1.5 ) { + return 2; + } else if ( baseRatio > 1 ) { + return 1.5; + } else { + return 1; + } +}; + +/** + * Get reported or approximate device pixel ratio, bracketed to [1, 1.5, 2]. + * + * This is useful for grabbing images on the fly with sizes based on the display + * density, without causing slowdown and extra thumbnail renderings on devices + * that are slightly different from the most common sizes. + * + * The bracketed ratios match the default 'srcset' output on MediaWiki thumbnails, + * so will be consistent with default renderings. + * + * - 1.0 means 1 CSS pixel is 1 hardware pixel + * - 1.5 means 1 CSS pixel is 1.5 hardware pixels + * - 2.0 means 1 CSS pixel is 2 hardware pixels + * + * @static + * @inheritable + * @return {number} Device pixel ratio + */ +$.bracketedDevicePixelRatio = function () { + return $.bracketDevicePixelRatio( $.devicePixelRatio() ); +}; + /** * Implement responsive images based on srcset attributes, if browser has no * native srcset support. @@ -61,7 +108,7 @@ $.devicePixelRatio = function () { */ $.fn.hidpi = function () { var $target = this, - // @todo add support for dpi media query checks on Firefox, IE + // TODO add support for dpi media query checks on Firefox, IE devicePixelRatio = $.devicePixelRatio(), testImage = new Image(); @@ -73,11 +120,11 @@ $.fn.hidpi = function () { match; if ( typeof srcset === 'string' && srcset !== '' ) { match = $.matchSrcSet( devicePixelRatio, srcset ); - if (match !== null ) { + if ( match !== null ) { $img.attr( 'src', match ); } } - }); + } ); } return $target; @@ -106,11 +153,11 @@ $.matchSrcSet = function ( devicePixelRatio, srcset ) { selectedSrc = null; candidates = srcset.split( / *, */ ); for ( i = 0; i < candidates.length; i++ ) { - candidate = candidates[i]; + candidate = candidates[ i ]; bits = candidate.split( / +/ ); - src = bits[0]; - if ( bits.length > 1 && bits[1].charAt( bits[1].length - 1 ) === 'x' ) { - ratioStr = bits[1].substr( 0, bits[1].length - 1 ); + src = bits[ 0 ]; + if ( bits.length > 1 && bits[ 1 ].charAt( bits[ 1 ].length - 1 ) === 'x' ) { + ratioStr = bits[ 1 ].slice( 0, -1 ); ratio = parseFloat( ratioStr ); if ( ratio <= devicePixelRatio && ratio > selectedRatio ) { selectedRatio = ratio;