[PATCH] richedit: fix for the semantics of the flags for some effects reported by EM_GETCHARFORMAT Remove workaround put in place by a previous patch, due to buggy flag reporting. Tests to verify fixed behavior.

Alex Villacís Lasso alex at karlalex.palosanto.com
Sat May 3 23:36:17 CDT 2008


---
 dlls/riched20/editor.c       |    7 ---
 dlls/riched20/run.c          |   14 ++++-
 dlls/riched20/tests/editor.c |  119 ++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 131 insertions(+), 9 deletions(-)

diff --git a/dlls/riched20/editor.c b/dlls/riched20/editor.c
index b5b2d00..b3cd442 100644
--- a/dlls/riched20/editor.c
+++ b/dlls/riched20/editor.c
@@ -3932,13 +3932,8 @@ BOOL ME_UpdateLinkAttribute(ME_TextEditor *editor, int sel_min, int sel_max)
       /* CFE_LINK effect should be consistently unset */
       link.cbSize = sizeof(link);
       ME_GetCharFormat(editor, beforeURL[0], beforeURL[1], &link);
-      /* FIXME: Workaround for what looks like a bug - ME_GetCharFormat does not
-         clear the CFM_LINK flag when selection spans text without CFE_LINK,
-         followed by CFE_LINK set. This needs a test for EM_GETCHARFORMAT */
-#if 0
       if (!(link.dwMask & CFM_LINK) || (link.dwEffects & CFE_LINK))
       {
-#endif
         /* CFE_LINK must be unset from this range */
         memset(&link, 0, sizeof(CHARFORMAT2W));
         link.cbSize = sizeof(link);
@@ -3946,9 +3941,7 @@ BOOL ME_UpdateLinkAttribute(ME_TextEditor *editor, int sel_min, int sel_max)
         link.dwEffects = 0;
         ME_SetCharFormat(editor, beforeURL[0], beforeURL[1] - beforeURL[0], &link);
         modified = TRUE;
-#if 0
       }
-#endif
     }
     if (inURL[0] < inURL[1])
     {
diff --git a/dlls/riched20/run.c b/dlls/riched20/run.c
index c49eb16..0af3ba0 100644
--- a/dlls/riched20/run.c
+++ b/dlls/riched20/run.c
@@ -857,6 +857,16 @@ void ME_SetDefaultCharFormat(ME_TextEditor *editor, CHARFORMAT2W *mod)
 static void ME_GetRunCharFormat(ME_TextEditor *editor, ME_DisplayItem *run, CHARFORMAT2W *pFmt)
 {
   ME_CopyCharFormat(pFmt, &run->member.run.style->fmt);
+  if ((pFmt->dwMask & CFM_UNDERLINETYPE) && (pFmt->bUnderlineType == CFU_CF1UNDERLINE))
+  {
+    pFmt->dwMask |= CFM_UNDERLINE;
+    pFmt->dwEffects |= CFE_UNDERLINE;
+  }
+  if ((pFmt->dwMask & CFM_UNDERLINETYPE) && (pFmt->bUnderlineType == CFU_UNDERLINENONE))
+  {
+    pFmt->dwMask |= CFM_UNDERLINE;
+    pFmt->dwEffects &= ~CFE_UNDERLINE;
+  }
 }
 
 /******************************************************************************
@@ -928,7 +938,7 @@ void ME_GetCharFormat(ME_TextEditor *editor, int nFrom, int nTo, CHARFORMAT2W *p
   do {
     /* FIXME add more style feature comparisons */
     int nAttribs = CFM_SIZE | CFM_FACE | CFM_COLOR | CFM_UNDERLINETYPE;
-    int nEffects = CFM_BOLD | CFM_ITALIC;
+    int nEffects = CFM_BOLD | CFM_ITALIC | CFM_UNDERLINE | CFM_STRIKEOUT | CFM_PROTECTED | CFM_LINK | CFM_SUPERSCRIPT;
 
     run = ME_FindItemFwd(run, diRun);
 
@@ -937,7 +947,6 @@ void ME_GetCharFormat(ME_TextEditor *editor, int nFrom, int nTo, CHARFORMAT2W *p
     ME_GetRunCharFormat(editor, run, &tmp);
 
     assert((tmp.dwMask & nAttribs) == nAttribs);
-    assert((tmp.dwMask & nEffects) == nEffects);
     /* reset flags that differ */
 
     if (pFmt->yHeight != tmp.yHeight)
@@ -964,6 +973,7 @@ void ME_GetCharFormat(ME_TextEditor *editor, int nFrom, int nTo, CHARFORMAT2W *p
     }
 
     pFmt->dwMask &= ~((pFmt->dwEffects ^ tmp.dwEffects) & nEffects);
+    pFmt->dwEffects = tmp.dwEffects;
 
   } while(run != run_end);
 }
diff --git a/dlls/riched20/tests/editor.c b/dlls/riched20/tests/editor.c
index 09c1527..fce2699 100644
--- a/dlls/riched20/tests/editor.c
+++ b/dlls/riched20/tests/editor.c
@@ -402,6 +402,18 @@ static void test_EM_SETCHARFORMAT(void)
   HWND hwndRichEdit = new_richedit(NULL);
   CHARFORMAT2 cf2;
   int rc = 0;
+  int tested_effects[] = {
+    CFE_BOLD,
+    CFE_ITALIC,
+    CFE_UNDERLINE,
+    CFE_STRIKEOUT,
+    CFE_PROTECTED,
+    CFE_LINK,
+    CFE_SUBSCRIPT,
+    CFE_SUPERSCRIPT,
+    0
+  };
+  int i;
 
   /* Invalid flags, CHARFORMAT2 structure blanked out */
   memset(&cf2, 0, sizeof(cf2));
@@ -520,6 +532,113 @@ static void test_EM_SETCHARFORMAT(void)
   ok(rc == -1, "Text not marked as modified, expected modified! (%d)\n", rc);
 
   DestroyWindow(hwndRichEdit);
+
+  /* EM_GETCHARFORMAT tests */
+  for (i = 0; tested_effects[i]; i++)
+  {
+    hwndRichEdit = new_richedit(NULL);
+    SendMessage(hwndRichEdit, WM_SETTEXT, 0, (LPARAM)"wine");
+
+    memset(&cf2, 0, sizeof(CHARFORMAT2));
+    cf2.cbSize = sizeof(CHARFORMAT2);
+    cf2.dwMask = tested_effects[i];
+    if (cf2.dwMask == CFE_SUBSCRIPT || cf2.dwMask == CFE_SUPERSCRIPT)
+      cf2.dwMask = CFM_SUPERSCRIPT;
+    cf2.dwEffects = tested_effects[i];
+    SendMessage(hwndRichEdit, EM_SETSEL, 0, 2);
+    SendMessage(hwndRichEdit, EM_SETCHARFORMAT, SCF_SELECTION, (LPARAM) &cf2);
+    
+    memset(&cf2, 0, sizeof(CHARFORMAT2));
+    cf2.cbSize = sizeof(CHARFORMAT2);
+    SendMessage(hwndRichEdit, EM_SETSEL, 0, 2);
+    SendMessage(hwndRichEdit, EM_GETCHARFORMAT, SCF_SELECTION, (LPARAM) &cf2);
+    ok ((((tested_effects[i] == CFE_SUBSCRIPT || tested_effects[i] == CFE_SUPERSCRIPT) &&
+          (cf2.dwMask & CFM_SUPERSCRIPT) == CFM_SUPERSCRIPT)
+          ||
+          (cf2.dwMask & tested_effects[i]) == tested_effects[i]),
+        "%d, cf2.dwMask == 0x%08x expected mask 0x%08x\n", i, cf2.dwMask, tested_effects[i]);
+    ok((cf2.dwEffects & tested_effects[i]) == tested_effects[i],
+        "%d, cf2.dwEffects == 0x%08x expected effect 0x%08x\n", i, cf2.dwEffects, tested_effects[i]);
+
+    memset(&cf2, 0, sizeof(CHARFORMAT2));
+    cf2.cbSize = sizeof(CHARFORMAT2);
+    SendMessage(hwndRichEdit, EM_SETSEL, 2, 4);
+    SendMessage(hwndRichEdit, EM_GETCHARFORMAT, SCF_SELECTION, (LPARAM) &cf2);
+    ok ((((tested_effects[i] == CFE_SUBSCRIPT || tested_effects[i] == CFE_SUPERSCRIPT) &&
+          (cf2.dwMask & CFM_SUPERSCRIPT) == CFM_SUPERSCRIPT)
+          ||
+          (cf2.dwMask & tested_effects[i]) == tested_effects[i]),
+        "%d, cf2.dwMask == 0x%08x expected mask 0x%08x\n", i, cf2.dwMask, tested_effects[i]);
+    ok((cf2.dwEffects & tested_effects[i]) == 0,
+        "%d, cf2.dwEffects == 0x%08x expected effect 0x%08x clear\n", i, cf2.dwEffects, tested_effects[i]);
+
+    memset(&cf2, 0, sizeof(CHARFORMAT2));
+    cf2.cbSize = sizeof(CHARFORMAT2);
+    SendMessage(hwndRichEdit, EM_SETSEL, 1, 3);
+    SendMessage(hwndRichEdit, EM_GETCHARFORMAT, SCF_SELECTION, (LPARAM) &cf2);
+    ok ((((tested_effects[i] == CFE_SUBSCRIPT || tested_effects[i] == CFE_SUPERSCRIPT) &&
+          (cf2.dwMask & CFM_SUPERSCRIPT) == 0)
+          ||
+          (cf2.dwMask & tested_effects[i]) == 0),
+        "%d, cf2.dwMask == 0x%08x expected mask 0x%08x clear\n", i, cf2.dwMask, tested_effects[i]);
+    ok((cf2.dwEffects & tested_effects[i]) == 0,
+        "%d, cf2.dwEffects == 0x%08x expected effect 0x%08x clear\n", i, cf2.dwEffects, tested_effects[i]);
+
+    DestroyWindow(hwndRichEdit);
+  }
+
+  for (i = 0; tested_effects[i]; i++)
+  {
+    hwndRichEdit = new_richedit(NULL);
+    SendMessage(hwndRichEdit, WM_SETTEXT, 0, (LPARAM)"wine");
+
+    memset(&cf2, 0, sizeof(CHARFORMAT2));
+    cf2.cbSize = sizeof(CHARFORMAT2);
+    cf2.dwMask = tested_effects[i];
+    if (cf2.dwMask == CFE_SUBSCRIPT || cf2.dwMask == CFE_SUPERSCRIPT)
+      cf2.dwMask = CFM_SUPERSCRIPT;
+    cf2.dwEffects = tested_effects[i];
+    SendMessage(hwndRichEdit, EM_SETSEL, 2, 4);
+    SendMessage(hwndRichEdit, EM_SETCHARFORMAT, SCF_SELECTION, (LPARAM) &cf2);
+
+    memset(&cf2, 0, sizeof(CHARFORMAT2));
+    cf2.cbSize = sizeof(CHARFORMAT2);
+    SendMessage(hwndRichEdit, EM_SETSEL, 0, 2);
+    SendMessage(hwndRichEdit, EM_GETCHARFORMAT, SCF_SELECTION, (LPARAM) &cf2);
+    ok ((((tested_effects[i] == CFE_SUBSCRIPT || tested_effects[i] == CFE_SUPERSCRIPT) &&
+          (cf2.dwMask & CFM_SUPERSCRIPT) == CFM_SUPERSCRIPT)
+          ||
+          (cf2.dwMask & tested_effects[i]) == tested_effects[i]),
+        "%d, cf2.dwMask == 0x%08x expected mask 0x%08x\n", i, cf2.dwMask, tested_effects[i]);
+    ok((cf2.dwEffects & tested_effects[i]) == 0,
+        "%d, cf2.dwEffects == 0x%08x expected effect 0x%08x clear\n", i, cf2.dwEffects, tested_effects[i]);
+
+    memset(&cf2, 0, sizeof(CHARFORMAT2));
+    cf2.cbSize = sizeof(CHARFORMAT2);
+    SendMessage(hwndRichEdit, EM_SETSEL, 2, 4);
+    SendMessage(hwndRichEdit, EM_GETCHARFORMAT, SCF_SELECTION, (LPARAM) &cf2);
+    ok ((((tested_effects[i] == CFE_SUBSCRIPT || tested_effects[i] == CFE_SUPERSCRIPT) &&
+          (cf2.dwMask & CFM_SUPERSCRIPT) == CFM_SUPERSCRIPT)
+          ||
+          (cf2.dwMask & tested_effects[i]) == tested_effects[i]),
+        "%d, cf2.dwMask == 0x%08x expected mask 0x%08x\n", i, cf2.dwMask, tested_effects[i]);
+    ok((cf2.dwEffects & tested_effects[i]) == tested_effects[i],
+        "%d, cf2.dwEffects == 0x%08x expected effect 0x%08x\n", i, cf2.dwEffects, tested_effects[i]);
+
+    memset(&cf2, 0, sizeof(CHARFORMAT2));
+    cf2.cbSize = sizeof(CHARFORMAT2);
+    SendMessage(hwndRichEdit, EM_SETSEL, 1, 3);
+    SendMessage(hwndRichEdit, EM_GETCHARFORMAT, SCF_SELECTION, (LPARAM) &cf2);
+    ok ((((tested_effects[i] == CFE_SUBSCRIPT || tested_effects[i] == CFE_SUPERSCRIPT) &&
+          (cf2.dwMask & CFM_SUPERSCRIPT) == 0)
+          ||
+          (cf2.dwMask & tested_effects[i]) == 0),
+        "%d, cf2.dwMask == 0x%08x expected mask 0x%08x clear\n", i, cf2.dwMask, tested_effects[i]);
+    ok((cf2.dwEffects & tested_effects[i]) == tested_effects[i],
+        "%d, cf2.dwEffects == 0x%08x expected effect 0x%08x set\n", i, cf2.dwEffects, tested_effects[i]);
+
+    DestroyWindow(hwndRichEdit);
+  }
 }
 
 static void test_EM_SETTEXTMODE(void)
-- 
1.5.4.1


--------------070200090506000603000401--



More information about the wine-patches mailing list