[GDIPLUS]
[reactos.git] / reactos / dll / win32 / gdiplus / stringformat.c
index bfe7d34..cf6ea1f 100644 (file)
@@ -48,11 +48,15 @@ GpStatus WINGDIPAPI GdipCreateStringFormat(INT attr, LANGID lang,
     (*format)->digitlang = LANG_NEUTRAL;
     (*format)->trimming = StringTrimmingCharacter;
     (*format)->digitsub = StringDigitSubstituteUser;
+    (*format)->character_ranges = NULL;
+    (*format)->range_count = 0;
     /* tabstops */
     (*format)->tabcount = 0;
     (*format)->firsttab = 0.0;
     (*format)->tabs = NULL;
 
+    TRACE("<-- %p\n", *format);
+
     return Ok;
 }
 
@@ -61,6 +65,7 @@ GpStatus WINGDIPAPI GdipDeleteStringFormat(GpStringFormat *format)
     if(!format)
         return InvalidParameter;
 
+    GdipFree(format->character_ranges);
     GdipFree(format->tabs);
     GdipFree(format);
 
@@ -141,14 +146,16 @@ GpStatus WINGDIPAPI GdipGetStringFormatLineAlign(GpStringFormat *format,
 }
 
 GpStatus WINGDIPAPI GdipGetStringFormatMeasurableCharacterRangeCount(
-        GDIPCONST GpStringFormat* format, INT* count)
+    GDIPCONST GpStringFormat *format, INT *count)
 {
     if (!(format && count))
         return InvalidParameter;
 
-    FIXME("stub: %p %p\n", format, count);
+    TRACE("%p %p\n", format, count);
+
+    *count = format->range_count;
 
-    return NotImplemented;
+    return Ok;
 }
 
 GpStatus WINGDIPAPI GdipGetStringFormatTabStopCount(GDIPCONST GpStringFormat *format,
@@ -242,15 +249,26 @@ GpStatus WINGDIPAPI GdipSetStringFormatLineAlign(GpStringFormat *format,
     return Ok;
 }
 
-GpStatus WINGDIPAPI GdipSetStringFormatMeasurableCharacterRanges(GpStringFormat*
-        format, INT rangeCount, GDIPCONST CharacterRange* ranges)
+GpStatus WINGDIPAPI GdipSetStringFormatMeasurableCharacterRanges(
+    GpStringFormat *format, INT rangeCount, GDIPCONST CharacterRange *ranges)
 {
-    if (!(format && rangeCount && ranges))
+    CharacterRange *new_ranges;
+
+    if (!(format && ranges))
         return InvalidParameter;
 
-    FIXME("stub: %p, %d, %p\n", format, rangeCount, ranges);
+    TRACE("%p, %d, %p\n", format, rangeCount, ranges);
 
-    return NotImplemented;
+    new_ranges = GdipAlloc(rangeCount * sizeof(CharacterRange));
+    if (!new_ranges)
+        return OutOfMemory;
+
+    GdipFree(format->character_ranges);
+    format->character_ranges = new_ranges;
+    memcpy(format->character_ranges, ranges, sizeof(CharacterRange) * rangeCount);
+    format->range_count = rangeCount;
+
+    return Ok;
 }
 
 GpStatus WINGDIPAPI GdipSetStringFormatTabStops(GpStringFormat *format, REAL firsttab,
@@ -331,6 +349,19 @@ GpStatus WINGDIPAPI GdipCloneStringFormat(GDIPCONST GpStringFormat *format, GpSt
     else
         (*newFormat)->tabs = NULL;
 
+    if(format->range_count > 0){
+        (*newFormat)->character_ranges = GdipAlloc(sizeof(CharacterRange) * format->range_count);
+        if(!(*newFormat)->character_ranges){
+            GdipFree((*newFormat)->tabs);
+            GdipFree(*newFormat);
+            return OutOfMemory;
+        }
+        memcpy((*newFormat)->character_ranges, format->character_ranges,
+               sizeof(CharacterRange) * format->range_count);
+    }
+    else
+        (*newFormat)->character_ranges = NULL;
+
     TRACE("%p %p\n",format,newFormat);
 
     return Ok;