GV

GeezerVison

The World Wide Web, restored to 800 pixels of glory.

Home|About|Gaming cabinet|Archives|How it works|Starter sites

On this site

  • Sign in
  • ActionsCI/CD and automation
  • CodespacesCloud development environments
  • All Features
  • Documentation
  • Training
  • Certifications
  • Build with Copilot
  • Customize Copilot
  • Integrations
  • Trending repos
  • GitHub Sponsors
  • Developer articles
  • Enterprises

This view

  • Original page
  • New address

GeezerVison is showing github.com — Drop the FT2Font intermediate buffer. by anntzer · Pull Request #30059 · matplotlib/matplotlib

Conversation

@anntzer

@anntzer anntzer commented May 16, 2025 •
edited
Loading

Uh oh!

There was an error while loading. Please reload this page.

Copy link
Copy Markdown
Contributor

Directly render FT glyphs to the Agg buffer. In particular, this naturally provides, with no extra work, subpixel positioning of glyphs (closing #29551) (this could also have been implemented in the old framework, but would have required careful tracking of subpixel offets).

Note that rendering of mathtext boxes (e.g., fraction bars) is currently missing, but should be "easy" (the main question being whether/how to ensure proper hinting/alignment to pixel edges in the horizontal or vertical output cases). Likewise, all baseline images should be regenerated. Finally, the new APIs added to FT2Font are likely up to bikeshedding (but they are all private).

In practice this should get included (if we agree to go this way) into the FreeType update (#29816). This would also supersede the patch advertised at #29816 (comment).

test modified from #29551 to also include mathtext:

import matplotlib.pyplot as plt
import matplotlib.animation as manim

fig = plt.figure(figsize=(2, 2))
ts = [
    fig.text(0, 0, '$ABC123$'),
    fig.text(0, 0.2, 'ABC123'),
]
change = 0.001

def update(*args, **kwargs):
    global change
    for t in ts:
        x, y = t.get_position()
        if not (0 <= x <= 1 and 0 <= y <= 1):
            change *= -1
        t.set_x(x + change)
        t.set_y(y + change)
    return ts

ani = manim.FuncAnimation(fig, update, interval=20, frames=int(2/change),
                          cache_frame_data=False)
ani.save('text.gif')

PR summary

PR checklist

  • "closes #0000" is in the body of the PR description to link the related issue
  • new and changed code is tested
  • Plotting related features are demonstrated in an example
  • New Features and API Changes are noted with a directive and release note
  • Documentation complies with general and docstring guidelines

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

All reactions
@anntzer anntzer added topic: text topic: text/mathtext labels May 16, 2025
@github-actions github-actions Bot added backend: agg topic: text/fonts and removed topic: text topic: text/mathtext labels May 16, 2025
This was referenced May 16, 2025
Update FreeType to 2.13.3 #29816
Merged
Fix alpha compositing in ft2font's draw_bitmap. #30043
Closed
@story645

story645 commented May 16, 2025 •
edited
Loading

Uh oh!

There was an error while loading. Please reload this page.

Copy link
Copy Markdown
Member

Would you be open to using a tracking issue or project board for the font work (sample categories: draft, waiting on other PRs, ready for review, please review first)?

I think breaking everything up into small PRs is fantastic but I'm finding it a bit overwhelming to keep track of the order for reviewing things (and figure I'm not alone here) and how these PRs relate to each other.

All reactions

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

@anntzer

anntzer commented May 16, 2025 •
edited
Loading

Uh oh!

There was an error while loading. Please reload this page.

Copy link
Copy Markdown
Contributor Author

Sure, I'll do that. I'm sorry for the mess, but this is basically me trying to remember all the patches or even just ideas I have accumulated over the years that went nowhere because they would thrash all the baseline images, and that I now try to present given that I see an opportunity with the FreeType upgrade. Also, some of them are not fully complete patches but things that I believe can be made complete with relatively little effort (for some value of "little effort"...) simply because I do not have the time now to finalize them but want to put them up for discussion as the underlying idea should be clear.

Edit: see the wiki; attn @QuLogic as well too.

story645 reacted with heart emoji
All reactions
  • ❤️ 1 reaction

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

@story645

story645 commented May 16, 2025 •
edited
Loading

Uh oh!

There was an error while loading. Please reload this page.

Copy link
Copy Markdown
Member

I'm sorry for the mess, but

No apologies needed, I commend you for taking advantage of the freetype upgrade. And thanks for the wiki, though some reason can't link cleanly ☹️

All reactions

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

@anntzer

anntzer commented May 16, 2025

Copy link
Copy Markdown
Contributor Author

link fixed

story645 reacted with thumbs up emoji
All reactions
  • 👍 1 reaction

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

@QuLogic QuLogic mentioned this pull request May 17, 2025
Replace FT2Image by plain numpy arrays. #30044
Merged
5 tasks
@anntzer
anntzer force-pushed the ft-direct-render branch 3 times, most recently from d44360f to 66fdae0 Compare May 17, 2025 09:55
@anntzer

anntzer commented May 17, 2025

Copy link
Copy Markdown
Contributor Author

Edit: fraction bar rendering has been added too.

All reactions

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

@QuLogic

QuLogic commented May 22, 2025

Copy link
Copy Markdown
Member

A few warnings from compiling locally:

[2/4] Compiling C++ object src/ft2font.cpython-313-x86_64-linux-gnu.so.p/ft2font_wrapper.cpp.o
../../src/ft2font_wrapper.cpp: In lambda function:
../../src/ft2font_wrapper.cpp:1785:22: warning: unused variable ‘error’ [-Wunused-variable]
 1785 |             if (auto error = FT_Load_Glyph(face, idx, static_cast<FT_Int32>(flags))) {
      |                      ^~~~~
../../src/ft2font_wrapper.cpp:1788:22: warning: unused variable ‘error’ [-Wunused-variable]
 1788 |             if (auto error = FT_Render_Glyph(face->glyph, FT_RENDER_MODE_NORMAL)) {
      |                      ^~~~~
../../src/ft2font_wrapper.cpp: In lambda function:
../../src/ft2font_wrapper.cpp:1804:26: warning: unused variable ‘error’ [-Wunused-variable]
 1804 |                 if (auto error = FT_Glyph_To_Bitmap(&g, FT_RENDER_MODE_NORMAL, &origin, 1)) {
      |                          ^~~~~
All reactions

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

@anntzer

anntzer commented May 22, 2025

Copy link
Copy Markdown
Contributor Author

This is semi-intentional: if these checks fail (error > 0) then the error should really be raised using throw_ft_error, not with a plain raise as I currently do, but throw_ft_error is not visible from ft2font_wrapper.cpp so some code needs to be moved around, e.g. make throw_ft_error an inline function defined in ft2font.h, or move the new implementations into real C++ FT2Font methods in ft2font.cpp and add wrapper lambdas in ft2font_wrapper.cpp, or (would be my preferred choice) switch error checking to the FT_CHECK macro used in mplcairo (see mplcairo's macros.h).
I left the warning as is just to keep this as a side discussion point, but it can trivially be suppressed by not capturing the error value too.

All reactions

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

@github-actions github-actions Bot added the status: needs rebase label May 24, 2025
@anntzer
anntzer force-pushed the ft-direct-render branch from 66fdae0 to e980d97 Compare May 24, 2025 09:30
@github-actions github-actions Bot removed the status: needs rebase label May 24, 2025
@QuLogic

QuLogic commented May 24, 2025

Copy link
Copy Markdown
Member

On a side note, I'm in favour of this in general as removing the intermediate buffer will make emoji/colour glyphs easier since they won't need to go through it.

anntzer reacted with thumbs up emoji
All reactions
  • 👍 1 reaction

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

@anntzer anntzer mentioned this pull request May 24, 2025
Simplify/improve error reporting from ft2font. #30102
Merged
5 tasks
@QuLogic

QuLogic commented May 30, 2025

Copy link
Copy Markdown
Member

On the call, we were discussing whether it made sense to target all these font-related (and requiring full image rebuild) PRs to a separate feature branch, which would contain the final test image updates. Do you have any thoughts on retargetting this PR (instead of folding it in to #29816)?

All reactions

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

@anntzer

anntzer commented May 30, 2025 •
edited
Loading

Uh oh!

There was an error while loading. Please reload this page.

Copy link
Copy Markdown
Contributor Author

On the call, we were discussing whether it made sense to target all these font-related (and requiring full image rebuild) PRs to a separate feature branch, which would contain the final test image updates. Do you have any thoughts on retargetting this PR (instead of folding it in to #29816)?

Sure, I don't really mind either way? Should the branch live on this repo and be ultimately pruned out, or on yours?

All reactions

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

@anntzer
anntzer force-pushed the ft-direct-render branch from e980d97 to 383e594 Compare May 30, 2025 08:37
@anntzer

anntzer commented May 30, 2025

Copy link
Copy Markdown
Contributor Author

Fixed #30059 (comment) by using FT_CHECK (thus also needs #30123).

All reactions

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

@QuLogic
QuLogic changed the base branch from main to text-overhaul June 5, 2025 01:47
@QuLogic QuLogic added this to the v3.11.0 milestone Jun 5, 2025
@github-actions github-actions Bot removed topic: mplot3d status: needs rebase labels Jan 22, 2026
@QuLogic

QuLogic commented Jan 22, 2026

Copy link
Copy Markdown
Member

There is something odd going on here with font/glyph caches; if I run lib/matplotlib/tests/test_text.py::test_complex_shaping then everything is fine. In fact, if I run all of test_text.py then everything is okay. But when running the whole test suite, the PDF and EPS both lose the Arabic: text in the second line.

(Note, I have updated the test-overhaul-figures branch to be based on this PR in anticipation of merging, so if you want to test it out, you can just fetch that, but you can also just run the test by itself first to generate the right results.)

All reactions

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

@QuLogic

QuLogic commented Jan 22, 2026

Copy link
Copy Markdown
Member

I've narrowed it down to just running anything with mathtext before will cause the failure, e.g.,

$ pytest lib/matplotlib/tests/test_mathtext.py::test_mathtext_cmr10_minus_sign lib/matplotlib/tests/test_text.py::test_complex_shaping -v
=============================== test session starts ===============================
platform linux -- Python 3.13.11, pytest-8.3.3, pluggy-1.5.0 -- venv/bin/python
cachedir: .pytest_cache
rootdir: matplotlib
configfile: pyproject.toml
plugins: timeout-2.3.1, rerunfailures-14.0, cov-6.0.0, memray-1.7.0, anyio-4.10.0, xdist-3.8.0, xvfb-3.1.1
collected 5 items                                                                                                                                                                                                                                                                         

lib/matplotlib/tests/test_mathtext.py::test_mathtext_cmr10_minus_sign PASSED                                                                                                                                                                                                        [ 20%]
lib/matplotlib/tests/test_text.py::test_complex_shaping[png] PASSED                                                                                                                                                                                                                 [ 40%]
lib/matplotlib/tests/test_text.py::test_complex_shaping[pdf] FAILED                                                                                                                                                                                                                 [ 60%]
lib/matplotlib/tests/test_text.py::test_complex_shaping[svg] PASSED                                                                                                                                                                                                                 [ 80%]
lib/matplotlib/tests/test_text.py::test_complex_shaping[eps] FAILED                                                                                                                                                                                                                 [100%]

==================================== FAILURES =====================================
______________________________________________ test_complex_shaping[pdf] _____________________________

args = (), kwds = {'extension': 'pdf', 'request': <FixtureRequest for <Function test_complex_shaping[pdf]>>}

    @wraps(func)
    def inner(*args, **kwds):
        with self._recreate_cm():
>           return func(*args, **kwds)
E           matplotlib.testing.exceptions.ImageComparisonFailure: images not close (RMS 28.259):
E           	result_images/test_text/complex_pdf.png
E           	result_images/test_text/complex-expected_pdf.png
E           	result_images/test_text/complex_pdf-failed-diff.png

/usr/lib64/python3.13/contextlib.py:85: ImageComparisonFailure
______________________________________________ test_complex_shaping[eps] _____________________________

args = (), kwds = {'extension': 'eps', 'request': <FixtureRequest for <Function test_complex_shaping[eps]>>}

    @wraps(func)
    def inner(*args, **kwds):
        with self._recreate_cm():
>           return func(*args, **kwds)
E           matplotlib.testing.exceptions.ImageComparisonFailure: images not close (RMS 28.222):
E           	result_images/test_text/complex_eps.png
E           	result_images/test_text/complex-expected_eps.png
E           	result_images/test_text/complex_eps-failed-diff.png

/usr/lib64/python3.13/contextlib.py:85: ImageComparisonFailure
============================= short test summary info =============================
FAILED lib/matplotlib/tests/test_text.py::test_complex_shaping[pdf] - matplotlib.testing.exceptions.ImageComparisonFailure: images not close (RMS 28.259):
FAILED lib/matplotlib/tests/test_text.py::test_complex_shaping[eps] - matplotlib.testing.exceptions.ImageComparisonFailure: images not close (RMS 28.222):
=========================== 2 failed, 3 passed in 2.62s ===========================

I suspect that somewhere a _set_transform is missing.

All reactions

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

@QuLogic

QuLogic commented Jan 22, 2026

Copy link
Copy Markdown
Member

When Agg's draw_mathtext calls _set_tranform with an offset, this sticks around and isn't reset anywhere.

So something like this does fix it for PDF:

diff --git a/lib/matplotlib/backends/backend_pdf.py b/lib/matplotlib/backends/backend_pdf.py
index c6b7cf0ac9..813d4a73ff 100644
--- a/lib/matplotlib/backends/backend_pdf.py
+++ b/lib/matplotlib/backends/backend_pdf.py
@@ -598,6 +598,8 @@ class Stream:
 
 def _get_pdf_charprocs(font_path, glyph_indices):
     font = get_font(font_path, hinting_factor=1)
+    hf = font._hinting_factor
+    font._set_transform([[round(0x10000 / hf), 0], [0, 0x10000]], [0, 0])
     conv = 1000 / font.units_per_EM  # Conversion to PS units (1/1000's).
     procs = {}
     for glyph_index in glyph_indices:
@@ -1121,6 +1123,8 @@ end"""
     def embedTTF(self, filename, subset_index, charmap):
         """Embed the TTF font from the named file into the document."""
         font = get_font(filename)
+        hf = font._hinting_factor
+        font._set_transform([[round(0x10000 / hf), 0], [0, 0x10000]], [0, 0])
         fonttype = mpl.rcParams['pdf.fonttype']
 
         def cvt(length, upe=font.units_per_EM, nearest=True):

and similar would probably work for EPS.

However, I wonder if we should be resetting this somewhere more central? Maybe in font_manager.get_font?

All reactions

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

@anntzer

anntzer commented Jan 22, 2026

Copy link
Copy Markdown
Contributor Author

Ah, good catch, thanks for the debugging. I suspect that the most efficient way would be to reset the transform just once at the end of draw_mathtext(), and the most "principled" way would be indeed to do it in get_font() and document that the latter always returns a font with the default transform.

All reactions

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

@QuLogic
QuLogic force-pushed the ft-direct-render branch from 9c96bc1 to f13fe82 Compare January 22, 2026 20:57
@QuLogic

QuLogic commented Jan 27, 2026

Copy link
Copy Markdown
Member

While looking at #22852, I noticed that some fraction bars were missing, both in that PR and here. For example, mathtext_cm_45 lost its fraction bar from this PR. I assume this has something to do with snapping to smaller than a pixel; should we impose some kind of minimum height when snapping is enabled here?

All reactions

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

@QuLogic

QuLogic commented Jan 28, 2026

Copy link
Copy Markdown
Member

Note if we were to simply give up on snapping for the rectangles, then that would affect lib/matplotlib/tests/test_text.py::test_antialiasing, lib/matplotlib/tests/test_quiver.py::test_quiver_animate and 115 mathtext images. About 20 of the mathtext ones are cases where the fraction bar is currently missing and in the remainder the bar would be a bit blurrier (and in very few cases a bit longer.)

All reactions

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

@QuLogic

QuLogic commented Jan 28, 2026

Copy link
Copy Markdown
Member

If we do something like this, then it affects <20 images and seems like the lightest fix.

All reactions

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

@anntzer

anntzer commented Jan 28, 2026

Copy link
Copy Markdown
Contributor Author

Oops. Yes, that definitely seems like the reasonable fix; good catch.

All reactions

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

@QuLogic
QuLogic force-pushed the ft-direct-render branch from f13fe82 to f5e7bc0 Compare January 28, 2026 08:49
@QuLogic QuLogic mentioned this pull request Jan 28, 2026
Implement TeX's fraction and script alignment #31046
Merged
2 of 5 tasks
@QuLogic

QuLogic commented Jan 28, 2026

Copy link
Copy Markdown
Member

OK, I pushed that change along with updated test images to the other branch. I'm a bit uncertain why test_pie_center_radius[png] is only failing on macOS though.

All reactions

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

@QuLogic

QuLogic commented Jan 29, 2026

Copy link
Copy Markdown
Member

Ah, I just noticed that those tests have a tolerance; probably they changed little enough that I didn't replace them, but just enough that they were different on another platform. I force regenerated them and running CI again.

All reactions

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

@anntzer @QuLogic
Drop the FT2Font intermediate buffer
9d7d7b4
Directly render FT glyphs to the Agg buffer.  In particular, this
naturally provides, with no extra work, subpixel positioning of glyphs
(which could also have been implemented in the old framework, but would
have required careful tracking of subpixel offets).

Note that all baseline images should be regenerated.  The new APIs added
to FT2Font are also up to bikeshedding (but they are all private).
@QuLogic
QuLogic force-pushed the ft-direct-render branch from f5e7bc0 to 9d7d7b4 Compare January 29, 2026 11:13
@QuLogic

QuLogic commented Jan 29, 2026

Copy link
Copy Markdown
Member

No luck, so I've just pushed a minor tolerance bump there and I can clean that up later when refreshing the images for good.

All reactions

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

QuLogic
QuLogic approved these changes Jan 29, 2026
View reviewed changes
@QuLogic
QuLogic merged commit d0df260 into matplotlib:text-overhaul Jan 29, 2026
33 of 37 checks passed

Uh oh!

There was an error while loading. Please reload this page.

@github-project-automation github-project-automation Bot moved this from Ready for Review to Done in Font and text overhaul Jan 29, 2026
@anntzer
anntzer deleted the ft-direct-render branch January 31, 2026 15:37
@anntzer

anntzer commented Jan 31, 2026 •
edited
Loading

Uh oh!

There was an error while loading. Please reload this page.

Copy link
Copy Markdown
Contributor Author

Thank you for shepherding this through!

QuLogic reacted with thumbs up emoji
All reactions
  • 👍 1 reaction

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

@anntzer anntzer mentioned this pull request Jan 31, 2026
[Bug]: Inconsistent rendering between backends when rendering Mathtext horizontal rule #23763
Closed
@QuLogic QuLogic mentioned this pull request Feb 2, 2026
Support for vector hrule rendering #26337
Closed
1 of 5 tasks
@anntzer anntzer mentioned this pull request Feb 3, 2026
[Bug]: 3D tick label position jitter when rotating the plot view #29551
Closed
wavebyrd pushed a commit to wavebyrd/matplotlib that referenced this pull request Mar 13, 2026
@QuLogic
Merge pull request matplotlib#30059 from anntzer/ft-direct-render
f2b6b54
Drop the FT2Font intermediate buffer.
@QuLogic QuLogic mentioned this pull request Apr 10, 2026
[Bug]: ax.text() box size determined incorrectly for *-subscript (cuts off text at bottom) #31481
Closed
QuLogic added a commit to QuLogic/matplotlib that referenced this pull request Apr 10, 2026
@QuLogic
Update test images for font/text overhaul
12d2a4d
This includes images changes for the following pull requests / commits:

* [Fix center of rotation with
  rotation_mode='anchor'](matplotlib#29199)
  (c44db77)
* [Remove ttconv backwards-compatibility
  code](matplotlib#30145)
  (8caff88)
* [Remove kerning_factor from
  tests](matplotlib#29816)
  (7b4d725)
* [Set text hinting to
  defaults](matplotlib#29816)
  (8255ae2)
* [Update FreeType to
  2.13.3](matplotlib#29816)
  (89c054d)
* [Implement text shaping with
  libraqm](matplotlib#30000)
  (b0ded3a,
  9813523)
* [Add language parameter to Text
  objects](matplotlib#29794)
  (7ce8eae)
* [Fix auto-sized glyphs with BaKoMa
  fonts](matplotlib#29936)
  (3ba2c13)
* [pdf: Improve text with characters outside embedded font
  limits](matplotlib#30512)
  (b70fb88,
  6cedcf7)
* [Prepare `CharacterTracker` for advanced font
  features](matplotlib#30608)
  (8274e17,
  70dc388,
  df670cf,
  ed5e074)
* [Add font feature API to
  Text](matplotlib#29695)
  (972a688)
* [Fix spacing in r"$\max
  f$"](matplotlib#30715)
  (4a99a83)
* [Implement libraqm for vector
  outputs](matplotlib#30607)
  (bd17cd4)
* [Drop the FT2Font intermediate
  buffer](matplotlib#30059)
  (9d7d7b4)
* [Rasterize dvi files without
  dvipng](matplotlib#30039)
  (7627118)
* [Update bundled FreeType and HarfBuzz
  libraries](matplotlib#30938)
  (a161658,
  9619bcc)
* [Fix positioning of wide mathtext
  accents](matplotlib#31069)
  (c2fa7ba)
* [Refactor RendererAgg.draw_{mathtext,text,tex} to use same base
  algorithm](matplotlib#31085)
  (931bcf3)
* [Implement TeX's fraction and script
  alignment](matplotlib#31046)
  (94ff452,
  4bfa0f9,
  1cd8510)
* [Fix confusion between text height and ascent in metrics
  calculations](matplotlib#31107)
  (60f2310)
* [mathtext: Fetch quad width & axis height from font
  metrics](matplotlib#31110)
  (692df3f,
  383028b)
* [mathtext: add mathnormal and distinguish between normal and italic
  family](matplotlib#31121)
  (a6913f3)
* [ENH: Ignore empty text for
  tightbbox](matplotlib#31285)
  (d772043)
* [Drop axis_artist tickdir image compat, due to text-overhaul
  merge](matplotlib#31281)
  (2057583)
* [text: Use font metrics to determine line
  heights](matplotlib#31291)
  (3ab6a27,
  d961462,
  97f4943)
* [ps/pdf: Override font height metrics to support AFM
  files](matplotlib#31371)
  (e0913d4)
* [TST: Cleanup back-compat code in tests touched by text
  overhaul](matplotlib#31295)
  (7c33379)
* [TST: Set tests touched by text overhaul to mpl20
  style](matplotlib#31300)
  (41c4d8d)
@QuLogic QuLogic mentioned this pull request Apr 10, 2026
Font and text overhaul #30161
Merged
4 tasks done
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Reviewers

@QuLogic QuLogic QuLogic approved these changes
@greglucas greglucas greglucas approved these changes

Uh oh!

There was an error while loading. Please reload this page.

Assignees

No one assigned

Labels

backend: agg topic: text/fonts topic: text

Projects

Font and text overhaul
Status: Done

Milestone

v3.11.0

Development

Successfully merging this pull request may close these issues.

Uh oh!

There was an error while loading. Please reload this page.

6 participants

@anntzer @story645 @QuLogic @timhoffm @tacaswell @greglucas
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
You are visitor 01402503 — GeezerVison does not store the pages you look up.
Best viewed with Netscape Navigator 4.7 or Internet Explorer 6 at 800×600. No cookies required.