[Gdiplus 1/4] Implement GdipSetStringFormatMeasurableCharacterRanges

Adam Petaccia adam at tpetaccia.com
Sat Aug 16 22:26:46 CDT 2008


Also, move a TRACE to the top.
---
 dlls/gdiplus/gdiplus_private.h    |    2 ++
 dlls/gdiplus/stringformat.c       |   28 +++++++++++++++++++++++++---
 dlls/gdiplus/tests/stringformat.c |    4 ++--
 3 files changed, 29 insertions(+), 5 deletions(-)

diff --git a/dlls/gdiplus/gdiplus_private.h b/dlls/gdiplus/gdiplus_private.h
index 3611239..7930be4 100644
--- a/dlls/gdiplus/gdiplus_private.h
+++ b/dlls/gdiplus/gdiplus_private.h
@@ -204,6 +204,8 @@ struct GpStringFormat{
     INT tabcount;
     REAL firsttab;
     REAL *tabs;
+    CharacterRange *charranges;
+    INT charrangecount;
 };
 
 struct GpFontCollection{
diff --git a/dlls/gdiplus/stringformat.c b/dlls/gdiplus/stringformat.c
index 201201a..8a3e8cd 100644
--- a/dlls/gdiplus/stringformat.c
+++ b/dlls/gdiplus/stringformat.c
@@ -235,12 +235,19 @@ GpStatus WINGDIPAPI GdipSetStringFormatLineAlign(GpStringFormat *format,
 GpStatus WINGDIPAPI GdipSetStringFormatMeasurableCharacterRanges(GpStringFormat*
         format, INT rangeCount, GDIPCONST CharacterRange* ranges)
 {
+    TRACE("%p, %d, %p\n", format, rangeCount, ranges);
+
     if (!(format && rangeCount && ranges))
         return InvalidParameter;
 
-    FIXME("stub: %p, %d, %p\n", format, rangeCount, ranges);
+    format->charrangecount = rangeCount;
+    GdipFree(format->charranges);
+    format->charranges = GdipAlloc(sizeof(CharacterRange) * rangeCount);
+    if (format->charranges == NULL)
+        return OutOfMemory;
+    memcpy(format->charranges, ranges, sizeof(CharacterRange) * rangeCount);
 
-    return NotImplemented;
+    return Ok;
 }
 
 GpStatus WINGDIPAPI GdipSetStringFormatTabStops(GpStringFormat *format, REAL firsttab,
@@ -293,6 +300,8 @@ GpStatus WINGDIPAPI GdipSetStringFormatFlags(GDIPCONST GpStringFormat *format, I
 
 GpStatus WINGDIPAPI GdipCloneStringFormat(GDIPCONST GpStringFormat *format, GpStringFormat **newFormat)
 {
+    TRACE("%p %p\n",format,newFormat);
+
     if(!format || !newFormat)
         return InvalidParameter;
 
@@ -312,7 +321,20 @@ GpStatus WINGDIPAPI GdipCloneStringFormat(GDIPCONST GpStringFormat *format, GpSt
     else
         (*newFormat)->tabs = NULL;
 
-    TRACE("%p %p\n",format,newFormat);
+    if(format->charrangecount > 0)
+    {
+        (*newFormat)->charranges = GdipAlloc(sizeof(CharacterRange) *
+                format->charrangecount);
+        if(!(*newFormat)->charranges)
+        {
+            GdipFree(*newFormat);
+            return OutOfMemory;
+        }
+        memcpy((*newFormat)->charranges, format->charranges,
+                sizeof(CharacterRange) * format->charrangecount);
+    }
+    else
+        (*newFormat)->charranges = NULL;
 
     return Ok;
 }
diff --git a/dlls/gdiplus/tests/stringformat.c b/dlls/gdiplus/tests/stringformat.c
index 9331912..ad52f4f 100644
--- a/dlls/gdiplus/tests/stringformat.c
+++ b/dlls/gdiplus/tests/stringformat.c
@@ -64,10 +64,10 @@ static void test_characterrange(void)
 
     stat = GdipCreateStringFormat(0, LANG_NEUTRAL, &format);
     expect(Ok, stat);
-todo_wine
-{
     stat = GdipSetStringFormatMeasurableCharacterRanges(format, 3, ranges);
     expect(Ok, stat);
+todo_wine
+{
     stat = GdipGetStringFormatMeasurableCharacterRangeCount(format, &count);
     expect(Ok, stat);
     if (stat == Ok) expect(3, count);
-- 
1.5.4.3




More information about the wine-patches mailing list