[PATCH 2/2] [v4] user32: Implement EC_USEFONTINFO margins in the CJK case.

Nikolay Sivov nsivov at codeweavers.com
Wed Mar 27 08:53:01 CDT 2019


On 3/27/19 4:25 PM, Akihiro Sagawa wrote:

> -                /* FIXME: figure out the CJK values. */
> -                default_left_margin = width / 2;
> -                default_right_margin = width / 2;
> +                if (is_cjk_charset(dc)) {
> +                    /* In the CJK case, use the minimum side bearings in hhea table */
> +                    UINT ret;
> +                    DWORD ppem, em_scale = 0;
> +                    OUTLINETEXTMETRICW *otm;
> +                    short min_lsb, min_rsb;
> +                    ret = GetOutlineTextMetricsW(dc, 0, NULL);
> +                    if (!ret) goto fail;
> +                    otm = HeapAlloc(GetProcessHeap(), 0, ret);
> +                    if (!otm) goto fail;
> +                    otm->otmSize = sizeof(*otm);
> +                    if (!GetOutlineTextMetricsW(dc, ret, otm)) goto fail;
> +                    ppem = tm.tmHeight - tm.tmInternalLeading;
> +                    em_scale = MulDiv(ppem, 1 << 16, otm->otmEMSquare);
> +                    HeapFree(GetProcessHeap(), 0, otm);
> +                    if (!get_side_bearings(dc, &min_lsb, &min_rsb)) goto fail;
> +
> +                    default_left_margin = get_cjk_fontinfo_margin(width, min_lsb, em_scale);
> +                    default_right_margin = get_cjk_fontinfo_margin(width, min_rsb, em_scale);
> +                } else {
> +                fail:
> +                    default_left_margin = width / 2;
> +                    default_right_margin = width / 2;
> +                }

You don't need to allocate 'otm', it's only necessary when you need 
string components.

Also please avoid goto jump across branches, you can simply make 
get_side_bearings() a part of condition, so default case will be hit 
naturally.




More information about the wine-devel mailing list