C ++でのSVGの読み取り

ベクトル2D画像を保存または交換するための形式を選択する場合、SVGは、その開放性と普及率により、主要な競争相手の1つです。 私の意見では、著者は、ドキュメントの作成の便利さと柔軟性に圧倒され、その結果、多様性と冗長性が大きくなり、結果として読みにくくなりました。 さらに、コンパクトさのために、XMLに組み込まれたさまざまな文法が発明されました。これはプログラマにとっても頭痛の種です。



現在、SVGをロードしてラスタに描画できるC / C ++ライブラリがいくつかありますが、これはアプリケーションでのSVGの可能なアプリケーションのごく一部です。



私はC ++ライブラリを開発しました。これは、仕様のほとんどの微妙な違いを実装し、SVGデータを便利な形式で提供します。 この場合、タスクはプログラマーにSVGからの初期情報の単純化を課すことではありませんでした。 たとえば、開発者は長さがどの測定単位に設定されているかに関心がない場合が多く、同じ次元に縮小された値を使用する方が便利です。 ただし、場合によっては(たとえば、SVG DOMの作成)、ユニットに関する情報をプログラムに転送する必要があります。 または、長方形、円など-場合によっては、均一性のためにパスで簡単に表されますが、それがどのような形状であるかを知りたい場合があります。



ようこそ、 SVG ++ 1.0です!





受け入れられているように、動機付けの例:



#include <rapidxml_ns/rapidxml_ns.hpp> #include <svgpp/policy/xml/rapidxml_ns.hpp> #include <svgpp/svgpp.hpp> using namespace svgpp; class Context { public: void on_enter_element(tag::element::any); void on_exit_element(); void transform_matrix(const boost::array<double, 6> & matrix); void path_move_to(double x, double y, tag::coordinate::absolute); void path_line_to(double x, double y, tag::coordinate::absolute); void path_cubic_bezier_to( double x1, double y1, double x2, double y2, double x, double y, tag::coordinate::absolute); void path_quadratic_bezier_to( double x1, double y1, double x, double y, tag::coordinate::absolute); void path_elliptical_arc_to( double rx, double ry, double x_axis_rotation, bool large_arc_flag, bool sweep_flag, double x, double y, tag::coordinate::absolute); void path_close_subpath(); void path_exit(); }; typedef boost::mpl::set< tag::element::circle, tag::element::ellipse, tag::element::line, tag::element::path, tag::element::polygon, tag::element::polyline, tag::element::rect, tag::element::svg, tag::element::g >::type processed_elements_t; typedef boost::mpl::insert< traits::shapes_attributes_by_element, tag::attribute::transform >::type processed_attributes_t; void loadSvg(rapidxml_ns::xml_node<> const * xml_root_element) { Context context; document_traversal< processed_elements<processed_elements_t>, processed_attributes<processed_attributes_t> >::load_document(xml_root_element, context); }
      
      







この小さなコードにより、ContextオブジェクトはSVGオブジェクトのジオメトリに関する情報を取得できます。 このために、SVG ++の「内部」で、SVG パス基本形状単位 、および変換の機能のサポートが実装されています。 そして、これはSVG ++の機能のほんの一部です。

実際、ジオメトリを完全にサポートするには(描画、クリッピング、マスクなどのスタイルがなくても)、さらにいくつかの手順を実行する必要があります(ビューポートのサイズ、デバイスの解像度、リンクなどを考慮してください)。 チュートリアルとヘルプ。



ライブラリはそれ自体を描画せず、何も描画しませんが、レンダリングにAGGまたはGDI +を使用してSVGラスタライズ(仕様のサブセット)を実装するsvgpp / src / demo / renderデモアプリケーションが含まれます。



ライブラリを完全に使用するには、 SVG 仕様に精通していること非常に望ましいです。






All Articles