Рисование сложного текста в android ics на родном языке c

NB: весь мой сенарио предназначен только для версии ICS для Android.

Моя цель - визуализировать текст со сложным скриптом / индикатором. В ICS эта функция была добавлена ​​в WebView (и, следовательно, в браузер). Если какой-либо индикаторный текст отображается в браузере или WebView, он отображается правильно. Но в других виджетах (TextView, EditText) он не работает.

Теперь моя цель - повторно использовать код для правильного рисования текста индикации в веб-ядре и использовать этот код для рисования текста индикации в пользовательском виджете.

Я также тестировал использование холста HTML5 в браузере, и он может нормально отображать индикаторный текст. Я тестировал android.graphics.Canvas в android, и он не смог правильно отобразить индикаторный текст.

В libskia серьезно не хватает документации, поэтому я не могу понять, как с ее помощью отображать текст.

Я проверил objdump libwebcore.so и увидел, что он зависит от lib "skia" "libicu". Итак, я предполагаю, что могу нарисовать индикаторный текст с помощью этих библиотек.

Может ли кто-нибудь подсказать, как нарисовать индикаторный текст с помощью skia и icu? или Может ли кто-нибудь указать на конкретный сегмент кода в libwebcore?


person Sarim    schedule 19.12.2012    source источник
comment
Вероятно, вы не хотите выпускать код для конкретной сборки, который ссылается на закрытые сведения о библиотеках. Хотя поставщики / операторы Android часто не спешат выпускать обновления, когда они отправляют обновления, они, как правило, являются обязательными. Также вы можете обнаружить, что это не работает у разных поставщиков. Сможете ли вы использовать веб-просмотр для рендеринга?   -  person Chris Stratton    schedule 19.12.2012
comment
@ChrisStratton, использующий веб-просмотр, на самом деле излишний. это замедляет работу. и я думаю, могу ли я упаковать эти библиотеки в свое приложение или что-нибудь придумать. Я не думаю о выпуске / распространении сейчас, я хочу как-нибудь сначала это сделать.   -  person Sarim    schedule 19.12.2012


Ответы (1)


Есть несколько альтернативных текстовых стеков, которые широко используются, но ни один из них не отображается напрямую через Android NDK. На базовом уровне вам необходимо:

  1. Разбейте текст на части одного скрипта, одним шрифтом, в одном направлении, в одной строке.
  2. Преобразуйте последовательность символов в каждом прогоне в последовательность глифов.
  3. Разместите эти глифы в 2D-пространстве, возможно, вернитесь к шагу (1), если ваш разрыв строки не сработал.
  4. Растеризуйте глифы в выбранных позициях.

Самый популярный стек для этого примерно (1) fribidi, (2) harfbuzz-ng, (3) more harfbuzz-ng, (4) libfreetype. Все эти проекты довольно легко запустить на Android; качество документации варьируется.

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

В качестве альтернативного стека различные части libicu могут заменять fribidi, harfbuzz-ng и Pango (последний с почти недокументированным классом ParagraphLayout); вам по-прежнему понадобится libfreetype для работы со шрифтами и растеризацией. Имейте в виду, что части libicu перемещаются в harbuzz-ng, поэтому эти стеки не полностью различимы; и хотя некоторые части libicu превосходны и регулярно обновляются, другие части более нечеткие.

person addaon    schedule 23.02.2013
comment
ICU рекомендует использовать harfbuzz для того, что делает harfbuzz. (библиотека icu-le). Я не уверен, что нечеткое в стеке - было бы любопытно, что вы имеете в виду. - person Steven R. Loomis; 10.09.2013