Skip to content

Log a warning if selected font weight differs from requested - #30272

Merged
dstansby merged 1 commit into
matplotlib:mainfrom
QuLogic:font-weight-warning
Jul 15, 2025
Merged

dstansby merged 1 commit into
matplotlib:mainfrom
QuLogic:font-weight-warning

Conversation

@QuLogic

@QuLogic QuLogic commented Jul 8, 2025

Copy link
Copy Markdown
Member

PR summary

This is a rebase of the orphaned #15615, but with @anntzer's comments handled.

PR checklist

@QuLogic
QuLogic force-pushed the font-weight-warning branch from 96be1df to 8d7f02e Compare July 8, 2025 02:08
Comment thread lib/matplotlib/font_manager.pyi Outdated
X11FontDirectories: list[str]
OSXFontDirectories: list[str]

def _normalize_weight(weight: str | Number) -> Number: ...

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Typical font weights are multiples of 100. Can / should this be any Number or can we specialize to int?

Suggested change
def _normalize_weight(weight: str | Number) -> Number: ...
def _normalize_weight(weight: str | int) -> int: ...

If we want a general Number, there should be a test case for it.

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looking at the OpenType spec, it does appear to be integral only: https://learn.microsoft.com/en-us/typography/opentype/spec/os2#usweightclass

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Also, I think the original PR just used Number because it was already imported in font_manager.py.

Comment on lines +413 to +415
def test_map_weights():
assert _normalize_weight('ultralight') == 100

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Let's reframe this to test the helper instead of the mapping, so that we can also test the passthrough behavior

Suggested change
def test_map_weights():
assert _normalize_weight('ultralight') == 100
def test_normalize_weight():
assert _normalize_weight(300) == 300 # passthough
assert _normalize_weight('ultralight') == 100

Maybe also add an error case e.g. "italic"

Comment thread lib/matplotlib/font_manager.py Outdated
Comment on lines +1487 to +1489
if best_font is not None:
if (_normalize_weight(prop.get_weight()) !=
_normalize_weight(best_font.weight)):

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why are these nested ifs instead of if A and B ?

@QuLogic
QuLogic force-pushed the font-weight-warning branch from 8d7f02e to 86983e4 Compare July 10, 2025 00:02
@QuLogic QuLogic added this to the v3.11.0 milestone Jul 10, 2025

@dstansby dstansby left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

One minor suggestion to improve the changelog - take it or leave it, and feel free to self merge.

Comment on lines +1 to +2
``font_manager.findfont`` logs if selected font weight does not match requested
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
``font_manager.findfont`` logs if selected font weight does not match requested
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
``font_manager.findfont`` warns if selected the font weight does not match requested
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

No, it's not a warning.

def test_font_match_warning(caplog):
findfont(FontProperties(family=["DejaVu Sans"], weight=750))
logs = [rec.message for rec in caplog.records]
assert 'findfont: Failed to find font weight 750, now using 700.' in logs

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Just for my own interest, is there a reason to check the logs, instead of using a pytest.warns context?

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Same reason as above.

@dstansby
dstansby merged commit d2050cb into matplotlib:main Jul 15, 2025
@QuLogic
QuLogic deleted the font-weight-warning branch July 15, 2025 10:53
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Chinese font can`t change the weight

3 participants