Implement wglUseFontBitmapsW.
authorLionel Ulmer <lionel.ulmer@free.fr>
Tue, 6 Jan 2004 00:36:13 +0000 (00:36 +0000)
committerAlexandre Julliard <julliard@winehq.org>
Tue, 6 Jan 2004 00:36:13 +0000 (00:36 +0000)
dlls/opengl32/make_opengl
dlls/opengl32/opengl32.spec
dlls/opengl32/wgl.c

index 12962c66674a790065965f203e712d22872e9371..fae0d7329d815617f259e263befd9cf42ee9897c 100755 (executable)
@@ -557,7 +557,7 @@ print SPEC "@  stdcall wglCreateContext(long)
 @  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 b050f1fd1c80754c78bdbd41f973afac5035e6c3..08a6e7d041eecb643953157aac876a6e4be22299 100644 (file)
@@ -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 948f50858712e0a45bd01dea85035107fd6af57b..989f4bbd5b11086c99923e84279414a0c44601d0 100644 (file)
@@ -480,19 +480,12 @@ BOOL WINAPI wglSwapLayerBuffers(HDC hdc,
   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 @@ BOOL WINAPI wglUseFontBitmapsA(HDC hdc,
     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 @@ BOOL WINAPI wglUseFontBitmapsA(HDC hdc,
 
     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);