13.06.2015, 21:53
|
|
Новичок
|
|
Регистрация: 25.12.2008
Сообщения: 71
Репутация: 114
|
|
Вот так сделал:
Код:
push rax
push rbx
push rcx
push rdx
push rdi
push rsi
mov rsi, DIBColorSrc // карта цветов иконки
mov rdi, DIBDest // карта цветов фона
//mov rcx, DIBColorSrcSize // размер массивов (приходит в rcx сам по себе)
shr rcx, 2 // размер элемента массива равен четырем,
// поэтому поправим счетчик цикла
// -----------------------------------------------------------------------------
@loop:
// цвета представленны следующим образом
// [rsi] = синий
// [rsi + 1] = зеленый
// [rsi + 2] = красный
// [rsi + 3] = альфа канал
mov al, [rsi + 3] // читаем значение альфа канала
cmp al, 0 // есть ли изображение иконки в данном пикселе?
jne @paint_full
add rsi, 4 // если нет - берем следующий элемент
add rdi, 4
loop @loop
jmp @done
// -----------------------------------------------------------------------------
@paint_full:
cmp al, 255 // Смотрим интенсивность цвета
jne @paint_alpha
mov eax, [rsi] // Данный пиксель полностью заполнен цветом иконки
mov [rdi], eax // копируем его целиком
add rsi, 4 // берем следующий элемент
add rdi, 4
loop @loop
jmp @done
// -----------------------------------------------------------------------------
@paint_alpha:
// присутствует альфаканал
xor rbx, rbx
call @make_alpha // микшируем синий цвет
inc rbx
call @make_alpha // микшируем зеленый цвет
inc rbx
call @make_alpha // микшируем красный цвет
add rsi, 4 // берем следующий элемент
add rdi, 4
loop @loop
jmp @done
// -----------------------------------------------------------------------------
@make_alpha:
// функция смешивает два цвета в зависимости от значения rbx,
// которое указывает какой именно брать байт из RGB
xor rax, rax
xor rdx, rdx
mov al, byte [rdi + rbx] // берем цвет приемника
mov dl, byte [rsi + 3] // берем значение альфаканала
not dl // значение альфаканала вычитаем из 255
mul dl // умножаем на получившееся значение
or dl, $FF
div dl // делим на 255
mov byte [rdi + rbx], al // запоминаем первый результат
xor rax, rax
xor rdx, rdx
mov al, byte [rsi + rbx] // берем цвет источника
mov dl, byte [rsi + 3] // берем значение альфаканала
mul dl // умножаем на значение альфаканала
or dl, $FF
div dl // делим на 255
xor rdx, rdx
mov dl, byte [rdi + rbx] // читаем первый результат
add ax, dx // к нему прибавляем второй результат
mov byte [rdi + rbx], al // сумму помещаем обратно
ret
// -----------------------------------------------------------------------------
@done:
// Восстановление значений регистров из стека
pop rsi
pop rdi
pop rdx
pop rcx
pop rbx
pop rax
end;
но дает ошибку:
Цитата:
Access violation at address 0000000000406B5D in module 'Project1.exe'. Write of address 0000000000000727.
|
|