Susieプラグインをつくる

戻る

はじめに

Susieプラグインは16bit時代の名残を引きずっており、 今となっては仕様がとても旧いものとなっています。 とはいえ、画像・アーカイブを展開する汎用的なプラグインとして、 代替できるものがないのが現状です。
メジャーなツールが新しいプラグイン仕様を出してくれれば、普及するとは思うんですがね・・・
そんなわけで、Susieプラグインは限定された分野で、 とても有用なツールとなっています。
なんといっても、メジャーな画像ツールの多くが対応しているというのが大きいです。

しかし最近、Susieプラグインなどのツールをつくる人が減ってきている気がします。
そこで、ツールの開発を推進するために、プラグインのサンプルを公開してみます。
無料のC/C++開発環境も世の中には存在しますので、やる気さえあればどなたでもつくれると思います。
Windowsプログラミングの知識や経験も、ほとんど要りません。

サンプルは、アリスソフトの画像ファーマットの一つ、QNTです。
少し前にやった、ぱすちゃContinueで使われてました。
* 複数フォーマット対応のサンプルとしてPMSにも対応させてみました。

サンプルソース

プラグイン作成方法については、 kanaさんの所などにもサンプルがあります。
若干、内容が古いですがSusieプラグイン自体の仕様が変わっていないので、今でも大変参考になります。


コンテンツ

  1. Susie32 plug-in 関数の実装 / 利用時の注意点
  2. C++でのプラグイン設計
  3. QNTフォーマットの解析について
  4. コンパイル時の注意点
  5. フリーのC++開発環境

C++でのプラグイン設計

ここではC++でのサンプルを紹介したいと思います。
と言っても、Susieプラグインはとても単純な仕様で、
Susieプラグインの各APIを実装するだけです。

そこで、一つのプラグインで複数のフォーマットに対応する場合を想定してみます。
各プラグインAPI関数の呼び出しごとにファイルタイプを判定し、
各ファイルタイプごとに処理を分ける必要があります。

単純に考えて、各APIの呼び出しごとに、以下のような条件分岐を書くことになるでしょう。
これを全てのAPIに毎回書くのはめんどうです。

    if (/* フォーマットその1か? */)
    {
        // フォーマットその1のAPIを呼ぶ
    }
    else if (/* フォーマットその2か? */)
    {
        // フォーマットその2のAPIを呼ぶ
    }
    ...
ということで、この分岐をせめて一箇所にまとめることを考えます。

  1. プラグインのベースとなるインターフェースを用意する
  2. 各ファイルフォーマットごに、ベースインターフェースを継承したクラスを作成
  3. 対応フォーマットに応じたプラグインを取得するための管理クラスを作成

イメージ図

わざわざベースインターフェースを作成するのは、
各フォーマットのプラグインクラスを抽象化するためです。

    SpiBase* spi = manager.QuerySpi(fileName);
    spi->GetPicture(...);

複数のフォーマットに対応するために、何種類ものプラグインクラスを作成しても、
GetPicture()関数の呼び出しはこれだけで済んでしまいます。
この辺が、C++を使う醍醐味です。

管理クラスmanagerは対応するプラグインのインスタンスを返し、
プラグインのベースインターフェースのポインタを介して、
対応プラグインの関数を呼ぶことができます。

もっとも、最初に書いたように、一つのフォーマットにしか対応しないなら、
あまり意味がありません。
同じファイルタイプでも、大きく異なる形式を持つ場合や、
新規にフォーマットが追加された場合のことを考えると、有効ではあると思います。


戻る inserted by FC2 system