Показать сообщение отдельно
  #4  
Старый 13.06.2015, 21:53
Аватар для volod3000
volod3000 volod3000 вне форума
Новичок
 
Регистрация: 25.12.2008
Сообщения: 71
Репутация: 114
По умолчанию

Вот так сделал:

Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
  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.
Ответить с цитированием