В Windows растровые шрифты крутятся на любые углы, а в wine во freetype.c при отображении растровых шрифтов поворот ставиться равным 0. Если убрать это, то строчка будет позиционироваться правильно, но буквы не будут повёрнуты под нужным углом. Похоже системный freetype не умеет это делать.
Саша, предлагаю когда будет пауза в других задачах, посмотреть на libfreetype, и выяснить в чём проблема с поворотом растровых (.fon) шрифтов.
Насколько я понял из документации, fon-шрифты нельзя повернуть с помощью FT_Set_Transform. Если нет какой-нибудь другой функции, поворачивающей немасштабируемые шрифты, то остаётся разве что поворачивать руками. Написал тестовую программу, которая выводит с помощью freetype изображение одного символа. С ttf-шрифтами она работает нормально, а с fon выводит какую-то ерунду.
Разобрался, почему тестовая программа неправильно показывала fon-шрифты. Для них создавалась картинка в другом формате (1 бит на пиксел), а программа пыталась её показывать как будто там 8 бит на пиксел. FT_Set_Transform немасштабируемые шрифты не поворачивает. Каких-то функций для преобразования немасштабируемых шрифтов во freetype вроде как не предусмотрено.
Оказывается, растровые шрифты не поворачиваются в Windows. В Windows CreateFontIndirect при использовании флага OUT_TT_ONLY_PRECIS делает выбор только из TrueType-шрифтов. Данный флаг используется в KMSchool, поэтому текст там поворачивается. В Wine данный флаг, видимо, правильно не обрабатывается и загружается растровый шрифт.
Created attachment 457 [details] Поддержка флага OUT_TT_ONLY_PRECIS Надписи в KMSchool теперь поворачиваются. Вайновские тесты у меня не работают и без патча, поэтому определить, ломает ли мой патч их или нет, не получается.
Патчи Дмитрия от 24.06.08 ломают масштаб повёрнутых шрифтов, поэтому для школьного вайна 0.9 я их отменил. Старый хак убрал commit 742759aa892db62c91cf2f637142dbd2758233c6 Author: Vitaly Lipatov <lav@etersoft.ru> Date: Wed Jun 25 21:30:32 2008 +0400 Revert "Replace MS Sans Serif with Tahoma, because freetype can not rotate bimap fonts (bug #1819)" This reverts commit 75f0e38d17d9959c927676767c804c79ab471427.
Created attachment 518 [details] Нормальный вид теста Исходники теста в wine-etersoft-devel/fonts/rotlet/
Created attachment 519 [details] Сломанный новыеми патчами на gdi32/freetype
Нужно создать тест, проверяющий неизменность размера региона, вмещающего текст, при повороте.
> Проблема с вращением битмап шрифтов та же, что и с вращением битмап > изображений (DIB/DDB) - gdi32 в Wine не поддерживает World Transforms > в полном объеме, а делает только масштабирование (и то не всегда верно).
Для строк, повёрнутых на 900 и 2700 градусов, GetTextExtentPoint32 возвращает ширину 0. Чем ближе наклон строки к этим углам, тем меньше её ширина.
Написал тест
Проверено, что исправлено к 1.1.2 Я убрал отмену патчей и проверил последние исходники (школьного и нашего) вайна тестом.