В Adobe Flex, почему встроенная версия шрифта ведет себя иначе, чем тот же шрифт, установленный в системе - PullRequest
2 голосов
/ 27 апреля 2010

Сценарий:

Приложение Flex, использующее объявление @ font-face для встраивания шрифта. (Для поворота текста требуются встроенные шрифты.)

Приложение изначально разрабатывалось как приложение на английском языке, но во время локализации возникла необходимость найти шрифт Unicode, способный отображать азиатские символы. Оригинальная реализация приложения использует четыре шрифта для удовлетворения различных сочетаний выделения символов. Полужирный, Полужирный Курсив, Курсив и Обычный поставляются через соответствующие шрифты Arial в семействе Arial.

Проблема:

При попытке скомпилировать в шрифте тот, который можно было бы использовать для жирного, курсивного и полужирного курсива через что-то вроде (да, это не идеал, это был просто тест, чтобы увидеть, можно ли это сделать):

@font-face { src:url("/fonts/ArialUnicode.ttf"); 
             fontFamily: myFamily;
             fontWeight: normal;
             fontStyle: normal;
             advancedAntiAliasing: true; }

@font-face { src:url("/fonts/ArialUnicode.ttf"); 
             fontFamily: myFamily;
             fontWeight: bold;
             fontStyle: normal;
             advancedAntiAliasing: true; }

etc.

Проблема в том, что при компиляции приложения Flex становится капризным и выдает следующее сообщение об ошибке:

[ERROR] /dirpath/Style.css:[49,-1] exception during transcoding: Font for alias 'myFont' with italic style was not found at: file:/dirpath/fonts/ArialUnicode.ttf

Таким образом, с некоторым исследованием было установлено, что, поскольку Unicode не поддерживает ни курсив, ни Bold, что, когда компилятор Flex пытается внедрить шрифт, он становится несчастным, так как не может найти шрифт в указанном месте, которое будет удовлетворять требованию CSS.

Теперь, когда объявление font-face возвращается к простейшей форме:

@font-face { src:url("/fonts/ArialUnicode.ttf"); 
             fontFamily: myFamily;
             fontWeight: normal;
             fontStyle: normal;
             advancedAntiAliasing: true; }

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

Теперь вот где это становится странным.

Если в системе установлен точно такой же шрифт Unicode, азиатские символы начнут отображаться жирным шрифтом и курсивом. Это не имеет смысла, так как символы Bold и Italic отсутствуют в шрифте, как продемонстрировано, когда Flex попытался внедрить этот шрифт для соответствия указанным выше стилям CSS. Тем не менее, очевидно, что этот шрифт используется для отображения символов, выделенных жирным шрифтом и курсивом, как прежде, чем они были просто прямоугольниками, прежде чем он был установлен в качестве системного шрифта. Это какой-то флекс вуду? И если так, то есть какой-то способ, которым я могу программно вызвать упомянутый voodoo, поскольку я не могу полагаться на то, что пользователь должен выйти и установить шрифт Unicode в своей системе.

Edit: Вот некоторая дополнительная информация, которая может прояснить проблему.

Мой вопрос на самом деле не в том, как мы делаем несколько граней шрифтов и весов для римских символов, это «Как Flex применяет жирный шрифт и курсив к системному шрифту. Тем более, когда он говорит, что этот шрифт не поддерживает те, когда пытаясь вставить этот шрифт. "

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

  1. Внедрить в приложение только MS Arial Unicode и развернуть его.
  2. На новой машине с Windows 2003 откройте Firefox и выберите японский язык.
  3. Перейдите к URL-адресу приложения и просмотрите поля, где должны быть жирный шрифт и курсив.
  4. Теперь выйдите из Firefox. Установите шрифт MS Arial Unicode в систему Windows 2003.
  5. Откройте Firefox и повторите. Области, которые раньше были прямоугольниками, теперь выделены жирным шрифтом / полужирным курсивом / курсивом. Японские символы.

Не так много, как решить эту проблему. Есть много жизнеспособных решений. Однако я действительно хотел бы знать, как Flex применяет жирный шрифт и курсив к шрифту, который, как он говорит, не поддерживает жирный шрифт или курсив.

Спасибо, C

1 Ответ

5 голосов
/ 27 апреля 2010

Проблема в том, что вы указываете одинаковое имя файла для всех четырех вариантов шрифта. Один файл ArialUnicode.ttf содержит только один вариант.

Используя имена из вашего каталога c: \ Windows \ fonts, вы хотите встроить arial.ttf, arialbd.ttf, arialbi.ttf и ariali.ttf. Это нормальный, жирный, полужирный и курсивный варианты, соответственно.

Помните, что не все шрифты могут быть встроены свободно как с технической, так и с юридической точек зрения.

Юридическая сторона заключается в том, что шрифты являются программным обеспечением, поэтому их необходимо лицензировать, как и любой другой сторонний код, который вы включаете в свою программу. Возможно, вы захотите взглянуть на семейство шрифтов Bitstream Vera , так как они лицензированы по лицензии. Семейство обладает большими возможностями, разработано для использования в качестве основных шрифтов в Linux и т. Д.

Техническая сторона заключается в том, что эти правила включены в форматы файлов TTF и OTF, а такие инструменты, как компилятор Flex, подчиняются лицензионным ограничениям, объявленным в файле. Если шрифт помечен как «без встраивания», он не позволит вам его встроить.

...