Board.KolibriOS.org

Official KolibriOS board
It is currently Wed Apr 24, 2019 9:19 pm

All times are UTC+03:00




Post new topic  Reply to topic  [ 7 posts ] 
Author Message
PostPosted: Sun Mar 25, 2012 8:17 pm 
На сегодняшний день в ядре (ревизия 2504) существуют три функции выводящие изображение:
1) Функция 7 - вывести изображение в окно. Работает только с 24 битным исходным изображением. Используется многими старыми приложениями.
2) Функция 65 - вывести изображение с палитрой в окно. Расширенная версия функции 7. Поддерживает исходное изображение от 1 до 32 бит глубиной. Используется zSea, KIV, box_lib и др.
3) Функция 73 (не документирована! безобразие!) - блиттер, вывести изображение с 32 битной глубиной. Используется плеером видео FPLAY.

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

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

В новом варианте:
Quote:
Функция 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 в соответствии с режимом отрисовки и размером экрана.


Last edited by Mario on Tue Mar 27, 2012 4:28 pm, edited 1 time in total.

Top
   
PostPosted: Sun Mar 25, 2012 11:33 pm 
Offline
Designer
User avatar

Joined: Thu Jan 25, 2007 3:33 pm
Posts: 4993
Я за отдельную функцию. Хотя я ламо и шарю в этом мало. Ммм... тоесть теперь можно будет удобно отображать нечто вроде conkey из Линукса?

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


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


Top
   
PostPosted: Mon Mar 26, 2012 5:28 pm 
Offline

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

Code:
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


Last edited by Стас on Mon Mar 26, 2012 6:02 pm, edited 2 times in total.

Top
   
PostPosted: Mon Mar 26, 2012 5:34 pm 
Да-да. Ты охуенно крут! :lol:
Плевать на все MUL и DIV.

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


Top
   
PostPosted: Tue Mar 27, 2012 12:15 am 
SVN r. 2509 Function 25 - put image area on the background layer

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


Top
   
PostPosted: Tue Mar 27, 2012 4:11 am 
Offline

Joined: Mon Jan 16, 2012 5:58 pm
Posts: 50
Код написал я сам.


Top
   
Display posts from previous:  Sort by  
Post new topic  Reply to topic  [ 7 posts ] 

All times are UTC+03:00


Who is online

Users browsing this forum: No registered users and 2 guests


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot post attachments in this forum

Search for:
Jump to:  
Powered by phpBB® Forum Software © phpBB Limited