From 83aafaaae80789868c46b090126a93bd59c59545 Mon Sep 17 00:00:00 2001 From: Nikolay Sivov Date: Thu, 25 Dec 2014 14:03:19 +0300 Subject: [PATCH] dwrite: Store nominal breakpoint data in layout. --- dlls/dwrite/layout.c | 30 +++++++++++++++++++++++++++++- 1 file changed, 29 insertions(+), 1 deletion(-) diff --git a/dlls/dwrite/layout.c b/dlls/dwrite/layout.c index 5b23a0c25b..1ede48c0d4 100644 --- a/dlls/dwrite/layout.c +++ b/dlls/dwrite/layout.c @@ -120,6 +120,8 @@ struct dwrite_textlayout { struct list ranges; struct list runs; BOOL recompute; + + DWRITE_LINE_BREAKPOINT *breakpoints; }; struct dwrite_textformat { @@ -276,6 +278,24 @@ static HRESULT layout_compute(struct dwrite_textlayout *layout) } } + /* nominal breakpoints are evaluated only once, because string never changes */ + if (!layout->breakpoints) { + IDWriteTextAnalyzer *analyzer; + HRESULT hr; + + layout->breakpoints = heap_alloc(sizeof(DWRITE_LINE_BREAKPOINT)*layout->len); + if (!layout->breakpoints) + return E_OUTOFMEMORY; + + hr = get_textanalyzer(&analyzer); + if (FAILED(hr)) + return hr; + + hr = IDWriteTextAnalyzer_AnalyzeLineBreakpoints(analyzer, &layout->IDWriteTextAnalysisSource_iface, + 0, layout->len, &layout->IDWriteTextAnalysisSink_iface); + IDWriteTextAnalyzer_Release(analyzer); + } + layout->recompute = FALSE; return hr; } @@ -675,6 +695,7 @@ static ULONG WINAPI dwritetextlayout_Release(IDWriteTextLayout2 *iface) free_layout_ranges_list(This); free_layout_runs(This); release_format_data(&This->format); + heap_free(This->breakpoints); heap_free(This->str); heap_free(This); } @@ -1575,7 +1596,13 @@ static HRESULT WINAPI dwritetextlayout_sink_SetScriptAnalysis(IDWriteTextAnalysi static HRESULT WINAPI dwritetextlayout_sink_SetLineBreakpoints(IDWriteTextAnalysisSink *iface, UINT32 position, UINT32 length, DWRITE_LINE_BREAKPOINT const* breakpoints) { - return E_NOTIMPL; + struct dwrite_textlayout *layout = impl_from_IDWriteTextAnalysisSink(iface); + + if (position + length > layout->len) + return E_FAIL; + + memcpy(&layout->breakpoints[position], breakpoints, length*sizeof(DWRITE_LINE_BREAKPOINT)); + return S_OK; } static HRESULT WINAPI dwritetextlayout_sink_SetBidiLevel(IDWriteTextAnalysisSink *iface, UINT32 position, @@ -1806,6 +1833,7 @@ HRESULT create_textlayout(const WCHAR *str, UINT32 len, IDWriteTextFormat *forma This->maxwidth = maxwidth; This->maxheight = maxheight; This->recompute = TRUE; + This->breakpoints = NULL; layout_format_from_textformat(This, format); list_init(&This->runs);