static int VGL_FlipHWSurface(_THIS, SDL_Surface *surface) { if (VGLPanScreen(VGLDisplay, 0, flip_page * surface->h) < 0) { SDL_SetError("VGLPanSreen() failed"); return -1; } flip_page = !flip_page; surface->pixels = flip_address[flip_page]; return 0; }
int GGI_vgl_setorigin(ggi_visual *vis,int x,int y) { ggi_mode *mode=LIBGGI_MODE(vis); if ( x<0 || x> mode->virt.x-mode->visible.x || y<0 || y> mode->virt.y-mode->visible.y ) return GGI_ENOSPACE; if (VGLPanScreen(VGLDisplay, x, y)) return -1; return 0; }
void VGLCheckSwitch(void) { if (VGLAbortPending) { VGLEnd(); exit(0); } while (VGLSwitchPending) { unsigned int offset; unsigned int len; int i; VGLSwitchPending = 0; if (VGLOnDisplay) { ioctl(0, KDENABIO, 0); ioctl(0, KDSETMODE, KD_GRAPHICS); ioctl(0, VGLMode, 0); VGLCurWindow = 0; VGLMem = (byte*)mmap(0, VGLAdpInfo.va_window_size, PROT_READ|PROT_WRITE, MAP_FILE, 0, 0); /* XXX: what if mmap() has failed! */ VGLDisplay->Type = VIDBUF8; /* XXX */ switch (VGLModeInfo.vi_mem_model) { case V_INFO_MM_PLANAR: if (VGLModeInfo.vi_depth == 4 && VGLModeInfo.vi_planes == 4) { if (VGLBufSize/VGLModeInfo.vi_planes > VGLAdpInfo.va_window_size) VGLDisplay->Type = VIDBUF4S; else VGLDisplay->Type = VIDBUF4; } else { /* shouldn't be happening */ } break; case V_INFO_MM_PACKED: if (VGLModeInfo.vi_depth == 8) { if (VGLBufSize/VGLModeInfo.vi_planes > VGLAdpInfo.va_window_size) VGLDisplay->Type = VIDBUF8S; else VGLDisplay->Type = VIDBUF8; } else { /* shouldn't be happening */ } break; case V_INFO_MM_VGAX: VGLDisplay->Type = VIDBUF8X; break; default: /* shouldn't be happening */ break; } VGLDisplay->Bitmap = VGLMem; VGLDisplay->Xsize = VGLModeInfo.vi_width; VGLDisplay->Ysize = VGLModeInfo.vi_height; VGLSetVScreenSize(VGLDisplay, VGLDisplay->VXsize, VGLDisplay->VYsize); VGLPanScreen(VGLDisplay, VGLDisplay->Xorigin, VGLDisplay->Yorigin); switch (VGLDisplay->Type) { case VIDBUF4S: outb(0x3c6, 0xff); outb(0x3ce, 0x01); outb(0x3cf, 0x00); /* set/reset enable */ outb(0x3ce, 0x08); outb(0x3cf, 0xff); /* bit mask */ for (offset = 0; offset < VGLBufSize/VGLModeInfo.vi_planes; offset += len) { VGLSetSegment(offset); len = min(VGLBufSize/VGLModeInfo.vi_planes - offset, VGLAdpInfo.va_window_size); for (i = 0; i < VGLModeInfo.vi_planes; i++) { outb(0x3c4, 0x02); outb(0x3c5, 0x01<<i); bcopy(&VGLBuf[i*VGLBufSize/VGLModeInfo.vi_planes + offset], VGLMem, len); } } break; case VIDBUF4: case VIDBUF8X: outb(0x3c6, 0xff); outb(0x3ce, 0x01); outb(0x3cf, 0x00); /* set/reset enable */ outb(0x3ce, 0x08); outb(0x3cf, 0xff); /* bit mask */ for (i = 0; i < VGLModeInfo.vi_planes; i++) { outb(0x3c4, 0x02); outb(0x3c5, 0x01<<i); bcopy(&VGLBuf[i*VGLAdpInfo.va_window_size], VGLMem, VGLAdpInfo.va_window_size); } break; case VIDBUF8: case VIDBUF8S: for (offset = 0; offset < VGLBufSize; offset += len) { VGLSetSegment(offset); len = min(VGLBufSize - offset, VGLAdpInfo.va_window_size); bcopy(&VGLBuf[offset], VGLMem, len); } break; } VGLRestorePalette(); ioctl(0, VT_RELDISP, VT_ACKACQ); } else { switch (VGLDisplay->Type) { case VIDBUF4S: for (offset = 0; offset < VGLBufSize/VGLModeInfo.vi_planes; offset += len) { VGLSetSegment(offset); len = min(VGLBufSize/VGLModeInfo.vi_planes - offset, VGLAdpInfo.va_window_size); for (i = 0; i < VGLModeInfo.vi_planes; i++) { outb(0x3ce, 0x04); outb(0x3cf, i); bcopy(VGLMem, &VGLBuf[i*VGLBufSize/VGLModeInfo.vi_planes + offset], len); } } break; case VIDBUF4: case VIDBUF8X: /* * NOTE: the saved buffer is NOT in the MEMBUF format which * the ordinary memory bitmap object is stored in. XXX */ for (i = 0; i < VGLModeInfo.vi_planes; i++) { outb(0x3ce, 0x04); outb(0x3cf, i); bcopy(VGLMem, &VGLBuf[i*VGLAdpInfo.va_window_size], VGLAdpInfo.va_window_size); } break; case VIDBUF8: case VIDBUF8S: for (offset = 0; offset < VGLBufSize; offset += len) { VGLSetSegment(offset); len = min(VGLBufSize - offset, VGLAdpInfo.va_window_size); bcopy(VGLMem, &VGLBuf[offset], len); } break; } VGLMem = MAP_FAILED; munmap(VGLDisplay->Bitmap, VGLAdpInfo.va_window_size); ioctl(0, VGLOldMode, 0); ioctl(0, KDSETMODE, KD_TEXT); ioctl(0, KDDISABIO, 0); ioctl(0, VT_RELDISP, VT_TRUE); VGLDisplay->Bitmap = VGLBuf; VGLDisplay->Type = MEMBUF; VGLDisplay->Xsize = VGLDisplay->VXsize; VGLDisplay->Ysize = VGLDisplay->VYsize; while (!VGLOnDisplay) pause(); } } }