Архив SieDevelop · Оглавление и файлы · О восстановлении · Что не найдено

DraW HooK

DraW Hook - Полупрозрачность и отрисовка 32x картинок на X65 и X75.

©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