Board.KolibriOS.org

Официальный форум KolibriOS
Текущее время: Вс дек 17, 2017 5:01 pm

Часовой пояс: UTC+03:00




Начать новую тему  Ответить на тему  [ 7 сообщений ] 
Автор Сообщение
СообщениеДобавлено: Вс мар 25, 2012 8:17 pm 
На сегодняшний день в ядре (ревизия 2504) существуют три функции выводящие изображение:
1) Функция 7 - вывести изображение в окно. Работает только с 24 битным исходным изображением. Используется многими старыми приложениями.
2) Функция 65 - вывести изображение с палитрой в окно. Расширенная версия функции 7. Поддерживает исходное изображение от 1 до 32 бит глубиной. Используется zSea, KIV, box_lib и др.
3) Функция 73 (не документирована! безобразие!) - блиттер, вывести изображение с 32 битной глубиной. Используется плеером видео FPLAY.

В данный момент я ломаю голову над решением для ICON (многопоточность и выскакивание иконки на вершину стека окон - проблемы которые надо решить) и у меня возникла мысль сделать функцию выводящую картинку на слой фона, т.е по сути слой принадлежащий ядру. С кодом отрисовки фона эта идей связана лишь по "событийным" соображениям.

Поскольку, если можно не создавать новую функцию, а расширять старую, то таковой стратегии и придерживаемся.
Я придумал вот что - в старом варианте:
Цитата:
Функция 7.
ebx = указатель на изображение

В новом варианте:
Цитата:
Функция 7.
ebx = указатель на изображение + 31 бит флаг указатель нового формата.

В старом варианте (бит 31 установлен в 0) изображение выводится в окно, формат изображения BBGGRRBBGGRR...

В новом варианте (бит 31 установлен в 1) изображение выводится на фон , формат изображения BBGGRRTTBBGGRRTT...
Изображение 32-х битное и TT это указатель прозрачности. На первое время: от 1 до FF - непрозрачно, от 0 - прозрачно.
Соответственно:
edx = [координата по оси x]*65536 + [координата по оси y]
Координаты от начала экрана.

Единственный минус на будущее - 2^31 = 2Гб, т.е. исходный рисунок должен располагаться в пределах первых 2 Гб виртуального адресного пространства приложения.
ЕМНИП в настоящее время потоку отведено только 1,5 Гб из которых на собственно прямое управление ф. 68 доступно только 900 Мб.

Другой вариант сделать независимую функцию - благо промежуточных пустых номеров много. Их есть у нас! :)
Ваши соображения товарищи разработчики?


З.Ы. Еще раз просьба не путать то что я предложил с ф. 15 (подфункциями 2,5,6,7) - это две разные вещи. Предложенное будет выводить именно в LFB, а не на область фонового рисунка, который потом масштабируется ф.15 в соответствии с режимом отрисовки и размером экрана.


Последний раз редактировалось Mario Вт мар 27, 2012 4:28 pm, всего редактировалось 1 раз.

Вернуться к началу
   
 Заголовок сообщения: Re: Вывод изображения на слой фона
СообщениеДобавлено: Вс мар 25, 2012 11:33 pm 
Не в сети
Designer
Аватара пользователя

Зарегистрирован: Чт янв 25, 2007 3:33 pm
Сообщения: 4227
Я за отдельную функцию. Хотя я ламо и шарю в этом мало. Ммм... тоесть теперь можно будет удобно отображать нечто вроде conkey из Линукса?

_________________
Через тернии к звездам


Вернуться к началу
 Заголовок сообщения: Re: Вывод изображения на слой фона
СообщениеДобавлено: Вс мар 25, 2012 11:47 pm 
Не совсем то. По большому счету функция предназначена для Icon, вывод же другой информации по одним и тем же координатам будет портить изображение обоих картинок. К том уже надо учитывать, что когда фон перерисовывается вся выведенная картинка пропадает. Поскольку это не окно, а фантомный отпечаток по сути, то его надо по мере необходимости перерисовывать. Собственно сейчас думаю над тем как эффективно сообщить о необходимости перерисовки, чтобы перерисовывать только нужный кусок изображения (в случае с Icon, когда много иконок)


Вернуться к началу
   
 Заголовок сообщения: Re: Вывод изображения на слой фона
СообщениеДобавлено: Пн мар 26, 2012 5:28 pm 
Не в сети

Зарегистрирован: Пн янв 16, 2012 5:58 pm
Сообщения: 50
от 1 до FF это коэффициент прозрачности, цвет иконки соединяют с цветом фона
вот тебе функция, рисует прозрачную иконку в формате
dw ширина
dw высота
dw длинна строки
data массив с изображением иконки

Код:
i dd 0
j dd 0
l dd 0
                                     в esi адрес иконки
ico_screen: pushad
            movzx eax,word[def3]    ;y координата на буфере
            movzx ecx,word[def10]   ;там ширины строки видео буфера
            mov [l],ecx
            mul ecx
            movzx ecx,word[def2]    ;x координата на буфере
            shl ecx,2
            add eax,ecx

            mov     edi,[def7]      ;там адрес экранного буфера
            add     edi,eax

            mov dx,[esi]                      ; Здесь ширина иконки
            add esi,4
            xor eax,eax
            lodsw                             ; Здесь длинна строки иконки

            sub [l],eax
            mov [i],dx
            mov [j],dx
            jmp .2
        .1: add edi,[l]
            mov [j],dx
            dec [i]
            jz .3

        .2: mov ebx,[esi]
            shr ebx,24

            cmp bl,0                  ;если 0, то точку не рисуем
            jnz .4
            add esi,4
            add edi,3
            inc edi
            jmp .5

            cmp bl,255                ;если 255, то прозрачности не надо
            jnz .4
            lodsd
            mov [edi],eax
            add edi,3
            mov al,[def13] ;Z
            mov [edi],al
            inc edi
            jmp .5
             
        .4: mov bh,255
            sub bh,bl
           
            xor ax,ax
            lodsb
            mul bl
            shr ax,8
            mov ch,al
            xor ax,ax
            mov al,[edi]
            mul bh
            shr ax,8
            add al,ch
            stosb
           
            xor ax,ax
            lodsb
            mul bl
            shr ax,8
            mov ch,al
            xor ax,ax
            mov al,[edi]
            mul bh
            shr ax,8
            add al,ch
            stosb

            xor ax,ax
            lodsb
            mul bl
            shr ax,8
            mov ch,al
            xor ax,ax
            mov al,[edi]
            mul bh
            shr ax,8
            add al,ch
            stosb
            inc esi

            mov al,[def13] ;Z
            stosb
           
        .5: dec [j]
            jz .1
            jmp .2
        .3: popad
            ret


В IcoFX можно сохранить любую иконку как bmp только 32битном формате и перевернуть её.
Потом добавить к себе например так
ico6 dw 48
dw 48
dw 48*4
file '6.bmp':54
потом в проге

mov esi,ico6
call ico_screen


Последний раз редактировалось Стас Пн мар 26, 2012 6:02 pm, всего редактировалось 2 раза.

Вернуться к началу
 Заголовок сообщения: Re: Вывод изображения на слой фона
СообщениеДобавлено: Пн мар 26, 2012 5:34 pm 
Да-да. Ты охуенно крут! :lol:
Плевать на все MUL и DIV.

И еще я конечно не разбираюсь в колбасных обрезках форматах графических данных.


Вернуться к началу
   
 Заголовок сообщения: Re: Вывод изображения на слой фона
СообщениеДобавлено: Вт мар 27, 2012 12:15 am 
SVN r. 2509 Function 25 - put image area on the background layer

Код нагло позаимствован из ф.36, которую в свою очередь делал я же, а все остальные матами и пиздюлями наставляли меня на путь истинный. :lol: Давно это было.
Описание читать в документационной части исходников ядра.


Вернуться к началу
   
 Заголовок сообщения: Re: Вывод изображения на слой фона
СообщениеДобавлено: Вт мар 27, 2012 4:11 am 
Не в сети

Зарегистрирован: Пн янв 16, 2012 5:58 pm
Сообщения: 50
Код написал я сам.


Вернуться к началу
Показать сообщения за:  Поле сортировки  
Начать новую тему  Ответить на тему  [ 7 сообщений ] 

Часовой пояс: UTC+03:00


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 2 гостя


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Создано на основе phpBB® Forum Software © phpBB Limited
Русская поддержка phpBB