2016-09-29 4 views
0

私は現在、いくつかのSVGファイルをロードして描画するためのC++パーサーを作成しています。私は描画ライブラリとしてGDI +を使用します。 SVGに間違った値が含まれていることがわかるまで、これはうまくいきました。ここでは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> 

私はこのSVGを読んだとき、アークの一つは95230194961536300000.の半径値が含まれているあなたが見ることができるように、私のエンジンは、受信した値を尊重し、正しくアークを発生させることができます結果は完全に非現実的であり、GDI +はそれをまったく気に入らない。最後に、緑の丸だけが描画され、GDI +はパスを完全に無視し、まったく描画しません。

だから私は多くの質問があります

  1. この値は何ですか?それは限界ですか? std::numeric_limits<float>::max()またはstd::numeric_limits<float>::infinity()
  2. これはGDI +の上限である可能性があります。そのような価値を支持していないのですか?はいの場合、座標のGDI +でサポートされている最大値はいくらですか?
  3. 私は、ChromeやFirefoxのようなブラウザが、パスの間違った部分をスキップすることによって、このSVGをほぼ正確に描くことに気付きました。彼らはどうやって?
  4. SVGが解析されている間に、そのようなエラーを(実際にはエラーの場合)キャッチする正しい方法は何ですか?そして、それが誤りでなければ、どのようにそのような弧を解釈すべきでしょうか?

よろしく

+0

質問1:#2:http://stackoverflow.com/questions/3468495/what-are-the-hard-bounds-for-drawing-coordinates-in-gdi –

+0

質問3 /#4あなたは自分でSVGを解析し、間違っている部分を削除する必要があります。解析の例として、ここを見てください:http://stackoverflow.com/questions/5115388/parsing-svg-path-elements-with-c-sharp-are-there-libraries-out-there-to-do- t –

答えて

0

まず、数字は野生と役に立たないです。

正直なところ、あなたの質問#3は#4に答える方法についての良いヒントだと思います。 #4は、あなたが出力を望んでいないか、あるいは「ちょっと変わったSVG入力を与えられれば最高だ」と決めるのはあなた次第です。正しいものがない限り、何か不正確なものがあれば、FireFox/Chromeの決定に参加してください。

SVGファイルを悪意のあるものとして拒否した場合、特にそれを作成している人がChromeを指して「このブラウザは完全に表示されますが、なぜコードが動作しないのですか? "技術的には間違っていますが、あなたができることを表示し、欠陥を記録し、何が欠陥を作り出すかを判断するための合理的な試みをすることは政治的に賢明かもしれません。

幸運を祈る!

+0

実際、それは私の問題です。私はできることを見せて、できるだけそのような問題に追いつくことを決めました。しかし、私が決定する必要があるのは、それをどうやって行うかです。そのためには、そのようなケースをどのように扱うかを決定する必要があります。そのために、この数字が表すもの、生成された方法とその理由、グラフィカルライブラリの限界は何かを理解する必要があります。それは#1と#2の質問の背後にある理由です –

関連する問題