What is MeasureText · Issue #1551 · oxyplot/oxyplot · GitHub
Skip to content

What is MeasureText #1551

Open
Open

Description

@VisualMelon

The IRenderContext.MeasureText method doesn't have a formal specification, and is implemented in different ways all over the place.

We should consider formalising its behaviour so that we can make everything consistent before attempting to address inconsistencies in multi-line text rendering between platforms (see Issue #1538 and discussion in PR #1549).

Activity

  1. Jonarw commented on May 10, 2020

    @Jonarw
    Member

    There appear to be some different nomenclatures around this topic. To be sure we are talking about the same thing, I will use the same nomenclature as in this blog post:
    http://www.cyrilchandelier.com/understanding-fonts-and-uifont

    Some thoughts:

    Height

    • Similar to what we do in OxyPlot.SkiaSharp and OxyPlot.ImageSharp for vertical text alignment, I would argue that the vertical text measurement should not actually be dependent on the content. I think it is more important that the baselines of multiple text runs are guaranteed to be aligned regardless of content.
    • A possible definition could be:
      [text-height] = (|[ascent]| + |[descent]| + [leading]) * [number-of-lines] - [leading]
      which would be equivalent to:
      [text-height] = [line-height] * [number-of-lines] - [leading]

    Width

    • This should take into account text shaping, if applicable
    • A possible definition could be:
      [text-width] = MAX([line] => SUM([advancement]))
  2. VisualMelon commented on May 10, 2020

    @VisualMelon
    ContributorAuthor

    Thanks for putting that so clearly.

    It's not immediately obvious how to implement the width computing manually in some APIs, but in practice the width doesn't seem to be much of an issue.

  3. Jonarw commented on May 10, 2020

    @Jonarw
    Member

    Yes, probably most of the APIs do exactly this computation under the hood, and if there is no issue there would be no need to change anything. The definition should only serve as a reference in case of doubts / inconsistencies.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions