0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

MFCからSVG変換Advent Calendar 2022

Day 1

MFCベクタ画像からSVG画像への変換の前準備

Last updated at Posted at 2022-11-30

MFC(Microsoft Foundation Class)にSVGクラスがほしい

SVG画像を出力するためにSVGクラスなどがライブラリにあればよかったのですが
見当たらないため自作することになりました。

SVG画像の中身はXMLなのでXMLTextReaderクラスを転用する方法も検討しましたが、
利便性の問題からその手法は取らず、設計からすべて自作することにしました。

SVG画像の仕様

以下の仕様を基にしてします。

https://www.w3.org/TR/2011/REC-SVG11-20110816/
https://triple-underscore.github.io/SVG11/index.html

SVG画像はXML構文と同じものです。
前提知識としてXMLが必要となりますのでご注意ください。

座標の変換について

MFCからそのまま出力する分には座標の変換は必要ありませんが
大抵の場合、グラフ座標を使っていることが多いと思います。
グラフ座標は任意の原点 (0, 0) からX座標は右方向に向かって増加し
Y座標は上方向に向かって増加します。

SVG画像はラスタ画像と同じで画像の左上のポイントを原点 (0, 0) とし、
X座標は右方向に向かって値が増加し、Y座標は下方向に向かって値が増加します。

本投稿に関連する投稿ではすべてSVG画像への出力時に
グラフ座標から画像座標への変換(上下の反転)を行います。
また、MFCでの表示範囲から一部だけを切り取りしたものを出力する形になりますので
平行移動なども同時に行います。

変換の詳細につきましては一つの投稿にまとめますのでそちらをご覧ください。

SVG出力用クラス

画像管理クラスとしてSvgImageクラスを用意しました。
全体管理を行う SvgImage クラスがXMLのタグ SvgTag クラスのリストを保持している形となります。
コンストラクタとデストラクタの中身は省略します。
以下のような宣言になっています。

SvgImage.h
class SvgTag
{
public:
	CString m_strName;		// タグ名
	CString m_strValue;		// 値
	int m_nDepth;			// 階層
	BOOL m_bOne;			// 単独タブかのフラグ
	CArray<CString, CString> m_arrAttr;			// 属性名
	CArray<CString, CString> m_arrAttrValue;	// 属性値

public:
	SvgTag();
    ~SvgTag();
};

class SvgImage
{
protected:
	CString m_strFilePath;		// ファイル名
	CArray<mdSvgTag*, mdSvgTag*> m_arrayTag;	// タグ
	Rect m_rectAll;	// viewport
public:
	SvgImage();
    ~SvgImage();
}

足りない分の方が多いですが、記事に応じて追加していきます。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?