Сообщение от BlackDaemon
Now go to your room and cry like a baby.
|
Теперь иди в свою комнату и плачь, как ребенок.
Короче, начинаю включать соображалку... т.к. методом тыка ничего не получается.
Вниматель и вдумчиво прочтите всё, что я написал ниже.
В общем долго думал над этой проблемой и пришёл к выводу, что Persian Rug всё-таки отрабатывает нормально и выдёргвает шрифт из PSP версии правильно. Просто на PSP этот код обрабатывается другим образом, чем на PC. В PC версии лежит обычный шрифт TGA с нормальным для компьютера форматом 32 бит с прозрачностью(4 слоя), т.е. каждый пиксель записывается 4-мя байтами - RGBA (Red-Green-Blue-Alpha), где каждый байт отвечает за один из цветов, а в совокупности дают цвет одного пикселя.
В PSP версии шрифт записан 1 байтом на каждый пиксель -
8bpp (8 bite per pixel), т.к. 1 байт = 8 бит. Отсюда и получается, что картинка шрифта 512х128=65536 байт, без всяких дополнительных слоёв. То есть, это по сути и есть 1 слой Альфа-канала. По другому - картинка в индексированных цветах.
Я уже несколько раз вытаскивал через GE-дебаггер PPSSPP из памяти эту картинку и каждый раз она выползала одинаковая байт-в-байт, я её (
FONT.bin) выкладывал в этом посту:
https://www.pspx.ru/forum/showpost.php?p=1097938
Если сравнить в хексе картинку из дебаггера и картинку, извлечённую с помощью Persian Rug из файла MenuInGame_wow_ff0e01f5.bin, то можно заметить, что они чем-то похожи. А просто-напросто тем, что в памяти эмулятора она перевёрнута, т.е. тот код, который есть в конце, теперь находится вначале. И ещё в файле TGA есть дополнительные 18 байт заголовка формата, который можно скопировать в голый код картинки дебаггера и превратить её так же в TGA, дописав расширение *.tga.
Короче, картинка извлекается вполне правильная, просто обычные графические просмотрщики неправильно их отображают из-за специфического формата файла. Взгляните на картинку внимательно, вот я её смасштабировал и отразил по вертикали, чтобы визуально лучше воспринималась:
Если приглядеться, на картинке изображение как-бы повторяется 4 раза по горизонтали. Это значит, что ширина картинки не 512 пикселей, а 4 раза по 128. Это намекает на то, что код картинки не имеет последовательную структуру, а именно не 512 пикселей подряд в одном ряду. Ведь графические редакторы считывают информацию последовательно и каждый последующий ряд пикселей автоматически переносится на следующий ряд в зависимости от указанной ширины изображения.
Здесь же видно, что код картинки выровнен по 128 байт (пикселей). Есть такое понятие в программировании, как alignment, причём я как-то встречал такое выравнивание по 128 байт в формате TIM2 для PS2.
И ещё, я не стал раскрашивать картинку в клеточку по горизонтали, но если присмотреться, то можно посчитать, что по вертикали картинка имеет 16 рядов. 128:16=8. Получается, что картинка по вертикали имеет выравнивание по 8 пикселей, а по горизонтали по 128.
(Но!!!, в программировании и вообще в мобильной системе PSP я встречал обычно выравнивание по 16 байт или по 8. И этому есть подтверждение..., если учесть вертикальное выравнивание по 8 пикселей, то заметны во многих рядах пустые пробелы по горизонтали, например в каждом красном квадратике верхний правый угол, там по ширине примерно 8 пикселей пустоты.)
Вот ещё соображения. Вот скриншот шрифта в хексе. Слева мы видим код, а справа его визуальное отображение.
Если полистать весь файл, то справа мы увидим интересную картину репина. И это не потому, что слева код так удачно случайным образом сложился, что справа так красиво видны начертания прямых, косых и закруглённых фигур. Ну да, это и есть начертания наших букв алфавита!
Дело в том, что мой хекс-редактор обычно всегда настроен на отображение 16-ти вертикальных столбцов, от 0 до 15 в коде или от 0 до F в визуальном отображении справа. Но если я изменю ширину редактора, например на 10 или 32 столбца, то справа вся картина репина рассыпется. Отсюда вывод, что выравнивание по горизонтали исчисляется 16-ю пикселями, возможно и 8-ю.
Так же, я отделил красной линией код с промежутком по 8 строк и это де-факто. Тут сразу видно, что очертания символов вырисовываются каждые 8 вертикальных строк.
В общем получается, что картинка складывается из 16 байт по горизонтали и 8 байт по вертикали, затем таким же образом справа прикрепляется следующая картинка, потом следующая и т.д, пока по горизонтали не наберётся 512 байт. Это значит, что 512:16=32 картинки нужно сложить справа, чтобы получить одну полосу рисунка в 8 байт по высоте. Затем ниже складывается следующая горизонтальная полоса, которая отрисовывает продолжение начертания символов.
Что я хотел сказать?
То, что в картинке 512х128 графический редактор обычно отрисовывает последовательно 512 пикселей в строке и так же последовательно продолжает переносить каждую строку. А у нас получается первая строка 16 байт, потом переходит на вторую строку 16 байт, потом на третью и так 8 строк по 16 байт. Затем 9-ая строка должна приклеиваться справа к первой строке, 10-ая строка ко 2-ой, 11-ая строка к 3-ей. То есть, через каждые 8 строк картинка дополняется по 16 байт к первым 8-ми строкам, пока не наберётся 512 байт в восьми строках.
Короче, надеюсь вы всё поняли, что я хотел сказать. Думаю теперь сами справитесь
