Flash, AS3 - Как считаются метрики (ascent, descent) для класса TextFormat?
От: Zzzum  
Дата: 01.10.12 09:06
Оценка:
Привет!

У меня есть два приложения: первое на Flex'e (AS3) — "дизайнер" и второе на Java — "рендерер". Смысл этих двух приложений в том, что юзер сначала создает дизайн в первом приложении, потом жмет "Save", и второе приложение генерит PDF при помощи iText либы. Дизайн может состоять из текстовых полей и картинок. Текст может быть разных шрифтов и размеров.

Проблема состоит в том, как отрисовать текст не теряя пропорций. Вот пример:

Text Object — "text", Font — ArialMT

Flex(AS3):
public class TextObject extends TextField implements IDesignObject {
     ...    
     protected function format():void {
          var textFormat:TextFormat = new TextFormat();
          textFormat.size = 25; // just an example
          trace(this.text + ' - textFormat.size = ' + textFormat.size);
          ...
          var metrics:TextLineMetrics = this.getLineMetrics(0);
          trace(this.text + ' - metrics = [ascent=' + metrics.ascent + ', descent=' + metrics.descent + ', height=' + metrics.height+ ', leading=' + metrics.leading+ ', width=' + metrics.width+ ', x=' + metrics.x + ']');
     }
}


Вот что получаем на это в логах:
text - textFormat.size = 25
text - metrics = [ascent=22.6, descent=5.25, height=27.85, leading=0, width=41.35, x=2]


Я открывал файл самого шрифта и обнаружил следующее, что maxY (ascent) для "t" — это 1433, а minY (descent) для "e" — это -24. EmSize — 2048. Вот к примеру как iText считает эти параметры:

ascent = 1433 * 1000 / 2048 = 699; // the ascent in normalized 1000 units
ascent in points = ascent * 0.001 * font_size;

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

Если во флеше использовался размер шрифта 25 пикселей, то при переводе этого размера в поинты получаем: pixel_size * 72 / resolution = point_size => 25 px * 72 / 300 = 6 pt
А для size = 6 pt iText выдает следующее ascent = 4.194 pt и descent = -0.066 pt.


Может быть кто-нибудь знает как эти метрики (class TextFormat) считаются во флеше? потому что для меня это является большой загадкой, и результаты, выдаваемые в логах флеша, даже по соотношениями не похожи на то, что должно быть...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.