Как прочитать таблицу пар кернинга из файла TTF в Android

В настоящее время я рисую текст на холсте, используя внешний (нестандартный) шрифт, загруженный из файла TTF. Я хочу включить кернинг для отображаемого текста.

Я хочу знать, есть ли возможность считывать кернинг-пары из гарнитуры с помощью Android API.

1 ответ

Решение

Я хочу знать, есть ли возможность считывать кернинг-пары из гарнитуры с помощью Android API.

Нет общедоступного API для чтения пар кернинга из файла TTF. Однако я вытащил соответствующий код из Apache FOP, и вы можете читать пары кернинга, используя эту библиотеку.

Пример использования:

TTFFile file = TTFFile.open(getAssets().open("fonts/font.ttf"));
Map<Integer, Map<Integer, Integer>> kerning = file.getKerning();

Вы также можете получить другие метаданные. Пример:

TTFFile ttfFile = TTFFile.open(new File("/system/fonts/Roboto-Regular.ttf"));

String name = ttfFile.getFullName();             // "Roboto Regular"
String family = ttfFile.getSubFamilyName();      // "Regular"
int fontWeight = ttfFile.getWeightClass();       // 400
String copyright = ttfFile.getCopyrightNotice(); // "Font data copyright Google 2014"

Я хочу включить кернинг для отображаемого текста.

Увидеть:

Как настроить кернинг текста в Android TextView?

setLetterSpacing ( с плавающей точкой)

Я был готов использовать описанный выше парсер, используя стандартную Java в Windows. Если кто-то хочет это сделать, нужно использовать Rectangle вместо Rect. Это всего лишь незначительное преобразование. Я также удалил каталог jaredrummler, потому что он был слишком длинным (хотя я оставил комментарии об авторских правах в начале файлов). Но в этом парсере есть два класса TTFFile. Этот код:

TTFFile file;
File ttf = new File("C:\\Windows\\Fonts\\calibri.ttf" );
try { file = TTFFile.open(ttf); }
catch (IOException e) {e.printStackTrace(); }
Map<Integer, Map<Integer, Integer>> kerning = file.getKerning();

Работает только в том случае, если вы импортируете правильный файл класса:

import com.fontreader.truetype.TTFFile;

Наконец, код работает, но возвращенные пары кернинга не работают с путями, которые вы конвертируете, используя:

void vectorize(Path2D.Float path, String s) {
    PathIterator pIter;
    FontRenderContext frc = new FontRenderContext(null,true,true);
    GlyphVector gv;
    Shape glyph;
    gv = font.createGlyphVector(frc, s);
    glyph = gv.getGlyphOutline(0);
    pIter = glyph.getPathIterator(null);
    while (!pIter.isDone()) {
        switch(pIter.currentSegment(points)) {
        case PathIterator.SEG_MOVETO:
            path.moveTo(points[0], points[1]);
            break;
        case PathIterator.SEG_LINETO :
            path.lineTo(points[0], points[1]);
            break;
        case PathIterator.SEG_QUADTO :
            path.quadTo(points[0], points[1], points[2], points[3]);
            break;
        case PathIterator.SEG_CUBICTO :
            path.curveTo(points[0], points[1], points[2], points[3], points[4], points[5]);
            break;
        case PathIterator.SEG_CLOSE :
            path.closePath();
        }
        pIter.next();
    } 
}

И длины, восстановленные линзой, в следующем коде:

double interchar = fontsize * 0.075;
int size = '}' - ' ' + 1;
Path2D.Float[] glyphs = new Path2D.Float[size];
double[] lens = new double[size];
String chars[] = new String[size];
int i; char c; 
char[] s = { '0' };
for (i = 0, c = ' '; c <= '}'; c++, i++) { s[0] = c; chars[i] = new String(s); }
for (i = 0; i < size; i++) {
    vectorize(glyphs[i] = new Path2D.Float(), chars[i], tx[i], 0f);
    lens[i] = glyphs[i].getBounds2D().getWidth() + interchar;
}

Для ясности, я отображаю глифы, используя заливку в Graphics2D, и перевожу, используя указанные выше длины, добавленные к смещениям кернинга, возвращаемым библиотекой Apache FOP, как предложено выше, но результат ужасен. FontSize является стандартным 1000, как предложено в этом обсуждении и Interchar результатов в 75, после умножения на размер шрифта. Все это кажется правильным, но мои ручные пары кернинга выглядят намного лучше, чем использование пар кернинга из файла ttf.

Есть ли кто-нибудь, кто обучался работе с этой библиотекой, чтобы понять, как мы должны использовать эти пары кернинга?

Извините за незначительное отклонение от исходного вопроса, но это может дополнить информацию, так как после чтения пар кернинга, как правильно их использовать в Windows или Android?

Другие вопросы по тегам