c++ - 如何管理SVG文件中的超出范围的值?

标签 c++ parsing svg error-handling gdi+

我目前正在编写一个c++解析器来加载和绘制几个SVG文件。我使用GDI +作为图形库。这很好,直到我发现一个SVG显然包含一些不正确的值。这是SVG内容:

<svg xmlns="http://www.w3.org/2000/svg" width="64" height="64" viewBox="0 0 64 64">
  <circle fill="#83BF4F" cx="32" cy="32" r="30"/>
  <path fill="#FFF" stroke="#FFF" stroke-miterlimit="10" d="M44.125 45.045c-1.4-1.076-2.914-3.112-3.215-5.043 3.275-4.105 5.716-9.195 4.947-14.506-.09-.629-.814-1.188-1.396-1.134-1.356.124-2.588.538-3.617 1.214v-3.93c0-.162-.025-.306-.06-.441-.349-3.004-2.514-5.039-5.39-5.198-1.627-.089-3.037.69-4.018 1.898-.978-1.114-2.363-1.809-3.982-1.898-1.621-.089-3.024.685-4.005 1.884a5.506 5.506 0 0 0-3.989-1.884c-1.869-.053-1.865 3.036 0 3.089 1.35.038 2.494 1.045 2.549 2.524 0 .009-.004.018-.004.026a95230194961536300000 95230194961536300000 0 0 1 2.904 21.948l-.005-21.862c.001-.029.007-.055.005-.086l-.001-.014c.194-3.301 4.923-3.295 5.097.014v21.948c0 1.991 2.898 1.991 2.898 0V21.646c.174-3.316 4.928-3.316 5.102 0v8.898a1.739 1.739 0 0 0 0 .368v8.046a38.165 38.165 0 0 1-3.576 3.543c-1.444 1.267.618 3.438 2.05 2.185a38.31 38.31 0 0 0 2.245-2.141c.855 2.069 2.368 3.913 3.998 5.165 1.52 1.17 2.963-1.512 1.463-2.665zm-1.08-17.262c.84 3.449-1.473 5.797-2.201 7.104v-4.343c.154-1.454 1.074-2.322 2.201-2.761z"/>
</svg>

如您所见,其中一个弧包含一个半径值95230194961536300000。当我阅读此SVG时,我的引擎能够正确地生成弧,并遵守接收到的值,但是结果完全是超现实的,GDI +不喜欢它所有。最后,仅画出绿色回合,而GDI +完全忽略了路径,根本不画出该路径。

所以我有很多问题:
  • 这个值是多少?是否有限制,例如std::numeric_limits<float>::max()std::numeric_limits<float>::infinity()
  • 这可能是GDI +限制,例如不支持这样的值?如果是,那么GDI +支持的最大坐标值是多少?
  • 我注意到,像Chrome或Firefox这样的浏览器通过跳过路径的不正确部分,几乎可以正确绘制此SVG。他们是如何做到的?
  • 在解析SVG时,捕获此类错误(如果确实是错误)的正确方法是什么?如果不是错误,那么应该如何解释这样的弧?

  • 问候

    最佳答案

    首先,数字是疯狂和无用的。

    老实说,我认为您的问题3是有关如何回答问题4的很好的提示。 #4完全由您决定是否不希望输出,或者只是“给定奇怪的SVG输入可以做的最好的事情”。如果不正确的事情总比没有好,否则对您总有好处,请加入FireFox/Chrome的决定。

    对于我来说,我将根据如果您认为该SVG文件不正确而做出的决定,特别是因为生产该文件的人将指向Chrome,并说“此浏览器完美地显示了它,为什么您的代码无法正常工作?”从技术上讲是不正确的,但在政治上可能谨慎以显示您能做的事情,记录缺陷并做出合理的尝试来找出导致缺陷的原因。

    祝好运!

    关于c++ - 如何管理SVG文件中的超出范围的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39771606/

    相关文章:

    javascript - 解析 json 数据失败 - jquery

    r - 在 R 中解析文本文件并提取信息

    javascript - 如何改变节点的不透明度?

    javascript - d3 : graph looks good in firefox but is cut off in chrome

    c++ - 迭代器范围删除元素

    c++ - 如何使用带范围的 C++ 创建 XLL 文件?

    c++ - Qt 中的私有(private)变量

    c++ - 编译器如何将类的对象实例翻译成二进制机器代码?

    javascript - 如何暂时禁用 d3.js 中的缩放

    string - 从 URL 获取参数,获取查询字符串中的子字符串并将它们存储在表中