Алгоритм вывода TTF шрифтов ?

Использование и разработка софта (преимущественно на ПЦ)

Moderator: Shaos

User avatar
Vasil Ivanov
Doomed
Posts: 413
Joined: 11 Dec 2003 14:34

Алгоритм вывода TTF шрифтов ?

Post by Vasil Ivanov »

Привет!
После того, как получено векторное представление шрифта (форма символа), как дальше оно выводится на экран моника - в виде картинки знакоместа (скажем bmp-формата) или векторным движком соотв. в векторной картинке ?
Vasil Ivanov
vasil-i@yandex.ru
User avatar
Shaos
Admin
Posts: 24008
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Post by Shaos »

ну движок по видимому должен растеризировать векторный фонт, кешируя буквы, чтобы одно и тоже не перерастеризировать по многу раз - см. freetype
Я тут за главного - если что шлите мыло на me собака shaos точка net
aav8
Maniac
Posts: 287
Joined: 05 Nov 2008 19:47
Location: 81.28.208.238

Post by aav8 »

Давным-давно экпериментировал с графикой посредством BGI от
Borland. Делал что-то вроде текстового редактора/просмотровщика.
Конечно все было не очень быстро - но довольно прилично.
Дак вот - во время прорисовки символов, если нажать "pause"
скорость вывода тормозилось раз в 100, и можно было видеть как
прорисовывается каждая буква - как будто рисуется карандашом.
vinxru
Retired
Posts: 587
Joined: 27 Mar 2013 04:55
Location: 62.192.229.16

Post by vinxru »

Я то же писал, но по другому.

Каждый отрезок/кривая в символе, превращается в выражение x=ay+b и ограничение y>=y0 && y<=y1.

Дальше, для каждой строки находим все решения уравнений. То есть находим координаты точки пересечения прямой/кривой и горизонтали. На входе y, на выходе x.

Точнее получаем массив чисел, который упорядочиваем. Потом рисуем линию от первой до второй точки, от третьей до четвертой и т.д.

Если число получилось дробное, то можно ставить не белую, а серую точку. Чуть-чуть повышается качество.
User avatar
Lavr
Supreme God
Posts: 16680
Joined: 21 Oct 2009 08:08
Location: Россия

Post by Lavr »

Когда я пересел со "Специалиста" на русскую ИБМ-ПыСи "Искра-1030", то очень хотелось
чтобы в ней эмуль "Специалиста" был... но разрешение экрана этого не позволяло (ХХХ х 200).

Тогда я решил, что в текстровых строках "Специалист" поместить всё же можно, если применить
масштабируемые векторные шрифты.

Ну и поскольку окромя Васика 4.5 у меня не было никакого софта, то я написал такие шрифты
через его оператор DRAW.

Текстовую эмляцию"Специалиста" я не закончил тогда... а вот сами шрифты очень пригодились
позже...
Потому как мои символы можно было вывести в любую точку экрана, а вот родные шрифты
"ИБМ-ПыСи" - позиционировались по знакоместам даже в графических режимах.

Если найду картинку и исходник - сейчас выложу здесь...

Значит - это кусок алгоритма создания шрифта:

Code: Select all

SELECT CASE Mes$
CASE "@"
'@
  DRAW "BR3 C15 L2 H U2 E R2 F D L2 U BD3 BR4"
CASE "A"
'A
'  DRAW "C15 U2 E2 F2 D NL3 D BR2"
   DRAW "C15 U E3 R D3 NL4 D BR2"
CASE "B"
'B
  DRAW "C15 U4 R3 F G NL2 F G L2 BR5"
CASE "C"
'C
  DRAW "BR C15 R2 E BU2 H L2 G D2 BD BR6"
CASE "D"
'D
  DRAW "C15 R3 E U2 H L2 NL D4 BR5"
CASE "E"
'E
  DRAW "C15 NR4 U2 NR3 U2 R4 BD4 BR2"
CASE "F"
'F
  DRAW "C15 U2 NR3 U2 R4 BD4 BR2"
CASE "G"
'G
  DRAW "BR C15 R3 U NL BU2 H L2 G D2 BD BR6"
CASE "H"
'H
  DRAW "C15 U4 BR4 D2 NL3 D2 BR2"
CASE "I"
'I
  DRAW "BR C15 R NR U4 L R2 BD4 BR3"
CASE "J"
'J
  DRAW "BU C15 F R E U3 L R2 BD4 BR2"
CASE "K"
'K
  DRAW "C15 U4 BR4 G2 NL2 F2 BR2"
CASE "L"
'L
  DRAW "C15 R U4 L R2 BD4 R2 U1 BD BR2"
CASE "M"
'M
  DRAW "C15 U4 F2 E2 D4 BR2"
CASE "N"
'N
  DRAW "C15 U4 F4 U4 BD4 BR2"
CASE "O"
'O
  DRAW "BR C15 R2 E U2 H L2 G D2 BD BR6"
END SELECT
Для скорости ASCII-таблица делилась на строки, для каждой строки - своя такая подпрограмма.

А это, собственно - вывод их на экран:

Image
iLavr
User avatar
Vasil Ivanov
Doomed
Posts: 413
Joined: 11 Dec 2003 14:34

Post by Vasil Ivanov »

Shaos wrote:ну движок по видимому должен растеризировать векторный фонт, кешируя буквы, чтобы одно и тоже не перерастеризировать по многу раз - см. freetype
Если только кэшировать сразу весь алфавит. Когда появилась Винда, а с ней и ttf-шрифты - тогда железо было не шибко навороченное, но в то же время, шрифты выводились в приличной скоростью при выводе страницы текста.
Vasil Ivanov
vasil-i@yandex.ru
User avatar
Vasil Ivanov
Doomed
Posts: 413
Joined: 11 Dec 2003 14:34

Post by Vasil Ivanov »

aav8 wrote:Давным-давно экпериментировал с графикой посредством BGI от
Borland. Делал что-то вроде текстового редактора/просмотровщика.
Конечно все было не очень быстро - но довольно прилично.
Дак вот - во время прорисовки символов, если нажать "pause"
скорость вывода тормозилось раз в 100, и можно было видеть как
прорисовывается каждая буква - как будто рисуется карандашом.
Думаю это был просто построчный вывод пикселей символа(ов). Скажем как прорисовка символов в текстовом режиме экрана.
Vasil Ivanov
vasil-i@yandex.ru
User avatar
Vasil Ivanov
Doomed
Posts: 413
Joined: 11 Dec 2003 14:34

Post by Vasil Ivanov »

Lavr wrote:Когда я пересел со "Специалиста" на русскую ИБМ-ПыСи "Искра-1030", то очень хотелось
чтобы в ней эмуль "Специалиста" был... но разрешение экрана этого не позволяло (ХХХ х 200).

Тогда я решил, что в текстровых строках "Специалист" поместить всё же можно, если применить
масштабируемые векторные шрифты.

Ну и поскольку окромя Васика 4.5 у меня не было никакого софта, то я написал такие шрифты
через его оператор DRAW.

Текстовую эмляцию"Специалиста" я не закончил тогда... а вот сами шрифты очень пригодились
позже...
Потому как мои символы можно было вывести в любую точку экрана, а вот родные шрифты
"ИБМ-ПыСи" - позиционировались по знакоместам даже в графических режимах.

Если найду картинку и исходник - сейчас выложу здесь...

Значит - это кусок алгоритма создания шрифта:

Code: Select all

SELECT CASE Mes$
CASE "@"
'@
  DRAW "BR3 C15 L2 H U2 E R2 F D L2 U BD3 BR4"
CASE "A"
'A
'  DRAW "C15 U2 E2 F2 D NL3 D BR2"
   DRAW "C15 U E3 R D3 NL4 D BR2"
CASE "B"
'B
  DRAW "C15 U4 R3 F G NL2 F G L2 BR5"
CASE "C"
'C
  DRAW "BR C15 R2 E BU2 H L2 G D2 BD BR6"
CASE "D"
'D
  DRAW "C15 R3 E U2 H L2 NL D4 BR5"
CASE "E"
'E
  DRAW "C15 NR4 U2 NR3 U2 R4 BD4 BR2"
CASE "F"
'F
  DRAW "C15 U2 NR3 U2 R4 BD4 BR2"
CASE "G"
'G
  DRAW "BR C15 R3 U NL BU2 H L2 G D2 BD BR6"
CASE "H"
'H
  DRAW "C15 U4 BR4 D2 NL3 D2 BR2"
CASE "I"
'I
  DRAW "BR C15 R NR U4 L R2 BD4 BR3"
CASE "J"
'J
  DRAW "BU C15 F R E U3 L R2 BD4 BR2"
CASE "K"
'K
  DRAW "C15 U4 BR4 G2 NL2 F2 BR2"
CASE "L"
'L
  DRAW "C15 R U4 L R2 BD4 R2 U1 BD BR2"
CASE "M"
'M
  DRAW "C15 U4 F2 E2 D4 BR2"
CASE "N"
'N
  DRAW "C15 U4 F4 U4 BD4 BR2"
CASE "O"
'O
  DRAW "BR C15 R2 E U2 H L2 G D2 BD BR6"
END SELECT
Для скорости ASCII-таблица делилась на строки, для каждой строки - своя такая подпрограмма.

А это, собственно - вывод их на экран:

Image
А вывод символов из bmp-картинки (массив символов) не быстрее будет ?
Vasil Ivanov
vasil-i@yandex.ru
User avatar
Shaos
Admin
Posts: 24008
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Post by Shaos »

Vasil Ivanov wrote:
Shaos wrote:ну движок по видимому должен растеризировать векторный фонт, кешируя буквы, чтобы одно и тоже не перерастеризировать по многу раз - см. freetype
Если только кэшировать сразу весь алфавит. Когда появилась Винда, а с ней и ttf-шрифты - тогда железо было не шибко навороченное, но в то же время, шрифты выводились в приличной скоростью при выводе страницы текста.
Шрифт может оказаться больше одного алфавита (unicode однако), поэтому растеризовать надо только те буквы, что реально выводятся, причём в том размере, который реальной нужен.
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Lavr
Supreme God
Posts: 16680
Joined: 21 Oct 2009 08:08
Location: Россия

Post by Lavr »

Vasil Ivanov wrote:А вывод символов из bmp-картинки (массив символов) не быстрее будет ?
А проверь! :lol: У меня такой необходимости не было, поэтому и не могу дать ответ...

А символы из bmp-картинки разве будут масштабируемыми и векторными?


PS. Собственно, на ХТ - "Искре-1030" с её 4.77 Мгц я видимых тормозов с этими шрифтами не замечал,
там, где я их использовал. А что было бы при эмуляции "Специалиста" - сказать трудно.
iLavr
User avatar
Vasil Ivanov
Doomed
Posts: 413
Joined: 11 Dec 2003 14:34

Post by Vasil Ivanov »

Shaos wrote:
Vasil Ivanov wrote:
Shaos wrote:ну движок по видимому должен растеризировать векторный фонт, кешируя буквы, чтобы одно и тоже не перерастеризировать по многу раз - см. freetype
Если только кэшировать сразу весь алфавит. Когда появилась Винда, а с ней и ttf-шрифты - тогда железо было не шибко навороченное, но в то же время, шрифты выводились в приличной скоростью при выводе страницы текста.
Шрифт может оказаться больше одного алфавита (unicode однако), поэтому растеризовать надо только те буквы, что реально выводятся, причём в том размере, который реальной нужен.
Речь уже пошла об оптимизации работы со шрифтами, а сабж о другом.
Vasil Ivanov
vasil-i@yandex.ru
User avatar
Vasil Ivanov
Doomed
Posts: 413
Joined: 11 Dec 2003 14:34

Post by Vasil Ivanov »

Lavr wrote:
Vasil Ivanov wrote:А вывод символов из bmp-картинки (массив символов) не быстрее будет ?
А проверь! :lol: У меня такой необходимости не было, поэтому и не могу дать ответ...

А символы из bmp-картинки разве будут масштабируемыми и векторными?


PS. Собственно, на ХТ - "Искре-1030" с её 4.77 Мгц я видимых тормозов с этими шрифтами не замечал,
там, где я их использовал. А что было бы при эмуляции "Специалиста" - сказать трудно.
По первому вопросу - я сейчас занимаюсь несколько другим. И для проверки вывода bmp-шрифтов нужен подопытный комп, чего у меня пока нет.
По второму вопросу ты и сам знаешь ответ - нет и нет.
Vasil Ivanov
vasil-i@yandex.ru
User avatar
Lavr
Supreme God
Posts: 16680
Joined: 21 Oct 2009 08:08
Location: Россия

Post by Lavr »

Vasil Ivanov wrote:По первому вопросу - я сейчас занимаюсь несколько другим.
Да вот и я тоже. Просто вспомнился этот артефакт в связи с векторными шрифтами...
iLavr