Commit f9bfbe2e authored by Kirill K. Smirnov's avatar Kirill K. Smirnov Committed by Alexandre Julliard

winhelp: Improved metafile support.

parent e852f195
...@@ -654,16 +654,17 @@ static BOOL HLPFILE_LoadMetaFile(BYTE* beg, BYTE pack, HLPFILE_PARAGRAPH* pa ...@@ -654,16 +654,17 @@ static BOOL HLPFILE_LoadMetaFile(BYTE* beg, BYTE pack, HLPFILE_PARAGRAPH* pa
unsigned long size, csize; unsigned long size, csize;
unsigned long off, hsoff; unsigned long off, hsoff;
BYTE* bits; BYTE* bits;
METAFILEPICT mfp; LPMETAFILEPICT lpmfp;
WINE_TRACE("Loading metafile\n"); WINE_TRACE("Loading metafile\n");
ptr = beg + 2; /* for type and pack */ ptr = beg + 2; /* for type and pack */
mfp.mm = fetch_ushort(&ptr); /* mapping mode */ lpmfp = &paragraph->u.gfx.u.mfp;
lpmfp->mm = fetch_ushort(&ptr); /* mapping mode */
mfp.xExt = GET_USHORT(ptr, 0); lpmfp->xExt = GET_USHORT(ptr, 0);
mfp.yExt = GET_USHORT(ptr, 2); lpmfp->yExt = GET_USHORT(ptr, 2);
ptr += 4; ptr += 4;
size = fetch_ulong(&ptr); /* decompressed size */ size = fetch_ulong(&ptr); /* decompressed size */
...@@ -674,25 +675,20 @@ static BOOL HLPFILE_LoadMetaFile(BYTE* beg, BYTE pack, HLPFILE_PARAGRAPH* pa ...@@ -674,25 +675,20 @@ static BOOL HLPFILE_LoadMetaFile(BYTE* beg, BYTE pack, HLPFILE_PARAGRAPH* pa
ptr += 8; ptr += 8;
WINE_TRACE("sz=%lu csz=%lu (%d,%d) offs=%lu/%u,%lu\n", 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); bits = HLPFILE_DecompressGfx(beg + off, csize, size, pack);
if (!bits) return FALSE; if (!bits) return FALSE;
paragraph->cookie = para_metafile; paragraph->cookie = para_metafile;
mfp.hMF = NULL; lpmfp->hMF = SetMetaFileBitsEx(size, bits);
paragraph->u.gfx.u.mf.hMetaFile = SetMetaFileBitsEx(size, bits); if (!lpmfp->hMF)
if (!paragraph->u.gfx.u.mf.hMetaFile)
WINE_FIXME("Couldn't load metafile\n"); WINE_FIXME("Couldn't load metafile\n");
if (bits != beg + off) HeapFree(GetProcessHeap(), 0, bits); 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; return TRUE;
} }
...@@ -1930,7 +1926,7 @@ static void HLPFILE_DeleteParagraph(HLPFILE_PARAGRAPH* paragraph) ...@@ -1930,7 +1926,7 @@ static void HLPFILE_DeleteParagraph(HLPFILE_PARAGRAPH* paragraph)
next = paragraph->next; next = paragraph->next;
if (paragraph->cookie == para_metafile) if (paragraph->cookie == para_metafile)
DeleteMetaFile(paragraph->u.gfx.u.mf.hMetaFile); DeleteMetaFile(paragraph->u.gfx.u.mfp.hMF);
HLPFILE_FreeLink(paragraph->link); HLPFILE_FreeLink(paragraph->link);
......
...@@ -69,11 +69,7 @@ typedef struct tagHlpFileParagraph ...@@ -69,11 +69,7 @@ typedef struct tagHlpFileParagraph
{ {
HBITMAP hBitmap; HBITMAP hBitmap;
} bmp; } bmp;
struct METAFILEPICT mfp;
{
HMETAFILE hMetaFile;
SIZE mfSize;
} mf;
} u; } u;
} gfx; /* for bitmaps and metafiles */ } gfx; /* for bitmaps and metafiles */
} u; } u;
......
...@@ -1051,11 +1051,35 @@ static LRESULT CALLBACK WINHELP_TextWndProc(HWND hWnd, UINT msg, WPARAM wParam, ...@@ -1051,11 +1051,35 @@ static LRESULT CALLBACK WINHELP_TextWndProc(HWND hWnd, UINT msg, WPARAM wParam,
break; break;
case hlp_line_part_metafile: 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); sz.cx = part->rect.right - part->rect.left;
PlayMetaFile(hDc, part->u.metafile.hMetaFile); sz.cy = part->rect.bottom - part->rect.top;
SetViewportOrgEx(hDc, pt.x, pt.y, NULL); 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; break;
} }
...@@ -1578,8 +1602,23 @@ static BOOL WINHELP_SplitLines(HWND hWnd, LPSIZE newsize) ...@@ -1578,8 +1602,23 @@ static BOOL WINHELP_SplitLines(HWND hWnd, LPSIZE newsize)
gfxSize.cx = dibs.dsBm.bmWidth; gfxSize.cx = dibs.dsBm.bmWidth;
gfxSize.cy = dibs.dsBm.bmHeight; 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; free_width = rect.right - ((part && *line) ? (*line)->rect.right : rect.left) - space.cx;
if (free_width <= 0) if (free_width <= 0)
{ {
...@@ -1601,7 +1640,8 @@ static BOOL WINHELP_SplitLines(HWND hWnd, LPSIZE newsize) ...@@ -1601,7 +1640,8 @@ static BOOL WINHELP_SplitLines(HWND hWnd, LPSIZE newsize)
else else
{ {
ref_part->cookie = hlp_line_part_metafile; 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; break;
......
...@@ -62,6 +62,7 @@ typedef struct tagHelpLinePart ...@@ -62,6 +62,7 @@ typedef struct tagHelpLinePart
struct struct
{ {
HMETAFILE hMetaFile; HMETAFILE hMetaFile;
INT mm;
} metafile; } metafile;
} u; } u;
HLPFILE_LINK* link; HLPFILE_LINK* link;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment