summaryrefslogtreecommitdiffstats
path: root/lib/libvgl/main.c
diff options
context:
space:
mode:
authornsouch <nsouch@FreeBSD.org>2001-01-13 11:30:17 +0000
committernsouch <nsouch@FreeBSD.org>2001-01-13 11:30:17 +0000
commita5fd80c2f50ce9eac5e6ae428320a9f4cf65238a (patch)
tree1de7b3a3598deed6d5ca5a6b8e6ec5885985355e /lib/libvgl/main.c
parent759414f218cbac7e3bb7e789f8f86f917cd37003 (diff)
downloadFreeBSD-src-a5fd80c2f50ce9eac5e6ae428320a9f4cf65238a.zip
FreeBSD-src-a5fd80c2f50ce9eac5e6ae428320a9f4cf65238a.tar.gz
Add Truecolor 16 and 32bits support. Note that 24bits modes are not
supported since it's not easy to put 3 bytes accross 64Kb windows of memory. This should not be such a problem with linear framebuffers. There is no major interface modification except that the color type becomes u_long instead of byte. So one just need to recompile his application. Approved by: Soren Schmidt <sos@freebsd.dk>
Diffstat (limited to 'lib/libvgl/main.c')
-rw-r--r--lib/libvgl/main.c79
1 files changed, 75 insertions, 4 deletions
diff --git a/lib/libvgl/main.c b/lib/libvgl/main.c
index 6047fec..635c29c 100644
--- a/lib/libvgl/main.c
+++ b/lib/libvgl/main.c
@@ -39,6 +39,8 @@
#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))
@@ -178,6 +180,25 @@ VGLInit(int mode)
case V_INFO_MM_VGAX:
VGLDisplay->Type = VIDBUF8X;
break;
+ case V_INFO_MM_DIRECT:
+ VGLDisplay->PixelBytes = VGLModeInfo.vi_pixel_size;
+ switch (VGLDisplay->PixelBytes) {
+ case 2:
+ VGLDisplay->Type = VIDBUF16;
+ break;
+#if notyet
+ case 3:
+ VGLDisplay->Type = VIDBUF24;
+ break;
+#endif
+ case 4:
+ VGLDisplay->Type = VIDBUF32;
+ break;
+ default:
+ VGLEnd();
+ return -4;
+ }
+ break;
default:
VGLEnd();
return -4;
@@ -224,10 +245,26 @@ VGLInit(int mode)
/* see if we are in the windowed buffer mode or in the linear buffer mode */
if (VGLBufSize/VGLModeInfo.vi_planes > VGLAdpInfo.va_window_size) {
- if (VGLDisplay->Type == VIDBUF4)
+ switch (VGLDisplay->Type) {
+ case VIDBUF4:
VGLDisplay->Type = VIDBUF4S;
- else if (VGLDisplay->Type == VIDBUF8)
+ break;
+ case VIDBUF8:
VGLDisplay->Type = VIDBUF8S;
+ break;
+ case VIDBUF16:
+ VGLDisplay->Type = VIDBUF16S;
+ break;
+ case VIDBUF24:
+ VGLDisplay->Type = VIDBUF24S;
+ break;
+ case VIDBUF32:
+ VGLDisplay->Type = VIDBUF32S;
+ break;
+ default:
+ VGLEnd();
+ return -8;
+ }
}
VGLMode = mode;
@@ -308,13 +345,35 @@ VGLCheckSwitch()
VGLDisplay->Type = VIDBUF8S;
else
VGLDisplay->Type = VIDBUF8;
- } else {
- /* shouldn't be happening */
}
break;
case V_INFO_MM_VGAX:
VGLDisplay->Type = VIDBUF8X;
break;
+ case V_INFO_MM_DIRECT:
+ switch (VGLModeInfo.vi_pixel_size) {
+ case 2:
+ if (VGLBufSize/VGLModeInfo.vi_planes > VGLAdpInfo.va_window_size)
+ VGLDisplay->Type = VIDBUF16S;
+ else
+ VGLDisplay->Type = VIDBUF16;
+ break;
+ case 3:
+ if (VGLBufSize/VGLModeInfo.vi_planes > VGLAdpInfo.va_window_size)
+ VGLDisplay->Type = VIDBUF24S;
+ else
+ VGLDisplay->Type = VIDBUF24;
+ break;
+ case 4:
+ if (VGLBufSize/VGLModeInfo.vi_planes > VGLAdpInfo.va_window_size)
+ VGLDisplay->Type = VIDBUF32S;
+ else
+ VGLDisplay->Type = VIDBUF32;
+ break;
+ default:
+ /* shouldn't be happening */
+ break;
+ }
default:
/* shouldn't be happening */
break;
@@ -357,6 +416,12 @@ VGLCheckSwitch()
break;
case VIDBUF8:
case VIDBUF8S:
+ case VIDBUF16:
+ case VIDBUF16S:
+ case VIDBUF24:
+ case VIDBUF24S:
+ case VIDBUF32:
+ case VIDBUF32S:
for (offset = 0; offset < VGLBufSize; offset += len) {
VGLSetSegment(offset);
len = min(VGLBufSize - offset, VGLAdpInfo.va_window_size);
@@ -398,6 +463,12 @@ VGLCheckSwitch()
break;
case VIDBUF8:
case VIDBUF8S:
+ case VIDBUF16:
+ case VIDBUF16S:
+ case VIDBUF24:
+ case VIDBUF24S:
+ case VIDBUF32:
+ case VIDBUF32S:
for (offset = 0; offset < VGLBufSize; offset += len) {
VGLSetSegment(offset);
len = min(VGLBufSize - offset, VGLAdpInfo.va_window_size);
OpenPOWER on IntegriCloud