Changelog: - implement wglUseFontBitmapsW -- Lionel Ulmer - http://www.bbrox.org/
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);