DraW HooK
©Dimadze
[!]Чтобы всё полностью работало, нужен ELFPack 2.3 24bit+alpha!
V1.9.1
Скриншоты c SL65:
[Не сохранилось изображение: scr_1.png][Не сохранилось изображение: scr_4.png][Не сохранилось изображение: SL65 c DrawHook: JavaМеню с alpha - элементами][Не сохранилось изображение: SL65 - MC - DrawHook]
Скриншоты c С75 без и с патчем:
[Не сохранилось изображение: scr_5.png]
Скриншоты c СX75 без и с патчем:
[Не сохранилось изображение: scr_6.png]
Скачать:
SL65v53
CX70v56
S65v58
SK65v50
CX75v25
C75v22
Исходники (IAR)
ELFPack's 24bit+alpha (X65)
Обсуждение: siedevelop.
Описание
Патч следит за функцией DrawObject(), через которую отрисовывается практически всё на Siemens, т.е. когда параметр содержит указатель на 5-ый (или 0x17-ый) объект отрисовки (DRWOBJ), патч проверяет на альфа-канал, если его нет, то всё отрисовывается стандартным образом, иначе в дело вступает самописная ф-ия отрисовки, она сделана максимально оптимизированной. В основе её работы лежит запись битмапа изображения прямо в промежуточный буфер отрисовки, я назвал его RamScreenPhoneCache (есть аналогичный для Java) c вычислением цвета при альфа-канале.
В итоге на SGold X65 могут отрисовываться 32 битные (24bit+alpha) изображения в эльфах, а также вы можете менять графику, используя все 32 бита, а не 8 и 16.
Даже на CX75 видна разница: по стандарту видны "разводы", с патчем изображение рисуется совершенно чётко.
Скорость отрисовки с патчем и без по моим наблюдениям не меняется.
Зачем на X65 нужен спецальный ELFPack
Дело в том, что поддержку загрузки 32 битного битмапа из png на X65 спецально урезали в ELFPack 2.3, так как телефон всё равно не может его отрисовывать, зачем лишнее место занимать, правда же?
Но теперь телефон научился, и, соответственно, ему нужен ELFPack 24 bit + alpha.
Как портировать
Проект настроен и готов к компиляции.
При портировании следует обратить внимание на эти 2 файла в папке \config\:
- MODELswFIRMWARE.xcl (SL65v53.xcl)
- drawhook.h
//MODELswFIRMWARE.xcl
PATCH_BODY,CODE ... - это пустое место под тело патча
PATCH_DRAWOBJECT_OBJ05 - адрес ф-ии подпрограммы DrawObject()
PATCH_DRAWOBJECT_OBJ17 - адрес ф-ии подпрограммы DrawObject()
И, в дополнение, для X75 надо:
PATCH_REPAIRJUMP145 - Место 8 байтного перехода на GBS_GetCurCepid
PATCH_REPAIRJUMP100 - Место 8 байтного перехода на GBS_SendMessage
PATCH_DRAWOBJECT_OBJ05_J32 - PATCH_REPAIRJUMP100 + 0x04 (дополнительное место для 32bit Branch'a)
PATCH_DRAWOBJECT_OBJ17_J32 - PATCH_REPAIRJUMP145 + 0x04 (дополнительное место для 32bit Branch'a)
PATCH_LOCALJUMP145 - Адрес GBS_GetCurCepid (0x145)
PATCH_LOCALJUMP100 - Адрес GBS_SendMessage (0x100)
//drawhook.h
Для X75:
#define EXC_CSM_MP // CSM Медиаплеера
#define EXC_CSM_ZP // CSM Функции Zoom
История версий:
1.0 - Первая публичная версия
1.1 - Проведена небольшая оптимизация
1.2 - Добавлена поддержка автоперерисовки экрана
Оказывается, DrawObject после помещения обьекта в буффер сразу же перерисовывает экран, а моя спец.ф-ия, естественно, этого делать не умела, но если попутно с полупрозрачной картинкой рисовалась, например, линия, то экран благополучно бы перерисовывался вместе с картинкой, но, а если нет ничего, кроме альфа-картинки? Правильно, рисовалась бы пустота, что мы и видели на примере эльфа Turnoff'a, поэтому было решено в отрисовку 32-битной картинки вставить ма-а-а-ленький однобитный IMGHDR (1x1) и бага как не бывало.
1.3 - Перерисовка полупрозрачных изображений в текстовом поле
В текстовом поле, как мы знаем, должны быть символы, но а также есть возможность добавлять туда картинки, то есть спецсимволы, зашифрованные как картинки, ну и поэтому в DrawObject приходили символы, а не картинки, и перехват не работал, в итоге пустота. Но таки нашёл место, где они (картинки-символы) приходят в "чистом" виде и там тоже установил перехват, ну и как вы догадались - картинки видны на экране.
1.4 - Патч переписан по-другому, уменьшен размер патча, дополнительная автоперерисовка экрана больше не нужна.
1.5 - Ещё одна перестановка.
Разгрузил врезки, оставил одну команду в каждой, т.е. уменьшил лишний восстановительный код. Добавлена поддержка полупрозрачности картинок в текстовом поле Java, теперь патч легко портируем, т.е. надо найти врезки и всё, никаких дополнительных ROM/RAM адресов. А также ведётся учёт глобальных границ отрисовки, т.е. картинка не вылезет туда куда нельзя, но врезки действителны в пределах +/- 4 Мб, поэтому на X75 никак не достанут до тела патча. Да и, впрочем, влезать в прошивку с таким "хирургическим" вмешательством - это не есть хорошо, из плюсов: небольшое преимущество в качестве отрисовки, а из минусов - баги, лаги, раздербаненная ф-ия DrawObject.
1.6 - Прорисовка полупрозрачных изображений в Java и иправлены некоторые баги.
1.7 - Добавлена поддержка отрисовки 32х разрядного пакованного битмапа 0x8A.
Дело в том, что алгоритм расшифровки RLE, на чём основана паковка битмапа, не полностью работает, но пока нет для меня доказательств, что он не достаточен для полноценной отрисовки. В любом случае буду искать более универсальные и оптимальные пути решения этой проблемы.
1.8 - Поправлена отрисовка 32х разрядного пакованного битмапа 0x8A.
Теперь она работает на 100%, механизм RLE для пакованного битмапа 0x8A полностью поддерживается. И эта ф-ия оснащена защитой от зависания, если ей дали неверно составленный битмап. Дело в том, что при неправильном исполнении битмапа вся последовательность пикселей идёт наперекосяк, это может вызвать многократное ложное считывание повторений и тогда отрисовка выходит далеко за предел битмапа в RAM'e. Ну и так как снежный ком, телефон так и будет заниматься этой отрисовкой - в итоге зависание.
1.9 - Немного упорядочен механизм отбора картинок, а также убирание глюка в медиаплеере на X75.
Более тщательно изучил ф-ию DrawObject, а точнее, её механизм распределения отрисовок обьектов, не знаю, поможет ли это в скорости, но такой каши в исходниках больше нет. Так ничего другого и не придумав, убрать глюк в медиаплеере на X75 пришлось огорождением Draw Hook от него, т.е от его CSM.
1.9.1 - Небольшая оптимизация для не пакованных изображений, исправлен пик на X75 при выходе из Charge Mode.
Предыдущая страница: Патчи
Следующая страница: Java Heap Control
Дополнение при восстановлении: dh_sl65v53.vkp. Draw Hook для SL65v53 из зеркала Google Code (ELFLoader_lg8), автор в заголовке — Dimadze. Совпадение с версией 1.9.1, указанной на сайте, не подтверждено.
Источник страницы: 2014-06-25. Открыть в Wayback Machine