From da7c3ef578ad06e1063146583b5aafe44a27f454 Mon Sep 17 00:00:00 2001 From: Nikolay Sivov Date: Mon, 1 Feb 2016 14:59:12 +0300 Subject: [PATCH] dwrite: Implement GetLocaleName() for layout analysis source. Signed-off-by: Nikolay Sivov Signed-off-by: Alexandre Julliard --- dlls/dwrite/layout.c | 25 +++++++++++++++++++++++-- 1 file changed, 23 insertions(+), 2 deletions(-) diff --git a/dlls/dwrite/layout.c b/dlls/dwrite/layout.c index 8f98c58d55..8847c976b0 100644 --- a/dlls/dwrite/layout.c +++ b/dlls/dwrite/layout.c @@ -4143,8 +4143,29 @@ static DWRITE_READING_DIRECTION WINAPI dwritetextlayout_source_GetParagraphReadi static HRESULT WINAPI dwritetextlayout_source_GetLocaleName(IDWriteTextAnalysisSource1 *iface, UINT32 position, UINT32* text_len, WCHAR const** locale) { - FIXME("%u %p %p: stub\n", position, text_len, locale); - return E_NOTIMPL; + struct dwrite_textlayout *layout = impl_from_IDWriteTextAnalysisSource1(iface); + struct layout_range *range = get_layout_range_by_pos(layout, position); + + if (position < layout->len) { + struct layout_range *next; + + *locale = range->locale; + *text_len = range->h.range.length - position; + + next = LIST_ENTRY(list_next(&layout->ranges, &range->h.entry), struct layout_range, h.entry); + while (next && next->h.range.startPosition < layout->len && !strcmpW(range->locale, next->locale)) { + *text_len += next->h.range.length; + next = LIST_ENTRY(list_next(&layout->ranges, &next->h.entry), struct layout_range, h.entry); + } + + *text_len = min(*text_len, layout->len - position); + } + else { + *locale = NULL; + *text_len = 0; + } + + return S_OK; } static HRESULT WINAPI dwritetextlayout_source_GetNumberSubstitution(IDWriteTextAnalysisSource1 *iface, -- 2.33.8