This commit is contained in:
Курнат Андрей
2026-02-17 21:31:51 +03:00
parent e2f50bf57e
commit 49d19cdbdb

View File

@@ -195,7 +195,34 @@
}
return buf;
}
function calculateOptimalLocationSize() {
// 1. Получаем размеры видимой области
const width = window.innerWidth;
const height = window.innerHeight;
// 2. Получаем текущий размер шрифта (из состояния или напрямую из настроек)
// Если размер шрифта еще не задан, используем 18px по умолчанию
const fontSize = state.currentFontSize || 18;
// 3. Эмпирический коэффициент:
// На 1 квадратный пиксель при 18-м шрифте приходится примерно 0.005 - 0.007 символа.
// Мы рассчитываем "площадь" одного символа.
// Чем больше шрифт, тем больше места занимает символ (квадратичная зависимость).
const charArea = (fontSize * fontSize) * 0.55;
// 4. Рассчитываем общую вместимость экрана в символах
const screenArea = width * height;
let charactersPerScreen = Math.floor(screenArea / charArea);
// 5. Ограничиваем значения для стабильности epub.js
// Минимум 400 (чтобы не плодить тысячи локаций на маленьких текстах)
// Максимум 1500 (чтобы избежать "залипания" на больших экранах)
const finalSize = Math.max(400, Math.min(1500, charactersPerScreen));
debugLog(`Расчет локации: Экран ${width}x${height}, Шрифт ${fontSize}px => Размер локации: ${finalSize}`);
return finalSize;
}
// ========== MESSAGE BRIDGE (Связь с приложением) ==========
function sendMessage(action, data) { // Отправка данных в нативный код (C# / Swift / Kotlin)
const message = JSON.stringify({ action, data: data || {} });
@@ -299,8 +326,10 @@
} else {
debugLog("Кэша нет, считаем в фоне...");
// Используем setTimeout, чтобы не блокировать поток отрисовки
const dynamicSize = calculateOptimalLocationSize();
// Запускаем генерацию с динамическим размером
setTimeout(() => {
state.book.locations.generate(2000).then(() => {
state.book.locations.generate(dynamicSize).then(() => {
state.totalPages = state.book.locations.length();
const locationsToSave = state.book.locations.save();