Huw Davies : riched20: Pass and return a paragraph ptr in the paragraph joining function.

Alexandre Julliard julliard at winehq.org
Fri Oct 16 15:55:38 CDT 2020


Module: wine
Branch: master
Commit: 434feab6a29706797d61499989b5ce445e02a3b3
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=434feab6a29706797d61499989b5ce445e02a3b3

Author: Huw Davies <huw at codeweavers.com>
Date:   Fri Oct 16 12:08:10 2020 +0100

riched20: Pass and return a paragraph ptr in the paragraph joining function.

Signed-off-by: Huw Davies <huw at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/riched20/caret.c  |   2 +-
 dlls/riched20/editor.h |   3 +-
 dlls/riched20/para.c   | 129 ++++++++++++++++++++++---------------------------
 dlls/riched20/undo.c   |   2 +-
 4 files changed, 62 insertions(+), 74 deletions(-)

diff --git a/dlls/riched20/caret.c b/dlls/riched20/caret.c
index cce4755257c..22da616731f 100644
--- a/dlls/riched20/caret.c
+++ b/dlls/riched20/caret.c
@@ -369,7 +369,7 @@ BOOL ME_InternalDeleteText(ME_TextEditor *editor, ME_Cursor *start,
           keepFirstParaFormat = TRUE;
         }
       }
-      ME_JoinParagraphs(editor, c.pPara, keepFirstParaFormat);
+      para_join( editor, &c.pPara->member.para, keepFirstParaFormat );
       /* ME_SkipAndPropagateCharOffset(p->pRun, shift); */
       ME_CheckCharOffsets(editor);
       nChars -= (eollen < nChars) ? eollen : nChars;
diff --git a/dlls/riched20/editor.h b/dlls/riched20/editor.h
index b0c3ec46214..ad7978c1f9d 100644
--- a/dlls/riched20/editor.h
+++ b/dlls/riched20/editor.h
@@ -198,8 +198,6 @@ void ME_SendRequestResize(ME_TextEditor *editor, BOOL force) DECLSPEC_HIDDEN;
 ME_DisplayItem *ME_GetParagraph(ME_DisplayItem *run) DECLSPEC_HIDDEN;
 void ME_GetSelectionParas(ME_TextEditor *editor, ME_DisplayItem **para, ME_DisplayItem **para_end) DECLSPEC_HIDDEN;
 void ME_MakeFirstParagraph(ME_TextEditor *editor) DECLSPEC_HIDDEN;
-ME_DisplayItem *ME_JoinParagraphs(ME_TextEditor *editor, ME_DisplayItem *tp,
-                                  BOOL keepFirstParaFormat) DECLSPEC_HIDDEN;
 void ME_DumpParaStyle(ME_Paragraph *s) DECLSPEC_HIDDEN;
 void ME_DumpParaStyleToBuf(const PARAFORMAT2 *pFmt, char buf[2048]) DECLSPEC_HIDDEN;
 BOOL ME_SetSelectionParaFormat(ME_TextEditor *editor, const PARAFORMAT2 *pFmt) DECLSPEC_HIDDEN;
@@ -209,6 +207,7 @@ void ME_SetDefaultParaFormat(ME_TextEditor *editor, PARAFORMAT2 *pFmt) DECLSPEC_
 int get_total_width(ME_TextEditor *editor) DECLSPEC_HIDDEN;
 ME_Run *para_end_run( ME_Paragraph *para ) DECLSPEC_HIDDEN;
 ME_Run *para_first_run( ME_Paragraph *para ) DECLSPEC_HIDDEN;
+ME_Paragraph *para_join( ME_TextEditor *editor, ME_Paragraph *para, BOOL use_first_fmt ) DECLSPEC_HIDDEN;
 void para_mark_add( ME_TextEditor *editor, ME_Paragraph *para ) DECLSPEC_HIDDEN;
 void para_mark_remove( ME_TextEditor *editor, ME_Paragraph *para ) DECLSPEC_HIDDEN;
 void para_mark_rewrap( ME_TextEditor *editor, ME_Paragraph *para ) DECLSPEC_HIDDEN;
diff --git a/dlls/riched20/para.c b/dlls/riched20/para.c
index 7251d1620a6..41debcac1bd 100644
--- a/dlls/riched20/para.c
+++ b/dlls/riched20/para.c
@@ -654,66 +654,60 @@ ME_Paragraph *para_split( ME_TextEditor *editor, ME_Run *run, ME_Style *style,
   return new_para;
 }
 
-/* join tp with tp->member.para.next_para, keeping tp's style; this
- * is consistent with the original */
-ME_DisplayItem *ME_JoinParagraphs(ME_TextEditor *editor, ME_DisplayItem *tp,
-                                  BOOL keepFirstParaFormat)
+/* join para with the next para keeping para's style using the paragraph fmt
+   specified in use_first_fmt */
+ME_Paragraph *para_join( ME_TextEditor *editor, ME_Paragraph *para, BOOL use_first_fmt )
 {
-  ME_DisplayItem *pNext, *pFirstRunInNext, *pRun, *pTmp, *pCell = NULL;
+  ME_DisplayItem *tmp, *pCell = NULL;
+  ME_Paragraph *next = para_next( para );
+  ME_Run *end_run, *next_first_run, *tmp_run;
   int i, shift;
   int end_len;
   CHARFORMAT2W fmt;
   ME_Cursor startCur, endCur;
   ME_String *eol_str;
 
-  assert(tp->type == diParagraph);
-  assert(tp->member.para.next_para);
-  assert(tp->member.para.next_para->type == diParagraph);
+  assert( next && para_next( next ) );
 
   /* Clear any cached para numbering following this paragraph */
-  if (tp->member.para.fmt.wNumbering)
-      para_num_clear_list( editor, &tp->member.para, &tp->member.para.fmt );
+  if (para->fmt.wNumbering) para_num_clear_list( editor, para, &para->fmt );
 
-  pNext = tp->member.para.next_para;
+  end_run = para_end_run( para );
+  next_first_run = para_first_run( next );
 
-  /* Need to locate end-of-paragraph run here, in order to know end_len */
-  pRun = ME_FindItemBack(pNext, diRunOrParagraph);
-
-  assert(pRun);
-  assert(pRun->type == diRun);
-  assert(pRun->member.run.nFlags & MERF_ENDPARA);
-
-  end_len = pRun->member.run.len;
-  eol_str = ME_VSplitString( tp->member.para.text, pRun->member.run.nCharOfs );
-  ME_AppendString( tp->member.para.text, pNext->member.para.text->szData, pNext->member.para.text->nLen );
+  end_len = end_run->len;
+  eol_str = ME_VSplitString( para->text, end_run->nCharOfs );
+  ME_AppendString( para->text, next->text->szData, next->text->nLen );
 
   /* null char format operation to store the original char format for the ENDPARA run */
   ME_InitCharFormat2W(&fmt);
-  endCur.pPara = pNext;
-  endCur.pRun = ME_FindItemFwd(pNext, diRun);
-  endCur.nOffset = 0;
-  startCur = endCur;
-  ME_PrevRun(&startCur.pPara, &startCur.pRun, TRUE);
+  startCur.pPara = para_get_di( para );
+  startCur.pRun = run_get_di( end_run );
+  endCur.pPara = para_get_di( next );
+  endCur.pRun = run_get_di( next_first_run );
+  startCur.nOffset = endCur.nOffset = 0;
+
   ME_SetCharFormat(editor, &startCur, &endCur, &fmt);
 
-  if (!editor->bEmulateVersion10) { /* v4.1 */
+  if (!editor->bEmulateVersion10) /* v4.1 */
+  {
     /* Table cell/row properties are always moved over from the removed para. */
-    tp->member.para.nFlags = pNext->member.para.nFlags;
-    tp->member.para.pCell = pNext->member.para.pCell;
+    para->nFlags = next->nFlags;
+    para->pCell = next->pCell;
 
     /* Remove cell boundary if it is between the end paragraph run and the next
      * paragraph display item. */
-    for (pTmp = pRun->next; pTmp != pNext; pTmp = pTmp->next)
+    for (tmp = run_get_di( end_run ); tmp != para_get_di( next ); tmp = tmp->next)
     {
-      if (pTmp->type == diCell)
+      if (tmp->type == diCell)
       {
-        pCell = pTmp;
+        pCell = tmp;
         break;
       }
     }
   }
 
-  add_undo_split_para( editor, &pNext->member.para, eol_str, pCell ? &pCell->member.cell : NULL );
+  add_undo_split_para( editor, next, eol_str, pCell ? &pCell->member.cell : NULL );
 
   if (pCell)
   {
@@ -725,63 +719,58 @@ ME_DisplayItem *ME_JoinParagraphs(ME_TextEditor *editor, ME_DisplayItem *tp,
     ME_DestroyDisplayItem( pCell );
   }
 
-  if (!keepFirstParaFormat)
+  if (!use_first_fmt)
   {
-    add_undo_set_para_fmt( editor, &tp->member.para );
-    tp->member.para.fmt = pNext->member.para.fmt;
-    tp->member.para.border = pNext->member.para.border;
+    add_undo_set_para_fmt( editor, para );
+    para->fmt = next->fmt;
+    para->border = next->border;
   }
 
-  shift = pNext->member.para.nCharOfs - tp->member.para.nCharOfs - end_len;
-
-  pFirstRunInNext = ME_FindItemFwd(pNext, diRunOrParagraph);
-
-  assert(pFirstRunInNext->type == diRun);
+  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++) {
-    if (editor->pCursors[i].pRun == pRun) {
-      editor->pCursors[i].pRun = pFirstRunInNext;
+  for (i = 0; i < editor->nCursors; i++)
+  {
+    if (editor->pCursors[i].pRun == run_get_di( end_run ))
+    {
+      editor->pCursors[i].pRun = run_get_di( next_first_run );
       editor->pCursors[i].nOffset = 0;
-    } else if (editor->pCursors[i].pPara == pNext) {
-      editor->pCursors[i].pPara = tp;
     }
+    else if (editor->pCursors[i].pPara == para_get_di( next ))
+      editor->pCursors[i].pPara = para_get_di( para );
   }
 
-  pTmp = pNext;
-  do {
-    pTmp = ME_FindItemFwd(pTmp, diRunOrParagraphOrEnd);
-    if (pTmp->type != diRun)
-      break;
-    TRACE("shifting %s by %d (previous %d)\n", debugstr_run( &pTmp->member.run ), shift, pTmp->member.run.nCharOfs);
-    pTmp->member.run.nCharOfs += shift;
-    pTmp->member.run.para = &tp->member.para;
-  } while(1);
+  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->para = para;
+  }
 
   /* Fix up the para's eop_run ptr */
-  tp->member.para.eop_run = pNext->member.para.eop_run;
+  para->eop_run = next->eop_run;
 
-  ME_Remove(pRun);
-  ME_DestroyDisplayItem(pRun);
+  ME_Remove( run_get_di( end_run ) );
+  ME_DestroyDisplayItem( run_get_di( end_run) );
 
-  if (editor->pLastSelStartPara == pNext)
-    editor->pLastSelStartPara = tp;
-  if (editor->pLastSelEndPara == pNext)
-    editor->pLastSelEndPara = tp;
+  if (editor->pLastSelStartPara == para_get_di( next ))
+    editor->pLastSelStartPara = para_get_di( para );
+  if (editor->pLastSelEndPara == para_get_di( next ))
+    editor->pLastSelEndPara = para_get_di( para );
 
-  tp->member.para.next_para = pNext->member.para.next_para;
-  pNext->member.para.next_para->member.para.prev_para = tp;
-  ME_Remove(pNext);
-  destroy_para(editor, pNext);
+  para->next_para = next->next_para;
+  next->next_para->member.para.prev_para = para_get_di( para );
+  ME_Remove( para_get_di(next) );
+  destroy_para( editor, para_get_di( next ) );
 
-  ME_PropagateCharOffset(tp->member.para.next_para, -end_len);
+  ME_PropagateCharOffset( para->next_para, -end_len );
 
   ME_CheckCharOffsets(editor);
 
   editor->nParagraphs--;
-  para_mark_rewrap( editor, &tp->member.para );
-  return tp;
+  para_mark_rewrap( editor, para );
+  return para;
 }
 
 ME_DisplayItem *ME_GetParagraph(ME_DisplayItem *item) {
diff --git a/dlls/riched20/undo.c b/dlls/riched20/undo.c
index 5616c64005a..72e3b74f4c8 100644
--- a/dlls/riched20/undo.c
+++ b/dlls/riched20/undo.c
@@ -373,7 +373,7 @@ static void ME_PlayUndoItem(ME_TextEditor *editor, struct undo_item *undo)
   {
     ME_Cursor tmp;
     cursor_from_char_ofs( editor, undo->u.join_paras.pos, &tmp );
-    ME_JoinParagraphs(editor, tmp.pPara, TRUE);
+    para_join( editor, &tmp.pPara->member.para, TRUE );
     break;
   }
   case undo_split_para:




More information about the wine-cvs mailing list