現在、SVGをロードしてラスタに描画できるC / C ++ライブラリがいくつかありますが、これはアプリケーションでのSVGの可能なアプリケーションのごく一部です。
私はC ++ライブラリを開発しました。これは、仕様のほとんどの微妙な違いを実装し、SVGデータを便利な形式で提供します。 この場合、タスクはプログラマーにSVGからの初期情報の単純化を課すことではありませんでした。 たとえば、開発者は長さがどの測定単位に設定されているかに関心がない場合が多く、同じ次元に縮小された値を使用する方が便利です。 ただし、場合によっては(たとえば、SVG DOMの作成)、ユニットに関する情報をプログラムに転送する必要があります。 または、長方形、円など-場合によっては、均一性のためにパスで簡単に表されますが、それがどのような形状であるかを知りたい場合があります。
ようこそ、 SVG ++ 1.0です!
- 商用および非商用使用の場合は無料、ライセンス-Boost 。
- ヘッダーのみ、クロスプラットフォーム、十分なC ++ 03。
- サードパーティのライブラリのうち、ブーストのみが必要です。 そうそう、あなたの好みに合わせた別のXMLパーサー。 RapidXML NS 、libxml2およびMSXMLにはすぐに使用できるアダプターがありますが、他のアダプターのサポートは簡単に追加できます。
受け入れられているように、動機付けの例:
#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 仕様に精通していることが非常に望ましいです。
- ドキュメントのあるライブラリのメインページはsvgpp.orgです (ドキュメントは英語への翻訳のために準備されているため、ロシア語と英語の一時的なミッシュマッシュです)
- Githubリポジトリgithub.com/svgpp/svgpp
- Googleグループのフォーラム