Page 1 of 1

Функция 25 - вывод изображения на слой фона

Posted: Sun Mar 25, 2012 8:17 pm
by Mario
На сегодняшний день в ядре (ревизия 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 в соответствии с режимом отрисовки и размером экрана.

Re: Вывод изображения на слой фона

Posted: Sun Mar 25, 2012 11:33 pm
by Leency
Я за отдельную функцию. Хотя я ламо и шарю в этом мало. Ммм... тоесть теперь можно будет удобно отображать нечто вроде conkey из Линукса?

Re: Вывод изображения на слой фона

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

Re: Вывод изображения на слой фона

Posted: Mon Mar 26, 2012 5:28 pm
by Стас
от 1 до FF это коэффициент прозрачности, цвет иконки соединяют с цветом фона
вот тебе функция, рисует прозрачную иконку в формате
dw ширина
dw высота
dw длинна строки
data массив с изображением иконки

Code: Select all

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

Re: Вывод изображения на слой фона

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

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

Re: Вывод изображения на слой фона

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

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

Re: Вывод изображения на слой фона

Posted: Tue Mar 27, 2012 4:11 am
by Стас
Код написал я сам.