1
0
mirror of https://github.com/ONLYOFFICE/sdkjs.git synced 2025-09-18 04:25:26 +03:00
Files
sdkjs/common/device_scale.js
2024-04-23 19:18:31 +03:00

120 lines
4.5 KiB
JavaScript

/*
* (c) Copyright Ascensio System SIA 2010-2024
*
* This program is a free software product. You can redistribute it and/or
* modify it under the terms of the GNU Affero General Public License (AGPL)
* version 3 as published by the Free Software Foundation. In accordance with
* Section 7(a) of the GNU AGPL its Section 15 shall be amended to the effect
* that Ascensio System SIA expressly excludes the warranty of non-infringement
* of any third-party rights.
*
* This program is distributed WITHOUT ANY WARRANTY; without even the implied
* warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. For
* details, see the GNU AGPL at: http://www.gnu.org/licenses/agpl-3.0.html
*
* You can contact Ascensio System SIA at 20A-6 Ernesta Birznieka-Upish
* street, Riga, Latvia, EU, LV-1050.
*
* The interactive user interfaces in modified source and object code versions
* of the Program must display Appropriate Legal Notices, as required under
* Section 5 of the GNU AGPL version 3.
*
* Pursuant to Section 7(b) of the License you must retain the original Product
* logo when distributing the program. Pursuant to Section 7(e) we decline to
* grant you any rights under trademark law for use of our trademarks.
*
* All the Product's GUI elements, including illustrations and icon sets, as
* well as technical writing content are licensed under the terms of the
* Creative Commons Attribution-ShareAlike 4.0 International. See the License
* terms at http://creativecommons.org/licenses/by-sa/4.0/legalcode
*
*/
"use strict";
(function (window, undefined) {
var supportedScaleValues = [1, 1.25, 1.5, 1.75, 2, 2.25, 2.5, 2.75, 3, 3.5, 4, 4.5, 5];
if (window["AscDesktopEditor"] && window["AscDesktopEditor"]["GetSupportedScaleValues"])
supportedScaleValues = window["AscDesktopEditor"]["GetSupportedScaleValues"]();
// uncomment to debug all scales
//supportedScaleValues = [];
var isCorrectApplicationScaleEnabled = (function(){
if (supportedScaleValues.length === 0)
return false;
var userAgent = navigator.userAgent.toLowerCase();
var isAndroid = (userAgent.indexOf("android") > -1);
var isIE = (userAgent.indexOf("msie") > -1 || userAgent.indexOf("trident") > -1 || userAgent.indexOf("edge") > -1);
var isChrome = !isIE && (userAgent.indexOf("chrome") > -1);
var isOperaOld = (!!window.opera);
var isMobile = /android|avantgo|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od|ad)|iris|kindle|lge |maemo|midp|mmp|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|symbian|treo|up\.(browser|link)|vodafone|wap|windows (ce|phone)|xda|xiino/i.test(navigator.userAgent || navigator.vendor || window.opera);
if (isAndroid || !isChrome || isOperaOld || isMobile || !document || !document.firstElementChild || !document.body)
return false;
return true;
})();
window['AscCommon'] = window['AscCommon'] || {};
window['AscCommon'].checkDeviceScale = function()
{
var retValue = {
zoom: 1,
devicePixelRatio: window.devicePixelRatio,
applicationPixelRatio: window.devicePixelRatio,
correct : false
};
if (!isCorrectApplicationScaleEnabled)
return retValue;
var systemScaling = window.devicePixelRatio;
var bestIndex = 0;
var bestDistance = Math.abs(supportedScaleValues[0] - systemScaling);
var currentDistance = 0;
for (var i = 1, len = supportedScaleValues.length; i < len; i++)
{
if (true)
{
// это "подстройка под интерфейс" - после убирания этого в общий код - удалить
if (Math.abs(supportedScaleValues[i] - systemScaling) > 0.0001)
{
if (supportedScaleValues[i] > (systemScaling - 0.0001))
break;
}
}
currentDistance = Math.abs(supportedScaleValues[i] - systemScaling);
if (currentDistance < (bestDistance - 0.0001))
{
bestDistance = currentDistance;
bestIndex = i;
}
}
retValue.applicationPixelRatio = supportedScaleValues[bestIndex];
if (Math.abs(retValue.devicePixelRatio - retValue.applicationPixelRatio) > 0.01)
{
retValue.zoom = retValue.devicePixelRatio / retValue.applicationPixelRatio;
retValue.correct = true;
}
return retValue;
};
var oldZoomValue = 1;
window['AscCommon'].correctApplicationScale = function(zoomValue)
{
if (!zoomValue.correct && Math.abs(zoomValue.zoom - oldZoomValue) < 0.0001)
return;
oldZoomValue = zoomValue.zoom;
var firstElemStyle = document.firstElementChild.style;
if (Math.abs(oldZoomValue - 1) < 0.001)
firstElemStyle.zoom = "normal";
else
firstElemStyle.zoom = 1.0 / oldZoomValue;
};
})(window);