Yanesdk 改造中(4)
時間が出来たのでイメージ周りの新しいやり方を考えてみました。
前回の、描画情報リストで管理して擬似的なイメージクラスとして多態するのは、転送先として使っていると描画情報リストを使って多態しているという部分を意識しないといけなくなるため、あまり良くないです。
なので、転送元イメージと転送先イメージを区別するのは使用者にやってもらうことにして、転送元・転送先のイメージクラスは別々に書くことにします。
/// <summary> /// イメージを表すインターフェース /// </summary> interface IImage { int Width { get; } int Height { get; } } /// <summary> /// 描画を行うためのインターフェース /// </summary> interface IGraphics { void Draw(IImage srcImage, YD.Point srcPoint, DrawContext context); void Flush(); } /// <summary> /// 転送元イメージを表すインターフェース /// </summary> interface ISourceImage : IImage { } /// <summary> /// 転送先イメージを表すインターフェース /// </summary> interface IDestinationImage : IImage { IGraphics Graphics { get; } }
/// <summary> /// Yanesdk.Draw.GlTexture を転送元イメージとして扱うためのクラス /// </summary> public class GlSourceImage : ISourceImage { } /// <summary> /// Yanesdk.Draw.GlTexture を転送先イメージとして扱うためのクラス /// </summary> public class GlDestinationImage : IDestinationImage { } /// <summary> /// GlDestinationImage に描画するためのクラス /// </summary> public class GlGraphics : IGraphics { } /// <summary> /// 転送先スクリーンを表すクラス /// </summary> public class ScreenDestinationImage : IDestinationImage { } /// <summary> /// ScreenDestinationImage に描画するためのクラス /// </summary> public class ScreenGraphics : IGraphics { } /// <summary> /// 転送方法を表現するクラス /// </summary> public class DrawContext { }
今のところこんな感じ。
GlSourceImage は内部で GlTexture を持っているだけですが、GlDestinationImage は内部に DIB を持っていて、GlGraphics.Flush() が実行されると、その DIB にテクスチャを貼り付けた後、glTexSubImage2D() を使って DIB からテクスチャに再変換を行うようにしようと思います。
GlSourceImage は転送先として使えないので少々不便ですが、GlSourceImage から GlDestinationImage への変換が可能であれば、特に問題は無いでしょう。
DrawContext は、イメージの転送方法を指定するクラスです。
スクリーンに対してアルファを指定したりするよりは、描画するときにその転送方法を指定した方が自分には分かりやすいので、そうすることにします。
例えば、
drawContext.Alpha = 128; drawContext.StretchSize = new Size(100, 100); dstImage.Graphics.Draw(image, point, drawContext);
こうすれば、image は 100x100 の大きさに拡大縮小されて、透過率50%で、point の位置に描画されるようにする予定です。
まだまだ問題になる部分は出てきそうですけど、とりあえずこんな方針でやってみます。