Huw Davies : riched20: Use the run and para helpers in the cursor movement functions.

Alexandre Julliard julliard at winehq.org
Tue Oct 13 15:42:03 CDT 2020


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

Author: Huw Davies <huw at codeweavers.com>
Date:   Tue Oct 13 11:16:34 2020 +0100

riched20: Use the run and para helpers in the cursor movement functions.

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

---

 dlls/riched20/caret.c | 121 ++++++++++++++++++++++----------------------------
 1 file changed, 54 insertions(+), 67 deletions(-)

diff --git a/dlls/riched20/caret.c b/dlls/riched20/caret.c
index 2fe057cdbd..dde0c7faad 100644
--- a/dlls/riched20/caret.c
+++ b/dlls/riched20/caret.c
@@ -671,7 +671,7 @@ int ME_MoveCursorChars(ME_TextEditor *editor, ME_Cursor *cursor, int nRelOfs, BO
     {
       /* new offset in the same paragraph */
       do {
-        cursor->pRun = ME_FindItemBack(cursor->pRun, diRun);
+        cursor->pRun = run_get_di( run_prev( &cursor->pRun->member.run ) );
       } while (cursor->nOffset < cursor->pRun->member.run.nCharOfs);
       cursor->nOffset -= cursor->pRun->member.run.nCharOfs;
       return nRelOfs;
@@ -688,27 +688,29 @@ int ME_MoveCursorChars(ME_TextEditor *editor, ME_Cursor *cursor, int nRelOfs, BO
 
     /* new offset in a previous paragraph */
     do {
-      cursor->pPara = cursor->pPara->member.para.prev_para;
+      cursor->pPara = para_get_di( para_prev( &cursor->pPara->member.para ) );
     } while (cursor->nOffset < cursor->pPara->member.para.nCharOfs);
     cursor->nOffset -= cursor->pPara->member.para.nCharOfs;
 
-    cursor->pRun = ME_FindItemBack(cursor->pPara->member.para.next_para, diRun);
+    cursor->pRun = run_get_di( para_end_run( &cursor->pPara->member.para ) );
     while (cursor->nOffset < cursor->pRun->member.run.nCharOfs) {
-      cursor->pRun = ME_FindItemBack(cursor->pRun, diRun);
+      cursor->pRun = run_get_di( run_prev( &cursor->pRun->member.run ) );
     }
     cursor->nOffset -= cursor->pRun->member.run.nCharOfs;
-  } else if (cursor->nOffset >= cursor->pRun->member.run.len) {
-    ME_DisplayItem *next_para;
+  }
+  else if (cursor->nOffset >= cursor->pRun->member.run.len)
+  {
+    ME_Paragraph *next_para;
     int new_offset;
 
     new_offset = ME_GetCursorOfs(cursor);
-    next_para = cursor->pPara->member.para.next_para;
-    if (new_offset < next_para->member.para.nCharOfs)
+    next_para = para_next( &cursor->pPara->member.para );
+    if (new_offset < next_para->nCharOfs)
     {
       /* new offset in the same paragraph */
       do {
         cursor->nOffset -= cursor->pRun->member.run.len;
-        cursor->pRun = ME_FindItemFwd(cursor->pRun, diRun);
+        cursor->pRun = run_get_di( run_next( &cursor->pRun->member.run ) );
       } while (cursor->nOffset >= cursor->pRun->member.run.len);
       return nRelOfs;
     }
@@ -723,16 +725,16 @@ int ME_MoveCursorChars(ME_TextEditor *editor, ME_Cursor *cursor, int nRelOfs, BO
 
     /* new offset in a following paragraph */
     do {
-      cursor->pPara = next_para;
-      next_para = next_para->member.para.next_para;
-    } while (new_offset >= next_para->member.para.nCharOfs);
+      cursor->pPara = para_get_di( next_para );
+      next_para = para_next( next_para );
+    } while (new_offset >= next_para->nCharOfs);
 
     cursor->nOffset = new_offset - cursor->pPara->member.para.nCharOfs;
-    cursor->pRun = ME_FindItemFwd(cursor->pPara, diRun);
+    cursor->pRun = run_get_di( para_first_run( &cursor->pPara->member.para ) );
     while (cursor->nOffset >= cursor->pRun->member.run.len)
     {
       cursor->nOffset -= cursor->pRun->member.run.len;
-      cursor->pRun = ME_FindItemFwd(cursor->pRun, diRun);
+      cursor->pRun = run_get_di( run_next( &cursor->pRun->member.run ) );
     }
   } /* else new offset is in the same run */
   return nRelOfs;
@@ -742,8 +744,8 @@ int ME_MoveCursorChars(ME_TextEditor *editor, ME_Cursor *cursor, int nRelOfs, BO
 BOOL
 ME_MoveCursorWords(ME_TextEditor *editor, ME_Cursor *cursor, int nRelOfs)
 {
-  ME_DisplayItem *pRun = cursor->pRun, *pOtherRun;
-  ME_DisplayItem *pPara = cursor->pPara;
+  ME_Run *run = &cursor->pRun->member.run, *other_run;
+  ME_Paragraph *para = &cursor->pPara->member.para;
   int nOffset = cursor->nOffset;
 
   if (nRelOfs == -1)
@@ -751,40 +753,33 @@ ME_MoveCursorWords(ME_TextEditor *editor, ME_Cursor *cursor, int nRelOfs)
     /* Backward movement */
     while (TRUE)
     {
-      nOffset = ME_CallWordBreakProc(editor, get_text( &pRun->member.run, 0 ),
-                                     pRun->member.run.len, nOffset, WB_MOVEWORDLEFT);
-      if (nOffset)
-        break;
-      pOtherRun = ME_FindItemBack(pRun, diRunOrParagraph);
-      if (pOtherRun->type == diRun)
+      nOffset = ME_CallWordBreakProc( editor, get_text( run, 0 ), run->len, nOffset, WB_MOVEWORDLEFT );
+      if (nOffset) break;
+      other_run = run_prev( run );
+      if (other_run)
       {
-        if (ME_CallWordBreakProc(editor, get_text( &pOtherRun->member.run, 0 ),
-                                 pOtherRun->member.run.len,
-                                 pOtherRun->member.run.len - 1,
-                                 WB_ISDELIMITER)
-            && !(pRun->member.run.nFlags & MERF_ENDPARA)
-            && !(cursor->pRun == pRun && cursor->nOffset == 0)
-            && !ME_CallWordBreakProc(editor, get_text( &pRun->member.run, 0 ),
-                                     pRun->member.run.len, 0,
-                                     WB_ISDELIMITER))
+        if (ME_CallWordBreakProc( editor, get_text( other_run, 0 ), other_run->len, other_run->len - 1, WB_ISDELIMITER )
+            && !(run->nFlags & MERF_ENDPARA)
+            && !(&cursor->pRun->member.run == run && cursor->nOffset == 0)
+            && !ME_CallWordBreakProc( editor, get_text( run, 0 ), run->len, 0, WB_ISDELIMITER ))
           break;
-        pRun = pOtherRun;
-        nOffset = pOtherRun->member.run.len;
+        run = other_run;
+        nOffset = other_run->len;
       }
-      else if (pOtherRun->type == diParagraph)
+      else
       {
-        if (cursor->pRun == pRun && cursor->nOffset == 0)
+        if (&cursor->pRun->member.run == run && cursor->nOffset == 0)
         {
-          pPara = pOtherRun;
+          para = run->para;
           /* Skip empty start of table row paragraph */
-          if (pPara->member.para.prev_para->member.para.nFlags & MEPF_ROWSTART)
-            pPara = pPara->member.para.prev_para;
+          if (para_prev( para )->nFlags & MEPF_ROWSTART)
+            para = para_prev( para );
           /* Paragraph breaks are treated as separate words */
-          if (pPara->member.para.prev_para->type == diTextStart)
+          if (para_get_di( para_prev( para ) )->type == diTextStart)
             return FALSE;
 
-          pRun = ME_FindItemBack(pPara, diRun);
-          pPara = pPara->member.para.prev_para;
+          para = para_prev( para );
+          run = para_end_run( para );
         }
         break;
       }
@@ -797,43 +792,35 @@ ME_MoveCursorWords(ME_TextEditor *editor, ME_Cursor *cursor, int nRelOfs)
     
     while (TRUE)
     {
-      if (last_delim && !ME_CallWordBreakProc(editor, get_text( &pRun->member.run, 0 ),
-                                              pRun->member.run.len, nOffset, WB_ISDELIMITER))
-        break;
-      nOffset = ME_CallWordBreakProc(editor, get_text( &pRun->member.run, 0 ),
-                                     pRun->member.run.len, nOffset, WB_MOVEWORDRIGHT);
-      if (nOffset < pRun->member.run.len)
+      if (last_delim && !ME_CallWordBreakProc( editor, get_text( run, 0 ), run->len, nOffset, WB_ISDELIMITER ))
         break;
-      pOtherRun = ME_FindItemFwd(pRun, diRunOrParagraphOrEnd);
-      if (pOtherRun->type == diRun)
+      nOffset = ME_CallWordBreakProc( editor, get_text( run, 0 ), run->len, nOffset, WB_MOVEWORDRIGHT );
+      if (nOffset < run->len) break;
+      other_run = run_next( run );
+      if (other_run)
       {
-        last_delim = ME_CallWordBreakProc(editor, get_text( &pRun->member.run, 0 ),
-                                          pRun->member.run.len, nOffset - 1, WB_ISDELIMITER);
-        pRun = pOtherRun;
+        last_delim = ME_CallWordBreakProc( editor, get_text( run, 0 ), run->len, nOffset - 1, WB_ISDELIMITER );
+        run = other_run;
         nOffset = 0;
       }
-      else if (pOtherRun->type == diParagraph)
+      else
       {
-        if (pOtherRun->member.para.nFlags & MEPF_ROWSTART)
-            pOtherRun = pOtherRun->member.para.next_para;
-        if (cursor->pRun == pRun) {
-          pPara = pOtherRun;
-          pRun = ME_FindItemFwd(pPara, diRun);
+        para = para_next( para );
+        if (para_get_di( para )->type == diTextEnd)
+        {
+          if (&cursor->pRun->member.run == run) return FALSE;
+          nOffset = 0;
+          break;
         }
-        nOffset = 0;
-        break;
-      }
-      else /* diTextEnd */
-      {
-        if (cursor->pRun == pRun)
-          return FALSE;
+        if (para->nFlags & MEPF_ROWSTART) para = para_next( para );
+        if (&cursor->pRun->member.run == run) run = para_first_run( para );
         nOffset = 0;
         break;
       }
     }
   }
-  cursor->pPara = pPara;
-  cursor->pRun = pRun;
+  cursor->pPara = para_get_di( para );
+  cursor->pRun = run_get_di( run );
   cursor->nOffset = nOffset;
   return TRUE;
 }




More information about the wine-cvs mailing list