[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