MCPcopy Create free account
hub / github.com/NetHack/NetHack / vesa_ReadPixel32

Function vesa_ReadPixel32

sys/msdos/vidvesa.c:315–384  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

313}
314
315static unsigned long
316vesa_ReadPixel32(unsigned x, unsigned y)
317{
318 unsigned long offset = y * vesa_scan_line + x * vesa_pixel_bytes;
319 unsigned long addr, color;
320 unsigned i;
321
322 if (vesa_segment != 0) {
323 /* Linear frame buffer in use */
324 switch (vesa_pixel_size) {
325 case 8:
326 color = _farpeekb(vesa_segment, offset);
327 break;
328
329 case 15:
330 case 16:
331 color = _farpeekw(vesa_segment, offset);
332 break;
333
334 case 24:
335 /* Don't cross a 4 byte boundary if it can be avoided */
336 if (offset & 1) {
337 color = _farpeekl(vesa_segment, offset - 1) >> 8;
338 } else {
339 color = _farpeekl(vesa_segment, offset) & 0xFFFFFFFF;
340 }
341 break;
342
343 case 32:
344 color = _farpeekl(vesa_segment, offset);
345 break;
346
347 default: /* Shouldn't happen */
348 color = 0;
349 break;
350 }
351 } else {
352 switch (vesa_pixel_size) {
353 case 8:
354 addr = vesa_SetWindow(vesa_read_win, offset);
355 color = _farpeekb(_dos_ds, addr);
356 break;
357
358 case 15:
359 case 16:
360 addr = vesa_SetWindow(vesa_read_win, offset);
361 color = _farpeekw(_dos_ds, addr);
362 break;
363
364 case 24:
365 /* Pixel may cross a window boundary */
366 color = 0;
367 for (i = 0; i < 3; ++i) {
368 addr = vesa_SetWindow(vesa_read_win, offset + i);
369 color |= (unsigned long) _farpeekb(_dos_ds, addr) << (i * 8);
370 }
371 break;
372

Callers 1

vesa_DrawCursorFunction · 0.85

Calls 1

vesa_SetWindowFunction · 0.85

Tested by

no test coverage detected