Module: wine Branch: master Commit: 7a83be7bd273a02a6c558f75e9d8a4af6145de5c URL: http://source.winehq.org/git/wine.git/?a=commit;h=7a83be7bd273a02a6c558f75e9...
Author: Nikolay Sivov nsivov@codeweavers.com Date: Fri Dec 25 15:57:58 2015 +0300
dwrite: Optimize for the most common case of layout object initialization.
Signed-off-by: Nikolay Sivov nsivov@codeweavers.com Signed-off-by: Alexandre Julliard julliard@winehq.org
---
dlls/dwrite/layout.c | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+)
diff --git a/dlls/dwrite/layout.c b/dlls/dwrite/layout.c index 66998b6..b341ad5 100644 --- a/dlls/dwrite/layout.c +++ b/dlls/dwrite/layout.c @@ -326,6 +326,8 @@ static inline struct dwrite_textformat *impl_from_IDWriteTextFormat1(IDWriteText return CONTAINING_RECORD(iface, struct dwrite_textformat, IDWriteTextFormat1_iface); }
+static struct dwrite_textformat *unsafe_impl_from_IDWriteTextFormat(IDWriteTextFormat*); + static inline struct dwrite_trimmingsign *impl_from_IDWriteInlineObject(IDWriteInlineObject *iface) { return CONTAINING_RECORD(iface, struct dwrite_trimmingsign, IDWriteInlineObject_iface); @@ -3896,10 +3898,29 @@ static const IDWriteTextAnalysisSourceVtbl dwritetextlayoutsourcevtbl = {
static HRESULT layout_format_from_textformat(struct dwrite_textlayout *layout, IDWriteTextFormat *format) { + struct dwrite_textformat *textformat; IDWriteTextFormat1 *format1; UINT32 len; HRESULT hr;
+ if ((textformat = unsafe_impl_from_IDWriteTextFormat(format))) { + layout->format = textformat->format; + + layout->format.locale = heap_strdupW(textformat->format.locale); + layout->format.family_name = heap_strdupW(textformat->format.family_name); + if (!layout->format.locale || !layout->format.family_name) + return E_OUTOFMEMORY; + + if (layout->format.trimmingsign) + IDWriteInlineObject_AddRef(layout->format.trimmingsign); + if (layout->format.collection) + IDWriteFontCollection_AddRef(layout->format.collection); + if (layout->format.fallback) + IDWriteFontFallback_AddRef(layout->format.fallback); + + return S_OK; + } + layout->format.weight = IDWriteTextFormat_GetFontWeight(format); layout->format.style = IDWriteTextFormat_GetFontStyle(format); layout->format.stretch = IDWriteTextFormat_GetFontStretch(format); @@ -4599,6 +4620,12 @@ static const IDWriteTextFormat1Vtbl dwritetextformatvtbl = { dwritetextformat1_GetFontFallback };
+static struct dwrite_textformat *unsafe_impl_from_IDWriteTextFormat(IDWriteTextFormat *iface) +{ + return (iface->lpVtbl == (IDWriteTextFormatVtbl*)&dwritetextformatvtbl) ? + CONTAINING_RECORD(iface, struct dwrite_textformat, IDWriteTextFormat1_iface) : NULL; +} + HRESULT create_textformat(const WCHAR *family_name, IDWriteFontCollection *collection, DWRITE_FONT_WEIGHT weight, DWRITE_FONT_STYLE style, DWRITE_FONT_STRETCH stretch, FLOAT size, const WCHAR *locale, IDWriteTextFormat **format) {