Output via GRADD
#include
PBYTE pVRAM;
FOURCC ScreenColorFormat;
ULONG ScanLineSize;
ULONG ScreenWidth;
ULONG ScreenHeight;
ULONG BPP;
PBYTE PointPtr;
INITPROCOUT initout;
GDDMODEINFO ScreenModeInfo;
HWREQIN hwreqin;
RECTL rctl;
ULONG rc;
/* получим указатель на начало видеопамяти */
initout.ulLength = sizeof(initout);
rc = VMIEntry(0, VMI_CMD_INITPROC, NULL, &initout);
if (rc) {
// ошибка, чего-то где-то не так
}
pVRAM = (PBYTE)(initout.ulVRAMVirt);
/* теперь получим информацию об экранном режиме */
ScreenModeInfo.ulLength = sizeof(ScreenModeInfo);
rc = VMIEntry(0, VMI_CMD_QUERYCURRENTMODE, NULL. &ScreenModeInfo);
ScreenWidth = ScreenModeInfo.ulHorizResolution;
ScreenHeight = ScreenModeInfo.ulVertResolution;
ScanLineSize = ScreenModeInfo.ulScanLineSize;
ScreenColorFormat = ScreenModeInfo.fccColorEncoding;
/* получим количество байт на пиксель */
switch (ScreenColorFormat) {
case FOURCC_LUT8: // 256 цветов с палитрой
BPP = 1;
break;
case FOURCC_R555: // 32768 цветов
case FOURCC_R565: // 65536 цветов
BPP = 2;
break;
case FOURCC_RGB3: // 16 млн цветов, три байта на пиксель
case FOURCC_BGR3: // обратный порядок байт
BPP = 3;
break;
case FOURCC_RGB4:
case FOURCC_BGR4: // 16 млн цветов, четыре байта на пиксель
BPP = 4;
break;
}
/* Теперь чтобы нарисуем точку на экране с координатами x,y */
PointPtr = pVRAM + y*ScanLineSize + x*BPP;
/* Захватываем экран, чтобы не было глюков */
hwreqin.ulLength = sizeof(hwreqin);
hwreqin.ulFlags = REQUEST_HW;
/* мы пишем в экран, нужно сообщить об этом градду,
на случай если используется софтверный курсор */
hwreqin.cScrChangeRects = 1;
hwreqin.arectlScreen = &rctl;
/* в rctl нужно запихать координаты прямоугольника, в котором мы рисуем */
rc = VMIEntry(0, VMI_CMD_REQUESTHW, &hwreqin, NULL);
if (rc) {
// чего-то некругло, в экран писать нельзя!
}
/* Допустим у нас экран в R565 - формате, то есть два байта на пиксель */
*((PUSHORT)(PointPtr)) = Color;
/* освободим видюху */
hwreqin.ulFlags = 0;
rc = VMIEntry(0, VMI_CMD_REQUESTHW, &hwreqin, NULL);
|