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