Huw Davies : riched20: Use para and run ptrs in the table deletion function.

Alexandre Julliard julliard at winehq.org
Thu Oct 29 16:32:08 CDT 2020


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

Author: Huw Davies <huw at codeweavers.com>
Date:   Thu Oct 29 10:49:11 2020 +0000

riched20: Use para and run ptrs in the table deletion function.

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

---

 dlls/riched20/caret.c  |   7 ++-
 dlls/riched20/editor.h |   2 +-
 dlls/riched20/table.c  | 136 +++++++++++++++++++++++--------------------------
 3 files changed, 67 insertions(+), 78 deletions(-)

diff --git a/dlls/riched20/caret.c b/dlls/riched20/caret.c
index 8af0f1de724..68bf40c76de 100644
--- a/dlls/riched20/caret.c
+++ b/dlls/riched20/caret.c
@@ -306,12 +306,11 @@ BOOL ME_InternalDeleteText(ME_TextEditor *editor, ME_Cursor *start,
 
   if (!bForce)
   {
-    ME_ProtectPartialTableDeletion(editor, &c, &nChars);
-    if (nChars == 0)
-      return FALSE;
+    table_protect_partial_deletion( editor, &c, &nChars );
+    if (nChars == 0) return FALSE;
   }
 
-  while(nChars > 0)
+  while (nChars > 0)
   {
     ME_Run *run;
     cursor_from_char_ofs( editor, nOfs + nChars, &c );
diff --git a/dlls/riched20/editor.h b/dlls/riched20/editor.h
index ddb6d138957..6e1c639236e 100644
--- a/dlls/riched20/editor.h
+++ b/dlls/riched20/editor.h
@@ -302,12 +302,12 @@ ME_Paragraph *table_insert_row_end( ME_TextEditor *editor, ME_Cursor *cursor ) D
 ME_Paragraph *table_insert_row_start( ME_TextEditor *editor, ME_Cursor *cursor ) DECLSPEC_HIDDEN;
 ME_Paragraph *table_insert_row_start_at_para( ME_TextEditor *editor, ME_Paragraph *para ) DECLSPEC_HIDDEN;
 ME_Paragraph *table_outer_para( ME_Paragraph *para ) DECLSPEC_HIDDEN;
+void table_protect_partial_deletion( ME_TextEditor *editor, ME_Cursor *c, int *num_chars ) DECLSPEC_HIDDEN;
 ME_Paragraph *table_row_end( ME_Paragraph *para ) DECLSPEC_HIDDEN;
 ME_Cell *table_row_end_cell( ME_Paragraph *para ) DECLSPEC_HIDDEN;
 ME_Cell *table_row_first_cell( ME_Paragraph *para ) DECLSPEC_HIDDEN;
 ME_Paragraph *table_row_start( ME_Paragraph *para ) DECLSPEC_HIDDEN;
 void ME_CheckTablesForCorruption(ME_TextEditor *editor) DECLSPEC_HIDDEN;
-void ME_ProtectPartialTableDeletion(ME_TextEditor *editor, ME_Cursor *c, int *nChars) DECLSPEC_HIDDEN;
 void ME_TabPressedInTable(ME_TextEditor *editor, BOOL bSelectedRow) DECLSPEC_HIDDEN;
 void ME_MoveCursorFromTableRowStartParagraph(ME_TextEditor *editor) DECLSPEC_HIDDEN;
 struct RTFTable *ME_MakeTableDef(ME_TextEditor *editor) DECLSPEC_HIDDEN;
diff --git a/dlls/riched20/table.c b/dlls/riched20/table.c
index 33e89a11771..40eef4bbd13 100644
--- a/dlls/riched20/table.c
+++ b/dlls/riched20/table.c
@@ -315,123 +315,113 @@ BOOL ME_IsInTable(ME_DisplayItem *pItem)
 }
 
 /* Table rows should either be deleted completely or not at all. */
-void ME_ProtectPartialTableDeletion(ME_TextEditor *editor, ME_Cursor *c, int *nChars)
+void table_protect_partial_deletion( ME_TextEditor *editor, ME_Cursor *c, int *num_chars )
 {
-  int nOfs = ME_GetCursorOfs(c);
+  int start_ofs = ME_GetCursorOfs( c );
   ME_Cursor c2 = *c;
-  ME_DisplayItem *this_para = c->pPara;
-  ME_DisplayItem *end_para;
+  ME_Paragraph *this_para = &c->pPara->member.para, *end_para;
 
-  ME_MoveCursorChars(editor, &c2, *nChars, FALSE);
-  end_para = c2.pPara;
-  if (c2.pRun->member.run.nFlags & MERF_ENDPARA) {
+  ME_MoveCursorChars( editor, &c2, *num_chars, FALSE );
+  end_para = &c2.pPara->member.para;
+  if (c2.pRun->member.run.nFlags & MERF_ENDPARA)
+  {
     /* End offset might be in the middle of the end paragraph run.
      * If this is the case, then we need to use the next paragraph as the last
      * paragraphs.
      */
-    int remaining = nOfs + *nChars - c2.pRun->member.run.nCharOfs
-                    - end_para->member.para.nCharOfs;
+    int remaining = start_ofs + *num_chars - c2.pRun->member.run.nCharOfs - end_para->nCharOfs;
     if (remaining)
     {
-      assert(remaining < c2.pRun->member.run.len);
-      end_para = end_para->member.para.next_para;
+      assert( remaining < c2.pRun->member.run.len );
+      end_para = para_next( end_para );
     }
   }
-  if (!editor->bEmulateVersion10) { /* v4.1 */
-    if (this_para->member.para.pCell != end_para->member.para.pCell ||
-        ((this_para->member.para.nFlags|end_para->member.para.nFlags)
-         & (MEPF_ROWSTART|MEPF_ROWEND)))
+  if (!editor->bEmulateVersion10) /* v4.1 */
+  {
+    if (para_cell( this_para ) != para_cell( end_para ) ||
+        ((this_para->nFlags | end_para->nFlags) & (MEPF_ROWSTART | MEPF_ROWEND)))
     {
       while (this_para != end_para)
       {
-        ME_DisplayItem *next_para = this_para->member.para.next_para;
-        BOOL bTruancateDeletion = FALSE;
-        if (this_para->member.para.nFlags & MEPF_ROWSTART) {
+        ME_Paragraph *next_para = para_next( this_para );
+        BOOL truancate_del = FALSE;
+        if (this_para->nFlags & MEPF_ROWSTART)
+        {
           /* The following while loop assumes that next_para is MEPF_ROWSTART,
-           * so moving back one paragraph let's it be processed as the start
+           * so moving back one paragraph lets it be processed as the start
            * of the row. */
           next_para = this_para;
-          this_para = this_para->member.para.prev_para;
-        } else if (next_para->member.para.pCell != this_para->member.para.pCell
-                   || this_para->member.para.nFlags & MEPF_ROWEND)
+          this_para = para_prev( this_para );
+        }
+        else if (para_cell( next_para) != para_cell( this_para ) || this_para->nFlags & MEPF_ROWEND)
         {
           /* Start of the deletion from after the start of the table row. */
-          bTruancateDeletion = TRUE;
+          truancate_del = TRUE;
         }
-        while (!bTruancateDeletion &&
-               next_para->member.para.nFlags & MEPF_ROWSTART)
+        while (!truancate_del && next_para->nFlags & MEPF_ROWSTART)
         {
-          next_para = table_row_end( &next_para->member.para )->next_para;
-          if (next_para->member.para.nCharOfs > nOfs + *nChars)
+          next_para = para_next( table_row_end( next_para ) );
+          if (next_para->nCharOfs > start_ofs + *num_chars)
           {
             /* End of deletion is not past the end of the table row. */
-            next_para = this_para->member.para.next_para;
+            next_para = para_next( this_para );
             /* Delete the end paragraph preceding the table row if the
              * preceding table row will be empty. */
-            if (this_para->member.para.nCharOfs >= nOfs)
-            {
-              next_para = next_para->member.para.next_para;
-            }
-            bTruancateDeletion = TRUE;
-          } else {
-            this_para = next_para->member.para.prev_para;
+            if (this_para->nCharOfs >= start_ofs) next_para = para_next( next_para );
+            truancate_del = TRUE;
           }
+          else this_para = para_prev( next_para );
         }
-        if (bTruancateDeletion)
+        if (truancate_del)
         {
-          ME_Run *end_run = &ME_FindItemBack(next_para, diRun)->member.run;
-          int nCharsNew = (next_para->member.para.nCharOfs - nOfs
-                           - end_run->len);
-          nCharsNew = max(nCharsNew, 0);
-          assert(nCharsNew <= *nChars);
-          *nChars = nCharsNew;
+          ME_Run *end_run = para_end_run( para_prev( next_para ) );
+          int new_chars = next_para->nCharOfs - start_ofs - end_run->len;
+          new_chars = max( new_chars, 0 );
+          assert( new_chars <= *num_chars);
+          *num_chars = new_chars;
           break;
         }
         this_para = next_para;
       }
     }
-  } else { /* v1.0 - 3.0 */
-    ME_DisplayItem *pRun;
-    int nCharsToBoundary;
+  }
+  else /* v1.0 - 3.0 */
+  {
+    ME_Run *run;
+    int chars_to_boundary;
 
-    if ((this_para->member.para.nCharOfs != nOfs || this_para == end_para) &&
-        this_para->member.para.fmt.dwMask & PFM_TABLE &&
-        this_para->member.para.fmt.wEffects & PFE_TABLE)
+    if ((this_para->nCharOfs != start_ofs || this_para == end_para) && para_in_table( this_para ))
     {
-      pRun = c->pRun;
+      run = &c->pRun->member.run;
       /* Find the next tab or end paragraph to use as a delete boundary */
-      while (!(pRun->member.run.nFlags & (MERF_TAB|MERF_ENDPARA)))
-        pRun = ME_FindItemFwd(pRun, diRun);
-      nCharsToBoundary = pRun->member.run.nCharOfs
-                         - c->pRun->member.run.nCharOfs
-                         - c->nOffset;
-      *nChars = min(*nChars, nCharsToBoundary);
-    } else if (end_para->member.para.fmt.dwMask & PFM_TABLE &&
-               end_para->member.para.fmt.wEffects & PFE_TABLE)
+      while (!(run->nFlags & (MERF_TAB | MERF_ENDPARA)))
+        run = run_next( run );
+      chars_to_boundary = run->nCharOfs - c->pRun->member.run.nCharOfs - c->nOffset;
+      *num_chars = min( *num_chars, chars_to_boundary );
+    }
+    else if (para_in_table( end_para ))
     {
       /* The deletion starts from before the row, so don't join it with
        * previous non-empty paragraphs. */
-      ME_DisplayItem *curPara;
-      pRun = NULL;
-      if (nOfs > this_para->member.para.nCharOfs) {
-        pRun = ME_FindItemBack(end_para, diRun);
-        curPara = end_para->member.para.prev_para;
+      ME_Paragraph *cur_para;
+      run = NULL;
+      if (start_ofs > this_para->nCharOfs)
+      {
+          cur_para = para_prev( end_para );
+          run = para_end_run( cur_para );
       }
-      if (!pRun) {
-        pRun = ME_FindItemFwd(end_para, diRun);
-        curPara = end_para;
+      if (!run)
+      {
+        cur_para = end_para;
+        run = para_first_run( end_para );
       }
-      if (pRun)
+      if (run)
       {
-        nCharsToBoundary = curPara->member.para.nCharOfs
-                           + pRun->member.run.nCharOfs
-                           - nOfs;
-        if (nCharsToBoundary >= 0)
-          *nChars = min(*nChars, nCharsToBoundary);
+        chars_to_boundary = cur_para->nCharOfs + run->nCharOfs - start_ofs;
+        if (chars_to_boundary >= 0) *num_chars = min( *num_chars, chars_to_boundary );
       }
     }
-    if (*nChars < 0)
-      *nChars = 0;
+    if (*num_chars < 0) *num_chars = 0;
   }
 }
 




More information about the wine-cvs mailing list