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

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

Оффлайн Maller

  • Новичок
  • *
  • Сообщений: 49
    • Просмотр профиля
Re: SDL_ttf.dll
« Ответ #60 : 30 Май 2014, 14:52:37 »
В соседней теме я как бы мимолётом упомянул интересный баг/фичу. Если в файлике colors.txt не прописать для BLACK 0 0 0, то мысли и описания будут всё также выводится набором картинок, а не текстом. Хоть крути ты мышь, хоть не крути и жмакай контрл до посинения.

Это к слову не так чтоб критично, но всё же.

И чтобы 2 раза не вставать спрошу.
Есть возможность библиотеки для работы changetext.py скомпилировать для Linux? Реально охренительная штука и принцип её постобработки вообще зашибись.

Оффлайн insolor

  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 1053
  • Adequate Reverse Engineer
    • Просмотр профиля
Re: SDL_ttf.dll
« Ответ #61 : 30 Май 2014, 14:57:24 »
В соседней теме я как бы мимолётом упомянул интересный баг/фичу. Если в файлике colors.txt не прописать для BLACK 0 0 0, то мысли и описания будут всё также выводится набором картинок, а не текстом. Хоть крути ты мышь, хоть не крути и жмакай контрл до посинения.

Это к слову не так чтоб критично, но всё же.

И чтобы 2 раза не вставать спрошу.
Есть возможность библиотеки для работы changetext.py скомпилировать для Linux? Реально охренительная штука и принцип её постобработки вообще зашибись.
Первая часть не про SDL_ttf.dll, а про SDL.dll, пока не могу ничем помочь.
По поводу второго - можно сделать что-то подобное по тому же принципу, однако у меня пока нет опыта в программировании под Linux. Возможно позже дойду до этого. Вообще это по идее будет сделать проще, чем писать патчер еще и для линуксовых исполняемых файлов.

Оффлайн insolor

  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 1053
  • Adequate Reverse Engineer
    • Просмотр профиля
Re: SDL_ttf.dll
« Ответ #62 : 13 Июль 2014, 22:16:56 »
В скрипте окончательно пофикшены werebeasts (быливолки и прочие былизебры):
https://bitbucket.org/dfint/changetextpy_script/commits/e7120a5fb035f330f17497d34110f4facd2e12c7

Оффлайн insolor

  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 1053
  • Adequate Reverse Engineer
    • Просмотр профиля
Re: SDL_ttf.dll
« Ответ #63 : 13 Июль 2014, 23:55:50 »
Обновил архив Fake_ttf_ChangeTextPy.7z.
Из изменений: переход на Python 3.4, совместимость Fake_ttf.dll с Win8, косметические изменения в changetext.dll, куча изменений в changetext.py
Можно ознакомиться со списком тестов, которые успешно проходит скрипт: https://bitbucket.org/dfint/changetextpy_script/src/tip/tests.py
Внутри фигурных скобок идут пары "как есть":"как должно быть", т.е. на вход скрипту подается "как есть" а выходное значение сравнивается с "как должно быть". Если результат совпадает, то тест пройден. Все что не закомментировано (символ # в начале строки), то успешно проходится.

Оффлайн Skin36

  • Старожил
  • ****
  • Сообщений: 320
    • Просмотр профиля
Re: SDL_ttf.dll
« Ответ #64 : 17 Ноябрь 2014, 11:54:08 »
Я думаю обрезание TTF текста кроется где то тут.
файл df_40_16_linux\df_linux\g_src\ttf_manager.ttf
Спойлер
bool ttf_managerst::init(int ceiling, int tile_width) {
  // Reset to a known state, clear everything
  if ((!TTF_WasInit()) && (TTF_Init() == -1)) {
    MessageBox(NULL, TTF_GetError(), "TTF error", MB_OK);
    return false;
  }
  if (font) TTF_CloseFont(font);
  handles.clear();
  for (auto it = textures.cbegin(); it != textures.cend(); ++it)
    SDL_FreeSurface(it->second);
  textures.clear();
  this->tile_width = tile_width;
  this->ceiling = ceiling;
  // Try progressively smaller point sizes until we find one that fits
  for (int sz=20; sz > 0; sz--) {
    font = TTF_OpenFont("data/art/font.ttf", sz);
    if (!font) continue;
    if (TTF_FontHeight(font) <= ceiling) {
#ifdef DEBUG
      cout << "Picked font at " << sz << " points for ceiling " << ceiling << endl;
      // get the glyph metric for the letter 'M' in a loaded font
      cout << "TTF_FontHeight " << TTF_FontHeight(font) << endl;
      cout << "TTF_FontAscent " << TTF_FontAscent(font) << endl;
      cout << "TTF_FontDescent " << TTF_FontDescent(font) << endl;
      cout << "TTF_FontLineSkip " << TTF_FontLineSkip(font) << endl;
#endif
      int minx,maxx,miny,maxy,advance;
      if (TTF_GlyphMetrics(font, 'M', &minx, &maxx, &miny, &maxy, &advance) == -1)
        puts(TTF_GetError());
      else {
        em_width = maxx;
#ifdef DEBUG
        printf("minx    : %d\n",minx);
        printf("maxx    : %d\n",maxx);
        printf("miny    : %d\n",miny);
        printf("maxy    : %d\n",maxy);
        printf("advance : %d\n",advance);
#endif
      }
      return true;
    }
    TTF_CloseFont(font);
  }
  // ..fine.
  cout << "No font found!" << endl;
  font = NULL;
  return false;
[свернуть]
« Последнее редактирование: 17 Ноябрь 2014, 12:03:12 от Skin36 »

Оффлайн insolor

  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 1053
  • Adequate Reverse Engineer
    • Просмотр профиля
Re: SDL_ttf.dll
« Ответ #65 : 17 Ноябрь 2014, 14:37:07 »
Я думаю обрезание TTF текста кроется где то тут.
файл df_40_16_linux\df_linux\g_src\ttf_manager.ttf
Спойлер
bool ttf_managerst::init(int ceiling, int tile_width) {
  // Reset to a known state, clear everything
  if ((!TTF_WasInit()) && (TTF_Init() == -1)) {
    MessageBox(NULL, TTF_GetError(), "TTF error", MB_OK);
    return false;
  }
  if (font) TTF_CloseFont(font);
  handles.clear();
  for (auto it = textures.cbegin(); it != textures.cend(); ++it)
    SDL_FreeSurface(it->second);
  textures.clear();
  this->tile_width = tile_width;
  this->ceiling = ceiling;
  // Try progressively smaller point sizes until we find one that fits
  for (int sz=20; sz > 0; sz--) {
    font = TTF_OpenFont("data/art/font.ttf", sz);
    if (!font) continue;
    if (TTF_FontHeight(font) <= ceiling) {
#ifdef DEBUG
      cout << "Picked font at " << sz << " points for ceiling " << ceiling << endl;
      // get the glyph metric for the letter 'M' in a loaded font
      cout << "TTF_FontHeight " << TTF_FontHeight(font) << endl;
      cout << "TTF_FontAscent " << TTF_FontAscent(font) << endl;
      cout << "TTF_FontDescent " << TTF_FontDescent(font) << endl;
      cout << "TTF_FontLineSkip " << TTF_FontLineSkip(font) << endl;
#endif
      int minx,maxx,miny,maxy,advance;
      if (TTF_GlyphMetrics(font, 'M', &minx, &maxx, &miny, &maxy, &advance) == -1)
        puts(TTF_GetError());
      else {
        em_width = maxx;
#ifdef DEBUG
        printf("minx    : %d\n",minx);
        printf("maxx    : %d\n",maxx);
        printf("miny    : %d\n",miny);
        printf("maxy    : %d\n",maxy);
        printf("advance : %d\n",advance);
#endif
      }
      return true;
    }
    TTF_CloseFont(font);
  }
  // ..fine.
  cout << "No font found!" << endl;
  font = NULL;
  return false;
[свернуть]

(Резюмирую переписку в аське) Может не совсем оно, но уже более-менее понятно, в каком направлении копать.