[PATCH 4/5] gdiplus/metafile: Added support for EmfPlusStringFormat object playback
Nikolay Sivov
nsivov at codeweavers.com
Tue Oct 17 07:49:14 CDT 2017
Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
---
dlls/gdiplus/metafile.c | 81 +++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 81 insertions(+)
diff --git a/dlls/gdiplus/metafile.c b/dlls/gdiplus/metafile.c
index b67f5654ae..5a8312dbe1 100644
--- a/dlls/gdiplus/metafile.c
+++ b/dlls/gdiplus/metafile.c
@@ -388,6 +388,37 @@ typedef struct EmfPlusFont
WCHAR FamilyName[1];
} EmfPlusFont;
+typedef struct EmfPlusLanguageIdentifier
+{
+ LANGID langid;
+} EmfPlusLanguageIdentifier;
+
+typedef struct EmfPlusCharacterRange
+{
+ DWORD First;
+ DWORD Length;
+} EmfPlusCharacterRange;
+
+typedef struct EmfPlusStringFormat
+{
+ DWORD Version;
+ DWORD StringFormatFlags;
+ EmfPlusLanguageIdentifier Language;
+ DWORD StringAlignment;
+ DWORD LineAlign;
+ DWORD DigitSubstitution;
+ EmfPlusLanguageIdentifier DigitLanguage;
+ float FirstTabOffset;
+ DWORD HotkeyPrefix;
+ float LeadingMargin;
+ float TrailingMargin;
+ float Tracking;
+ DWORD Trimming;
+ DWORD TabStopCount;
+ DWORD RangeCount;
+ BYTE StringFormatData[1];
+} EmfPlusStringFormat;
+
static void metafile_free_object_table_entry(GpMetafile *metafile, BYTE id)
{
struct emfplus_object *object = &metafile->objtable[id];
@@ -1734,6 +1765,56 @@ static GpStatus METAFILE_PlaybackObject(GpMetafile *metafile, UINT flags, UINT d
GdipDeleteFontFamily(family);
break;
}
+ case ObjectTypeStringFormat:
+ {
+ DWORD optional_offset = FIELD_OFFSET(EmfPlusStringFormat, StringFormatData);
+ EmfPlusStringFormat *data = (EmfPlusStringFormat *)record_data;
+ GpStringFormat *format = NULL;
+
+ if (data_size < optional_offset)
+ return InvalidParameter;
+ data_size -= optional_offset;
+
+ if (data_size != (data->TabStopCount * sizeof(float) + data->RangeCount * sizeof(EmfPlusCharacterRange)))
+ return InvalidParameter;
+
+ status = GdipCreateStringFormat(data->StringFormatFlags, data->Language.langid, &format);
+ if (status != Ok)
+ return status;
+
+ status = GdipSetStringFormatAlign(format, data->StringAlignment);
+ if (status == Ok)
+ status = GdipSetStringFormatLineAlign(format, data->LineAlign);
+ if (status == Ok)
+ status = GdipSetStringFormatDigitSubstitution(format, data->DigitLanguage.langid, data->DigitSubstitution);
+ if (status == Ok)
+ status = GdipSetStringFormatHotkeyPrefix(format, data->HotkeyPrefix);
+ if (status == Ok)
+ status = GdipSetStringFormatTrimming(format, data->Trimming);
+ format->leading_margin = data->LeadingMargin;
+ format->trailing_margin = data->TrailingMargin;
+ format->tracking = data->Tracking;
+
+ if (status == Ok && data->TabStopCount)
+ {
+ status = GdipSetStringFormatTabStops(format, data->FirstTabOffset, data->TabStopCount,
+ (float *)data->StringFormatData);
+ optional_offset += data->TabStopCount * sizeof(float);
+ }
+
+ if (status == Ok && data->RangeCount)
+ {
+ status = GdipSetStringFormatMeasurableCharacterRanges(format, data->RangeCount,
+ (CharacterRange *)((BYTE *)data->StringFormatData + optional_offset));
+ }
+
+ if (status == Ok)
+ object = format;
+ else
+ GdipDeleteStringFormat(format);
+
+ break;
+ }
case ObjectTypeImageAttributes:
{
EmfPlusImageAttributes *data = (EmfPlusImageAttributes *)record_data;
--
2.14.2
More information about the wine-patches
mailing list