Module: wine Branch: master Commit: 9f63f7d949abc7a67f0031d046818698b7e82ec9 URL: http://source.winehq.org/git/wine.git/?a=commit;h=9f63f7d949abc7a67f0031d046...
Author: Hans Leidekker hans@codeweavers.com Date: Tue Dec 22 10:37:55 2009 +0100
gdiplus: Implement GdipGet/SetStringFormatMeasurableCharacterRanges.
---
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); }