[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