Kirill K. Smirnov : winhelp: Improved metafile support.
Alexandre Julliard
julliard at wine.codeweavers.com
Wed Oct 18 07:39:02 CDT 2006
Module: wine
Branch: master
Commit: f9bfbe2e315c42eb7a63f1dfefcff9fcbc5e237f
URL: http://source.winehq.org/git/wine.git/?a=commit;h=f9bfbe2e315c42eb7a63f1dfefcff9fcbc5e237f
Author: Kirill K. Smirnov <lich at math.spbu.ru>
Date: Mon Oct 16 21:02:23 2006 +0400
winhelp: Improved metafile support.
---
programs/winhelp/hlpfile.c | 22 +++++++-----------
programs/winhelp/hlpfile.h | 6 +----
programs/winhelp/winhelp.c | 54 ++++++++++++++++++++++++++++++++++++++------
programs/winhelp/winhelp.h | 1 +
4 files changed, 58 insertions(+), 25 deletions(-)
diff --git a/programs/winhelp/hlpfile.c b/programs/winhelp/hlpfile.c
index 2e64270..04e5645 100644
--- a/programs/winhelp/hlpfile.c
+++ b/programs/winhelp/hlpfile.c
@@ -654,16 +654,17 @@ static BOOL HLPFILE_LoadMetaFile(BYT
unsigned long size, csize;
unsigned long off, hsoff;
BYTE* bits;
- METAFILEPICT mfp;
+ LPMETAFILEPICT lpmfp;
WINE_TRACE("Loading metafile\n");
ptr = beg + 2; /* for type and pack */
- mfp.mm = fetch_ushort(&ptr); /* mapping mode */
+ lpmfp = ¶graph->u.gfx.u.mfp;
+ lpmfp->mm = fetch_ushort(&ptr); /* mapping mode */
- mfp.xExt = GET_USHORT(ptr, 0);
- mfp.yExt = GET_USHORT(ptr, 2);
+ lpmfp->xExt = GET_USHORT(ptr, 0);
+ lpmfp->yExt = GET_USHORT(ptr, 2);
ptr += 4;
size = fetch_ulong(&ptr); /* decompressed size */
@@ -674,25 +675,20 @@ static BOOL HLPFILE_LoadMetaFile(BYT
ptr += 8;
WINE_TRACE("sz=%lu csz=%lu (%d,%d) offs=%lu/%u,%lu\n",
- size, csize, mfp.xExt, mfp.yExt, off, ptr - beg, hsoff);
+ size, csize, lpmfp->xExt, lpmfp->yExt, off, ptr - beg, hsoff);
bits = HLPFILE_DecompressGfx(beg + off, csize, size, pack);
if (!bits) return FALSE;
paragraph->cookie = para_metafile;
- mfp.hMF = NULL;
+ lpmfp->hMF = SetMetaFileBitsEx(size, bits);
- paragraph->u.gfx.u.mf.hMetaFile = SetMetaFileBitsEx(size, bits);
-
- if (!paragraph->u.gfx.u.mf.hMetaFile)
+ if (!lpmfp->hMF)
WINE_FIXME("Couldn't load metafile\n");
if (bits != beg + off) HeapFree(GetProcessHeap(), 0, bits);
- paragraph->u.gfx.u.mf.mfSize.cx = mfp.xExt;
- paragraph->u.gfx.u.mf.mfSize.cy = mfp.yExt;
-
return TRUE;
}
@@ -1930,7 +1926,7 @@ static void HLPFILE_DeleteParagraph(HLPF
next = paragraph->next;
if (paragraph->cookie == para_metafile)
- DeleteMetaFile(paragraph->u.gfx.u.mf.hMetaFile);
+ DeleteMetaFile(paragraph->u.gfx.u.mfp.hMF);
HLPFILE_FreeLink(paragraph->link);
diff --git a/programs/winhelp/hlpfile.h b/programs/winhelp/hlpfile.h
index 0818ca1..2f3ffed 100644
--- a/programs/winhelp/hlpfile.h
+++ b/programs/winhelp/hlpfile.h
@@ -69,11 +69,7 @@ typedef struct tagHlpFileParagraph
{
HBITMAP hBitmap;
} bmp;
- struct
- {
- HMETAFILE hMetaFile;
- SIZE mfSize;
- } mf;
+ METAFILEPICT mfp;
} u;
} gfx; /* for bitmaps and metafiles */
} u;
diff --git a/programs/winhelp/winhelp.c b/programs/winhelp/winhelp.c
index 6f68f82..28d464d 100644
--- a/programs/winhelp/winhelp.c
+++ b/programs/winhelp/winhelp.c
@@ -1051,11 +1051,35 @@ static LRESULT CALLBACK WINHELP_TextWndP
break;
case hlp_line_part_metafile:
{
- POINT pt;
+ HDC hMemDC;
+ HBITMAP hBitmap;
+ SIZE sz;
+ RECT rc;
- SetViewportOrgEx(hDc, part->rect.left, part->rect.top - scroll_pos, &pt);
- PlayMetaFile(hDc, part->u.metafile.hMetaFile);
- SetViewportOrgEx(hDc, pt.x, pt.y, NULL);
+ sz.cx = part->rect.right - part->rect.left;
+ sz.cy = part->rect.bottom - part->rect.top;
+ hMemDC = CreateCompatibleDC(hDc);
+ hBitmap = CreateCompatibleBitmap(hDc, sz.cx, sz.cy);
+ SelectObject(hMemDC, hBitmap);
+ SelectObject(hMemDC, win->hBrush);
+ rc.left = 0;
+ rc.top = 0;
+ rc.right = sz.cx;
+ rc.bottom = sz.cy;
+ FillRect(hMemDC, &rc, win->hBrush);
+ SetMapMode(hMemDC, part->u.metafile.mm);
+ SetWindowExtEx(hMemDC, sz.cx, sz.cy, 0);
+ SetViewportExtEx(hMemDC, sz.cx, sz.cy, 0);
+ SetWindowOrgEx(hMemDC, 0, 0, 0);
+ SetViewportOrgEx(hMemDC, 0, 0, 0);
+ PlayMetaFile(hMemDC, part->u.metafile.hMetaFile);
+ SetMapMode(hMemDC, MM_TEXT);
+ SetWindowOrgEx(hMemDC, 0, 0, 0);
+ SetViewportOrgEx(hMemDC, 0, 0, 0);
+ BitBlt(hDc, part->rect.left, part->rect.top - scroll_pos,
+ sz.cx, sz.cy, hMemDC, 0, 0, SRCCOPY);
+ DeleteDC(hMemDC);
+ DeleteObject(hBitmap);
}
break;
}
@@ -1578,8 +1602,23 @@ static BOOL WINHELP_SplitLines(HWND hWnd
gfxSize.cx = dibs.dsBm.bmWidth;
gfxSize.cy = dibs.dsBm.bmHeight;
}
- else gfxSize = p->u.gfx.u.mf.mfSize;
-
+ else
+ {
+ LPMETAFILEPICT lpmfp = &p->u.gfx.u.mfp;
+ if (lpmfp->mm == MM_ANISOTROPIC || lpmfp->mm == MM_ISOTROPIC)
+ {
+ gfxSize.cx = MulDiv(lpmfp->xExt, GetDeviceCaps(hDc, HORZRES),
+ 100*GetDeviceCaps(hDc, HORZSIZE));
+ gfxSize.cy = MulDiv(lpmfp->yExt, GetDeviceCaps(hDc, VERTRES),
+ 100*GetDeviceCaps(hDc, VERTSIZE));
+ }
+ else
+ {
+ gfxSize.cx = lpmfp->xExt;
+ gfxSize.cy = lpmfp->yExt;
+ }
+ }
+
free_width = rect.right - ((part && *line) ? (*line)->rect.right : rect.left) - space.cx;
if (free_width <= 0)
{
@@ -1601,7 +1640,8 @@ static BOOL WINHELP_SplitLines(HWND hWnd
else
{
ref_part->cookie = hlp_line_part_metafile;
- ref_part->u.metafile.hMetaFile = p->u.gfx.u.mf.hMetaFile;
+ ref_part->u.metafile.hMetaFile = p->u.gfx.u.mfp.hMF;
+ ref_part->u.metafile.mm = p->u.gfx.u.mfp.mm;
}
}
break;
diff --git a/programs/winhelp/winhelp.h b/programs/winhelp/winhelp.h
index b7227bf..7b10019 100644
--- a/programs/winhelp/winhelp.h
+++ b/programs/winhelp/winhelp.h
@@ -62,6 +62,7 @@ typedef struct tagHelpLinePart
struct
{
HMETAFILE hMetaFile;
+ INT mm;
} metafile;
} u;
HLPFILE_LINK* link;
More information about the wine-cvs
mailing list