[PATCH 5/6] dwrite: Use MapCharacters for non-visual characters
Nikolay Sivov
nsivov at codeweavers.com
Sat May 26 08:43:39 CDT 2018
On 05/23/2018 09:07 PM, Lucian Poston wrote:
> Signed-off-by: Lucian Poston <lucianposton at pm.me>
> ---
> dlls/dwrite/layout.c | 22 +++++++++++++++-------
> dlls/dwrite/tests/layout.c | 24 ------------------------
> 2 files changed, 15 insertions(+), 31 deletions(-)
>
> diff --git a/dlls/dwrite/layout.c b/dlls/dwrite/layout.c
> index df3f3beabb..5d06bf9348 100644
> --- a/dlls/dwrite/layout.c
> +++ b/dlls/dwrite/layout.c
> @@ -822,7 +822,8 @@ static HRESULT layout_resolve_fonts(struct dwrite_textlayout *layout)
> LIST_FOR_EACH_ENTRY(r, &layout->runs, struct layout_run, entry) {
> struct regular_layout_run *run = &r->u.regular;
> IDWriteFont *font;
> - UINT32 length;
> + UINT32 length, mapped_length;
> + FLOAT scale;
>
> if (r->kind == LAYOUT_RUN_INLINE)
> continue;
> @@ -830,12 +831,19 @@ static HRESULT layout_resolve_fonts(struct dwrite_textlayout *layout)
> range = get_layout_range_by_pos(layout, run->descr.textPosition);
>
> if (run->sa.shapes == DWRITE_SCRIPT_SHAPES_NO_VISUAL) {
> - IDWriteFontCollection *collection;
> -
> - collection = range->collection ? range->collection : sys_collection;
> -
> - if (FAILED(hr = create_matching_font(collection, range->fontfamily, range->weight, range->style,
> - range->stretch, &font))) {
> + hr = IDWriteFontFallback_MapCharacters(fallback,
> + (IDWriteTextAnalysisSource *)&layout->IDWriteTextAnalysisSource1_iface,
> + run->descr.textPosition,
> + run->descr.stringLength,
> + range->collection,
> + range->fontfamily,
> + range->weight,
> + range->style,
> + range->stretch,
> + &mapped_length,
> + &font,
> + &scale);
> + if (FAILED(hr)) {
> WARN("%s: failed to create matching font for non visual run, family %s, collection %p\n",
> debugstr_rundescr(&run->descr), debugstr_w(range->fontfamily), range->collection);
> break;
This only works together with patch 4/6, right? What we need to figure
out here is which font is picked in NO_VISUAL case, does it change with
range locale,
or custom collection. Then we can either hardcode it here, or add
corresponding char ranges.
> diff --git a/dlls/dwrite/tests/layout.c b/dlls/dwrite/tests/layout.c
> index 85967e7ee8..975b6ac7b3 100644
> --- a/dlls/dwrite/tests/layout.c
> +++ b/dlls/dwrite/tests/layout.c
> @@ -5715,34 +5715,22 @@ static void test_GetMetrics_with_custom_fontcollection(void)
> ok(hr == S_OK, "got 0x%08x\n", hr);
> count = 9999;
> hr = IDWriteTextLayout_GetClusterMetrics(layout, clusters, 4, &count);
> - todo_wine
> ok(hr == S_OK, "got 0x%08x\n", hr);
> - todo_wine
> ok(count == 4, "got %u\n", count);
> for (i = 0, width = 0.0; i < count; i++)
> width += clusters[i].width;
> memset(&metrics, 0xcc, sizeof(metrics));
> hr = IDWriteTextLayout_GetMetrics(layout, &metrics);
> - todo_wine
> ok(hr == S_OK, "got 0x%08x\n", hr);
> - todo_wine
> ok(metrics.left == 0.0, "got %.2f\n", metrics.left);
> - todo_wine
> ok(metrics.top == 0.0, "got %.2f\n", metrics.top);
> - todo_wine
> ok(metrics.width == width, "got %.2f, expected %.2f\n", metrics.width, width);
> - todo_wine
> ok(metrics.widthIncludingTrailingWhitespace == width, "got %.2f, expected %.2f\n",
> metrics.widthIncludingTrailingWhitespace, width);
> - todo_wine
> ok(metrics.height > 0.0, "got %.2f\n", metrics.height);
> - todo_wine
> ok(metrics.layoutWidth == 1000.0, "got %.2f\n", metrics.layoutWidth);
> - todo_wine
> ok(metrics.layoutHeight == 1000.0, "got %.2f\n", metrics.layoutHeight);
> - todo_wine
> ok(metrics.maxBidiReorderingDepth == 1, "got %u\n", metrics.maxBidiReorderingDepth);
> - todo_wine
> ok(metrics.lineCount == 1, "got %u\n", metrics.lineCount);
> IDWriteTextLayout_Release(layout);
>
> @@ -5751,34 +5739,22 @@ static void test_GetMetrics_with_custom_fontcollection(void)
> ok(hr == S_OK, "got 0x%08x\n", hr);
> count = 9999;
> hr = IDWriteTextLayout_GetClusterMetrics(layout, clusters, 4, &count);
> - todo_wine
> ok(hr == S_OK, "got 0x%08x\n", hr);
> - todo_wine
> ok(count == 4, "got %u\n", count);
> for (i = 0, width = 0.0; i < count; i++)
> width += clusters[i].width;
> memset(&metrics, 0xcc, sizeof(metrics));
> hr = IDWriteTextLayout_GetMetrics(layout, &metrics);
> - todo_wine
> ok(hr == S_OK, "got 0x%08x\n", hr);
> - todo_wine
> ok(metrics.left == 0.0, "got %.2f\n", metrics.left);
> - todo_wine
> ok(metrics.top == 0.0, "got %.2f\n", metrics.top);
> - todo_wine
> ok(metrics.width == width, "got %.2f, expected %.2f\n", metrics.width, width);
> - todo_wine
> ok(metrics.widthIncludingTrailingWhitespace == width, "got %.2f, expected %.2f\n",
> metrics.widthIncludingTrailingWhitespace, width);
> - todo_wine
> ok(metrics.height > 0.0, "got %.2f\n", metrics.height);
> - todo_wine
> ok(metrics.layoutWidth == 1000.0, "got %.2f\n", metrics.layoutWidth);
> - todo_wine
> ok(metrics.layoutHeight == 1000.0, "got %.2f\n", metrics.layoutHeight);
> - todo_wine
> ok(metrics.maxBidiReorderingDepth == 1, "got %u\n", metrics.maxBidiReorderingDepth);
> - todo_wine
> ok(metrics.lineCount == 1, "got %u\n", metrics.lineCount);
> IDWriteTextLayout_Release(layout);
>
More information about the wine-devel
mailing list