diff options
author | nsouch <nsouch@FreeBSD.org> | 2001-01-13 11:30:17 +0000 |
---|---|---|
committer | nsouch <nsouch@FreeBSD.org> | 2001-01-13 11:30:17 +0000 |
commit | a5fd80c2f50ce9eac5e6ae428320a9f4cf65238a (patch) | |
tree | 1de7b3a3598deed6d5ca5a6b8e6ec5885985355e /lib/libvgl/main.c | |
parent | 759414f218cbac7e3bb7e789f8f86f917cd37003 (diff) | |
download | FreeBSD-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.c | 79 |
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); |