Huw Davies : riched20: Use cell ptrs in the paragraph splitting and joining functions.

Alexandre Julliard julliard at winehq.org
Fri Nov 6 14:15:24 CST 2020


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

Author: Huw Davies <huw at codeweavers.com>
Date:   Fri Nov  6 08:32:21 2020 +0000

riched20: Use cell ptrs in the paragraph splitting and joining functions.

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

---

 dlls/riched20/editor.h |  1 +
 dlls/riched20/para.c   | 60 +++++++++++++++++++++++++-------------------------
 dlls/riched20/table.c  |  6 +++++
 3 files changed, 37 insertions(+), 30 deletions(-)

diff --git a/dlls/riched20/editor.h b/dlls/riched20/editor.h
index 24e750be1de..df8e9d2b829 100644
--- a/dlls/riched20/editor.h
+++ b/dlls/riched20/editor.h
@@ -289,6 +289,7 @@ ME_Paragraph *editor_end_para( ME_TextEditor *editor ) DECLSPEC_HIDDEN;
 ME_Paragraph *editor_first_para( ME_TextEditor *editor ) DECLSPEC_HIDDEN;
 
 /* table.c */
+ME_Cell *cell_create( void ) DECLSPEC_HIDDEN;
 ME_Paragraph *cell_end_para( ME_Cell *cell ) DECLSPEC_HIDDEN;
 ME_Paragraph *cell_first_para( ME_Cell *cell ) DECLSPEC_HIDDEN;
 ME_Cell *cell_next( ME_Cell *cell ) DECLSPEC_HIDDEN;
diff --git a/dlls/riched20/para.c b/dlls/riched20/para.c
index e7c3c6934b9..47640a6fd50 100644
--- a/dlls/riched20/para.c
+++ b/dlls/riched20/para.c
@@ -243,7 +243,7 @@ static void table_update_flags( ME_Paragraph *para )
 {
     para->fmt.dwMask |= PFM_TABLE | PFM_TABLEROWDELIMITER;
 
-    if (para->pCell) para->nFlags |= MEPF_CELL;
+    if (para_cell( para )) para->nFlags |= MEPF_CELL;
     else para->nFlags &= ~MEPF_CELL;
 
     if (para->nFlags & MEPF_ROWEND) para->fmt.wEffects |= PFE_TABLEROWDELIMITER;
@@ -623,29 +623,28 @@ ME_Paragraph *para_split( ME_TextEditor *editor, ME_Run *run, ME_Style *style,
   {
     if (paraFlags & (MEPF_ROWSTART | MEPF_CELL))
     {
-      ME_DisplayItem *cell = ME_MakeDI(diCell);
-      ME_InsertBefore( para_get_di( new_para ), cell );
-      new_para->pCell = cell;
-      cell->member.cell.next_cell = NULL;
+      ME_Cell *cell = cell_create();
+      ME_InsertBefore( para_get_di( new_para ), cell_get_di( cell ) );
+      new_para->pCell = cell_get_di( cell );
+      cell->next_cell = NULL;
       if (paraFlags & MEPF_ROWSTART)
       {
         old_para->nFlags |= MEPF_ROWSTART;
-        cell->member.cell.prev_cell = NULL;
-        cell->member.cell.parent_cell = old_para->pCell;
-        if (old_para->pCell)
-          cell->member.cell.nNestingLevel = old_para->pCell->member.cell.nNestingLevel + 1;
+        cell->prev_cell = NULL;
+        cell->parent_cell = old_para->pCell;
+        if (para_cell( old_para ))
+          cell->nNestingLevel = para_cell( old_para )->nNestingLevel + 1;
         else
-          cell->member.cell.nNestingLevel = 1;
+          cell->nNestingLevel = 1;
       }
       else
       {
-        cell->member.cell.prev_cell = old_para->pCell;
-        assert(cell->member.cell.prev_cell);
-        cell->member.cell.prev_cell->member.cell.next_cell = cell;
+        cell->prev_cell = old_para->pCell;
+        cell_prev( cell )->next_cell = cell_get_di( cell );
         assert( old_para->nFlags & MEPF_CELL );
         assert( !(old_para->nFlags & MEPF_ROWSTART) );
-        cell->member.cell.nNestingLevel = cell->member.cell.prev_cell->member.cell.nNestingLevel;
-        cell->member.cell.parent_cell = cell->member.cell.prev_cell->member.cell.parent_cell;
+        cell->nNestingLevel = cell_prev( cell )->nNestingLevel;
+        cell->parent_cell = cell_prev( cell )->parent_cell;
       }
     }
     else if (paraFlags & MEPF_ROWEND)
@@ -653,11 +652,11 @@ ME_Paragraph *para_split( ME_TextEditor *editor, ME_Run *run, ME_Style *style,
       old_para->nFlags |= MEPF_ROWEND;
       old_para->pCell = old_para->pCell->member.cell.parent_cell;
       new_para->pCell = old_para->pCell;
-      assert( old_para->prev_para->member.para.nFlags & MEPF_CELL );
-      assert( !(old_para->prev_para->member.para.nFlags & MEPF_ROWSTART) );
-      if (new_para->pCell != new_para->next_para->member.para.pCell
-          && new_para->next_para->member.para.pCell
-          && !new_para->next_para->member.para.pCell->member.cell.prev_cell)
+      assert( para_prev( old_para )->nFlags & MEPF_CELL );
+      assert( !(para_prev( old_para )->nFlags & MEPF_ROWSTART) );
+      if (new_para->pCell != para_next( new_para )->pCell
+          && para_next( new_para )->pCell
+          && !para_next( new_para )->pCell->member.cell.prev_cell)
       {
         /* Row starts just after the row that was ended. */
         new_para->nFlags |= MEPF_ROWSTART;
@@ -686,9 +685,10 @@ ME_Paragraph *para_split( ME_TextEditor *editor, ME_Run *run, ME_Style *style,
    specified in use_first_fmt */
 ME_Paragraph *para_join( ME_TextEditor *editor, ME_Paragraph *para, BOOL use_first_fmt )
 {
-  ME_DisplayItem *tmp, *pCell = NULL;
+  ME_DisplayItem *tmp;
   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;
   CHARFORMAT2W fmt;
@@ -729,22 +729,22 @@ ME_Paragraph *para_join( ME_TextEditor *editor, ME_Paragraph *para, BOOL use_fir
     {
       if (tmp->type == diCell)
       {
-        pCell = tmp;
+        cell = &tmp->member.cell;
         break;
       }
     }
   }
 
-  add_undo_split_para( editor, next, eol_str, pCell ? &pCell->member.cell : NULL );
+  add_undo_split_para( editor, next, eol_str, cell );
 
-  if (pCell)
+  if (cell)
   {
-    ME_Remove( pCell );
-    if (pCell->member.cell.prev_cell)
-      pCell->member.cell.prev_cell->member.cell.next_cell = pCell->member.cell.next_cell;
-    if (pCell->member.cell.next_cell)
-      pCell->member.cell.next_cell->member.cell.prev_cell = pCell->member.cell.prev_cell;
-    ME_DestroyDisplayItem( pCell );
+    ME_Remove( cell_get_di( cell ) );
+    if (cell_prev( cell ))
+        cell_prev( cell )->next_cell = cell_next( cell ) ? cell_get_di( cell_next( cell ) ) : NULL;
+    if (cell_next( cell ))
+        cell_next( cell )->prev_cell = cell_prev( cell ) ? cell_get_di( cell_prev( cell ) ) : NULL;
+    ME_DestroyDisplayItem( cell_get_di( cell ) );
   }
 
   if (!use_first_fmt)
diff --git a/dlls/riched20/table.c b/dlls/riched20/table.c
index 83b089d6dbc..08f04e06ca7 100644
--- a/dlls/riched20/table.c
+++ b/dlls/riched20/table.c
@@ -185,6 +185,12 @@ ME_Cell *table_row_end_cell( ME_Paragraph *para )
     return cell_next( para_cell( para ) );
 }
 
+ME_Cell *cell_create( void )
+{
+    ME_DisplayItem *item = ME_MakeDI( diCell );
+    return &item->member.cell;
+}
+
 ME_Cell *cell_next( ME_Cell *cell )
 {
     if (!cell->next_cell) return NULL;




More information about the wine-cvs mailing list