Сообщение от impersonalis
For y=0 To GraphicsHeight()-1
For x=0 To GraphicsWidth() -1
Что любопытно - на некоторых моделях карточек драйвер (я так понимаю) сам фиксит выход за пределы, на некоторых же происходит ошибка
|
Нет, драйвер здесь не причем, чтение происходит из массива в оперативной памяти (смотри структуру
http://www.tesko-sport.ru/temp/buffer.gif)
А теперь смотри дизасм ReadPixelFast:

ReadPixelFast(x, y, buffer)
{
00D90069: 81EC0C000000 sub esp, 0000000Ch
00D9006F: 8B5DF8 mov ebx, [ebp-08h]
00D90072: 895C2404 mov [esp+04h], ebx <- y
00D90076: 8B75F4 mov esi, [ebp-0Ch]
00D90079: 89742408 mov [esp+08h], esi <- buffer
00D9007D: 8B45FC mov eax, [ebp-04h]
00D90080: 890424 mov [esp], eax <- x
00D90083: E8E85FBDFF call 00966070h
}
call 00966070h
{
00966070: 8B44240C mov eax, [esp+0Ch] <- адрес буфера
00966074: 85C0 test eax, eax <- не указан?
00966076: 7505 jnz 96607Dh
00966078: A1700FA700 mov eax, [A70F70h] <- используем текущий буфер
0096607D: 8B4868 mov ecx, [eax+68h] <- байтов на пиксель (depth)
00966080: 8B5038 mov edx, [eax+38h] <- байтов на строку пикселей (pitch)
00966083: 0FAF4C2404 imul ecx, [esp+04h] <- x * depth
00966088: 0FAF542408 imul edx, [esp+08h] <- y * pitch
0096608D: 03CA add ecx, edx <- x * depth + y * pitch
0096608F: 034848 add ecx, [eax+48h] <- адрес массива + x * depth + y * pitch
00966092: FF908C000000 call [eax+0000008Ch] <- читаем значение по полученому адресу
00966098: C20C00 retn 000Ch
}
call [eax+0000008Ch]
{
00EA0040: 53 push ebx
00EA0041: 8B01 mov eax, [ecx]
00EA0043: 5B pop ebx
00EA0044: 0D000000FF Or eax, FF000000h
00EA0049: C3 ret
}
Обрати внимание на смещения, те же что и в структуре на картинке, так что там простое чтение с массива