Тема: ReadPixelFast...
Показать сообщение отдельно
Старый 12.12.2010, 04:12   #4
Venom2
 
Сообщений: n/a
Ответ: ReadPixelFast...

Сообщение от 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 
}
Обрати внимание на смещения, те же что и в структуре на картинке, так что там простое чтение с массива
 
Ответить с цитированием
Эти 2 пользователя(ей) сказали Спасибо за это полезное сообщение:
Crayzi (12.12.2010), impersonalis (12.12.2010)