[PATCH 3/3] [WinHelp]: added support for relative offsets in richedit rendered pages
Eric Pouech
eric.pouech at orange.fr
Wed Apr 30 01:31:36 CDT 2008
A+
---
programs/winhelp/hlpfile.c | 21 +++++++++++++++------
programs/winhelp/hlpfile.h | 5 ++++-
programs/winhelp/winhelp.c | 14 ++++++++++----
3 files changed, 29 insertions(+), 11 deletions(-)
diff --git a/programs/winhelp/hlpfile.c b/programs/winhelp/hlpfile.c
index 8205fcf..28dda81 100644
--- a/programs/winhelp/hlpfile.c
+++ b/programs/winhelp/hlpfile.c
@@ -1192,7 +1192,8 @@ unsigned HLPFILE_HalfPointsToTwips(unsigned pts)
*
* HLPFILE_BrowseParagraph
*/
-static BOOL HLPFILE_BrowseParagraph(HLPFILE_PAGE* page, struct RtfData* rd, BYTE *buf, BYTE* end)
+static BOOL HLPFILE_BrowseParagraph(HLPFILE_PAGE* page, struct RtfData* rd,
+ BYTE *buf, BYTE* end, unsigned* parlen)
{
HLPFILE_PARAGRAPH *paragraph, **paragraphptr;
UINT textsize;
@@ -1211,6 +1212,7 @@ static BOOL HLPFILE_BrowseParagraph(HLPFILE_PAGE* page, struct RtfData* rd, BYTE
if (buf + 0x19 > end) {WINE_WARN("header too small\n"); return FALSE;};
+ *parlen = 0;
blocksize = GET_UINT(buf, 0);
size = GET_UINT(buf, 0x4);
datalen = GET_UINT(buf, 0x10);
@@ -1241,7 +1243,7 @@ static BOOL HLPFILE_BrowseParagraph(HLPFILE_PAGE* page, struct RtfData* rd, BYTE
if (buf[0x14] == 0x20 || buf[0x14] == 0x23)
{
fetch_long(&format);
- fetch_ushort(&format);
+ *parlen = fetch_ushort(&format);
}
if (buf[0x14] == 0x23)
@@ -1728,12 +1730,14 @@ done:
* HLPFILE_BrowsePage
*
*/
-BOOL HLPFILE_BrowsePage(HLPFILE_PAGE* page, struct RtfData* rd, unsigned font_scale)
+BOOL HLPFILE_BrowsePage(HLPFILE_PAGE* page, struct RtfData* rd,
+ unsigned font_scale, unsigned relative)
{
HLPFILE *hlpfile = page->file;
BYTE *buf, *end;
DWORD ref = page->reference;
- unsigned index, old_index = -1, offset, count = 0, cpg;
+ unsigned index, old_index = -1, offset, count = 0, offs = 0;
+ unsigned cpg, parlen;
char tmp[1024];
const char* ck = NULL;
@@ -1744,6 +1748,8 @@ BOOL HLPFILE_BrowsePage(HLPFILE_PAGE* page, struct RtfData* rd, unsigned font
rd->first_link = rd->current_link = NULL;
rd->force_color = FALSE;
rd->font_scale = font_scale;
+ rd->relative = relative;
+ rd->char_pos_rel = 0;
}
switch (hlpfile->charset)
@@ -1848,7 +1854,7 @@ BOOL HLPFILE_BrowsePage(HLPFILE_PAGE* page, struct RtfData* rd, unsigned font
buf = hlpfile->topic_map[index] + offset;
if (buf + 0x15 >= hlpfile->topic_end) {WINE_WARN("extra\n"); break;}
end = min(buf + GET_UINT(buf, 0), hlpfile->topic_end);
- if (index != old_index) {old_index = index;}
+ if (index != old_index) {offs = 0; old_index = index;}
switch (buf[0x14])
{
@@ -1858,7 +1864,10 @@ BOOL HLPFILE_BrowsePage(HLPFILE_PAGE* page, struct RtfData* rd, unsigned font
case 0x01:
case 0x20:
case 0x23:
- if (!HLPFILE_BrowseParagraph(page, rd, buf, end)) return FALSE;
+ if (!HLPFILE_BrowseParagraph(page, rd, buf, end, &parlen)) return FALSE;
+ if (relative >= index * 0x8000 + offs)
+ rd->char_pos_rel = rd->char_pos;
+ offs += parlen;
break;
default:
WINE_ERR("buf[0x14] = %x\n", buf[0x14]);
diff --git a/programs/winhelp/hlpfile.h b/programs/winhelp/hlpfile.h
index 0d3a8f4..cbab950 100644
--- a/programs/winhelp/hlpfile.h
+++ b/programs/winhelp/hlpfile.h
@@ -222,6 +222,9 @@ struct RtfData {
HLPFILE_LINK*first_link;
HLPFILE_LINK*current_link;
BOOL force_color;
+ unsigned relative; /* offset within page to lookup for */
+ unsigned char_pos_rel; /* char_pos correspondinf to relative */
};
-BOOL HLPFILE_BrowsePage(HLPFILE_PAGE*, struct RtfData* rd, unsigned font_scale);
+BOOL HLPFILE_BrowsePage(HLPFILE_PAGE*, struct RtfData* rd,
+ unsigned font_scale, unsigned relative);
diff --git a/programs/winhelp/winhelp.c b/programs/winhelp/winhelp.c
index 73cb538..9ce7ace 100644
--- a/programs/winhelp/winhelp.c
+++ b/programs/winhelp/winhelp.c
@@ -551,7 +551,7 @@ BOOL WINHELP_CreateHelpWindow(WINHELP_WNDPAGE* wpage, int nCmdShow, BOOL remembe
bPopup = !bPrimary && (wpage->wininfo->win_style & WS_POPUP);
if (wpage->page && !wpage->page->first_paragraph)
- HLPFILE_BrowsePage(wpage->page, NULL, 1 /* FIXME */);
+ HLPFILE_BrowsePage(wpage->page, NULL, 1 /* FIXME */, wpage->relative);
if (!bPopup)
{
@@ -1096,8 +1096,12 @@ static void WINHELP_FillRichEdit(HWND hTextWnd, WINHELP_WINDOW *win, ULONG relat
{
struct RtfData rd;
EDITSTREAM es;
+ unsigned cp = 0;
+ POINTL ptl;
+ POINT pt;
- if (HLPFILE_BrowsePage(win->page, &rd, win->font_scale))
+
+ if (HLPFILE_BrowsePage(win->page, &rd, win->font_scale, relative))
{
rd.where = rd.data;
es.dwCookie = (DWORD_PTR)&rd;
@@ -1105,17 +1109,19 @@ static void WINHELP_FillRichEdit(HWND hTextWnd, WINHELP_WINDOW *win, ULONG relat
es.pfnCallback = WINHELP_RtfStreamIn;
SendMessageW(hTextWnd, EM_STREAMIN, SF_RTF, (LPARAM)&es);
+ cp = rd.char_pos_rel;
}
/* FIXME: else leaking potentially the rd.first_link chain */
HeapFree(GetProcessHeap(), 0, rd.data);
+ SendMessage(hTextWnd, EM_POSFROMCHAR, (WPARAM)&ptl, cp ? cp - 1 : 0);
+ pt.x = 0; pt.y = ptl.y;
+ SendMessage(hTextWnd, EM_SETSCROLLPOS, 0, (LPARAM)&pt);
}
else
{
SendMessage(hTextWnd, WM_SETTEXT, 0, (LPARAM)"");
}
SendMessage(hTextWnd, WM_SETREDRAW, TRUE, 0);
- SendMessage(hTextWnd, EM_SETSEL, 0, 0);
- SendMessage(hTextWnd, EM_SCROLLCARET, 0, 0);
InvalidateRect(hTextWnd, NULL, TRUE);
}
More information about the wine-patches
mailing list