Низкоуровневый текстовый движок для планшетных ОС - PullRequest
3 голосов
/ 24 февраля 2011

Общие сведения: я разрабатываю программное обеспечение для просмотра специализированного академического контента со сложными требованиями к макету (сложные сноски, таблицы, изображения, нестандартные наборы символов и т. Д.). В настольной версии это достигается с помощью низкоуровневого TextFormatter WPF и вВ веб-приложении это выполняется с помощью FTE Flash (не TLF, а базового движка).Оба они являются низкоуровневыми механизмами, которые выдают текстовые строки заданной ширины и форматирования, которые затем можно упорядочить для формирования страниц.

Мы бы хотели перенести приложение на планшеты iPad и Android.В настоящее время мы склоняемся к использованию AIR для Android / Packager for iPhone для повторного использования большей части нашей существующей кодовой базы as3.Тем не менее, мы хотим изучить возможность перехода на нативные функции на каждой платформе.

Мой вопрос таков: предлагают ли iOS и Android сопоставимый низкоуровневый текстовый движок, способный:

  1. ЛинияРазрыв по ширине
  2. Двунаправленный текст
  3. Кернинг, лигатуры и т. д.
  4. Несколько встроенных шрифтов
  5. Встроенные и плавающие изображения
  6. Текствыделение / выделение
  7. Все остальное, что необходимо для создания сложных макетов

Предполагая, что это не предлагается нативными API (и, по крайней мере, при просмотре Android SDK это кажетсяcase), есть ли какие-либо сторонние платформы, доступные для этих платформ, которые выполняют все вышеперечисленное?

1 Ответ

2 голосов
/ 25 февраля 2011

В iOS есть CoreText framework.(предлагается на языке Си) Я думаю, что это идеально подходит для вас.Вот справочная документация.http://developer.apple.com/library/ios/#documentation/StringsTextFonts/Conceptual/CoreText_Programming/Introduction/Introduction.html


У Apple одна из самых сильных типографских технологий, как у Adobe.Насколько я знаю, их технологии не совместимы.(кроме шрифта и PDF) CoreText имеет большинство функций, аналогичных Adobe, но ведет себя немного по-другому.Поэтому вам нужно снова настроить все значения макета.

Я не уверен, что все перечисленные функции поддерживаются.

  • межстрочный интервал,
  • кернинг,
  • разнообразные шрифты,
  • макет встроенного объекта (как изображения),
  • иetc

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

В первоначальном выпуске CoreText были некоторые проблемы.Я описал некоторые из них здесь: (1) Выравнивание текста по размеру по вертикали по центру вместо базовой линии с Core Text в iOS (2) Core Text: визуализация в нечетную форму

CoreText изначально является платформой Mac OS X.И он постепенно переносится на iOS.Я не использовал CoreText на Mac, но когда я проверял документ, у него было намного больше функций.Я ожидаю, что большинство функций будет перенесено.В настоящее время Apple активно портирует многие функции Mac.

Я использовал Flash (не всесторонний уровень в шрифтах), и я доволен работой Apple.Я верю, что вы не будете разочарованы этим.Как вы знаете, Apple является одним из новичков компьютерной типографии эпохи.(другой - Adobe:)


Фреймворк выглядит немного хардкорным, но его очень просто использовать, чем кажется.Он может нарисовать NSAttributedString (объект rich-text) как есть, и все, что вам нужно сделать, это просто создать экземпляр NSAttributedString и нарисовать его с CoreText.

Например, если вы правильно настроилиNSAttributedString, этот код будет рисовать каждый форматированный текст в определенной области прямоугольника.

// In an UIView subclass.
- (void)drawRect:(CGRect)rect
{
    NSAttributedString* AS  =   [self text]; // Assumes this property exist.
    CGContextRef        CTX =   UIGraphicsGetCurrentContext();
    CGMutablePathRef    P   =   CGPathCreateMutable();
    CGRect              R   =   rect;
    CGPathAddRect(P, NULL, R);

    CTFramesetterRef    FS  =   CTFramesetterCreateWithAttributedString((CFAttributedStringRef)AS);
    CTFrameRef          F   =   CTFramesetterCreateFrame(FS, CFRangeMake(0, 0), P, NULL);

    CTFrameDraw(F, CTX);

    CFRelease(FS);      
    CGPathRelease(P);

Конечно, нарисованная графика будет перевернута, если вы не вызовете этот код где-нибудь.

    [[self layer] setGeometryFlipped:YES];

И если вы находите альтернативу нативной типографской / макетной структуре, есть два варианта:

  1. HTML + CSS
  2. библиотека freetype

HTML с UIWebView может быть одним.Посмотрите на CSS3 и позже.Есть довольно много функций, чем обычно ожидают люди.Тем не менее, HTML и UIWebView намного тяжелее и медленнее, чем CoreText.Я мог бы использовать CoreText рисования в UITableViewCell без каких-либо проблем с прокруткой анимации.

библиотека freetype - это библиотека низкоуровневых шрифтов.Он предлагает самый низкий уровень прямого доступа к данным шрифтов и средств рендеринга с сглаживанием.Поскольку это низкий уровень, вы должны реализовать логику компоновки самостоятельно.Я плохо знаю об этой библиотеке.


Я не знаю об Android.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...