[PATCH] usp10: Better implementation for ScriptGetLogicalWidths()

Aric Stewart aric at codeweavers.com
Tue Aug 9 09:16:11 CDT 2016


Signed-off-by: Aric Stewart <aric at codeweavers.com>

On 8/9/16 8:59 AM, Nikolay Sivov wrote:
> Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
> ---
> 
> Based on ScriptStringGetLogicalWidths(), todo tests indicate that fClusterStart
> should be used to determine cluster size and advance.
> 
> Initialy reported as https://bugs.winehq.org/show_bug.cgi?id=32495
> 
> 
>  dlls/usp10/tests/usp10.c | 53 ++++++++++++++++++++++++++++++++++++++++++++++++
>  dlls/usp10/usp10.c       | 27 +++++++++++++++++++-----
>  2 files changed, 75 insertions(+), 5 deletions(-)
> 
> diff --git a/dlls/usp10/tests/usp10.c b/dlls/usp10/tests/usp10.c
> index aed0620..e77f90e 100644
> --- a/dlls/usp10/tests/usp10.c
> +++ b/dlls/usp10/tests/usp10.c
> @@ -3610,6 +3610,58 @@ static void test_ScriptGetFontFunctions(HDC hdc)
>      }
>  }
>  
> +struct logical_width_test
> +{
> +    int char_count;
> +    int glyph_count;
> +    int advances[3];
> +    WORD map[3];
> +    int widths[3];
> +    BOOL clusterstart[3];
> +    BOOL diacritic[3];
> +    BOOL zerowidth[3];
> +    BOOL todo;
> +};
> +
> +static const struct logical_width_test logical_width_tests[] =
> +{
> +    { 3, 3, { 6, 9, 12 }, { 0, 1, 2 }, {  6,  9, 12 }, { 1, 1, 1 } },
> +    { 3, 3, { 6, 9, 12 }, { 0, 1, 2 }, {  6,  9, 12 }, { 1, 1, 1 }, { 1, 0, 0 } },
> +    { 3, 3, { 6, 9, 12 }, { 0, 1, 2 }, {  6,  9, 12 }, { 1, 1, 1 }, { 0 }, { 1, 1, 1 } },
> +    { 3, 3, { 6, 9, 12 }, { 0, 1, 2 }, { 27, 21, 12 }, { 0, 0, 0 }, { 0 }, { 0 }, TRUE },
> +    { 3, 3, { 6, 9, 12 }, { 0, 1, 2 }, {  6, 21, 12 }, { 0, 1, 0 }, { 0 }, { 0 }, TRUE },
> +    { 3, 3, { 6, 9, 12 }, { 0, 1, 2 }, {  6, 21, 12 }, { 1, 1, 0 }, { 0 }, { 0 }, TRUE },
> +    { 3, 3, { 6, 9, 12 }, { 0, 2, 2 }, { 15,  6,  6 }, { 1, 0, 1 } },
> +};
> +
> +static void test_ScriptGetLogicalWidths(void)
> +{
> +    SCRIPT_ANALYSIS sa = { 0 };
> +    unsigned int i, j;
> +
> +    for (i = 0; i < sizeof(logical_width_tests)/sizeof(logical_width_tests[0]); i++)
> +    {
> +        const struct logical_width_test *ptr = logical_width_tests + i;
> +        SCRIPT_VISATTR attrs[3];
> +        int widths[3];
> +        HRESULT hr;
> +
> +        memset(attrs, 0, sizeof(attrs));
> +        for (j = 0; j < ptr->glyph_count; j++)
> +        {
> +            attrs[j].fClusterStart = ptr->clusterstart[j];
> +            attrs[j].fDiacritic = ptr->diacritic[j];
> +            attrs[j].fZeroWidth = ptr->zerowidth[j];
> +        }
> +
> +        hr = ScriptGetLogicalWidths(&sa, ptr->char_count, ptr->glyph_count, ptr->advances, ptr->map, attrs, widths);
> +        ok(hr == S_OK, "got 0x%08x\n", hr);
> +
> +        todo_wine_if(ptr->todo)
> +            ok(!memcmp(ptr->widths, widths, sizeof(widths)), "test %u: got wrong widths\n", i);
> +    }
> +}
> +
>  START_TEST(usp10)
>  {
>      HWND            hwnd;
> @@ -3663,6 +3715,7 @@ START_TEST(usp10)
>      test_newlines();
>  
>      test_ScriptGetFontFunctions(hdc);
> +    test_ScriptGetLogicalWidths();
>  
>      ReleaseDC(hwnd, hdc);
>      DestroyWindow(hwnd);
> diff --git a/dlls/usp10/usp10.c b/dlls/usp10/usp10.c
> index f5eba8d..dc1cc06 100644
> --- a/dlls/usp10/usp10.c
> +++ b/dlls/usp10/usp10.c
> @@ -3890,16 +3890,33 @@ HRESULT WINAPI ScriptStringGetOrder(SCRIPT_STRING_ANALYSIS ssa, UINT *order)
>   *  Failure: a non-zero HRESULT.
>   */
>  HRESULT WINAPI ScriptGetLogicalWidths(const SCRIPT_ANALYSIS *sa, int nbchars, int nbglyphs,
> -                                      const int *glyph_width, const WORD *log_clust,
> +                                      const int *advances, const WORD *log_clust,
>                                        const SCRIPT_VISATTR *sva, int *widths)
>  {
> -    int i;
> +    int i, next = 0, direction;
>  
>      TRACE("(%p, %d, %d, %p, %p, %p, %p)\n",
> -          sa, nbchars, nbglyphs, glyph_width, log_clust, sva, widths);
> +          sa, nbchars, nbglyphs, advances, log_clust, sva, widths);
> +
> +    if (sa->fRTL && !sa->fLogicalOrder)
> +        direction = -1;
> +    else
> +        direction = 1;
> +
> +    for (i = 0; i < nbchars; i++)
> +    {
> +        int clust_size = get_cluster_size(log_clust, nbchars, i, direction, NULL, NULL);
> +        int advance = get_glyph_cluster_advance(advances, sva, log_clust, nbglyphs, nbchars, log_clust[i], direction);
> +        int j;
> +
> +        for (j = 0; j < clust_size; j++)
> +        {
> +            widths[next] = advance / clust_size;
> +            next++;
> +            if (j) i++;
> +        }
> +    }
>  
> -    /* FIXME */
> -    for (i = 0; i < nbchars; i++) widths[i] = glyph_width[i];
>      return S_OK;
>  }
>  
> 



More information about the wine-patches mailing list