diff --git a/lib/libvgl/bitmap.c b/lib/libvgl/bitmap.c index f98f533acd1c..aa75daa2ac29 100644 --- a/lib/libvgl/bitmap.c +++ b/lib/libvgl/bitmap.c @@ -338,8 +338,8 @@ __VGLBitmapCopy(VGLBitmap *src, int srcx, int srcy, byte buffer[2048]; /* XXX */ byte *p; - if (width > sizeof(buffer)) { - p = malloc(width); + if (width * src->PixelBytes > sizeof(buffer)) { + p = malloc(width * src->PixelBytes); if (p == NULL) return 1; } else { @@ -349,7 +349,7 @@ __VGLBitmapCopy(VGLBitmap *src, int srcx, int srcy, ReadVerticalLine(src, srcx, srcline, width, p); WriteVerticalLine(dst, dstx, dstline, width, p); } - if (width > sizeof(buffer)) + if (width * src->PixelBytes > sizeof(buffer)) free(p); } return 0; @@ -387,6 +387,7 @@ VGLBitmap object->Xorigin = 0; object->Yorigin = 0; object->Bitmap = bits; + object->PixelBytes = VGLDisplay->PixelBytes; return object; } @@ -401,7 +402,7 @@ VGLBitmapDestroy(VGLBitmap *object) int VGLBitmapAllocateBits(VGLBitmap *object) { - object->Bitmap = (byte *)malloc(object->VXsize*object->VYsize); + object->Bitmap = malloc(object->VXsize*object->VYsize*object->PixelBytes); if (object->Bitmap == NULL) return -1; return 0; diff --git a/lib/libvgl/main.c b/lib/libvgl/main.c index 99563727ecb0..12f2c648d0e3 100644 --- a/lib/libvgl/main.c +++ b/lib/libvgl/main.c @@ -132,7 +132,7 @@ int VGLInit(int mode) { struct vt_mode smode; - int adptype; + int adptype, depth; if (VGLInitDone) return -1; @@ -188,6 +188,7 @@ VGLInit(int mode) return -4; } VGLDisplay->Type = VIDBUF4; + VGLDisplay->PixelBytes = 1; break; case V_INFO_MM_PACKED: /* we can do only 256 color packed modes */ @@ -294,8 +295,11 @@ VGLInit(int mode) VGLDisplay->Xsize = VGLModeInfo.vi_width; VGLDisplay->Ysize = VGLModeInfo.vi_height; + depth = VGLModeInfo.vi_depth; + if (depth == 15) + depth = 16; VGLDisplay->VXsize = VGLAdpInfo.va_line_width - *8/(VGLModeInfo.vi_depth/VGLModeInfo.vi_planes); + *8/(depth/VGLModeInfo.vi_planes); VGLDisplay->VYsize = VGLBufSize/VGLModeInfo.vi_planes/VGLAdpInfo.va_line_width; VGLDisplay->Xorigin = 0; VGLDisplay->Yorigin = 0; @@ -530,6 +534,8 @@ VGLSetSegment(unsigned int offset) int VGLSetVScreenSize(VGLBitmap *object, int VXsize, int VYsize) { + int depth; + if (VXsize < object->Xsize || VYsize < object->Ysize) return -1; if (object->Type == MEMBUF) @@ -537,8 +543,11 @@ VGLSetVScreenSize(VGLBitmap *object, int VXsize, int VYsize) if (ioctl(0, FBIO_SETLINEWIDTH, &VXsize)) return -1; ioctl(0, CONS_ADPINFO, &VGLAdpInfo); /* FBIO_ADPINFO */ + depth = VGLModeInfo.vi_depth; + if (depth == 15) + depth = 16; object->VXsize = VGLAdpInfo.va_line_width - *8/(VGLModeInfo.vi_depth/VGLModeInfo.vi_planes); + *8/(depth/VGLModeInfo.vi_planes); object->VYsize = VGLBufSize/VGLModeInfo.vi_planes/VGLAdpInfo.va_line_width; if (VYsize < object->VYsize) object->VYsize = VYsize; diff --git a/lib/libvgl/mouse.c b/lib/libvgl/mouse.c index f38c4bf9f34e..40b15e707163 100644 --- a/lib/libvgl/mouse.c +++ b/lib/libvgl/mouse.c @@ -82,7 +82,7 @@ static VGLBitmap VGLMouseStdAndMask = static VGLBitmap VGLMouseStdOrMask = VGLBITMAP_INITIALIZER(MEMBUF, MOUSE_IMG_SIZE, MOUSE_IMG_SIZE, StdOrMask); static VGLBitmap *VGLMouseAndMask, *VGLMouseOrMask; -static byte map[MOUSE_IMG_SIZE*MOUSE_IMG_SIZE]; +static byte map[MOUSE_IMG_SIZE*MOUSE_IMG_SIZE*4]; static VGLBitmap VGLMouseSave = VGLBITMAP_INITIALIZER(MEMBUF, MOUSE_IMG_SIZE, MOUSE_IMG_SIZE, map); static int VGLMouseVisible = 0; @@ -95,7 +95,7 @@ static int VGLMouseButtons = 0; void VGLMousePointerShow() { - byte buf[MOUSE_IMG_SIZE*MOUSE_IMG_SIZE]; + byte buf[MOUSE_IMG_SIZE*MOUSE_IMG_SIZE*4]; VGLBitmap buffer = VGLBITMAP_INITIALIZER(MEMBUF, MOUSE_IMG_SIZE, MOUSE_IMG_SIZE, buf); byte crtcidx, crtcval, gdcidx, gdcval; diff --git a/lib/libvgl/vgl.h b/lib/libvgl/vgl.h index 267c7a0f1673..67b1d0e56ce1 100644 --- a/lib/libvgl/vgl.h +++ b/lib/libvgl/vgl.h @@ -49,7 +49,7 @@ typedef struct { } VGLBitmap; #define VGLBITMAP_INITIALIZER(t, x, y, bits) \ - { (t), (x), (y), (x), (y), 0, 0, (bits) } + { (t), (x), (y), (x), (y), 0, 0, (bits), -1 } /* * Defined Type's