Caxton
Caxton, названный в честь Уильяма Кэкстона, представляет собой мод для Minecraft, который добавляет поддержку шрифтов TrueType и OpenType.
Доступен на Modrinth и CurseForge!
Возможности
- Четкий текст любого размера благодаря технологии MSDF
- Настоящие жирные и курсивные шрифты
- Сложное отображение текста
- Не использует AWT
Текущие ограничения
- Формирование арабской письменности в устаревших шрифтах в настоящее время не поддерживается. Реализация этого функционала при наличии стилизации и правильной обработки двунаправленного текста является сложной задачей, поскольку мы не можем использовать для этого API ICU4J. Для корректного отображения арабского текста необходимо использовать шрифт с поддержкой арабского языка под управлением Caxton.
- Генерация MTSDF из шрифтов является ресурсоемкой операцией. По этой причине Caxton распараллеливает этот процесс и кэширует результаты после его первого выполнения.
- Многие элементы пользовательского интерфейса, как в Minecraft, так и в модах, делают неверные предположения об отображении текста. Исправление их для работы с двунаправленным текстом – не говоря уже о лигатурах – является масштабной задачей, и патчи в этой области приветствуются.
- Элементы графического интерфейса были исправлены для учета этого, но отображаемый текст выравнивается по левому краю независимо от его базового направления.
- Хинтинг шрифтов, вероятно, никогда не будет поддерживаться.
Совместимость с модами и ресурспаками
Совместим с некоторыми оговорками
Мод | Версия | Примечания |
---|---|---|
Sodium | Любая, кроме Caxton <0.6.0 + Sodium 0.5.5 | Текст с обводкой неправильно отображался с Sodium 0.5.5 и версиями Caxton до 0.6.0 |
ImmediatelyFast | ≥1.2.0 | Отключите опцию Caxton sortTextRenderLayers (плюс reuseTextRendererDrawer для Caxton <0.6.0) (выполняется автоматически). Убедитесь, что опция ImmediatelyFast experimental_sign_text_buffering отключена. |
Exordium | Любая | Отключите буферизацию табличек в Exordium |
Несовместим
Мод | Версия | Примечания |
---|---|---|
Iris Shaders | Любая | Пользовательские основные шейдеры не поддерживаются Iris; текст в мире с использованием шрифтов MSDF не отображается |
Emojiful | Любая | Полностью заменяет стандартный рендерер текста Minecraft |
MemoryLeakFix | ≤1.1.1 | |
VanillaIcecreamFix | ≤1.2.1-beta+1.20.4 | Конфликтует с зависимостью Fabric ASM от Caxton при запуске – исправлено в 1.2.2-beta+1.21 |
Porting Lib | <1.2.1451-beta+1.18.2/2.1.1453+1.19.2 | Конфликтует с API регистрации основных шейдеров Fabric API |
Advent of Ascension | 1.20.4-3.7.7 | Нет падения, но текст с обводкой из AoA не использует шрифты MSDF, а прокручиваемый компонент панели AoA не обрезает текст в шрифтах MSDF (планируется аддон для совместимости) |
Неправильно обрабатывает компоновку
Следующие моды известны тем, что неправильно обрабатывают компоновку текста. Они не должны вызывать падение игры, но элементы графического интерфейса этих модов могут иметь неожиданное поведение и могут вызывать предупреждения в логе о неподдерживаемых методах обработки текста.
Мод | Версия | Примечания |
---|---|---|
IBE Editor | Любая | Использует пользовательский виджет текстового поля, который клонирует большую часть кода рендеринга ванильного Minecraft |
Roughly Enough Items | Любая | Использует неподдерживаемые методы в некоторых своих виджетах |
Ресурспаки с пользовательскими основными шейдерами, связанными с текстом
Ресурспаки, изменяющие основные шейдеры, связанные с текстом, такие как «Dark UI» и «Transparent UI» от Vanilla Tweaks, потребуют доработки для работы со шрифтами Caxton.
Поддержка операционных систем
Caxton использует нативную библиотеку для помощи в формировании текста и генерации MSDF. Предварительно собранная копия мода включает версии этой библиотеки для платформ x86_64 Windows и Linux. При использовании другой платформы необходимо самостоятельно собрать копию мода.
Если мод по-прежнему не распознает вашу платформу, измените настройку rustTarget
в файле config/caxton.json
на одно из названий платформ Rust, соответствующих вашей платформе, и сообщите об ошибке здесь.
Обратите внимание, что в моем доме нет ни одного Mac, поэтому я не могу собрать бинарные файлы для macOS из-за проблем с лицензированием.
Как использовать Caxton
Caxton в настоящее время поставляется с двумя встроенными ресурспаками для шрифтов. Первый включенный шрифт – это Inter, а второй – Open Sans.
Если ни один из них не подходит для ваших нужд, вы можете использовать свой собственный шрифт с помощью ресурспака. Перед распространением ресурспака, содержащего файл шрифта, ознакомьтесь с лицензией шрифта, чтобы убедиться, что у вас есть право распространять этот шрифт.
Добавление шрифтов через ресурспаки
Caxton добавляет провайдер шрифтов типа caxton
, который поддерживает ключи regular
, bold
, italic
и bold_italic
. Каждый из них может быть установлен в идентификатор, где
разрешается в файл шрифта assets/
. Для указания других параметров используйте объект, где ключ file
указывает путь:
{
// Единственный обязательный элемент.
"file": ":",
// Коэффициент масштабирования шрифта относительно размера по умолчанию.
// Если значение равно 1.0, шрифт масштабируется так, чтобы ascent масштабировался до 7
// пикселей шрифта bitmap по умолчанию.
// Добавлено в Caxton 0.3.0.
"scale_factor": 1.0,
// Смещение тени, кратное размеру пикселя memefont.
"shadow_offset": 1.0,
// Величина смещения отображаемого текста по осям X и Y в пикселях memefont.
// Добавлено в Caxton 0.4.4.
"shift": [
0.0,
0.0
],
// 32-битное целое число, биты которого интерпретируются как 32-битное число с плавающей запятой,
// описывающее наклон, применяемый к символам.
// Может использоваться для эмуляции курсива в шрифтах, не имеющих курсивного варианта,
// но всегда предпочтительнее использовать выделенный курсивный вариант, если он
// доступен.
// Добавлено в Caxton 0.5.6.
// Не поддерживается в Caxton 0.7.0.
"the_font_designer_couldnt_be_assed_to_make_an_italic_variant_so_slant_the_text": 0,
// Список тегов функций OpenType. Синтаксис см. ниже:
// https://docs.rs/rustybuzz/0.6.0/rustybuzz/struct.Feature.html#method.from_str
"features": [],
// Влияет только на растровую технологию. Интерполяция всегда включена для
// шрифтов MSDF.
// Если true, тексели в растровом изображении глифа будут интерполированы.
// Добавлено в Caxton 0.4.0. Заменено настройкой метаданных шрифта в Caxton 0.7.0.
"blur": false
}
Если в файле JSON шрифта существует объект по ключу caxton_providers
, то он будет использоваться вместо providers
, если установлен Caxton. Это можно использовать для загрузки шрифта Caxton с наличием резервного варианта на случай, если Caxton не установлен. Если caxton_providers
не указан, то вместо него будет использоваться providers
.
Вы также можете добавить файл assets/
, который содержит настройки для растрирования шрифта:
{
// Указывает фактический путь к файлу шрифта, как он появился бы в провайдере шрифтов Caxton.
// Обычно это можно опустить, но может быть полезно при использовании
// переменного шрифта.
"path": "<путь к файлу шрифта>",
// Все эти параметры являются необязательными и будут использовать предоставленные значения по умолчанию.
// Количество единиц шрифта, соответствующих каждому пикселю в текстуре атласа.
// Можно установить высокое значение при использовании технологии рендеринга шрифтов "msdf".
// При использовании "raster" следует установить более низкое значение.
"shrinkage": 32.0,
// Количество пикселей, которое нужно оставить вокруг ограничивающей рамки глифа с каждой стороны.
// Должно быть больше, чем `range`, и будет по умолчанию равно `range`, если оставлено пустым.
"margin": 4,
// Ширина диапазона вокруг глифа между минимальным и максимальным
// представляемыми знаковыми расстояниями. Это положительное целое число, не превышающее
// 255.
// Также определяет ширину обводки, рисуемой для светящегося текста на табличках.
"range": 4,
// Следует ли инвертировать поле знаковых расстояний (true или false).
// Если null, то Caxton попытается определить это автоматически,
// но вы можете переопределить это, если он угадает неправильно.
"invert": null,
// Этот параметр используется для установки координат оси вариаций в переменных шрифтах.
// Каждый элемент имеет следующий формат:
// { "axis": <тип оси>, "value": <значение оси> }
"variations": [],
// Индекс начертания шрифта для использования в коллекции шрифтов.
// Оставьте значение 0, если не уверены.
// Добавлено в Caxton 0.3.0.
"face_index": 0,
// Определяет, использовать ли метод рендеринга на основе MSDF ("msdf") или
// растровые изображения глифов ("raster" – ЭКСПЕРИМЕНТАЛЬНО).
// "msdf" рекомендуется для большинства шрифтов, а "raster" больше подходит для
// пиксельных шрифтов.
// Кроме того, только "raster" полностью совместим с Iris Shaders – текст в
// шрифтах MSDF не будет отображаться внутри мира, если загружен шейдер.
// Добавлено в Caxton 0.4.0.
"tech": "msdf",
// Максимальный уровень Mipmap (0 – 4).
// Бессмысленно устанавливать, если используется технология рендеринга MSDF.
// Однако это может быть полезно для непоследовательных шрифтов при использовании растровой
// технологии рендеринга.
// Добавлено в Caxton 0.4.0.
"max_mipmap": 0,
// Влияет только на растровую технологию. Интерполяция всегда включена для
// шрифтов MSDF.
// Если true, тексели в растровом изображении глифа будут интерполированы.
// Заменяет настройку провайдера шрифтов в Caxton 0.7.0.
"blur": false
}
Обязательно укажите расширение файла шрифта. Таким образом, если ваш шрифт находится по адресу assets/example/textures/font/example.otf
, то ваш JSON-файл должен находиться по адресу assets/example/textures/font/example.otf.json
(а не example.json
).
Глобальная конфигурация
В файле config/caxton.json
доступны следующие опции:
{
// Одно из названий платформ Rust (https://doc.rust-lang.org/nightly/rustc/platform-support.html)
// соответствующее вашей платформе.
// Если null, то Caxton определит правильное значение для вашей
// платформы, поэтому рекомендуется изменять это только при необходимости.
// Добавлено в Caxton 0.2.1.
"rustTarget": null,
// Использовать другой метод отрисовки текста уровня на полосе опыта:
// Для шрифтов Caxton это рисует текст с помощью шейдера обводки, вместо
// отрисовки четырех смещенных копий в цвете обводки с последующей отрисовкой основного текста
// в цвете заливки.
// Эта опция в первую очередь служит для улучшения внешнего вида текста уровня опыта
// в шрифтах с обводкой. Раньше она использовалась как обходной путь для проблемы
// неправильного отображения с ImmediatelyFast, но создавала проблемы в некоторых более поздних версиях этого мода.
// Начиная с Caxton 0.5.0, Caxton будет обнаруживать наличие ImmediatelyFast 1.2.0 или
// более поздней версии и использовать его API для смягчения проблем с этой настройкой
// во включенном состоянии.
// См.:
// * https://gitlab.com/Kyarei/caxton/-/issues/31
// * https://github.com/RaphiMC/ImmediatelyFast/issues/49
// Шрифты, не относящиеся к Caxton, не затрагиваются.
// Добавлено в Caxton 0.4.0.
"tweakExpText": true,
// Сортировать примитивы на слоях рендеринга текста Caxton от заднего плана к переднему.
// Отключение этой настройки может теоретически привести к неправильному отображению текста;
// однако ImmediatelyFast ожидает, что эта настройка отключена, и
// разработчик ImmediatelyFast не получал сообщений о проблемах рендеринга
// при отключении этой функциональности.
// Если вы столкнетесь с проблемами рендеринга, когда некоторый текст, по-видимому, рисуется в
// неправильном z-порядке, попробуйте включить эту опцию (и отключить пакетную обработку HUD
// в ImmediatelyFast).
// См.: https://github.com/RaphiMC/ImmediatelyFast/issues/49
// Добавлено в Caxton 0.4.0.
"sortTextRenderLayers": false,
// До версии 0.6.0 Caxton повторно использовал класс `TextRenderer.Drawer`
// из ванильной игры, но принудительно устанавливал его поля `x` и `y` вместо создания нового
// экземпляра для каждой операции.
// Это вызывало несовместимость с одним из миксинов ImmediatelyFast,
// поэтому была введена эта опция для обхода проблемы.
// Начиная с версии 0.6.0-alpha.4, это больше не требуется, так как Caxton больше не
// использует `TextRenderer.Drawer`.
// См.: https://gitlab.com/Kyarei/caxton/-/issues/50
// Добавлено в Caxton 0.4.7.
// Удалено в Caxton 0.6.0.
"reuseTextRendererDrawer": true,
// Некоторые методы обработки текста изначально некорректны и не поддерживаются Caxton.
// Caxton будет записывать предупреждение в лог при каждом вызове этих методов. Если эта опция
// установлена в true, то Caxton вместо этого будет выбрасывать исключение.
// Эта опция в первую очередь полезна для отладки. В случае сомнений установите значение false.
// Добавлено в Caxton 0.2.1.
"fatalOnBrokenMethodCall": false,
// Отслеживать информацию о том, когда к объекту шрифта Caxton добавляется или удаляется ссылка
// для целей отладки.
// В случае сомнений установите значение false.
// Добавлено в Caxton 0.3.0.
"debugRefcountChanges": false,
// Отключать пасхальные яйца сплеш-текста в определенные даты.
// Добавлено в Caxton 0.5.6.
"disableEasterEggs": false
}
Сборка из исходного кода
Если вы хотите собрать Caxton из исходного кода, то вам необходимо установить инструментарий Rust и Clang в дополнение к Gradle.
По умолчанию нативная библиотека будет собрана только для платформы хоста. Чтобы собрать ее для дополнительных платформ, укажите дополнительные цели по их тройкам целей (разделенным запятыми) в свойстве xyz.flirora.caxton.additionalTargets
. Например, если вы хотите собрать библиотеку для x86_64 Windows, вы можете вызвать
gradle build -Dxyz.flirora.caxton.additionalTargets=x86_64-pc-windows-gnu
Если вы получите ошибку о неизвестных целях, измените переменную cargoCrossBuildTasks
в файле caxton-impl/build.gradle
.
Сравнение с другими модами
BetterFonts / TrueType Font Replacement
Изначально создан thvortex до версии 1.4.4, обновлен до 1.4.7 пользователем bechill, затем до 1.5.2 пользователем The_MiningCrafter, затем secretdataz до версий 1.6.x и 1.7.x, затем cubex2 с версии 1.8.9 до 1.12.2. Затем снова обновлен до версии 1.13 пользователем secretdataz.
Этот мод использует функциональность компоновки текста Java AWT для размещения текста. Для рендеринга глифов он растрирует их в растровые изображения. Разрешение довольно ограничено. Однако, в отличие от многих других модов, перечисленных ниже, он правильно реализует жирные и курсивные стили, а также сложные сценарии.
Smooth Font
Создан bre2el для версий с 1.7 по 1.12. Этот мод также улучшает рендеринг текста в разных масштабах и реализует некоторые оптимизации для рендеринга текста.
Что касается того, как он работает, кто его RenderType
знает? Этот мод защищен авторским правом (ARR).
ThaiFixes
Создан lion328 для Forge на версиях до 1.12.2 и для Rift на версии 1.13, и обновлен до версии 1.18.2 на Fabric пользователем secretdataz.
Этот мод реализует собственные процедуры формирования для тайского языка. Таким образом, он не полезен для других языков, требующих сложного рендеринга.
Modern UI
Создан