pkmn-classic-framework/gts/script/retina.js
2014-08-30 03:21:31 -04:00

130 lines
3.9 KiB
JavaScript

function setPixelRatioCookie(scale)
{
var expires = new Date();
expires.setDate(expires.getDate() + 21);
document.cookie = "pixelRatio=" + scale + "; expires=" + expires;
}
setPixelRatioCookie(getPixelRatio());
function getPixelRatio()
{
if (window.rjsPrinting === true)
return 4.0;
else if (window.devicePixelRatio != undefined)
return window.devicePixelRatio;
else if (window.screen.deviceXDPI != undefined)
return window.screen.deviceXDPI / 96.0;
else if (window.matchMedia != undefined)
return bisectScale(1.0, 2.0, 0.005);
else
return 1.0;
}
function matchScale(scale)
{
var dpi = scale * 96.0;
var dpi_int = Math.ceil(dpi); // ceil to get mathmatically correct results for non-int dpi
return window.matchMedia("(min--moz-device-pixel-ratio: " + scale.toString() + ")").matches || // firefox 8-15
window.matchMedia("(-o-min-device-pixel-ratio: " + dpi_int.toString() + "/96)").matches ||
window.matchMedia("(-webkit-min-device-pixel-ratio: " + scale.toString() + ")").matches ||
window.matchMedia("(min-resolution: " + dpi.toString() + "dpi)").matches ||
window.matchMedia("(min-resolution: " + dpi_int.toString() + "dpi)").matches // firefox 7- doesn't understand non-int dpi units
}
function bisectScale(min, max, tolerance)
{
if (min + tolerance > max) return min;
if (matchScale(max)) return max;
if (!matchScale(min)) return min;
if (matchScale((min + max) * 0.5)) return bisectScale((min + max) * 0.5, max, tolerance);
return bisectScale(min, (min + max) * 0.5, tolerance);
}
function checkRetina(element, scale)
{
try
{
var sizes = new Array();
var x = 0;
for (x in element.attributes)
{
var attrName = element.attributes[x].name;
if (attrName != undefined && attrName.length > 11 &&
attrName.substring(0, 11).toLowerCase() == "data-hires-")
{
sizes.push(parseFloat(attrName.substring(11)));
}
}
sizes.sort();
var best = 0.0;
for (x in sizes)
{
var f = sizes[x];
if (f === undefined) continue;
if (best > 0.0 && f > scale && best >= scale) break;
best = f;
}
element.src = element.getAttribute("data-hires-" + best.toString());
}
catch (err)
{
}
}
var retinaLastCheckedScale;
function checkAllRetina()
{
var scale = getPixelRatio();
if (retinaLastCheckedScale == scale) return;
retinaLastCheckedScale = scale;
$("img.retina").each(function ()
{
checkRetina(this, scale);
});
setPixelRatioCookie(scale);
}
function checkRetinaIn(element)
{
var scale = getPixelRatio();
$("img.retina", element).each(function ()
{
checkRetina(this, scale);
});
}
function handleBeforePrint()
{
window.rjsPrinting = true;
checkAllRetina();
}
function handleAfterPrint()
{
window.rjsPrinting = false;
checkAllRetina();
}
function handlePrintListener(mql)
{
window.rjsPrinting = mql.matches;
checkAllRetina();
}
window.rjsPrinting = false;
if (document.addEventListener) document.addEventListener("DOMContentLoaded", checkAllRetina, false);
else if (document.attachEvent) document.attachEvent("DOMContentLoaded", checkAllRetina, false);
if (window.addEventListener) window.addEventListener("resize", checkAllRetina, false);
else if (window.attachEvent) window.attachEvent("resize", checkAllRetina, false);
if (window.addEventListener) window.addEventListener("beforeprint", handleBeforePrint, false);
else if (window.attachEvent) window.attachEvent("beforeprint", handleBeforePrint, false);
if (window.addEventListener) window.addEventListener("afterprint", handleAfterPrint, false);
else if (window.attachEvent) window.attachEvent("afterprint", handleAfterPrint, false);
if (window.matchMedia) window.matchMedia("print").addListener(handlePrintListener);