void display( VGLBitmap *pic, byte *red, byte *green, byte *blue, struct action *e) { VGLBitmap target; int x,y,i=0,j=0; VGLMouseMode(VGL_MOUSEHIDE); VGLRestorePalette(); /* XXX Broken in r!=2. Libvgl bug. */ //VGLClear(VGLDisplay,0); VGLBitmapCopy(&bkg,0,0,VGLDisplay,0,0,bkg.Xsize,bkg.Ysize); if(e!=NULL) { if(e->zoom!=1 || e->rotate) { target.Bitmap=(byte *)calloc(pic->Xsize*pic->Ysize*e->zoom*e->zoom,1); if(e->rotate) { target.Xsize=pic->Ysize*e->zoom; target.Ysize=pic->Xsize*e->zoom; } else { target.Xsize=pic->Xsize*e->zoom; target.Ysize=pic->Ysize*e->zoom; } target.Type=pic->Type; for(x=0;x<pic->Xsize;x++) { for(y=0;y<pic->Ysize;y++) { for(i=0;i<e->zoom;i++) { for(j=0;j<e->zoom;j++) { if(e->rotate) { VGLSetXY(&target,target.Xsize-(e->zoom*y+i),e->zoom*x+j,VGLGetXY(pic,x,y)); } else { VGLSetXY(&target,e->zoom*x+i,e->zoom*y+j,VGLGetXY(pic,x,y)); } } } } } } else { target.Bitmap=(byte *)calloc(pic->Xsize*pic->Ysize,sizeof(byte)); target.Xsize=pic->Xsize; target.Ysize=pic->Ysize; target.Type=pic->Type; VGLBitmapCopy(pic,0,0,&target,0,0,pic->Xsize,pic->Ysize); } } else { target.Bitmap=(byte *)calloc(pic->Xsize*pic->Ysize,sizeof(byte)); target.Xsize=pic->Xsize; target.Ysize=pic->Ysize; target.Type=pic->Type; VGLBitmapCopy(pic,0,0,&target,0,0,pic->Xsize,pic->Ysize); } VGLSetPalette(red, green, blue); if(e!=NULL) { VGLBitmapCopy(&target,0,0,VGLDisplay,e->Xshift,e->Yshift,target.Xsize,target.Ysize); } else { VGLBitmapCopy(&target,0,0,VGLDisplay,0,0,target.Xsize,target.Ysize); } VGLMouseMode(VGL_MOUSESHOW); free(target.Bitmap); }
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(); } } }