Huw Davies : riched20: Pass a para or run ptr to the char ofs propagation function.
Alexandre Julliard
julliard at winehq.org
Mon Nov 9 15:11:50 CST 2020
Module: wine
Branch: master
Commit: 47228b7db4ab57b0cb929cec13d13de6d7bb08aa
URL: https://source.winehq.org/git/wine.git/?a=commit;h=47228b7db4ab57b0cb929cec13d13de6d7bb08aa
Author: Huw Davies <huw at codeweavers.com>
Date: Mon Nov 9 08:45:03 2020 +0000
riched20: Pass a para or run ptr to the char ofs propagation function.
Signed-off-by: Huw Davies <huw at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/riched20/caret.c | 6 ++---
dlls/riched20/editor.h | 3 +--
dlls/riched20/para.c | 12 +++------
dlls/riched20/run.c | 66 +++++++++++++++++---------------------------------
4 files changed, 29 insertions(+), 58 deletions(-)
diff --git a/dlls/riched20/caret.c b/dlls/riched20/caret.c
index 813074599a7..2fa6842da13 100644
--- a/dlls/riched20/caret.c
+++ b/dlls/riched20/caret.c
@@ -413,10 +413,8 @@ BOOL ME_InternalDeleteText(ME_TextEditor *editor, ME_Cursor *start,
/* c = updated data now */
- if (c.run == cursor.run)
- ME_SkipAndPropagateCharOffset( run_get_di( c.run ), shift );
- else
- ME_PropagateCharOffset( run_get_di( c.run ), shift );
+ if (c.run == cursor.run) c.run->nCharOfs -= shift;
+ editor_propagate_char_ofs( NULL, c.run, shift );
if (!cursor.run->len)
{
diff --git a/dlls/riched20/editor.h b/dlls/riched20/editor.h
index d06fcef332f..c29619cc793 100644
--- a/dlls/riched20/editor.h
+++ b/dlls/riched20/editor.h
@@ -126,12 +126,12 @@ static inline ME_DisplayItem *row_get_di( ME_Row *row )
void cursor_from_char_ofs( ME_TextEditor *editor, int char_ofs, ME_Cursor *cursor ) DECLSPEC_HIDDEN;
BOOL cursor_next_run( ME_Cursor *cursor, BOOL all_para ) DECLSPEC_HIDDEN;
BOOL cursor_prev_run( ME_Cursor *cursor, BOOL all_para ) DECLSPEC_HIDDEN;
+void editor_propagate_char_ofs( ME_Paragraph *para, ME_Run *run, int shift ) DECLSPEC_HIDDEN;
int run_char_ofs( ME_Run *run, int ofs ) DECLSPEC_HIDDEN;
ME_Run *run_create( ME_Style *s, int nFlags ) DECLSPEC_HIDDEN;
ME_Run *run_insert( ME_TextEditor *editor, ME_Cursor *cursor,
ME_Style *style, const WCHAR *str, int len, int flags ) DECLSPEC_HIDDEN;
void ME_CheckCharOffsets(ME_TextEditor *editor) DECLSPEC_HIDDEN;
-void ME_PropagateCharOffset(ME_DisplayItem *p, int shift) DECLSPEC_HIDDEN;
/* this one accounts for 1/2 char tolerance */
int ME_CharFromPointContext(ME_Context *c, int cx, ME_Run *run, BOOL closest, BOOL visual_order) DECLSPEC_HIDDEN;
int ME_CharFromPoint(ME_TextEditor *editor, int cx, ME_Run *run, BOOL closest, BOOL visual_order) DECLSPEC_HIDDEN;
@@ -147,7 +147,6 @@ ME_Run *run_split( ME_TextEditor *editor, ME_Cursor *cursor ) DECLSPEC_HIDDEN;
void ME_UpdateRunFlags(ME_TextEditor *editor, ME_Run *run) DECLSPEC_HIDDEN;
SIZE ME_GetRunSizeCommon(ME_Context *c, const ME_Paragraph *para, ME_Run *run, int nLen,
int startx, int *pAscent, int *pDescent) DECLSPEC_HIDDEN;
-void ME_SkipAndPropagateCharOffset(ME_DisplayItem *p, int shift) DECLSPEC_HIDDEN;
void ME_SetCharFormat(ME_TextEditor *editor, ME_Cursor *start, ME_Cursor *end, CHARFORMAT2W *pFmt) DECLSPEC_HIDDEN;
void ME_SetSelectionCharFormat(ME_TextEditor *editor, CHARFORMAT2W *pFmt) DECLSPEC_HIDDEN;
void ME_GetCharFormat(ME_TextEditor *editor, const ME_Cursor *from,
diff --git a/dlls/riched20/para.c b/dlls/riched20/para.c
index a8168ff0daa..1a53ba46a27 100644
--- a/dlls/riched20/para.c
+++ b/dlls/riched20/para.c
@@ -674,7 +674,7 @@ ME_Paragraph *para_split( ME_TextEditor *editor, ME_Run *run, ME_Style *style,
para_mark_rewrap( editor, &new_para->prev_para->member.para );
/* we've added the end run, so we need to modify nCharOfs in the next paragraphs */
- ME_PropagateCharOffset( para_get_di( next_para ), eol_len );
+ editor_propagate_char_ofs( next_para, NULL, eol_len );
editor->nParagraphs++;
return new_para;
@@ -688,8 +688,7 @@ ME_Paragraph *para_join( ME_TextEditor *editor, ME_Paragraph *para, BOOL use_fir
ME_Paragraph *next = para_next( para );
ME_Run *end_run, *next_first_run, *tmp_run;
ME_Cell *cell = NULL;
- int i, shift;
- int end_len;
+ int i, end_len;
CHARFORMAT2W fmt;
ME_Cursor startCur, endCur;
ME_String *eol_str;
@@ -751,8 +750,6 @@ ME_Paragraph *para_join( ME_TextEditor *editor, ME_Paragraph *para, BOOL use_fir
para->border = next->border;
}
- shift = next->nCharOfs - para->nCharOfs - end_len;
-
/* Update selection cursors so they don't point to the removed end
* paragraph run, and point to the correct paragraph. */
for (i = 0; i < editor->nCursors; i++)
@@ -768,8 +765,7 @@ ME_Paragraph *para_join( ME_TextEditor *editor, ME_Paragraph *para, BOOL use_fir
for (tmp_run = next_first_run; tmp_run; tmp_run = run_next( tmp_run ))
{
- TRACE( "shifting %s by %d (previous %d)\n", debugstr_run( tmp_run ), shift, tmp_run->nCharOfs );
- tmp_run->nCharOfs += shift;
+ tmp_run->nCharOfs += next->nCharOfs - para->nCharOfs - end_len;
tmp_run->para = para;
}
@@ -789,7 +785,7 @@ ME_Paragraph *para_join( ME_TextEditor *editor, ME_Paragraph *para, BOOL use_fir
ME_Remove( para_get_di(next) );
para_destroy( editor, next );
- ME_PropagateCharOffset( para->next_para, -end_len );
+ editor_propagate_char_ofs( para_next( para ), NULL, -end_len );
ME_CheckCharOffsets(editor);
diff --git a/dlls/riched20/run.c b/dlls/riched20/run.c
index db0ae0a6aa0..fdda43ba51a 100644
--- a/dlls/riched20/run.c
+++ b/dlls/riched20/run.c
@@ -137,54 +137,32 @@ BOOL ME_CanJoinRuns(const ME_Run *run1, const ME_Run *run2)
return TRUE;
}
-void ME_SkipAndPropagateCharOffset(ME_DisplayItem *p, int shift)
-{
- p = ME_FindItemFwd(p, diRunOrParagraphOrEnd);
- assert(p);
- ME_PropagateCharOffset(p, shift);
-}
-
/******************************************************************************
- * ME_PropagateCharOffsets
+ * editor_propagate_char_ofs
*
* Shifts (increases or decreases) character offset (relative to beginning of
- * the document) of the part of the text starting from given place.
+ * the document) of the part of the text starting from given place.
+ * Call with only one of para or run non-NULL.
*/
-void ME_PropagateCharOffset(ME_DisplayItem *p, int shift)
+void editor_propagate_char_ofs( ME_Paragraph *para, ME_Run *run, int shift )
{
- /* Runs in one paragraph contain character offset relative to their owning
- * paragraph. If we start the shifting from the run, we need to shift
- * all the relative offsets until the end of the paragraph
- */
- if (p->type == diRun) /* propagate in all runs in this para */
- {
- TRACE("PropagateCharOffset(%s, %d)\n", debugstr_run( &p->member.run ), shift);
- do {
- p->member.run.nCharOfs += shift;
- assert(p->member.run.nCharOfs >= 0);
- p = ME_FindItemFwd(p, diRunOrParagraphOrEnd);
- } while(p->type == diRun);
- }
- /* Runs in next paragraphs don't need their offsets updated, because they,
- * again, those offsets are relative to their respective paragraphs.
- * Instead of that, we're updating paragraphs' character offsets.
- */
- if (p->type == diParagraph) /* propagate in all next paras */
- {
- do {
- p->member.para.nCharOfs += shift;
- assert(p->member.para.nCharOfs >= 0);
- p = p->member.para.next_para;
- } while(p->type == diParagraph);
- }
- /* diTextEnd also has character offset in it, which makes finding text length
- * easier. But it needs to be up to date first.
- */
- if (p->type == diTextEnd)
- {
- p->member.para.nCharOfs += shift;
- assert(p->member.para.nCharOfs >= 0);
- }
+ assert( !para ^ !run );
+
+ if (run)
+ {
+ para = para_next( run->para );
+ do
+ {
+ run->nCharOfs += shift;
+ run = run_next( run );
+ } while (run);
+ }
+
+ do
+ {
+ para->nCharOfs += shift;
+ para = para_next( para );
+ } while (para);
}
/******************************************************************************
@@ -422,7 +400,7 @@ ME_Run *run_insert( ME_TextEditor *editor, ME_Cursor *cursor, ME_Style *style,
ME_InsertString( run->para->text, run->nCharOfs, str, len );
ME_InsertBefore( run_get_di( insert_before ), run_get_di( run ) );
TRACE("Shift length:%d\n", len);
- ME_PropagateCharOffset( run_get_di( insert_before ), len );
+ editor_propagate_char_ofs( NULL, insert_before, len );
para_mark_rewrap( editor, insert_before->para );
/* Move any cursors that were at the end of the previous run to the end of the inserted run */
More information about the wine-cvs
mailing list