[OGL] Implement wglUseFontBitmapsW

Lionel Ulmer lionel.ulmer at free.fr
Mon Jan 5 15:20:24 CST 2004


Changelog:
 - implement wglUseFontBitmapsW

-- 
		 Lionel Ulmer - http://www.bbrox.org/
-------------- next part --------------
Index: dlls/opengl32/make_opengl
===================================================================
RCS file: /home/wine/wine/dlls/opengl32/make_opengl,v
retrieving revision 1.20
diff -u -r1.20 make_opengl
--- dlls/opengl32/make_opengl	11 Jul 2003 03:51:38 -0000	1.20
+++ dlls/opengl32/make_opengl	4 Jan 2004 18:28:41 -0000
@@ -557,7 +557,7 @@
 @  stdcall wglUseFontOutlinesA(long long long long long long long ptr)
 @  stub    glGetLevelParameterfv
 @  stub    glGetLevelParameteriv
-@  stub    wglUseFontBitmapsW
+@  stdcall wglUseFontBitmapsW(long long long long)
 @  stub    wglUseFontOutlinesW
 @  stub    wglGetDefaultProcAddress
 @  stdcall wglChoosePixelFormat(long ptr) gdi32.ChoosePixelFormat
Index: dlls/opengl32/opengl32.spec
===================================================================
RCS file: /home/wine/wine/dlls/opengl32/opengl32.spec,v
retrieving revision 1.21
diff -u -r1.21 opengl32.spec
--- dlls/opengl32/opengl32.spec	8 Jul 2003 21:07:03 -0000	1.21
+++ dlls/opengl32/opengl32.spec	4 Jan 2004 18:28:41 -0000
@@ -18,7 +18,7 @@
 @  stdcall wglUseFontOutlinesA(long long long long long long long ptr)
 @  stub    glGetLevelParameterfv
 @  stub    glGetLevelParameteriv
-@  stub    wglUseFontBitmapsW
+@  stdcall wglUseFontBitmapsW(long long long long)
 @  stub    wglUseFontOutlinesW
 @  stub    wglGetDefaultProcAddress
 @  stdcall wglChoosePixelFormat(long ptr) gdi32.ChoosePixelFormat
Index: dlls/opengl32/wgl.c
===================================================================
RCS file: /home/wine/wine/dlls/opengl32/wgl.c,v
retrieving revision 1.41
diff -u -r1.41 wgl.c
--- dlls/opengl32/wgl.c	5 Dec 2003 04:43:20 -0000	1.41
+++ dlls/opengl32/wgl.c	4 Jan 2004 18:28:41 -0000
@@ -480,19 +480,12 @@
   return TRUE;
 }
 
-/***********************************************************************
- *		wglUseFontBitmapsA (OPENGL32.@)
- */
-BOOL WINAPI wglUseFontBitmapsA(HDC hdc,
-			       DWORD first,
-			       DWORD count,
-			       DWORD listBase)
+static BOOL internal_wglUseFontBitmaps(HDC hdc,
+				       DWORD first,
+				       DWORD count,
+				       DWORD listBase,
+				       DWORD WINAPI (*GetGlyphOutline_ptr)(HDC,UINT,UINT,LPGLYPHMETRICS,DWORD,LPVOID,const MAT2*))
 {
-  Font fid = get_font( hdc );
-
-  TRACE("(%p, %ld, %ld, %ld) using font %ld\n", hdc, first, count, listBase, fid);
-
-  if (fid == 0) {
     /* We are running using client-side rendering fonts... */
     GLYPHMETRICS gm;
     static const MAT2 id = { { 0, 1 }, { 0, 0 }, { 0, 0 }, { 0, 0 } };
@@ -507,67 +500,68 @@
     LEAVE_GL();
 
     for (glyph = first; glyph < first + count; glyph++) {
-      int needed_size = GetGlyphOutlineA(hdc, glyph, GGO_BITMAP, &gm, 0, NULL, &id);
-      int height, width_int;
-
-      if (needed_size == GDI_ERROR) goto error;
-      if (needed_size > size) {
-	size = needed_size;
-	if (bitmap) HeapFree(GetProcessHeap(), 0, bitmap);
-	if (gl_bitmap) HeapFree(GetProcessHeap(), 0, gl_bitmap);
-	bitmap = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, size);
-	gl_bitmap = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, size);
-      }
-      if (GetGlyphOutlineA(hdc, glyph, GGO_BITMAP, &gm, size, bitmap, &id) == GDI_ERROR) goto error;
-      if (TRACE_ON(opengl)) {
-	unsigned int height, width, bitmask;
-	unsigned char *bitmap_ = (unsigned char *) bitmap;
-
-	DPRINTF("Glyph : %d\n", glyph);
-	DPRINTF("  - bbox : %d x %d\n", gm.gmBlackBoxX, gm.gmBlackBoxY);
-	DPRINTF("  - origin : (%ld , %ld)\n", gm.gmptGlyphOrigin.x, gm.gmptGlyphOrigin.y);
-	DPRINTF("  - increment : %d - %d\n", gm.gmCellIncX, gm.gmCellIncY);
-	DPRINTF("  - size : %d\n", needed_size);
-	DPRINTF("  - bitmap : \n");
-	for (height = 0; height < gm.gmBlackBoxY; height++) {
-	  DPRINTF("      ");
-	  for (width = 0, bitmask = 0x80; width < gm.gmBlackBoxX; width++, bitmask >>= 1) {
-	    if (bitmask == 0) {
-	      bitmap_ += 1;
-	      bitmask = 0x80;
+	int needed_size = GetGlyphOutline_ptr(hdc, glyph, GGO_BITMAP, &gm, 0, NULL, &id);
+	int height, width_int;
+	
+	if (needed_size == GDI_ERROR) goto error;
+	if (needed_size > size) {
+	    size = needed_size;
+	    if (bitmap) HeapFree(GetProcessHeap(), 0, bitmap);
+	    if (gl_bitmap) HeapFree(GetProcessHeap(), 0, gl_bitmap);
+	    bitmap = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, size);
+	    gl_bitmap = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, size);
+	}
+	if (GetGlyphOutline_ptr(hdc, glyph, GGO_BITMAP, &gm, size, bitmap, &id) == GDI_ERROR) goto error;
+	if (TRACE_ON(opengl)) {
+	    unsigned int height, width, bitmask;
+	    unsigned char *bitmap_ = (unsigned char *) bitmap;
+	    
+	    DPRINTF("Glyph : %d\n", glyph);
+	    DPRINTF("  - bbox : %d x %d\n", gm.gmBlackBoxX, gm.gmBlackBoxY);
+	    DPRINTF("  - origin : (%ld , %ld)\n", gm.gmptGlyphOrigin.x, gm.gmptGlyphOrigin.y);
+	    DPRINTF("  - increment : %d - %d\n", gm.gmCellIncX, gm.gmCellIncY);
+	    DPRINTF("  - size : %d\n", needed_size);
+	    DPRINTF("  - bitmap : \n");
+	    for (height = 0; height < gm.gmBlackBoxY; height++) {
+		DPRINTF("      ");
+		for (width = 0, bitmask = 0x80; width < gm.gmBlackBoxX; width++, bitmask >>= 1) {
+		    if (bitmask == 0) {
+			bitmap_ += 1;
+			bitmask = 0x80;
+		    }
+		    if (*bitmap_ & bitmask)
+			DPRINTF("*");
+		    else
+			DPRINTF(" ");
+		}
+		bitmap_ += (4 - (((unsigned int) bitmap_) & 0x03));
+		DPRINTF("\n");
 	    }
-	    if (*bitmap_ & bitmask)
-	      DPRINTF("*");
-	    else
-	      DPRINTF(" ");
-	  }
-	  bitmap_ += (4 - (((unsigned int) bitmap_) & 0x03));
-	  DPRINTF("\n");
 	}
-      }
-
-      /* For some obscure reasons, I seem to need to rotate the glyph for OpenGL to be happy.
-	 As Wine does not seem to support the MAT2 field, I need to do it myself.... */
-      width_int = (gm.gmBlackBoxX + 31) / 32;
-      for (height = 0; height < gm.gmBlackBoxY; height++) {
-	int width;
-	for (width = 0; width < width_int; width++) {
-	  ((int *) gl_bitmap)[(gm.gmBlackBoxY - height - 1) * width_int + width] =
-	    ((int *) bitmap)[height * width_int + width];
+	
+	/* For some obscure reasons, I seem to need to rotate the glyph for OpenGL to be happy.
+	   As Wine does not seem to support the MAT2 field, I need to do it myself.... */
+	width_int = (gm.gmBlackBoxX + 31) / 32;
+	for (height = 0; height < gm.gmBlackBoxY; height++) {
+	    int width;
+	    for (width = 0; width < width_int; width++) {
+		((int *) gl_bitmap)[(gm.gmBlackBoxY - height - 1) * width_int + width] =
+		    ((int *) bitmap)[height * width_int + width];
+	    }
 	}
-      }
-
-      ENTER_GL();
-      glNewList(listBase++, GL_COMPILE);
-      glBitmap(gm.gmBlackBoxX, gm.gmBlackBoxY, gm.gmptGlyphOrigin.x, gm.gmBlackBoxY - gm.gmptGlyphOrigin.y, gm.gmCellIncX, gm.gmCellIncY, gl_bitmap);
-      glEndList();
-      LEAVE_GL();
+	
+	ENTER_GL();
+	glNewList(listBase++, GL_COMPILE);
+	glBitmap(gm.gmBlackBoxX, gm.gmBlackBoxY, gm.gmptGlyphOrigin.x,
+		 gm.gmBlackBoxY - gm.gmptGlyphOrigin.y, gm.gmCellIncX, gm.gmCellIncY, gl_bitmap);
+	glEndList();
+	LEAVE_GL();
     }
-
+    
     ENTER_GL();
     glPixelStorei(GL_UNPACK_ALIGNMENT, org_alignment);
     LEAVE_GL();
-
+    
     if (bitmap) HeapFree(GetProcessHeap(), 0, bitmap);
     if (gl_bitmap) HeapFree(GetProcessHeap(), 0, gl_bitmap);
     return TRUE;
@@ -579,9 +573,50 @@
 
     if (bitmap) HeapFree(GetProcessHeap(), 0, bitmap);
     if (gl_bitmap) HeapFree(GetProcessHeap(), 0, gl_bitmap);
-    return FALSE;
+    return FALSE;    
+}
+
+/***********************************************************************
+ *		wglUseFontBitmapsA (OPENGL32.@)
+ */
+BOOL WINAPI wglUseFontBitmapsA(HDC hdc,
+			       DWORD first,
+			       DWORD count,
+			       DWORD listBase)
+{
+  Font fid = get_font( hdc );
+
+  TRACE("(%p, %ld, %ld, %ld) using font %ld\n", hdc, first, count, listBase, fid);
+
+  if (fid == 0) {
+      return internal_wglUseFontBitmaps(hdc, first, count, listBase, GetGlyphOutlineA);
+  }
+
+  ENTER_GL();
+  /* I assume that the glyphs are at the same position for X and for Windows */
+  glXUseXFont(fid, first, count, listBase);
+  LEAVE_GL();
+  return TRUE;
+}
+
+/***********************************************************************
+ *		wglUseFontBitmapsW (OPENGL32.@)
+ */
+BOOL WINAPI wglUseFontBitmapsW(HDC hdc,
+			       DWORD first,
+			       DWORD count,
+			       DWORD listBase)
+{
+  Font fid = get_font( hdc );
+
+  TRACE("(%p, %ld, %ld, %ld) using font %ld\n", hdc, first, count, listBase, fid);
+
+  if (fid == 0) {
+      return internal_wglUseFontBitmaps(hdc, first, count, listBase, GetGlyphOutlineW);
   }
 
+  WARN("Using the glX API for the WCHAR variant - some characters may come out incorrectly !\n");
+  
   ENTER_GL();
   /* I assume that the glyphs are at the same position for X and for Windows */
   glXUseXFont(fid, first, count, listBase);


More information about the wine-patches mailing list