Mesa (master): st/wgl: Implement wglUseFontBitmaps.

Brian Paul brianp at kemper.freedesktop.org
Thu Jul 6 23:26:13 UTC 2017


Module: Mesa
Branch: master
Commit: 43dea65ad2e8259330849aa7a3e1ed86db5a5d0f
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=43dea65ad2e8259330849aa7a3e1ed86db5a5d0f

Author: Olivier Lauffenburger <o.lauffenburger at topsolid.com>
Date:   Thu Jul  6 09:27:00 2017 -0600

st/wgl: Implement wglUseFontBitmaps.

wglUseFontBitmaps is currently a noop.
This patch implements this function for Windows.
Misc code clean-ups by Brian.

Signed-off-by: Olivier Lauffenburger <o.lauffenburger at topsolid.com>
Reviewed-by: Brian Paul <brianp at vmware.com>

---

 src/gallium/state_trackers/wgl/stw_wgl.c | 65 ++++++++++++++++++++++++--------
 1 file changed, 49 insertions(+), 16 deletions(-)

diff --git a/src/gallium/state_trackers/wgl/stw_wgl.c b/src/gallium/state_trackers/wgl/stw_wgl.c
index de4b4f6f3b..532a5adb95 100644
--- a/src/gallium/state_trackers/wgl/stw_wgl.c
+++ b/src/gallium/state_trackers/wgl/stw_wgl.c
@@ -214,14 +214,7 @@ wglUseFontBitmapsA(
    DWORD count,
    DWORD listBase )
 {
-   (void) hdc;
-   (void) first;
-   (void) count;
-   (void) listBase;
-
-   assert( 0 );
-
-   return FALSE;
+   return wglUseFontBitmapsW(hdc, first, count, listBase);
 }
 
 WINGDIAPI BOOL APIENTRY
@@ -240,14 +233,54 @@ wglUseFontBitmapsW(
    DWORD count,
    DWORD listBase )
 {
-   (void) hdc;
-   (void) first;
-   (void) count;
-   (void) listBase;
-
-   assert( 0 );
-
-   return FALSE;
+   GLYPHMETRICS gm;
+   MAT2 tra;
+   FIXED one, minus_one, zero;
+   void *buffer = NULL;
+   BOOL result = TRUE;
+
+   one.value = 1;
+   one.fract = 0;
+   minus_one.value = -1;
+   minus_one.fract = 0;
+   zero.value = 0;
+   zero.fract = 0;
+
+   tra.eM11 = one;
+   tra.eM22 = minus_one;
+   tra.eM12 = tra.eM21 = zero;
+
+   for (int i = 0; i < count; i++) {
+      DWORD size = GetGlyphOutline(hdc, first + i, GGO_BITMAP, &gm, 0,
+                                   NULL, &tra);
+
+      glNewList(listBase + i, GL_COMPILE);
+
+      if (size != GDI_ERROR) {
+         if (size == 0) {
+            glBitmap(0, 0, -gm.gmptGlyphOrigin.x, gm.gmptGlyphOrigin.y,
+                     gm.gmCellIncX, gm.gmCellIncY, NULL);
+         }
+         else {
+            buffer = realloc(buffer, size);
+            size = GetGlyphOutline(hdc, first + i, GGO_BITMAP, &gm,
+                                   size, buffer, &tra);
+
+            glBitmap(gm.gmBlackBoxX, gm.gmBlackBoxY,
+                     -gm.gmptGlyphOrigin.x, gm.gmptGlyphOrigin.y,
+                     gm.gmCellIncX, gm.gmCellIncY, buffer);
+         }
+      }
+      else {
+         result = FALSE;
+      }
+
+      glEndList();
+   }
+
+   free(buffer);
+
+   return result;
 }
 
 WINGDIAPI BOOL APIENTRY




More information about the mesa-commit mailing list