Author: bde Date: Fri Apr 26 13:49:06 2019 New Revision: 346745 URL: https://svnweb.freebsd.org/changeset/base/346745
Log: Fix the only known remaining (libvgl) bug for 24-bit modes, and enable support for 24-bit modes. The non-segmented case has worked for a long time, but the segmented case could never have worked since 24-bit accesses may cross a window boundary but the window was not changed in the middle of the specialized 24-bit accesses for writing a single pixel. Modified: head/lib/libvgl/main.c head/lib/libvgl/simple.c Modified: head/lib/libvgl/main.c ============================================================================== --- head/lib/libvgl/main.c Fri Apr 26 13:22:54 2019 (r346744) +++ head/lib/libvgl/main.c Fri Apr 26 13:49:06 2019 (r346745) @@ -42,8 +42,6 @@ __FBSDID("$FreeBSD$"); #include <sys/consio.h> #include "vgl.h" -/* XXX Direct Color 24bits modes unsupported */ - #define min(x, y) (((x) < (y)) ? (x) : (y)) #define max(x, y) (((x) > (y)) ? (x) : (y)) @@ -223,11 +221,9 @@ VGLInit(int mode) case 2: VGLDisplay->Type = VIDBUF16; break; -#if notyet case 3: VGLDisplay->Type = VIDBUF24; break; -#endif case 4: VGLDisplay->Type = VIDBUF32; break; Modified: head/lib/libvgl/simple.c ============================================================================== --- head/lib/libvgl/simple.c Fri Apr 26 13:22:54 2019 (r346744) +++ head/lib/libvgl/simple.c Fri Apr 26 13:49:06 2019 (r346745) @@ -51,7 +51,7 @@ static byte VGLSavePaletteBlue[256]; void VGLSetXY(VGLBitmap *object, int x, int y, u_long color) { - int offset, undermouse; + int offset, soffset, undermouse; VGLCheckSwitch(); if (x>=0 && x<object->VXsize && y>=0 && y<object->VYsize) { @@ -67,7 +67,6 @@ VGLSetXY(VGLBitmap *object, int x, int y, u_long color switch (object->Type) { case VIDBUF8S: case VIDBUF16S: - case VIDBUF24S: case VIDBUF32S: offset = VGLSetSegment(offset); /* FALLTHROUGH */ @@ -89,6 +88,25 @@ VGLSetXY(VGLBitmap *object, int x, int y, u_long color break; case 4: memcpy(&object->Bitmap[offset], &color, 4); + break; + } + break; + case VIDBUF24S: + soffset = VGLSetSegment(offset); + color = htole32(color); + switch (VGLAdpInfo.va_window_size - soffset) { + case 1: + memcpy(&object->Bitmap[soffset], &color, 1); + soffset = VGLSetSegment(offset + 1); + memcpy(&object->Bitmap[soffset], (byte *)&color + 1, 2); + break; + case 2: + memcpy(&object->Bitmap[soffset], &color, 2); + soffset = VGLSetSegment(offset + 2); + memcpy(&object->Bitmap[soffset], (byte *)&color + 2, 1); + break; + default: + memcpy(&object->Bitmap[soffset], &color, 3); break; } break; _______________________________________________ svn-src-head@freebsd.org mailing list https://lists.freebsd.org/mailman/listinfo/svn-src-head To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"