syobon's note

2023/11/12

Inkscape のコードを読む

#eeic

前回に続き、東大 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 に機能を追加できるシステム)のための名前空間

ややこしさも否めないですね……。

 

ここまで、既存の実装について、今回の実験で拡張した機能に関連する部分を中心に触れました。 私が触れなかった、拡張した機能の実装などについては、班の他の方の記事に書いてあるはずです。

では、また。


syobon