SVGタグの追加
基本的にタグ要素を生成してタグ名 m_strName とタグの値 m_strValue を設定します。
例に挙げている title タグの追加は値が存在しますので値のない単独タグであることを示すフラグ m_bOne が "FALSE" となります。
階層は svg タグ内の宣言となりますので m_nDepth は "1" となります。
ヘッダは宣言の部分のみ
class SvgImage
{
public:
+ void AddTitle(LPCTSTR strTitle);
}
void SvgImage::AddTitle(LPCTSTR strTitle)
{
SvgTag* svgRoot = new SvgTag();
svgRoot->m_strName = L"title";
svgRoot->m_strValue = strTitle;
svgRoot->m_nDepth = 1;
svgRoot->m_bOne = FALSE;
m_arrayTag.Add(svgRoot);
}
属性の追加
属性は指定された属性が既に登録済みであった場合のことも考慮して準備します。
ヘッダは宣言の部分のみ
class SvgImage
{
public:
+ void AddAttribute(LPCTSTR attrName, LPCTSTR attrValue, BOOL bOverwrite);
}
void mdSvgImage::AddAttribute(LPCTSTR attrName, LPCTSTR attrValue, BOOL bOverwrite)
{
SvgTag *svgTag = m_arrayTag.GetAt(m_arrayTag.GetSize() - 1);
BOOL bFind = FALSE;
for (int i = 0; i < svgTag->m_arrAttr.GetSize(); i++)
{
if (svgTag->m_arrAttr.GetAt(i).CompareNoCase(attrName) == 0)
{
CString strProp = svgTag->m_arrAttrValue.GetAt(i);
strProp = bOverwrite ? attrValue : svgTag->m_arrAttrValue.GetAt(i) + attrValue;
svgTag->m_arrAttrValue.SetAt(i, strProp);
bFind = TRUE;
}
}
if (bFind == FALSE)
{
svgTag->m_arrAttr.Add(attrName);
svgTag->m_arrAttrValue.Add(attrValue);
}
}
現在終端にあるタグが保持している属性全てに対してループをします。
bFind は追加したい属性名が重複していないか判定するためのフラグです。
FALSEのままであれば属性リストに追加する処理を行います。
SvgTag *svgTag = m_arrayTag.GetAt(m_arrayTag.GetSize() - 1);
BOOL bFind = FALSE;
for (int i = 0; i < svgTag->m_arrAttr.GetSize(); i++)
{
属性が重複しないかを調べます。
重複している場合は上書きか追記かを bOverwrite フラグから参照し、TRUE の場合は上書きし、FALSE の場合は追記を行います。
if (svgTag->m_arrAttr.GetAt(i).CompareNoCase(attrName) == 0)
{
CString strProp = svgTag->m_arrAttrValue.GetAt(i);
strProp = bOverwrite ? attrValue : svgTag->m_arrAttrValue.GetAt(i) + attrValue;
svgTag->m_arrAttrValue.SetAt(i, strProp);
bFind = TRUE;
}
属性リストで重複が見つからなければ(bFind == FALSE の場合)新規追加を行います。
if (bFind == FALSE)
{
svgTag->m_arrAttr.Add(attrName);
svgTag->m_arrAttrValue.Add(attrValue);
}
MFC のカラーコードを考慮した属性の追加
SVG の fill や stroke 属性にはカラーコードかURLが必要となります。
MFC のカラーコードから SVG 画像のカラーコード(16進数テキスト)に変換して出力します。
カラーコードは上書きを指定しています。
ヘッダは宣言の部分のみ
class SvgImage
{
public:
+ void AddAttrColor(LPCTSTR attrName, COLORREF color);
}
void SvgImage::AddAttrColor(LPCTSTR attrName, COLORREF color)
{
CString strColor;
strColor.Format(L"#%02x%02x%02x", GetRValue(color), GetGValue(color), GetBValue(color));
AddAttribute(attrName, strColor, TRUE);
}