LINUX.ORG.RU

История изменений

Исправление manul91, (текущая версия) :

Прочитал описание формата, там все совершенно понятно. Отталкиваться надо от baseline:

  1. Создать функцию printchar(charDataBuf, baseline,x, return nextX) которая рендерит очередную буковку: принимает описание буковки, текущий baseline, x-координату с которой начать; и возвращает x-координату с которой нужно отрисовать следующую буковку. Очевидно, кроме аргументов на вход, printchar будет использовать только параметры конкретной буковки из charDataBuf (width, height, xoffset, yoffset, deviceWidth) как и сам растер; больше ей ничего не нужно.

  2. Сделать функцию для «перевода каретки» которая смещает на одну строку вниз: на вход берет y-координату текущей baseline, на выход выдает y-координату baseline следующей строки. В простейшей имплементации она может тупо добавлять ascent + descent + leading (которые являеются шрифтовыми константами, кроме leading) и возвращать эту сумму. Произвол есть у выбора константы leading; но поскольку указано что буковки могут выходить за границ ascent-а и descent-а, leading должен быть «достаточно большой» чтобы буковки из соседних строк все же не перекрывались; и в то жо время не намного бОльше чем MAXH. В более сложной имплементации она может учитывать максимальную высоту из всех глифов в только-что отрендерированной строке max(ascent+descent,max(height)) + leading; тогда расстояния по вертикали между baseline могут получаться слегка разными для разных соседних строк; зато буковки перекрываться гарантированно не будут.

Не совсем понятно только где понадобится MAXW (в каждой буковки итак содержится достаточно информации, чтобы ТОЧНО определить смещение по х, с котором нужно начинать рисовать следующую за ней). Может быть для каких-то экзотичных ситуаций, если глифы нужно рисовать сверху-вниз (вместо по горизонтали), чтобы определить x-смещение м/у таких «вертикальных строк»….

Исправление manul91, :

Прочитал описание формата, там все совершенно понятно. Отталкиваться надо от baseline:

  1. Создать функцию printchar(charDataBuf, baseline,x, return nextX) которая рендерит очередную буковку: принимает описание буковки, текущий baseline, x-координату с которой начать; и возвращает x-координату с которой нужно отрисовать следующую буковку. Очевидно, кроме аргументов на вход, printchar будет использовать только параметры конкретной буковки из charDataBuf (width, height, xoffset, yoffset, deviceWidth) как и сам растер; больше ей ничего не нужно.

  2. Сделать функцию для «перевода каретки» которая смещает на одну строку вниз: на вход берет y-координату текущей baseline, на выход выдает y-координату baseline следующей строки. В простейшей имплементации она может тупо добавлять ascent + descent + leading (которые являеются шрифтовыми константами, кроме leading) и возвращать эту сумму. Произвол есть у выбора константы leading; но поскольку указано что буковки могут выходить за границ ascent-а и descent-а, leading должен быть «достаточно большой» чтобы буковки из соседних строк все же не перекрывались; и в то жо время не намного бОльше чем MAXH. В более сложной имплементации она может учитывать максимальные ascent и descent из всех глифов в только-что отрендерированной строке max(ascent)+max(descent) + leading; тогда расстояния по вертикали между baseline могут получаться слегка разными для разных соседних строк; зато буковки перекрываться гарантированно не будут.

Не совсем понятно только где понадобится MAXW (в каждой буковки итак содержится достаточно информации, чтобы ТОЧНО определить смещение по х, с котором нужно начинать рисовать следующую за ней). Может быть для каких-то экзотичных ситуаций, если глифы нужно рисовать сверху-вниз (вместо по горизонтали), чтобы определить x-смещение м/у таких «вертикальных строк»….

Исправление manul91, :

Прочитал описание формата, там все совершенно понятно. Отталкиваться надо от baseline:

  1. Создать функцию printchar(charDataBuf, baseline,x, return nextX) которая рендерит очередную буковку: принимает описание буковки, текущий baseline, x-координату с которой начать; и возвращает x-координату с которой нужно отрисовать следующую буковку. Очевидно, кроме аргументов на вход, printchar будет использовать только параметры конкретной буковки из charDataBuf (width, height, xoffset, yoffset, deviceWidth) как и сам растер; больше ей ничего не нужно.

  2. Сделать функцию для «перевода каретки» которая смещает на одну строку вниз: на вход берет y-координату текущей baseline, на выход выдает y-координату baseline следующей строки. В простейшей имплементации она может тупо добавлять ascent + descent + leading (которые являеются шрифтовыми константами, кроме leading) и возвращать эту сумму. Произвол есть у выбора константы leading; но поскольку указано что буковки могут выходить за границ ascent-а и descent-а, leading должен быть «достаточно большой» чтобы буковки из соседних строк все же не перекрывались; и в то жо время не намного бОльше чем MAXH.

Не совсем понятно только где понадобится MAXW (в каждой буковки итак содержится достаточно информации, чтобы ТОЧНО определить смещение по х, с котором нужно начинать рисовать следующую за ней). Может быть для каких-то экзотичных ситуаций, если глифы нужно рисовать сверху-вниз (вместо по горизонтали), чтобы определить x-смещение м/у таких «вертикальных строк»….

Исходная версия manul91, :

Прочитал описание формата, там все совершенно понятно. Отталкиваться надо от baseline:

  1. Создать функцию printchar(charDataBuf, baseline,x, return nextX) которая рендерит очередную буковку: принимает описание буковки, текущий baseline, x-координату с которой начать; и возвращает x-координату с которой нужно отрисовать следующую буковку. Очевидно, кроме аргументов на вход, printchar будет использовать только параметры конкретной буковки из charDataBuf (width, height, xoffset, yoffset, deviceWidth) как и сам растер; больше ей ничего не нужно.

  2. Сделать функцию для «перевода каретки» которая смещает на одну строку вниз: на вход берет y-координату текущей baseline, на выход выдает y-координату baseline следующей строки. В простейшей имплементации она может тупо добавлять ascent + descent + leading (которые являеются шрифтовыми константами, кроме leading) и возвращать эту сумму. Произвол есть у выбора константы leading; но поскольку указано что буковки могут выходит за ascent-а и descent-а, leading должен быть «достаточно большой» чтобы строки не перекрывались; и в то жо время не намного бОльше чем MAXH.

Не совсем понятно только где понадобится MAXW (в каждой буковки итак содержится достаточно информации, чтобы ТОЧНО определить смещение по х, с котором нужно начинать рисовать следующую за ней). Может быть для каких-то экзотичных ситуаций, если глифы нужно рисовать сверху-вниз (вместо по горизонтали), чтобы определить x-смещение м/у таких «вертикальных строк»….