dwrite: Added a helper to get source text pointer.
This commit is contained in:
parent
6e4ad78ff4
commit
e0403efc21
|
@ -676,19 +676,66 @@ static ULONG WINAPI dwritetextanalyzer_Release(IDWriteTextAnalyzer2 *iface)
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static HRESULT WINAPI dwritetextanalyzer_AnalyzeScript(IDWriteTextAnalyzer2 *iface,
|
/* This helper tries to get 'length' chars from a source, allocating a buffer only if source failed to provide enough
|
||||||
IDWriteTextAnalysisSource* source, UINT32 position, UINT32 length, IDWriteTextAnalysisSink* sink)
|
data after a first request. */
|
||||||
|
static HRESULT get_text_source_ptr(IDWriteTextAnalysisSource *source, UINT32 position, UINT32 length, const WCHAR **text, WCHAR **buff)
|
||||||
{
|
{
|
||||||
const WCHAR *text;
|
|
||||||
HRESULT hr;
|
HRESULT hr;
|
||||||
UINT32 len;
|
UINT32 len;
|
||||||
|
|
||||||
TRACE("(%p %u %u %p)\n", source, position, length, sink);
|
*buff = NULL;
|
||||||
|
*text = NULL;
|
||||||
hr = IDWriteTextAnalysisSource_GetTextAtPosition(source, position, &text, &len);
|
len = 0;
|
||||||
|
hr = IDWriteTextAnalysisSource_GetTextAtPosition(source, position, text, &len);
|
||||||
if (FAILED(hr)) return hr;
|
if (FAILED(hr)) return hr;
|
||||||
|
|
||||||
return analyze_script(text, len, sink);
|
if (len < length) {
|
||||||
|
UINT32 read;
|
||||||
|
|
||||||
|
*buff = heap_alloc(length*sizeof(WCHAR));
|
||||||
|
if (!*buff)
|
||||||
|
return E_OUTOFMEMORY;
|
||||||
|
memcpy(*buff, *text, len*sizeof(WCHAR));
|
||||||
|
read = len;
|
||||||
|
|
||||||
|
while (read < length && *text) {
|
||||||
|
*text = NULL;
|
||||||
|
len = 0;
|
||||||
|
hr = IDWriteTextAnalysisSource_GetTextAtPosition(source, read, text, &len);
|
||||||
|
if (FAILED(hr)) {
|
||||||
|
heap_free(*buff);
|
||||||
|
return hr;
|
||||||
|
}
|
||||||
|
memcpy(*buff + read, *text, min(len, length-read)*sizeof(WCHAR));
|
||||||
|
read += len;
|
||||||
|
}
|
||||||
|
|
||||||
|
*text = *buff;
|
||||||
|
}
|
||||||
|
|
||||||
|
return hr;
|
||||||
|
}
|
||||||
|
|
||||||
|
static HRESULT WINAPI dwritetextanalyzer_AnalyzeScript(IDWriteTextAnalyzer2 *iface,
|
||||||
|
IDWriteTextAnalysisSource* source, UINT32 position, UINT32 length, IDWriteTextAnalysisSink* sink)
|
||||||
|
{
|
||||||
|
WCHAR *buff = NULL;
|
||||||
|
const WCHAR *text;
|
||||||
|
HRESULT hr;
|
||||||
|
|
||||||
|
TRACE("(%p %u %u %p)\n", source, position, length, sink);
|
||||||
|
|
||||||
|
if (length == 0)
|
||||||
|
return S_OK;
|
||||||
|
|
||||||
|
hr = get_text_source_ptr(source, position, length, &text, &buff);
|
||||||
|
if (FAILED(hr))
|
||||||
|
return hr;
|
||||||
|
|
||||||
|
hr = analyze_script(text, length, sink);
|
||||||
|
heap_free(buff);
|
||||||
|
|
||||||
|
return hr;
|
||||||
}
|
}
|
||||||
|
|
||||||
static HRESULT WINAPI dwritetextanalyzer_AnalyzeBidi(IDWriteTextAnalyzer2 *iface,
|
static HRESULT WINAPI dwritetextanalyzer_AnalyzeBidi(IDWriteTextAnalyzer2 *iface,
|
||||||
|
@ -698,7 +745,7 @@ static HRESULT WINAPI dwritetextanalyzer_AnalyzeBidi(IDWriteTextAnalyzer2 *iface
|
||||||
UINT8 baselevel, level, explicit_level;
|
UINT8 baselevel, level, explicit_level;
|
||||||
WCHAR *buff = NULL;
|
WCHAR *buff = NULL;
|
||||||
const WCHAR *text;
|
const WCHAR *text;
|
||||||
UINT32 len, pos, i;
|
UINT32 pos, i;
|
||||||
HRESULT hr;
|
HRESULT hr;
|
||||||
|
|
||||||
TRACE("(%p %u %u %p)\n", source, position, length, sink);
|
TRACE("(%p %u %u %p)\n", source, position, length, sink);
|
||||||
|
@ -706,33 +753,9 @@ static HRESULT WINAPI dwritetextanalyzer_AnalyzeBidi(IDWriteTextAnalyzer2 *iface
|
||||||
if (length == 0)
|
if (length == 0)
|
||||||
return S_OK;
|
return S_OK;
|
||||||
|
|
||||||
/* get some, check for length */
|
hr = get_text_source_ptr(source, position, length, &text, &buff);
|
||||||
text = NULL;
|
if (FAILED(hr))
|
||||||
len = 0;
|
return hr;
|
||||||
hr = IDWriteTextAnalysisSource_GetTextAtPosition(source, position, &text, &len);
|
|
||||||
if (FAILED(hr)) return hr;
|
|
||||||
|
|
||||||
if (len < length) {
|
|
||||||
UINT32 read;
|
|
||||||
|
|
||||||
buff = heap_alloc(length*sizeof(WCHAR));
|
|
||||||
if (!buff)
|
|
||||||
return E_OUTOFMEMORY;
|
|
||||||
memcpy(buff, text, len*sizeof(WCHAR));
|
|
||||||
read = len;
|
|
||||||
|
|
||||||
while (read < length && text) {
|
|
||||||
text = NULL;
|
|
||||||
len = 0;
|
|
||||||
hr = IDWriteTextAnalysisSource_GetTextAtPosition(source, read, &text, &len);
|
|
||||||
if (FAILED(hr))
|
|
||||||
goto done;
|
|
||||||
memcpy(&buff[read], text, min(len, length-read)*sizeof(WCHAR));
|
|
||||||
read += len;
|
|
||||||
}
|
|
||||||
|
|
||||||
text = buff;
|
|
||||||
}
|
|
||||||
|
|
||||||
levels = heap_alloc(length*sizeof(*levels));
|
levels = heap_alloc(length*sizeof(*levels));
|
||||||
explicit = heap_alloc(length*sizeof(*explicit));
|
explicit = heap_alloc(length*sizeof(*explicit));
|
||||||
|
|
Loading…
Reference in New Issue