Superseded patch 146572.
Signed-off-by: Jactry Zeng jzeng@codeweavers.com --- dlls/riched20/editor.c | 13 +++++++------ dlls/riched20/editor.h | 2 +- dlls/riched20/editstr.h | 1 + dlls/riched20/paint.c | 10 +++++----- dlls/riched20/table.c | 4 ++-- dlls/riched20/wrap.c | 11 +++++++++-- 6 files changed, 25 insertions(+), 16 deletions(-)
diff --git a/dlls/riched20/editor.c b/dlls/riched20/editor.c index 820b0380c7..82132761f0 100644 --- a/dlls/riched20/editor.c +++ b/dlls/riched20/editor.c @@ -3028,6 +3028,7 @@ ME_TextEditor *ME_MakeEditor(ITextHost *texthost, BOOL bEmulateVersion10)
ed->hWnd = NULL; ed->hwndParent = NULL; + ed->hdcDraw = NULL; ed->sizeWindow.cx = ed->sizeWindow.cy = 0; ed->texthost = texthost; ed->reOle = NULL; @@ -3494,7 +3495,7 @@ static LRESULT ME_WmCreate(ME_TextEditor *editor, LPARAM lParam, BOOL unicode) }
ME_CommitUndo(editor); - ME_WrapMarkedParagraphs(editor); + ME_WrapMarkedParagraphs(editor, NULL); ME_MoveCaret(editor); return 0; } @@ -3645,7 +3646,7 @@ LRESULT ME_HandleMessage(ME_TextEditor *editor, UINT msg, WPARAM wParam, cf.yHeight = size * 20; /* convert twips to points */ ME_SetSelectionCharFormat(editor, &cf); ME_CommitUndo(editor); - ME_WrapMarkedParagraphs(editor); + ME_WrapMarkedParagraphs(editor, NULL); ME_UpdateScrollBar(editor); ME_Repaint(editor);
@@ -3934,7 +3935,7 @@ LRESULT ME_HandleMessage(ME_TextEditor *editor, UINT msg, WPARAM wParam, ME_CommitUndo(editor); if (bRepaint) { - ME_WrapMarkedParagraphs(editor); + ME_WrapMarkedParagraphs(editor, NULL); ME_UpdateScrollBar(editor); ME_Repaint(editor); } @@ -3959,7 +3960,7 @@ LRESULT ME_HandleMessage(ME_TextEditor *editor, UINT msg, WPARAM wParam, case EM_SETPARAFORMAT: { BOOL result = ME_SetSelectionParaFormat(editor, (PARAFORMAT2 *)lParam); - ME_WrapMarkedParagraphs(editor); + ME_WrapMarkedParagraphs(editor, NULL); ME_UpdateScrollBar(editor); ME_Repaint(editor); ME_CommitUndo(editor); @@ -4054,7 +4055,7 @@ LRESULT ME_HandleMessage(ME_TextEditor *editor, UINT msg, WPARAM wParam,
ME_CommitUndo(editor); ME_MarkAllForWrapping(editor); - ME_WrapMarkedParagraphs(editor); + ME_WrapMarkedParagraphs(editor, NULL); ME_UpdateScrollBar(editor); if (bRepaint) ME_Repaint(editor); @@ -4714,7 +4715,7 @@ LRESULT ME_HandleMessage(ME_TextEditor *editor, UINT msg, WPARAM wParam, editor->bDefaultFormatRect = TRUE; } ME_MarkAllForWrapping(editor); - ME_WrapMarkedParagraphs(editor); + ME_WrapMarkedParagraphs(editor, NULL); ME_UpdateScrollBar(editor); if (msg != EM_SETRECTNP) ME_Repaint(editor); diff --git a/dlls/riched20/editor.h b/dlls/riched20/editor.h index 0f0e56ecd1..425a34f0c2 100644 --- a/dlls/riched20/editor.h +++ b/dlls/riched20/editor.h @@ -182,7 +182,7 @@ void ME_InitContext(ME_Context *c, ME_TextEditor *editor, HDC hDC) DECLSPEC_HIDD void ME_DestroyContext(ME_Context *c) DECLSPEC_HIDDEN;
/* wrap.c */ -BOOL ME_WrapMarkedParagraphs(ME_TextEditor *editor) DECLSPEC_HIDDEN; +BOOL ME_WrapMarkedParagraphs(ME_TextEditor *editor, HDC hdc) DECLSPEC_HIDDEN; void ME_InvalidateParagraphRange(ME_TextEditor *editor, ME_DisplayItem *start_para, ME_DisplayItem *last_para) DECLSPEC_HIDDEN; void ME_SendRequestResize(ME_TextEditor *editor, BOOL force) DECLSPEC_HIDDEN;
diff --git a/dlls/riched20/editstr.h b/dlls/riched20/editstr.h index 206ce85287..1d811e1c2a 100644 --- a/dlls/riched20/editstr.h +++ b/dlls/riched20/editstr.h @@ -383,6 +383,7 @@ typedef struct tagME_InStream ME_InStream; typedef struct tagME_TextEditor { HWND hWnd, hwndParent; + HDC hdcDraw; ITextHost *texthost; IRichEditOle *reOle; BOOL bEmulateVersion10; diff --git a/dlls/riched20/paint.c b/dlls/riched20/paint.c index fcc4e105a3..f2429081fc 100644 --- a/dlls/riched20/paint.c +++ b/dlls/riched20/paint.c @@ -105,7 +105,7 @@ void ME_PaintContent(ME_TextEditor *editor, HDC hDC, const RECT *rcUpdate)
void ME_Repaint(ME_TextEditor *editor) { - if (ME_WrapMarkedParagraphs(editor)) + if (ME_WrapMarkedParagraphs(editor, NULL)) { ME_UpdateScrollBar(editor); FIXME("ME_Repaint had to call ME_WrapMarkedParagraphs\n"); @@ -118,7 +118,7 @@ void ME_UpdateRepaint(ME_TextEditor *editor, BOOL update_now) /* Should be called whenever the contents of the control have changed */ BOOL wrappedParagraphs;
- wrappedParagraphs = ME_WrapMarkedParagraphs(editor); + wrappedParagraphs = ME_WrapMarkedParagraphs(editor, NULL); if (wrappedParagraphs) ME_UpdateScrollBar(editor);
@@ -145,7 +145,7 @@ ME_RewrapRepaint(ME_TextEditor *editor) * looks, but not content. Like resizing. */
ME_MarkAllForWrapping(editor); - ME_WrapMarkedParagraphs(editor); + ME_WrapMarkedParagraphs(editor, NULL); ME_UpdateScrollBar(editor); ME_Repaint(editor); } @@ -1163,7 +1163,7 @@ void ME_UpdateScrollBar(ME_TextEditor *editor) SCROLLINFO si; BOOL bScrollBarWasVisible, bScrollBarWillBeVisible;
- if (ME_WrapMarkedParagraphs(editor)) + if (ME_WrapMarkedParagraphs(editor, NULL)) FIXME("ME_UpdateScrollBar had to call ME_WrapMarkedParagraphs\n");
si.cbSize = sizeof(si); @@ -1336,7 +1336,7 @@ ME_InvalidateSelection(ME_TextEditor *editor) there's no (inverted) area to be repainted, neither old nor new */ if (nStart == nEnd && editor->nLastSelStart == editor->nLastSelEnd) return; - ME_WrapMarkedParagraphs(editor); + ME_WrapMarkedParagraphs(editor, NULL); ME_GetSelectionParas(editor, &sel_start, &sel_end); assert(sel_start->type == diParagraph); assert(sel_end->type == diParagraph); diff --git a/dlls/riched20/table.c b/dlls/riched20/table.c index 4cd77eb399..5457935dfa 100644 --- a/dlls/riched20/table.c +++ b/dlls/riched20/table.c @@ -499,7 +499,7 @@ static void ME_SelectOrInsertNextCell(ME_TextEditor *editor, editor->pCursors[0].pRun = ME_FindItemFwd(para, diRun); editor->pCursors[0].nOffset = 0; editor->pCursors[1] = editor->pCursors[0]; - ME_WrapMarkedParagraphs(editor); + ME_WrapMarkedParagraphs(editor, NULL); return; } } @@ -544,7 +544,7 @@ static void ME_SelectOrInsertNextCell(ME_TextEditor *editor, editor->pCursors[0].pRun = ME_FindItemFwd(para, diRun); editor->pCursors[0].nOffset = 0; editor->pCursors[1] = editor->pCursors[0]; - ME_WrapMarkedParagraphs(editor); + ME_WrapMarkedParagraphs(editor, NULL); return; } } diff --git a/dlls/riched20/wrap.c b/dlls/riched20/wrap.c index e3a70f07d1..4c92252547 100644 --- a/dlls/riched20/wrap.c +++ b/dlls/riched20/wrap.c @@ -980,14 +980,21 @@ static void ME_MarkRepaintEnd(ME_DisplayItem *para, *repaint_end = para; }
-BOOL ME_WrapMarkedParagraphs(ME_TextEditor *editor) +BOOL ME_WrapMarkedParagraphs(ME_TextEditor *editor, HDC hdc) { ME_DisplayItem *item; ME_Context c; int totalWidth = 0; ME_DisplayItem *repaint_start = NULL, *repaint_end = NULL;
- ME_InitContext(&c, editor, ITextHost_TxGetDC(editor->texthost)); + if (!hdc) + hdc = ITextHost_TxGetDC(editor->texthost); + if (hdc != editor->hdcDraw) + { + ME_MarkAllForWrapping(editor); + editor->hdcDraw = hdc; + } + ME_InitContext(&c, editor, hdc); c.pt.x = 0; item = editor->pBuffer->pFirst->next; while(item != editor->pBuffer->pLast) {
On Wed, Jun 06, 2018 at 05:24:31PM +0800, Jactry Zeng wrote:
Superseded patch 146572.
Signed-off-by: Jactry Zeng jzeng@codeweavers.com
dlls/riched20/editor.c | 13 +++++++------ dlls/riched20/editor.h | 2 +- dlls/riched20/editstr.h | 1 + dlls/riched20/paint.c | 10 +++++----- dlls/riched20/table.c | 4 ++-- dlls/riched20/wrap.c | 11 +++++++++-- 6 files changed, 25 insertions(+), 16 deletions(-)
diff --git a/dlls/riched20/editor.c b/dlls/riched20/editor.c index 820b0380c7..82132761f0 100644 --- a/dlls/riched20/editor.c +++ b/dlls/riched20/editor.c @@ -3028,6 +3028,7 @@ ME_TextEditor *ME_MakeEditor(ITextHost *texthost, BOOL bEmulateVersion10)
ed->hWnd = NULL; ed->hwndParent = NULL;
- ed->hdcDraw = NULL; ed->sizeWindow.cx = ed->sizeWindow.cy = 0; ed->texthost = texthost; ed->reOle = NULL;
@@ -3494,7 +3495,7 @@ static LRESULT ME_WmCreate(ME_TextEditor *editor, LPARAM lParam, BOOL unicode) }
ME_CommitUndo(editor);
- ME_WrapMarkedParagraphs(editor);
- ME_WrapMarkedParagraphs(editor, NULL); ME_MoveCaret(editor); return 0;
} @@ -3645,7 +3646,7 @@ LRESULT ME_HandleMessage(ME_TextEditor *editor, UINT msg, WPARAM wParam, cf.yHeight = size * 20; /* convert twips to points */ ME_SetSelectionCharFormat(editor, &cf); ME_CommitUndo(editor);
ME_WrapMarkedParagraphs(editor);
ME_WrapMarkedParagraphs(editor, NULL); ME_UpdateScrollBar(editor); ME_Repaint(editor);
@@ -3934,7 +3935,7 @@ LRESULT ME_HandleMessage(ME_TextEditor *editor, UINT msg, WPARAM wParam, ME_CommitUndo(editor); if (bRepaint) {
ME_WrapMarkedParagraphs(editor);
}ME_WrapMarkedParagraphs(editor, NULL); ME_UpdateScrollBar(editor); ME_Repaint(editor);
@@ -3959,7 +3960,7 @@ LRESULT ME_HandleMessage(ME_TextEditor *editor, UINT msg, WPARAM wParam, case EM_SETPARAFORMAT: { BOOL result = ME_SetSelectionParaFormat(editor, (PARAFORMAT2 *)lParam);
- ME_WrapMarkedParagraphs(editor);
- ME_WrapMarkedParagraphs(editor, NULL); ME_UpdateScrollBar(editor); ME_Repaint(editor); ME_CommitUndo(editor);
@@ -4054,7 +4055,7 @@ LRESULT ME_HandleMessage(ME_TextEditor *editor, UINT msg, WPARAM wParam,
ME_CommitUndo(editor); ME_MarkAllForWrapping(editor);
- ME_WrapMarkedParagraphs(editor);
- ME_WrapMarkedParagraphs(editor, NULL); ME_UpdateScrollBar(editor); if (bRepaint) ME_Repaint(editor);
@@ -4714,7 +4715,7 @@ LRESULT ME_HandleMessage(ME_TextEditor *editor, UINT msg, WPARAM wParam, editor->bDefaultFormatRect = TRUE; } ME_MarkAllForWrapping(editor);
- ME_WrapMarkedParagraphs(editor);
- ME_WrapMarkedParagraphs(editor, NULL); ME_UpdateScrollBar(editor); if (msg != EM_SETRECTNP) ME_Repaint(editor);
diff --git a/dlls/riched20/editor.h b/dlls/riched20/editor.h index 0f0e56ecd1..425a34f0c2 100644 --- a/dlls/riched20/editor.h +++ b/dlls/riched20/editor.h @@ -182,7 +182,7 @@ void ME_InitContext(ME_Context *c, ME_TextEditor *editor, HDC hDC) DECLSPEC_HIDD void ME_DestroyContext(ME_Context *c) DECLSPEC_HIDDEN;
/* wrap.c */ -BOOL ME_WrapMarkedParagraphs(ME_TextEditor *editor) DECLSPEC_HIDDEN; +BOOL ME_WrapMarkedParagraphs(ME_TextEditor *editor, HDC hdc) DECLSPEC_HIDDEN; void ME_InvalidateParagraphRange(ME_TextEditor *editor, ME_DisplayItem *start_para, ME_DisplayItem *last_para) DECLSPEC_HIDDEN; void ME_SendRequestResize(ME_TextEditor *editor, BOOL force) DECLSPEC_HIDDEN;
diff --git a/dlls/riched20/editstr.h b/dlls/riched20/editstr.h index 206ce85287..1d811e1c2a 100644 --- a/dlls/riched20/editstr.h +++ b/dlls/riched20/editstr.h @@ -383,6 +383,7 @@ typedef struct tagME_InStream ME_InStream; typedef struct tagME_TextEditor { HWND hWnd, hwndParent;
- HDC hdcDraw; ITextHost *texthost; IRichEditOle *reOle; BOOL bEmulateVersion10;
diff --git a/dlls/riched20/paint.c b/dlls/riched20/paint.c index fcc4e105a3..f2429081fc 100644 --- a/dlls/riched20/paint.c +++ b/dlls/riched20/paint.c @@ -105,7 +105,7 @@ void ME_PaintContent(ME_TextEditor *editor, HDC hDC, const RECT *rcUpdate)
void ME_Repaint(ME_TextEditor *editor) {
- if (ME_WrapMarkedParagraphs(editor))
- if (ME_WrapMarkedParagraphs(editor, NULL)) { ME_UpdateScrollBar(editor); FIXME("ME_Repaint had to call ME_WrapMarkedParagraphs\n");
@@ -118,7 +118,7 @@ void ME_UpdateRepaint(ME_TextEditor *editor, BOOL update_now) /* Should be called whenever the contents of the control have changed */ BOOL wrappedParagraphs;
- wrappedParagraphs = ME_WrapMarkedParagraphs(editor);
- wrappedParagraphs = ME_WrapMarkedParagraphs(editor, NULL); if (wrappedParagraphs) ME_UpdateScrollBar(editor);
@@ -145,7 +145,7 @@ ME_RewrapRepaint(ME_TextEditor *editor) * looks, but not content. Like resizing. */
ME_MarkAllForWrapping(editor);
- ME_WrapMarkedParagraphs(editor);
- ME_WrapMarkedParagraphs(editor, NULL); ME_UpdateScrollBar(editor); ME_Repaint(editor);
} @@ -1163,7 +1163,7 @@ void ME_UpdateScrollBar(ME_TextEditor *editor) SCROLLINFO si; BOOL bScrollBarWasVisible, bScrollBarWillBeVisible;
- if (ME_WrapMarkedParagraphs(editor))
if (ME_WrapMarkedParagraphs(editor, NULL)) FIXME("ME_UpdateScrollBar had to call ME_WrapMarkedParagraphs\n");
si.cbSize = sizeof(si);
@@ -1336,7 +1336,7 @@ ME_InvalidateSelection(ME_TextEditor *editor) there's no (inverted) area to be repainted, neither old nor new */ if (nStart == nEnd && editor->nLastSelStart == editor->nLastSelEnd) return;
- ME_WrapMarkedParagraphs(editor);
- ME_WrapMarkedParagraphs(editor, NULL); ME_GetSelectionParas(editor, &sel_start, &sel_end); assert(sel_start->type == diParagraph); assert(sel_end->type == diParagraph);
diff --git a/dlls/riched20/table.c b/dlls/riched20/table.c index 4cd77eb399..5457935dfa 100644 --- a/dlls/riched20/table.c +++ b/dlls/riched20/table.c @@ -499,7 +499,7 @@ static void ME_SelectOrInsertNextCell(ME_TextEditor *editor, editor->pCursors[0].pRun = ME_FindItemFwd(para, diRun); editor->pCursors[0].nOffset = 0; editor->pCursors[1] = editor->pCursors[0];
ME_WrapMarkedParagraphs(editor);
}ME_WrapMarkedParagraphs(editor, NULL); return; }
@@ -544,7 +544,7 @@ static void ME_SelectOrInsertNextCell(ME_TextEditor *editor, editor->pCursors[0].pRun = ME_FindItemFwd(para, diRun); editor->pCursors[0].nOffset = 0; editor->pCursors[1] = editor->pCursors[0];
ME_WrapMarkedParagraphs(editor);
ME_WrapMarkedParagraphs(editor, NULL); return; } }
diff --git a/dlls/riched20/wrap.c b/dlls/riched20/wrap.c index e3a70f07d1..4c92252547 100644 --- a/dlls/riched20/wrap.c +++ b/dlls/riched20/wrap.c @@ -980,14 +980,21 @@ static void ME_MarkRepaintEnd(ME_DisplayItem *para, *repaint_end = para; }
-BOOL ME_WrapMarkedParagraphs(ME_TextEditor *editor) +BOOL ME_WrapMarkedParagraphs(ME_TextEditor *editor, HDC hdc) { ME_DisplayItem *item; ME_Context c; int totalWidth = 0; ME_DisplayItem *repaint_start = NULL, *repaint_end = NULL;
- ME_InitContext(&c, editor, ITextHost_TxGetDC(editor->texthost));
- if (!hdc)
- hdc = ITextHost_TxGetDC(editor->texthost);
- if (hdc != editor->hdcDraw)
- {
- ME_MarkAllForWrapping(editor);
- editor->hdcDraw = hdc;
- }
- ME_InitContext(&c, editor, hdc); c.pt.x = 0; item = editor->pBuffer->pFirst->next; while(item != editor->pBuffer->pLast) {
Unfortunately it's more complicated than this because the styles cache font metrics and uniscribe data. These will need to be recalculated for a new hdc.
We'll probably also want to re-think how the windowed and window-less controls handle hdcs in general.
Huw.