Учим Cool Reader использовать системные шрифты из MS Windows

Я очень люблю читать электронные книжки различных форматов на своем ноутбуке. К сожалению, удобных программ для чтения электронных книг формата *.fb2, не так уж и много. Из наиболее известных можно отметить FBReader и Cool Reader; обе программы разработаны отечественными программистами. FBReader является де-факто стандартной читалкой, используемой в дистрибутивах GNU/Linux, а Cool Reader, на мой взгляд, больше подходит для MS Windows.



Интерфейс программ для чтения электронных книг. FBReader и Cool Reader в операционной системе MS Windows 8.1 (кликабельно)

У FBReader’а в Windows, по моему мнению, просто ужасный интерфейс; зато имеется возможность использовать любой системный шрифт. Версия Cool Reader’а для Windows может быть собрана с использованием различных фреймворков графических интерфейсов: кроме нативного Win32 API тут имеется Qt и WxWidgets. Кросс-платформенная Qt-версия Cool Reader’а выглядит весьма лаконично, но, увы, отсутствует возможность использовать какой-либо другой системный или пользовательский шрифт, кроме тех, что отмечены автором, как наиболее подходящие. Честно говоря, возможность использовать кастомный шрифт в Cool Reader имеется: для этого необходимо в корневой директории с программой создать папку «Fonts/» и положить туда любимые *.ttf-шрифты. Но ведь весьма велика вероятность, что любимый шрифт уже давно установлен в систему, а *.ttf-файл удален. Я считаю, что возможность использования любого установленного в систему шрифта — это наиболее правильное решение.

Во всех программах для чтения электронных книг, я привык использовать Nokia Sans. Для меня этот конденсированный шрифт является наиболее предпочтительным для отображения текстовой информации в интерфейсах. У меня он уже достаточно давно установлен в систему, а *.ttf-файлов не осталось. Поэтому я решил немного переделать удобную мне читалку Cool Reader, добавив в неё возможность использования всех установленных в систему шрифтов.

Скачав исходный код программы, я углубился в его изучение. Спустя одну чашку кофе была найдена функция InitCREngine(), в которой и происходила загрузка системных шрифтов из захардкоденного массива const char *fontnames[]. Вместо инициализации этого массива я решил написать блок кода, сканирующий каталог «%WINDIR%\Fonts» и рекурсивно добавляющий системные шрифты подходящего формата в массив *fontnames[].



Массив с несколькими системными шрифтами

Благодаря фреймворку Qt это оказалось сделать очень легко:

Сниппет для конвертирования QStringList’а в массив обычных сишных строк, я нашел тут. Далее с помощью цикла элементы нашего массива, содержащие имена системных шрифтов, передаются аргументом в метод RegisterFont(), а затем обрабатываются движком:

Теперь изменённую программу необходимо было собрать для MS Windows. Если скачать архив с программой с официального сайта, то можно заметить, что она собрана компилятором cl.exe, идущим в комплекте с MS Visual Studio. Для нормальной работы с фреймворком Qt в Visual Studio необходимо установить специальное дополнение. Так как Express-версия программы не поддерживает установку дополнений, я решил рискнуть и попробовать скомпилировать Cool Reader с помощью GNU Compilers Collection (MinGW) и интегрированной среды разработки Qt Creator. Кроме того, Cool Reader, доступный для скачивания с официального сайта, использует Qt 4.7.1, у меня же установлена последняя версия из четвертой ветки — Qt 4.8.5.

Для компиляции читалки используется CMake, работа с этой кросс-платформенной системой сборки уже предусмотрена в Qt Creator’е; CMake необходимо лишь скачать и установить.

После генерации Makefile’ов я запустил сборку проекта. На удивление, он собрался под Qt 4.8.5 и MinGW практически без каких-либо изменений и весьма быстро. Пофиксив единственную ошибку, связанную с компилятором MinGW, я принялся за тестирование.

Как и ожидалось, мои изменения в коде программе, помогли ей увидеть все системные шрифты.



Доступные шрифты в Cool Reader, после внесённых изменений

На этой радостной ноте я решил собрать статическую portable-версию программы. Пока она собиралась, я нашёл небольшой баг, связанный с отображением полностью заряженной батарейки и быстренько его поправил.



Найденный баг с отображением полностью заряженной батарейки

Разрешив проблемы с линковкой статически собранной программы, я решил оформить все изменения в небольшой патч, забрать который можно отсюда:
[ => DOWNLOAD | СКАЧАТЬ (~4 KB) <= ]
В нём код добавления всех системных шрифтов на всякий случай обвернут в дефайн «_USE_ALL_SYSTEM_FONTS».

Если вы хотите скомпилировать Cool Reader с моим патчем, то вот вам руководство к действию:

С помощью команд:

Скачиваете исходный код из git-репозитория и патчите его.

Затем открываете файл «CMakeLists.txt» с помощью Qt Creator’а, выбираете директорию для сборки и пишете в аргументы CMake строку:

-DCMAKE_CXX_FLAGS:STRING="-D_USE_ALL_SYSTEM_FONTS"



Аргумент, прописанный в CMake (выделен красным овалом)

После генерации Makefile’ов, можете приступать к сборке программы. Компиляция успешно проходит на Qt 4.8.5 и MinGW (4.6.2), на остальных версиях компилятора и фреймворка тоже должно быть всё гладко. Для разрешения конфликтов в процессе линковки следует использовать аргументы:

-DUSE_QT_JPEG=1 -DUSE_QT_ZLIB=1 -DUSE_QT_PNG=1

Если вы статически линкуете программу, не забудьте прописать:

-DCMAKE_EXE_LINKER_FLAGS:STRING="-static -static-libgcc -static-libstdc++"

Итак, моя цель была полностью достигнута: в Cool Reader’е теперь появилась возможность использовать любой *.ttf-шрифт, установленный в систему.



Программа Cool Reader, запущенная в Windows 8.1; для отображения текста используется кастомный шрифт Nokia Sans

Скачать мою сборку Cool Reader’а можно здесь:
[ => DOWNLOAD | СКАЧАТЬ (5.3 MB, 7z-архив) <= ]

Update 21-AUG-2016: Специально для страждущих обновил свою сборку Cool Reader до master-версии из официального репозитория на GitHub’е. По просьбе Арнольда увеличил диапазон размеров шрифта между 32-36. Скачать новую сборку можно здесь:
[ => DOWNLOAD | СКАЧАТЬ (6.2 MB, 7z-архив) <= ]

Update 12-JUN-2017: В комментариях к этой статье Кирилл обозначил интересную проблему со страничными отступами. Сначала я решил, что это мои патчи как-то сломали программу, но проведя небольшое расследование, я обнаружил, что Вадим Лопатин (автор программы Cool Reader) при изменении отступов в коммите 28811c4 забыл поправить файл формы settings.ui, из-за чего и возник этот баг. Я создал Pull Request с исправлением этой проблемы и обновил свою сборку Cool Reader, скачать которую можно по этой ссылке:
[ => DOWNLOAD | СКАЧАТЬ (5.1 MB, 7z-архив) <= ]

Приятного чтения!

Manuals, Others

Учим Cool Reader использовать системные шрифты из MS Windows: 8 комментариев

  1. Доброе время суток, Сергей. Спасибо за вашу сборку Cool Reader’а — пользуюсь ей второй год. Возможность использовать все системные шрифты — это то, чего очень не хватало, но есть еще одна вещь, которую было бы здорово реализовать — это возможность в режиме просмотра «Две страницы» использовать скины, которые бы растягивались на всю книгу, а не на каждую страницу по отдельности. Проиллюистрирую скриншотами:
    https://drive.google.com/file/d/0B-kIk2vuAR0zUWRMMUdaazFIT1U/view?usp=sharing
    https://drive.google.com/file/d/0B-kIk2vuAR0zQjdnbVdxeE9QQ1k/view?usp=sharing
    https://drive.google.com/file/d/0B-kIk2vuAR0zaXR6NkVoSG5rc3c/view?usp=sharing
    В сети есть множество текстур раскрытых книг высокого разрешения, и если бы их можно было использовать в Cool Reader, то эффект присутствия и погружения был бы колоссальным. Я не призываю вас браться за реализацию этой идеи, но вдруг она вас заинтересует.=)

    1. Добрый день, спасибо за отзыв! Функция действительно интересная, если найду свободное время и канал, позволяющий мне стянуть исходники Cool Reader’а из репозитория (сейчас у меня очень плохой мобильный интернет), то я обязательно попробую заняться реализацией вашей идеи.

  2. Обновите пожалуйста сборку Cool Reader’а с возможностью использовать все системные шрифты до версии 3.3.61(cr3-win32-qt-opengl-3.3.61.zip)

    1. Обновил сборку Cool Reader’а до последней ветки master’а, это 3.2.1-x

      См. последний раздел статьи. К сожалению, Cool Reader 3.3.61 это уже совсем другой проект.

  3. Спасибо за исключительно полезную сборку! С расширением набора шрифтов довольно убогий интерфейс Cool Reader’а стал значительно богаче. К сожалению, выбор размеров шрифта в этой читалке тоже весьма ограничен. Например, для самых ходовых шрифтов на экране моего таблета (10″, Win 8.1) размер 32 пк явно мал, а 38 -слишком велик, а между ними ничего нет. Нельзя ли «научить» Cool Reader применять также более широкую гамму размеров шрифта?
    С глубоким уважением.

    1. День добрый, специально для вас сделал последнюю сборку Cool Reader, где можно выставить размер шрифта в 32, 33, 34, 35, 36, 37 и 38. Смотрите в обновлениях поста выше.

  4. Замечательная сборка!
    Спасибо огромное за работу!

    Маленькое и некритичное пожелание: в сборке «Update 21-AUG-2016: cr3-qt-win32-static-latest» настройка «Страница — Отступы страницы» имеет в несколько раз меньший эффект, чем в старой сборке «cr3-qt-win32-3.0.57-15» и оригинальных старых версиях — даже при максимальном значении отступа 30 он всё равно очень маленький. Можно, конечно, скомпенсировать через «Таблицы стилей — Стиль параграфа — Отступы», но это же костыли.
    Ещё раз спасибо!

    1. Кирилл, здравствуйте! Извините за задержку с ответом.
      Я исправил описанную вами проблему, подробнее смотрите в конце этой статьи.
      Кроме того, я добавил новую сборку с исправленным багом. Просьба протестировать.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *