Title: Clipping filled paths in vector outputs · Issue #9488 · matplotlib/matplotlib · GitHub
Open Graph Title: Clipping filled paths in vector outputs · Issue #9488 · matplotlib/matplotlib
X Title: Clipping filled paths in vector outputs · Issue #9488 · matplotlib/matplotlib
Description: The svg spec says that renderers should support values within the range of a C float (https://www.w3.org/TR/SVG/types.html#Precision). However, in practice, inkscape appears to be limited to overflow around 2**24, probably due to the fac...
Open Graph Description: The svg spec says that renderers should support values within the range of a C float (https://www.w3.org/TR/SVG/types.html#Precision). However, in practice, inkscape appears to be limited to overfl...
X Description: The svg spec says that renderers should support values within the range of a C float (https://www.w3.org/TR/SVG/types.html#Precision). However, in practice, inkscape appears to be limited to overfl...
Opengraph URL: https://github.com/matplotlib/matplotlib/issues/9488
X: @github
Domain: github.com
{"@context":"https://schema.org","@type":"DiscussionForumPosting","headline":"Clipping filled paths in vector outputs","articleBody":"The svg spec says that renderers should support values within the range of a C float (https://www.w3.org/TR/SVG/types.html#Precision). However, in practice, inkscape appears to be limited to overflow around 2**24, probably due to the fact that it relies on cairo (which has the same limitation) for rendering. Chromium's svg renderer also appears to hit an overflow somewhere (not sure about the exact value). Agg also has this limitation (see comment at the top of `_path_converters.h`: \r\n\r\n\u003e PathClipper: Clips line segments to a given rectangle. This is\r\n\u003e helpful for data reduction, and also to avoid a limitation in\r\n\u003e Agg where coordinates can not be larger than 24-bit signed\r\n\u003e integers.\r\n\r\nand it is explicitly tested that this is worked around for Agg (test_simplification.test_overflow).\r\n\r\nCurrently, the svg backend clips output paths to the actually drawn canvas, but does not clip filled areas. So, with\r\n```\r\nfrom pylab import *\r\nfill_between([0, 1e10], [1, 1], color=\"b\")\r\nplot([0, 1e10], [.5, .5], \"r\")\r\ngca().set(xlim=(0, 1)) # force very large x-coordinates in pixels\r\ngca().set_axis_off()\r\nsavefig(\"/tmp/foo.png\")\r\nsavefig(\"/tmp/foo.svg\")\r\n```\r\nwe get:\r\n\r\npng:\r\n\r\n\r\n\r\nsvg, converted to png by inkscape (can't attach a svg in a gh comment) -- but chromium renders the same way:\r\n\r\n\r\n\r\n(the red line is drawn accurately because it is clipped in the SVG output; the blue box disappears because it is not clipped and overflows inkscape's renderer)\r\n\r\nThere are similar overflow issues with pdf output (via ghostscript -- the relevant renderer, as we use it for the test suite), which are in fact the factor limiting the clip value in https://github.com/matplotlib/matplotlib/pull/9477 (that's how I found out about this issue), although I can't point to anything in the pdf spec right now.\r\n\r\nNow one may argue that \"this is the fault of the noncompliant renderer\", but given that we are *already* clipping unfilled paths, and also fully working around this for raster output, I think it makes sense to clip filled paths as well in svg (and pdf). (Of course, this will still fail when someone tries to make a svg image with a dimension exceeding 2**24. Honestly I don't care about that case :-))\r\n\r\nRelated to #8901 (clipping in eps).","author":{"url":"https://github.com/anntzer","@type":"Person","name":"anntzer"},"datePublished":"2017-10-20T09:02:21.000Z","interactionStatistic":{"@type":"InteractionCounter","interactionType":"https://schema.org/CommentAction","userInteractionCount":5},"url":"https://github.com/9488/matplotlib/issues/9488"}
| route-pattern | /_view_fragments/issues/show/:user_id/:repository/:id/issue_layout(.:format) |
| route-controller | voltron_issues_fragments |
| route-action | issue_layout |
| fetch-nonce | v2:dfa8f59b-2349-4f72-c13b-0a275a1c4298 |
| current-catalog-service-hash | 81bb79d38c15960b92d99bca9288a9108c7a47b18f2423d0f6438c5b7bcd2114 |
| request-id | DCA4:1357D4:67F367:8D31D2:6A515021 |
| html-safe-nonce | d56756f25f0788203a5a19ebc6ba62e99842c95ff3479f50ff96e4a07151b045 |
| visitor-payload | eyJyZWZlcnJlciI6IiIsInJlcXVlc3RfaWQiOiJEQ0E0OjEzNTdENDo2N0YzNjc6OEQzMUQyOjZBNTE1MDIxIiwidmlzaXRvcl9pZCI6IjQzMTkxMjc3MTcxODQzNjA0ODEiLCJyZWdpb25fZWRnZSI6ImlhZCIsInJlZ2lvbl9yZW5kZXIiOiJpYWQifQ== |
| visitor-hmac | f3e53c4c1c177ecc64c01d3d56730b369456529d5d1e43fd88bc1b6f97d770f9 |
| hovercard-subject-tag | issue:267108985 |
| github-keyboard-shortcuts | repository,issues,copilot |
| google-site-verification | Apib7-x98H0j5cPqHWwSMm6dNU4GmODRoqxLiDzdx9I |
| octolytics-url | https://collector.github.com/github/collect |
| analytics-location | / |
| fb:app_id | 1401488693436528 |
| apple-itunes-app | app-id=1477376905, app-argument=https://github.com/_view_fragments/issues/show/matplotlib/matplotlib/9488/issue_layout |
| twitter:image | https://opengraph.githubassets.com/45628c70f7577a9058100fa9d521d11fdda66a93359daa9078ced762f195e474/matplotlib/matplotlib/issues/9488 |
| twitter:card | summary_large_image |
| og:image | https://opengraph.githubassets.com/45628c70f7577a9058100fa9d521d11fdda66a93359daa9078ced762f195e474/matplotlib/matplotlib/issues/9488 |
| og:image:alt | The svg spec says that renderers should support values within the range of a C float (https://www.w3.org/TR/SVG/types.html#Precision). However, in practice, inkscape appears to be limited to overfl... |
| og:image:width | 1200 |
| og:image:height | 600 |
| og:site_name | GitHub |
| og:type | object |
| og:author:username | anntzer |
| hostname | github.com |
| expected-hostname | github.com |
| None | 6f17634ed2af1d116850bcea6c63a70a4d72970f33ade1dd3eef3764b7e16994 |
| turbo-cache-control | no-preview |
| go-import | github.com/matplotlib/matplotlib git https://github.com/matplotlib/matplotlib.git |
| octolytics-dimension-user_id | 215947 |
| octolytics-dimension-user_login | matplotlib |
| octolytics-dimension-repository_id | 1385122 |
| octolytics-dimension-repository_nwo | matplotlib/matplotlib |
| octolytics-dimension-repository_public | true |
| octolytics-dimension-repository_is_fork | false |
| octolytics-dimension-repository_network_root_id | 1385122 |
| octolytics-dimension-repository_network_root_nwo | matplotlib/matplotlib |
| turbo-body-classes | logged-out env-production page-responsive |
| disable-turbo | false |
| browser-stats-url | https://api.github.com/_private/browser/stats |
| browser-errors-url | https://api.github.com/_private/browser/errors |
| release | 511bff6ea06e144ed085ff736aea4c6404987b00 |
| ui-target | full |
| theme-color | #1e2327 |
| color-scheme | light dark |
Links:
Viewport: width=device-width