Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 26 Apr 2019 13:49:06 +0000 (UTC)
From:      Bruce Evans <bde@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r346745 - head/lib/libvgl
Message-ID:  <201904261349.x3QDn64N096804@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
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;



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201904261349.x3QDn64N096804>