2023/11/12
Inkscape のコードを読む
前回に続き、東大 eeic 3A の実験、『大規模ソフトウェアを手探る』のレポート代わりのブログです。
実験では Inkscape という描画ソフトの、 CUI でのファイルエクスポート機能の拡張を目標に取り組みました。
この記事では、その目標に向けてコードを解読した内容について、(実験で解読した限りの理解なので、間違いもあるかもしれませんが)書いていきます。
概要
Inkscape のソースコードは GitLab から入手できます。
レポジトリ: https://gitlab.com/inkscape/inkscape
2023 年 10 月時点で 9 割以上が C++ で書かれています。
また実装については、ドキュメントの情報を参照するのがよさそうです。
Inkscape Documentation: https://inkscape.gitlab.io/inkscape/doxygen/index.html
(大雑把な)コードの構成
今回はエクスポート機能を拡張したかったので、ソースコードのうちデータ管理やエクスポートに関係する部分を確認しました。 関係するのは主に以下の部分です。
エクスポートの実装
src/ui/*
: GUI の場合
src/io/*
: CUI の場合
src/object/*
: 描画データを管理するクラスなど
src/inkscape-application.cpp
: InkscapeApplication
というこのアプリケーションの基盤部分を司るクラスの在処
レポジトリ内にアーキテクチャの図があり、概要を掴むには便利です。 (ただし一部環境では図が見切れてしまうので、注意が必要そうです。)
document model
"document model" はデータ管理を行うモデルです。
SVG document model
"SVG document model" は描画したデータの一時的な管理を行うモデルで、 src/object/sp-*.h
などに実装されています。
以下の 3 つのクラスがあり、下のクラスは、上のクラスのサブクラスになっています。
SPDocument
(= ファイル内のデータ全体)
SPObject
(= layer )
SPItem
(= layer 内の図形単体)
XML document model
SPRepr
という XML に変換されたデータを扱うクラスがあります。 src/xml/*
に実装されています。
エクスポートの流れ
CUI の入力をトリガーとしてエクスポートが実行される流れを、 export-id
オプション(オブジェクト ID で指定されたレイヤを書き出すオプション)を指定した場合を例に追っていきます。
InkscapeApplication
クラス内でオプションを処理する
InkscapeApplication
から InkFileExportCmd::do_export()
を呼び出す
InkFileExportCmd
: CUI からのエクスポートを司るクラス
エクスポート先のファイル形式ごとに 1 つのメソッドを持つ
ex. do_export()
, do_export_svg()
, do_export_vector()
エクスポートのオプション指定を管理するメンバを持つ
コマンドラインで指定できるオプションとほぼ 1 対 1 対応
ex. export_id
, export_filename
do_export_vector()
を呼び出す
do_export_vector()
メソッド内で指定したレイヤを見つける
SPDocument::getObjectById()
を呼び出し、オブジェクト ID に対応する SPObject
を受け取る
Inkscape::Extension::save()
で、エクス ポートファイルを生成する
Inkscape
: Inkscape のコード全体の名前空間
Extension
: Extension system (= Inkscape に機能を追加できるシステム)のための名前空間
ややこしさも否めないですね……。
ここまで、既存の実装について、今回の実験で拡張した機能に関連する部分を中心に触れました。 私が触れなかった、拡張した機能の実装などについては、班の他の方の記事に書いてあるはずです。
では、また。