Автор Тема: SDL_ttf.dll  (Прочитано 29481 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн insolor

  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 1064
  • Adequate Reverse Engineer
    • Просмотр профиля
SDL_ttf.dll
« : 08 Сентября 2013, 01:53:40 »
Наконец-то добрался до SDL_ttf.dll. К сожалению не разобрался, как его компилировать из исходников. Посмотрел версию mialax'а, так он вообще скомпилировал ее как Microsoft.Net Assembly :)

В общем, выбрал обходной путь, и написал Fake_ttf.dll - библиотеку-переходничёк на ассемблере 8-) Исходная библиотека SDL_ttf не меняется, просто между DF и ею добавляется "прослойка", в которую в свою очередь можно добавлять свой функционал.

Библиотеку ChangeText тоже посмотрел, и заставить ее работать в паре с моей Fake_ttf. Единственно, сделал буферный массив outText в функции ChangeText() статическим, потому как возвращать адрес нестатической локальной переменной - это айайай. Позже постараюсь добавить возможность писать скипты на питоне.

Во вложении:
  • FakeTTF_ChangeText_bin.7z - готовые к употреблению библиотеки Fake_ttf.dll и ChangeText.dll. Распаковать в папку с игрой и запустить bat-файл. Для отключения запустить тот же батник еще раз :)
  • ChangeTextInsolor_src.7z - исходники слегка подправленной библиотеки ChangeText.dll и проект для MS Visual Studio 2008
« Последнее редактирование: 10 Сентября 2013, 00:46:11 от insolor »

Оффлайн insolor

  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 1064
  • Adequate Reverse Engineer
    • Просмотр профиля
Re: SDL_ttf.dll
« Ответ #1 : 08 Сентября 2013, 02:16:14 »
По поводу обрезания текста. Жаб, к сожалению, не знает, для чего в SDL_ttf функция TTF_SizeUNICODE, поэтому определяет размеры выводимого текста, взяв "самую широкую" букву - латинскую букву M, и умножив ее ширину на количество выводимых символов. В результате, если попытаться через SDL_ttf переводить "Quit" как "Выход", то получится "Выхо" и маленький кусочек буквы д.

Отсюда вывод: использовать перевод через SDL_ttf как самостоятельное решение не получится, а только вместе с имеющимся патчем-переводчиком, с целью устранения нестыковок грамматики, например, и перевода где-то глубоко закопаных строк (например, текста, появляющегося при переходе к созданию мира).
« Последнее редактирование: 08 Сентября 2013, 14:36:57 от insolor »

Оффлайн Jesus

  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 1459
  • Баню, удаляю исключительно рекламо-спамеров.
    • Просмотр профиля
Re: SDL_ttf.dll
« Ответ #2 : 08 Сентября 2013, 09:40:48 »
По поводу обрезания текста. Жаб, к сожалению, не знает, для чего в SDL_ttf функция TTF_SizeUNICODE, поэтому определяет размеры выводимого текста, взяв "самую широкую" букву - латинскую букву M, и умножив ее ширину на количество выводимых символов. В результате, если попытаться через SDL_ttf переводить "Quit" как "Выход", то получится "Выхо" и маленький кусочек буквы д.

Отсюда вывод: использовать перевод через SDL_ttf как самостоятельное решение не получится, а только вместе с имеющимся патчем-переводчиком, с целью устранения нестыковок грамматики, например, и перевода где-то глубоко закопаных строк (например, текста, появляющегося при переходе к созданию мира).
А размер буквы M он получает через библиотеку? один раз ?

Оффлайн iKlim

  • Старожил
  • ****
  • Сообщений: 391
    • Просмотр профиля
Re: SDL_ttf.dll
« Ответ #3 : 08 Сентября 2013, 13:43:20 »
Сколько же ещё в коде таких неожиданно-смелых решений от Жаба.   ???

Оффлайн Jesus

  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 1459
  • Баню, удаляю исключительно рекламо-спамеров.
    • Просмотр профиля
Re: SDL_ttf.dll
« Ответ #4 : 08 Сентября 2013, 13:57:57 »
Сколько же ещё в коде таких неожиданно-смелых решений от Жаба.   ???
Это обычные решения :) чаще всего именно так на практике некоторые вещи и решаются....
а на другой стороне есть теоретики от программирования которые всегда знаю как должно быть :) но почему-то редко они являются программистами :)

Оффлайн insolor

  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 1064
  • Adequate Reverse Engineer
    • Просмотр профиля
Re: SDL_ttf.dll
« Ответ #5 : 08 Сентября 2013, 14:16:36 »
А размер буквы M он получает через библиотеку? один раз ?
Один раз, тогда же, когда инициализируется шрифт.
А вот вру я. Да, ширину буквы M он зачем-то определяет, при инициализации шрифта. Но вызовы TTF SizeUNICODE() идут для каждой строки, по крайней мере на "титульном" экране (проверял в отладчике). Почему вчера я не заметил импортирования этой процедуры в DF - хз. Так что, не все так печально. Сейчас подправлю Fake_ttf.dll, чтобы она перехватывала и эти вызовы. И в будущем нужно добавить в ChangeText() кэширование результатов перевода.

Обновил архивы в первом посте темы. Все прекрасно заменяется и выравнивается посредине (в меню, например) и не обрезается (в определенных пределах). Для чего нужна ширина буквы M я предполагаю, но нужно хорошо проверить, чтобы не лохануться снова :)

Прикладываю вид переведенного титульного экрана и пример файлика words.txt
« Последнее редактирование: 08 Сентября 2013, 16:37:00 от insolor »

Оффлайн Lens

  • Ветеран
  • *****
  • Сообщений: 884
  • Наш мир тьмой побежден или нет..
    • Просмотр профиля
Re: SDL_ttf.dll
« Ответ #6 : 08 Сентября 2013, 16:49:59 »
Ээ.. теперь перевод будет расово верный?
http://steamcommunity.com/groups/DFrus Русское steam комьюнити.
Шмалим в эльфов, бьём людей, Дуем ром, пиво пьем, Пиво пьем, пьем, пьем, И подделки продаем!
Кто продает?! Мы продаем! Вырезаем - продаем!
Пятнашка ?, эльфачок, Гони в лапу пятачок!
Если с бабками облом - То депо мы разнесем.

Оффлайн Andys

  • Ветеран
  • *****
  • Сообщений: 1220
  • Maidophile
    • Просмотр профиля
Re: SDL_ttf.dll
« Ответ #7 : 08 Сентября 2013, 17:20:57 »
Ээ.. теперь перевод будет расово верный?
Расшифруй может понятие 'расово верного'?

Оффлайн insolor

  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 1064
  • Adequate Reverse Engineer
    • Просмотр профиля
Re: SDL_ttf.dll
« Ответ #8 : 08 Сентября 2013, 18:12:10 »
Ээ.. теперь перевод будет расово верный?
Отдельные расовые дварфоводы считают, что сам по себе перевод DF - ересь, и Армок нас всех покарает, так что про "расовую верность" я пожалуй промолчу ;)

Если ты имеешь в виду строение предложений согласно правилам русского языка, то тут все возможно.

Оффлайн insolor

  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 1064
  • Adequate Reverse Engineer
    • Просмотр профиля
Re: SDL_ttf.dll
« Ответ #9 : 08 Сентября 2013, 22:27:35 »
Обновил файлы в первом посте.
Спойлер
Библиотека ChangeText.dll теперь экспортирует функции как extern "C" и, соответственно, Fake_ttf.dll ожидает от нее этого :)
[свернуть]
« Последнее редактирование: 10 Сентября 2013, 02:10:12 от insolor »

Оффлайн insolor

  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 1064
  • Adequate Reverse Engineer
    • Просмотр профиля
Re: SDL_ttf.dll
« Ответ #10 : 09 Сентября 2013, 19:35:04 »
В общем, привязка к Python на компах без установленного Python 3.3 пока не работает. Буду разбираться, чего ему еще надо кроме Python33.dll.
« Последнее редактирование: 10 Сентября 2013, 02:24:57 от insolor »

Оффлайн Andys

  • Ветеран
  • *****
  • Сообщений: 1220
  • Maidophile
    • Просмотр профиля
Re: SDL_ttf.dll
« Ответ #11 : 09 Сентября 2013, 20:08:14 »
Как предположения:
1. через Process Monitor посмотреть, к каким файлам из питоновой диры обращается (читает) при подгрузке длл
2. посмотреть что кроме питон.длл входит в файлы, создаваемые py2exe (правда это скорее всего придется делать со второй версией питона)

Оффлайн insolor

  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 1064
  • Adequate Reverse Engineer
    • Просмотр профиля
Re: SDL_ttf.dll
« Ответ #12 : 09 Сентября 2013, 21:32:19 »
Как предположения:
1. через Process Monitor посмотреть, к каким файлам из питоновой диры обращается (читает) при подгрузке длл
2. посмотреть что кроме питон.длл входит в файлы, создаваемые py2exe (правда это скорее всего придется делать со второй версией питона)
Идея здравая. Я попробовал, доступ идет к нескольким подпапкам в папке python33. Попробовал попереименовывать папки, оказалось что перестает работать, если переименовать папку Lib. Скопировал папку Lib целиком в папку DF, а папку Python33 переименовал - работает, но таскать с собой папку размером 25 Мб - не вариант. В общем, осталось посмотреть, что оттуда можно безболезненно удалить.

...

Результат - папка размером 1.7 Мб.
« Последнее редактирование: 09 Сентября 2013, 21:56:27 от insolor »

Оффлайн Andys

  • Ветеран
  • *****
  • Сообщений: 1220
  • Maidophile
    • Просмотр профиля
Re: SDL_ttf.dll
« Ответ #13 : 09 Сентября 2013, 22:31:06 »
таскать с собой папку размером 25 Мб - не вариант. В общем, осталось посмотреть, что оттуда можно безболезненно удалить.
гы :) у меня папка либ - 180мб... Это с левыми библиотеками, конечно

Оффлайн insolor

  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 1064
  • Adequate Reverse Engineer
    • Просмотр профиля
Re: SDL_ttf.dll
« Ответ #14 : 09 Сентября 2013, 23:54:16 »
таскать с собой папку размером 25 Мб - не вариант. В общем, осталось посмотреть, что оттуда можно безболезненно удалить.
гы :) у меня папка либ - 180мб... Это с левыми библиотеками, конечно
Я вообще думал, что достаточно будет хостовой проги (библиотеки ChangeText в нашем случае), Python33.dll и вызываемого скрипта. А тут оказывается такая запара с модулями.