Перейти к содержимому

Caxton

Мод, добавляющий улучшенную поддержку шрифтов TrueType/OpenType.

FabricNeoForgeForge
Загрузчики
FabricNeoForgeForge
Скачиваний на Modrinth
1000 тыс.
Подписчиков на Modrinth
168
версий
560
Обновлён
16 сентября 202616 сент.
Опубликован
в 2022
A book page showing styling · свайп

Коротко о моде

Работает на Fabric, NeoForge и Forge
Для Minecraft 1.19.2–26.1, 26.1.2–26.3 …
Ставится только в игру; на сервер ставить не нужно
Последняя версия — 1.2.0-alpha.2+26.3-NEOFORGE от 16 сентября 2026
Лицензия MIT — бесплатно
Где нужен
В игреобязателенНа серверене нужен

Ставится только в игру; на сервер ставить не нужно

Версии игры1.18.2, 1.19.2–26.1, 26.1.2–26.3
Описание переведено автоматическиПоказать оригинал (EN)

Caxton

Caxton, названный в честь [Уильяма Кэкстона], — это мод для Minecraft, добавляющий поддержку шрифтов TrueType и OpenType.

Доступен на Modrinth и CurseForge!

Возможности

  • Чёткий текст любого размера благодаря технологии [MSDF]
  • Настоящие жирный и курсивный шрифты
  • Отрисовка сложного текста
  • Не использует AWT

Текущие ограничения

  • Формирование арабского текста в устаревших шрифтах пока не поддерживается. Реализовать это с учётом стилей и правильной обработки двунаправленного текста сложно, так как мы не можем использовать для этого API ICU4J. Если вы хотите, чтобы арабский текст отображался правильно, вам придётся использовать шрифт с поддержкой арабского языка в Caxton.
  • Генерация MTSDF из шрифтов — затратный процесс. По этой причине Caxton распараллеливает этот процесс и кэширует результаты после первого выполнения.
  • Многие элементы интерфейса, как в Minecraft, так и в модах, делают неверные предположения об отрисовке текста. Научить их учитывать двунаправленный текст — не говоря уже о таких вещах, как лигатуры — будет масштабной задачей, и патчи в этой области приветствуются.

    • Элементы GUI были пропатчены с учётом этого, но отображаемый текст выравнивается по левому краю независимо от его базового направления.
  • Поддержка хинтинга шрифтов, вероятно, никогда не будет реализована.

Совместимость с модами и ресурспаками

Совместимо с некоторыми оговорками

МодВерсияПримечания
[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]ЛюбаяПользовательские core-шейдеры не поддерживаются 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 регистрации core-шейдеров Fabric API
[Advent of Ascension]1.20.4-3.7.7Без краша, но текст с обводкой из AoA не использует шрифты MSDF, а компонент прокручиваемой панели AoA не обрезает текст в шрифтах MSDF (планируется аддон для совместимости)

Неправильная обработка разметки

Следующие моды, как известно, неправильно обрабатывают разметку текста. Они не должны приводить к крашу игры, но элементы GUI из этих модов могут вести себя неожиданно и могут вызывать появление в логе предупреждений о неподдерживаемых методах обработки текста.

МодВерсияПримечания
[IBE Editor]ЛюбаяИспользует собственный виджет текстового поля, который копирует большую часть кода отрисовки ванильного Minecraft
[Roughly Enough Items]ЛюбаяИспользует неподдерживаемые методы в некоторых своих виджетах

Ресурспаки с кастомными core-шейдерами, связанными с текстом

Ресурспаки, изменяющие core-шейдеры, связанные с текстом, такие как паки «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//textures/font/. Чтобы указать другие параметры, используйте объект, в котором ключ file` задаёт путь:

{
  // Единственный обязательный элемент.
  "file": "<namespace>:<path>",
  // Множитель масштабирования шрифта относительно размера по умолчанию.
  // Если он равен 1.0, то шрифт масштабируется так, что ascender приводится к 7
  // пикселям стандартного растрового шрифта.
  // Добавлено в 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/<namespace>/textures/font/<path>.json`, содержащий настройки для
растеризации шрифта:

```json5
{
  // Указывает фактический путь к файлу шрифта, как он был бы указан в
  // провайдере шрифтов Caxton.
  // Обычно это следует опускать, но может быть полезно, если вы используете
  // вариативный шрифт.
  "path": "<path of font file>",
  // Все эти параметры необязательны и по умолчанию принимают указанные значения.
  // Количество единиц шрифта, соответствующих каждому пикселю в атласе текстур.
  // Это можно установить на высокое значение при использовании технологии
  // рендеринга шрифтов "msdf".
  // Если вы используете "raster", то следует установить меньшее значение.
  "shrinkage": 32.0,
  // Количество пикселей, оставляемых вокруг ограничивающей рамки глифа с каждой стороны.
  // Это значение должно быть больше `range` и по умолчанию будет равно `range`, если оставить поле пустым.
  "margin": 4,
  // Ширина диапазона вокруг глифа между минимальным и максимальным
  // представимыми знаковыми расстояниями. Это положительное целое число, не большее
  // 255.
  // Это также определяет ширину границы, рисуемой для светящегося текста табличек.
  "range": 4,
  // Инвертировать ли поле знаковых расстояний (true или false).
  // Если это null, то Caxton попытается определить это автоматически,
  // но вы можете переопределить это, если он угадает неправильно.
  "invert": null,
  // Этот параметр используется для задания координат осей вариации в вариативных шрифтах.
  // Каждый элемент имеет следующий формат:
  // { "axis": <axis type>, "value": <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",
  // Максимальный уровень мипмаппинга (0 – 4).
  // Нет смысла задавать это, если вы используете технологию рендеринга MSDF.
  // Однако это может быть полезно для непиксельных шрифтов, когда вы используете
  // технологию рендеринга raster.
  // Добавлено в Caxton 0.4.0.
  "max_mipmap": 0,
  // Влияет только на технологию raster. Интерполяция всегда включена для
  // шрифтов 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 из исходников, то помимо Gradle вам потребуется установить [Rust toolchain] и [Clang].

По умолчанию нативная библиотека собирается только для текущей платформы. Чтобы собрать её для других платформ, укажите дополнительные цели через их [target triples] (разделённые запятыми) в свойстве
`xyz.flirora.caxton.additionalTargets`. Например, если вы хотите собрать библиотеку для x86_64 Windows, то можете выполнить

```sh
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

Создан [BloCamLimb] для версий с 1.15 по 1.19 на Forge.

Судя по скриншотам, этот мод поддерживает сложную отрисовку текста и настоящие жирный и курсивный стили. Он также исправляет многие проблемы с раскладкой текста в ваниле, такие как [MC-117311].

Судя по коду, у Modern UI на удивление сложный алгоритм раскладки. Впрочем, у меня не было много времени, чтобы его изучить.

Однако этот мод не может отрисовать текст с чёткими границами. Он также использует AWT для выполнения раскладки текста.

Minecraft 1.13 и новее

Начиная с 1.13 Minecraft поддерживает шрифты TrueType и OpenType. Однако эта реализация принципиально не отличается от реализации битмап-шрифтов — игра преобразует глифы в битмапы и наивно размещает текст. Кроме того, она неправильно обрабатывает метрики глифов, из-за чего текст TTF выглядит перекошенным.

Благодарности

Caxton был бы невозможен без следующих проектов:

  • [Fabric] для Minecraft
  • [Architectury Loom]
  • Язык программирования [Rust]
  • [Gradle Cargo Wrapper] (Arc-blroth, Apache-2.0)
  • [HarfRust] (MIT)

    • В версиях до 0.8 использовался [RustyBuzz] (RazrFalcon, MIT)
  • [Skrifa] (MIT/Apache-2.0)

    • В версиях до 0.8 использовался [ttf-parser] (RazrFalcon, MIT/Apache-2.0)
  • [fdsm] (я, MIT)

    • В версиях до 0.5 использовались [msdfgen] (Chlumsky, MIT) и привязки [msdfgen-rs] (Kayo Phoenix, MIT), которые впоследствии оказались бесценны при разработке fdsm.
    • В версиях 0.2.3 и более ранних вместо них использовались привязки [msdf-rs] (Penple, MIT).
  • [ab-glyph-rasterizer] (alexheretic, Apache-2.0)
  • [JNI bindings for Rust] (MIT/Apache-2.0)
  • [flate2] (MIT/Apache-2.0)
  • [Rayon] (MIT/Apache-2.0)
  • [Cross] (MIT/Apache-2.0)
  • [Fabric-ASM] (Chocohead, MPL-2.0)
  • [MixinExtras] (LlamaLad7, MIT)
  • [Caffeine] (Ben Manes, Apache-2.0)
  • [Inter] (Rasmus Andersson, OFL-1.1)
  • [Open Sans] (OFL-1.1)

Следующие люди также внесли вклад в переводы:

  • IcedDog за китайский перевод
  • JustFoxxo за польский перевод

Частые вопросы

Как установить Caxton?

Установите Fabric под свою версию Minecraft, скачайте Caxton под ту же версию и загрузчик, положите файл в папку mods и запустите игру с профилем загрузчика.

Для каких версий Minecraft есть Caxton?

У Caxton есть сборки для Minecraft 1.18.2, 1.19.2–26.1, 26.1.2–26.3.

Нужен ли Caxton на сервере?

Ставится только в игру; на сервер ставить не нужно

С какими модами Caxton несовместим?

Автор указывает несовместимость с Emojiful.

Лицензия и источник
MIT Licenseможно свободно использовать и распространять с указанием автора
Оригинал — Modrinth↗Файлы — без изменений, проверены по SHA-512Это ваш мод? Правообладателям

Сайт использует cookie: необходимые — для входа и темы, а также счётчики посещений Яндекс Метрика и LiveInternet — по ним мы видим, как пользуются сайтом. Рекламных cookie у нас нет. Подробнее