• R/O
  • HTTP
  • SSH
  • HTTPS

svg-dll: コミット

SVG (SSTP-Viewer Ghost) 用プラグイン


コミットメタ情報

リビジョンd1eec4ea70ddd9916013d03669fb532be193ba4f (tree)
日時2003-04-06 01:29:05
作者naru <bottle@mika...>
コミッターnaru

ログメッセージ

no message

変更サマリ

差分

--- /dev/null
+++ b/SVG.dpr
@@ -0,0 +1,250 @@
1+library SVG;
2+
3+{$R *.res}
4+
5+uses
6+ Windows, Classes, SysUtils, Graphics, IniFiles;
7+
8+const
9+ SurfaceWidth = 48;
10+ SurfaceHeight = 64;
11+ ConfigFile = 'SVG.ini';
12+
13+var
14+ MyPath: String;
15+ GhostFile: String;
16+ Ghost2File: TStringList;
17+
18+// DLLロード時、およびDLL再初期化時に呼ばれる。
19+// 読み込まれた画像は、Bottle Client側で「サーフィス再読み込み」を
20+// 明示的に指定されない限りは Bottle Client 側でキャッシュされるので、
21+// DLLで画像のキャッシュなどを考える必要は基本的にない。
22+// とはいえサーフィス定義ファイルなどを先に解析しておく必要があるなら、
23+// ここで読み込んでおくと良い。PathにDLLのパスが渡される。
24+procedure Load(Path: PChar); cdecl;
25+var Ini: TIniFile;
26+begin
27+ MyPath := Path;
28+ Ini := TIniFile.Create(MyPath + ConfigFile);
29+ try
30+ GhostFile := Ini.ReadString('SVG', 'GhostFile', '');
31+ finally
32+ Ini.Free;
33+ end;
34+ Ghost2File := TStringList.Create;
35+end;
36+
37+// DLLアンロード時に呼ばれる。
38+// たぶんやることはない。
39+procedure Unload; cdecl;
40+begin
41+ Ghost2File.Free;
42+end;
43+
44+// DLLの名前およびバージョンを返す。
45+// DLLNameにはDLLの名称や作者、DLL本体のバージョンなどをを簡潔に指定する。
46+// NameLenバイトを超えてはならない。
47+// versionにはとりあえず1を返すこと。versionはSSTP Bottle Clientとの
48+// 通信のインターフェースのバージョンであってDLLのバージョンとかではないことに
49+// 注意(Bottle ClientはDLLのバージョン番号なぞ興味ないので)。
50+// CanConfigureは、Configureを呼ばれてやることがあるかどうかを返す。
51+function GetVersion(DLLName: PChar; NameLen: integer;
52+ var Version: integer; var CanConfigure: boolean): integer; cdecl;
53+const ThisDLL = 'SVG Surface Loader';
54+begin
55+ Version := 1;
56+ CanConfigure := true;
57+ StrLCopy(DLLName, ThisDLL, NameLen);
58+ Result := Length(ThisDLL) + 1;
59+end;
60+
61+function LoadDefinitionFile(Ghost: String;
62+ Surface: integer; FileName: String; out Pos: integer): String;
63+var Lines, ALine, SurfaceMap: TStringList;
64+ i, j, p: integer;
65+begin
66+ // 内部関数。ゴースト定義ファイルを解析して、
67+ // 目的のゴーストの含まれたファイルかどうか判断する
68+ Lines := TStringList.Create;
69+ try
70+ Lines.LoadFromFile(FileName);
71+ ALine := TStringList.Create;
72+ try
73+ ALine.CommaText := Lines[0];
74+ if (ALine[0] <> 'GHOST') or (ALine[1] <> Ghost) then
75+ Exit;
76+ // 目的のゴースト発見
77+
78+ SurfaceMap := TStringList.Create;
79+ try
80+ for i := 1 to Lines.Count-1 do
81+ begin
82+ SurfaceMap.CommaText := Lines[i];
83+ for j := 0 to SurfaceMap.Count-1 do
84+ begin
85+ try
86+ p := System.Pos(':', SurfaceMap[j]);
87+ if p = 0 then
88+ Continue;
89+ if StrToInt(Copy(SurfaceMap[j], 1, p-1)) = Surface then
90+ begin
91+ Pos := StrToInt(Copy(SurfaceMap[j], p+1, High(integer)));
92+ Result := ALine[4]; // BMPファイル名
93+ Exit;
94+ end;
95+ except
96+ on EConvertError do; // nothing. 単なるコメント行扱い
97+ end;
98+ end;
99+ end;
100+ finally
101+ SurfaceMap.Free;
102+ end;
103+
104+ // BASICの場合の処理
105+ if AnsiCompareText('BASIC', ALine[3]) = 0 then
106+ begin
107+ if (Surface >= 0) and (Surface <= 11) then
108+ begin
109+ Result := ALine[4]; // BMPファイル名
110+ Pos := Surface; // BASICの場合は位置とサーフィス番号が一対一対応している
111+ Exit;
112+ end;
113+ end;
114+
115+ finally
116+ ALine.Free;
117+ end;
118+ finally
119+ Lines.Free;
120+ end;
121+end;
122+
123+function FetchBmpFileAndPosition(Ghost: String;
124+ Surface: integer; out Pos: integer): String;
125+var Ghosts, AGhost: TStringList;
126+ i, dum: integer;
127+ Dir, DefFileName, BmpFileName: String;
128+begin
129+ if Ghost2File.Values[Ghost] <> '' then // すでにそのゴーストのファイルを記憶してる
130+ begin
131+ DefFileName := Ghost2File.Values[Ghost];
132+ BmpFileName := LoadDefinitionFile(Ghost, Surface,
133+ DefFileName, dum);
134+ if BmpFileName <> '' then
135+ begin
136+ Result := ExtractFilePath(DefFileName) + BmpFileName;
137+ Pos := dum;
138+ Exit;
139+ end;
140+ end;
141+
142+ // 内部関数。ghost.txtを読み込む。
143+ Dir := ExtractFilePath(GhostFile);
144+ Ghosts := TStringList.Create;
145+ try
146+ Ghosts.LoadFromFile(GhostFile);
147+ for i := 0 to Ghosts.Count-1 do
148+ begin
149+ AGhost := TStringList.Create;
150+ try
151+ AGhost.CommaText := Ghosts[i];
152+ if AGhost[0] <> 'GHOST' then
153+ Continue;
154+ DefFileName := Dir + AGhost[3];
155+ // 定義ファイルを読み込む
156+ BmpFileName := LoadDefinitionFile(Ghost, Surface,
157+ DefFileName, dum);
158+ if BmpFileName <> '' then
159+ begin
160+ // 発見!
161+ Ghost2File.Values[Ghost] := DefFileName; // 次からのために定義ファイル名を記憶
162+ Result := ExtractFilePath(DefFileName) + BmpFileName;
163+ Pos := dum;
164+ Break;
165+ end;
166+ finally
167+ AGhost.Free;
168+ end;
169+ end;
170+ finally
171+ Ghosts.Free;
172+ end;
173+end;
174+
175+// Ghostで指定されるゴーストのSurface番のサーフィスイメージを実際に読み出す。
176+// Hで指定されているビットマップに書き出すこと。
177+function GetImage(Ghost: PChar; Surface: integer; H: HBITMAP): integer; cdecl;
178+var Bmp, Bmp2: TBitmap;
179+ BmpFile: String;
180+ Position, x, y, nCol: integer;
181+begin
182+ try
183+ BmpFile := FetchBmpFileAndPosition(Ghost, Surface, Position);
184+ if BmpFile = '' then // そのようなゴーストのそのようなサーフィスは見つからない
185+ begin
186+ Result := 1;
187+ Exit;
188+ end;
189+ except
190+ on Exception do // ファイルが見つかってない可能性がもっとも高い
191+ begin
192+ Result := 1;
193+ Exit;
194+ end;
195+ end;
196+
197+ Bmp := TBitmap.Create;
198+ try
199+ Bmp.Handle := H;
200+ Bmp2 := TBitmap.Create;
201+ try
202+ Bmp2.LoadFromFile(BmpFile);
203+ nCol := Bmp2.Width div SurfaceWidth;
204+ x := SurfaceWidth * (Position mod nCol);
205+ y := SurfaceHeight * (Position div nCol);
206+ Bmp.Canvas.CopyRect(
207+ Rect(0, 0, Bmp.Width, Bmp.Height),
208+ Bmp2.Canvas,
209+ Rect(x, y, x+SurfaceWidth, y+SurfaceHeight)
210+ );
211+ finally
212+ Bmp2.Free;
213+ end;
214+ finally
215+ Bmp.ReleaseHandle;
216+ Bmp.Free;
217+ end;
218+ Result := 0;
219+end;
220+
221+// イメージの大きさを返す。
222+// 大抵の場合イメージの大きさはもとから分かっていると思うので、
223+// それなら単純に定数を返して差し支えない。
224+// イメージの大きさがゴーストやサーフィス番号によって変わるならそのように。
225+function GetImageSize(Ghost: PChar; Surface: integer;
226+ var w, h: integer): integer; cdecl;
227+begin
228+ w := SurfaceWidth;
229+ h := SurfaceHeight;
230+ Result := 0;
231+end;
232+
233+
234+// DLL固有の設定を行う。
235+//
236+procedure Configure; cdecl;
237+begin
238+end;
239+
240+exports
241+ Load,
242+ Unload,
243+ GetVersion,
244+ Configure,
245+ GetImage,
246+ GetImageSize;
247+
248+begin
249+
250+end.
Binary files /dev/null and b/SVG.res differ
旧リポジトリブラウザで表示