gdiplus: Implement GdipGet/SetStringFormatMeasurableCharacterRanges.
Hans Leidekker
hans at codeweavers.com
Tue Dec 22 03:37:55 CST 2009
Fixes http://bugs.winehq.org/show_bug.cgi?id=21109
---
dlls/gdiplus/gdiplus_private.h | 2 +
dlls/gdiplus/stringformat.c | 41 +++++++++++++++++++++++++++++-------
dlls/gdiplus/tests/stringformat.c | 15 ++++++++++---
3 files changed, 46 insertions(+), 12 deletions(-)
diff --git a/dlls/gdiplus/gdiplus_private.h b/dlls/gdiplus/gdiplus_private.h
index 9a357c8..6d778a4 100644
--- a/dlls/gdiplus/gdiplus_private.h
+++ b/dlls/gdiplus/gdiplus_private.h
@@ -282,6 +282,8 @@ struct GpStringFormat{
INT tabcount;
REAL firsttab;
REAL *tabs;
+ CharacterRange *character_ranges;
+ INT range_count;
};
struct GpFontCollection{
diff --git a/dlls/gdiplus/stringformat.c b/dlls/gdiplus/stringformat.c
index bfe7d34..6e85008 100644
--- a/dlls/gdiplus/stringformat.c
+++ b/dlls/gdiplus/stringformat.c
@@ -48,6 +48,8 @@ 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;
@@ -61,6 +63,7 @@ GpStatus WINGDIPAPI GdipDeleteStringFormat(GpStringFormat *format)
if(!format)
return InvalidParameter;
+ GdipFree(format->character_ranges);
GdipFree(format->tabs);
GdipFree(format);
@@ -141,14 +144,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);
- return NotImplemented;
+ *count = format->range_count;
+
+ return Ok;
}
GpStatus WINGDIPAPI GdipGetStringFormatTabStopCount(GDIPCONST GpStringFormat *format,
@@ -242,15 +247,22 @@ 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))
+ if (!(format && ranges))
return InvalidParameter;
- FIXME("stub: %p, %d, %p\n", format, rangeCount, ranges);
+ TRACE("%p, %d, %p\n", format, rangeCount, ranges);
+
+ format->character_ranges = GdipAlloc(rangeCount * sizeof(CharacterRange));
+ if (!format->character_ranges)
+ return OutOfMemory;
- return NotImplemented;
+ memcpy(format->character_ranges, ranges, sizeof(CharacterRange) * rangeCount);
+ format->range_count = rangeCount;
+
+ return Ok;
}
GpStatus WINGDIPAPI GdipSetStringFormatTabStops(GpStringFormat *format, REAL firsttab,
@@ -331,6 +343,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;
diff --git a/dlls/gdiplus/tests/stringformat.c b/dlls/gdiplus/tests/stringformat.c
index b28dbc6..117e57b 100644
--- a/dlls/gdiplus/tests/stringformat.c
+++ b/dlls/gdiplus/tests/stringformat.c
@@ -29,7 +29,7 @@ static void test_constructor(void)
{
GpStringFormat *format;
GpStatus stat;
- INT n;
+ INT n, count;
StringAlignment align, valign;
StringTrimming trimming;
StringDigitSubstitute digitsub;
@@ -43,6 +43,7 @@ static void test_constructor(void)
GdipGetStringFormatHotkeyPrefix(format, &n);
GdipGetStringFormatTrimming(format, &trimming);
GdipGetStringFormatDigitSubstitution(format, &digitlang, &digitsub);
+ GdipGetStringFormatMeasurableCharacterRangeCount(format, &count);
expect(HotkeyPrefixNone, n);
expect(StringAlignmentNear, align);
@@ -50,6 +51,7 @@ static void test_constructor(void)
expect(StringTrimmingCharacter, trimming);
expect(StringDigitSubstituteUser, digitsub);
expect(LANG_NEUTRAL, digitlang);
+ expect(0, count);
stat = GdipDeleteStringFormat(format);
expect(Ok, stat);
@@ -64,14 +66,19 @@ static void test_characterrange(void)
stat = GdipCreateStringFormat(0, LANG_NEUTRAL, &format);
expect(Ok, stat);
-todo_wine
-{
+ stat = GdipSetStringFormatMeasurableCharacterRanges(NULL, 3, ranges);
+ expect(InvalidParameter, stat);
+ stat = GdipSetStringFormatMeasurableCharacterRanges(format, 0, ranges);
+ expect(Ok, stat);
+ stat = GdipSetStringFormatMeasurableCharacterRanges(format, 3, NULL);
+ expect(InvalidParameter, stat);
+
stat = GdipSetStringFormatMeasurableCharacterRanges(format, 3, ranges);
expect(Ok, stat);
stat = GdipGetStringFormatMeasurableCharacterRangeCount(format, &count);
expect(Ok, stat);
if (stat == Ok) expect(3, count);
-}
+
stat= GdipDeleteStringFormat(format);
expect(Ok, stat);
}
--
1.6.3.3
More information about the wine-patches
mailing list