Рендеринг шрифтов в Java: java.awt.Font работает неправильно - PullRequest
1 голос
/ 02 апреля 2012

До сих пор я сталкивался с тем, что я могу подумать об «ошибке» в библиотеках рендеринга шрифтов Oracle в Java.В некоторых шрифтах (например, шрифтах, встроенных в файлы PDF) используются некоторые нерегулярные коды символов, и с ними связаны глифы.

При попытке получить вектор глифа с использованием метода java.awt.Font.createGlyphVector в таких случаях (коды символов 9), 10 и 13, которые принадлежат tab, возврат каретки и новая строка) правильный глиф не возвращается, но он работает для всего остального.

Я отслеживал проблему в реализации CMap в Java, в которой есть кодпримерно так:

         char getGlyph(int charCode) {
             if (charCode < 256) {
                 if (charCode < 0x0010) {
                     switch (charCode) {
                     case 0x0009:
                     case 0x000a:
                     case 0x000d: return CharToGlyphMapper.INVISIBLE_GLYPH_ID;
                     }
                 }
                 return (char)(0xff & cmap[charCode]);
             } else {
                 return 0;
             }
         }

Итак, мой вопрос:

  • Это действительно ошибка?
  • Кто-нибудь знает, как обойти это?
  • Есть ли способ извлечь данные CMAP из шрифтов истинного типа, чтобы я мог сопоставить символы (кодовые точки) с кодами глифов?

1 Ответ

0 голосов
/ 11 мая 2012

Я уверен, что вы уже выяснили проблему, но для тех, кто наткнется на эту страницу в будущем, я бы порекомендовал библиотеку sfntly . Это бесплатная библиотека Java от Google, которая позволяет редактировать шрифты на основе sfnt, с которыми очень легко работать. Если вы решили свою проблему по-другому, сообщите нам об этом. Спасибо.

...