summaryrefslogtreecommitdiff
path: root/lib/libvgl
diff options
context:
space:
mode:
authorBruce Evans <bde@FreeBSD.org>2019-04-26 13:49:06 +0000
committerBruce Evans <bde@FreeBSD.org>2019-04-26 13:49:06 +0000
commitea0a99050980bc03a41f85ba86712a773f9989c8 (patch)
treee8359b7abdd5884e78faaec3127e39e42290b9e2 /lib/libvgl
parenta73b15498c3b411cf9bdf8b1eb6583b1fd9aa281 (diff)
downloadsrc-test2-ea0a99050980bc03a41f85ba86712a773f9989c8.tar.gz
src-test2-ea0a99050980bc03a41f85ba86712a773f9989c8.zip
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.
Notes
Notes: svn path=/head/; revision=346745
Diffstat (limited to 'lib/libvgl')
-rw-r--r--lib/libvgl/main.c4
-rw-r--r--lib/libvgl/simple.c22
2 files changed, 20 insertions, 6 deletions
diff --git a/lib/libvgl/main.c b/lib/libvgl/main.c
index 27761f00dcf3..09d646892c23 100644
--- a/lib/libvgl/main.c
+++ b/lib/libvgl/main.c
@@ -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;
diff --git a/lib/libvgl/simple.c b/lib/libvgl/simple.c
index 204b9afb440b..9cb4311b033c 100644
--- a/lib/libvgl/simple.c
+++ b/lib/libvgl/simple.c
@@ -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 */
@@ -92,6 +91,25 @@ VGLSetXY(VGLBitmap *object, int x, int y, u_long color)
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;
case VIDBUF8X:
outb(0x3c4, 0x02);
outb(0x3c5, 0x01 << (x&0x3));