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 } };
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;
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);