• R/O
  • HTTP
  • SSH
  • HTTPS

svg-dll: コミット

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


コミットメタ情報

リビジョンe8b216c990d9f7ca914eb01a30d738941f1d444b (tree)
日時2003-04-17 05:51:10
作者naru <bottle@mika...>
コミッターnaru

ログメッセージ

SVG3 support - cannot load PNG and JPEG file yet

変更サマリ

差分

--- a/SVG.dpr
+++ b/SVG.dpr
@@ -8,7 +8,7 @@ library SVG;
88 {$R *.res}
99
1010 uses
11- Windows, Classes, SysUtils, Graphics, IniFiles, Dialogs;
11+ Windows, Classes, SysUtils, Graphics, IniFiles, Dialogs, PngImage;
1212
1313 const
1414 SurfaceWidth = 48;
@@ -57,7 +57,7 @@ end;
5757 // CanConfigureは、Configureを呼ばれてやることがあるかどうかを返す。
5858 function GetVersion(DLLName: PChar; NameLen: integer;
5959 var Version: integer; var CanConfigure: boolean): integer; cdecl;
60-const ThisDLL = 'SVG Surface Loader Ver. 1.2';
60+const ThisDLL = 'SVG Surface Loader Ver. 2.0';
6161 begin
6262 Version := 1;
6363 CanConfigure := true;
@@ -65,76 +65,184 @@ begin
6565 Result := Length(ThisDLL) + 1;
6666 end;
6767
68-function LoadDefinitionFile(Ghost: String;
69- Surface: integer; FileName: String; out Pos: integer): String;
70-var Lines, ALine, SurfaceMap: TStringList;
68+function LoadDefinitionFileVer2(Ghost: String;
69+ Surface: integer; Lines: TStringList; const FileName: String;
70+ out Pos: integer): String;
71+var ALine, SurfaceMap: TStringList;
7172 i, j, p, sur, oldpos: integer;
7273 posstr: String;
7374 begin
7475 // 内部関数。ゴースト定義ファイルを解析して、
7576 // 目的のゴーストの含まれたファイルかどうか判断する
76- Lines := TStringList.Create;
77+ ALine := TStringList.Create;
7778 try
78- Lines.LoadFromFile(FileName);
79- ALine := TStringList.Create;
79+ ALine.CommaText := Lines[0];
80+ if (ALine[0] <> 'GHOST') then
81+ Exit;
82+ if (ALine[1] <> Ghost) then
83+ begin
84+ Ghost2File.Values[Ghost] := FileName; // 次からのショートカット
85+ Exit;
86+ end;
87+
88+ // 目的のゴースト発見
89+ oldpos := 0;
90+ SurfaceMap := TStringList.Create;
8091 try
81- ALine.CommaText := Lines[0];
82- if (ALine[0] <> 'GHOST') then
83- Exit;
84- if (ALine[1] <> Ghost) then
92+ for i := 1 to Lines.Count-1 do
93+ begin
94+ SurfaceMap.CommaText := Lines[i];
95+ for j := 0 to SurfaceMap.Count-1 do
96+ begin
97+ try
98+ p := System.Pos(':', SurfaceMap[j]);
99+ if p = 0 then
100+ Continue;
101+ sur := StrToInt(Copy(SurfaceMap[j], 1, p-1));
102+ posstr := Copy(SurfaceMap[j], p+1, High(integer));
103+ if posstr = '+' then
104+ Pos := oldpos + 1
105+ else
106+ Pos := StrToInt(posstr);
107+ if sur = Surface then
108+ begin
109+ Result := ALine[4]; // BMPファイル名
110+ Exit;
111+ end else
112+ oldpos := Pos;
113+ except
114+ on EConvertError do; // nothing. 単なるコメント行扱い
115+ end;
116+ end;
117+ end;
118+ finally
119+ SurfaceMap.Free;
120+ end;
121+
122+ // BASICの場合の処理
123+ if AnsiCompareText('BASIC', ALine[3]) = 0 then
124+ begin
125+ if (Surface >= 0) and (Surface <= 11) then
85126 begin
86- Ghost2File.Values[Ghost] := FileName; // 次からのショートカット
127+ Result := ALine[4]; // BMPファイル名
128+ Pos := Surface; // BASICの場合は位置とサーフィス番号が一対一対応している
87129 Exit;
88130 end;
131+ end;
89132
90- // 目的のゴースト発見
91- oldpos := 0;
92- SurfaceMap := TStringList.Create;
93- try
94- for i := 1 to Lines.Count-1 do
133+ finally
134+ ALine.Free;
135+ end;
136+end;
137+
138+procedure ParseKeyVal(const Line: String; out Key, Val: String);
139+var p: integer;
140+begin
141+ p := Pos('=', Line);
142+ if p > 0 then
143+ begin
144+ Key := Copy(Line, 1, p-1);
145+ Val := Copy(Line, p+1, High(integer));
146+ end else begin
147+ Key := '';
148+ Val := Line;
149+ end;
150+end;
151+
152+function LoadDefinitionFileVer3(Ghost: String;
153+ Surface: integer; Lines: TStringList; const FileName: String;
154+ out Pos: integer): String;
155+var i, j, k, smin, smax, oldsur: integer;
156+ Key, Val, SurStr, PosStr, SakuraName: String;
157+ Dat, Sur2Pos: TStringList;
158+begin
159+ Sur2Pos := TStringList.Create;
160+ oldsur := -1;
161+ try
162+ for i := 1 to Lines.Count-1 do // 1行目は"SVG"の文字列
163+ begin
164+ ParseKeyVal(Lines[i], Key, Val);
165+ if SameText(Key, 'sakura') then
166+ begin
167+ SakuraName := Val;
168+ if SakuraName <> Ghost then //別ゴーストの定義ファイルなのでパス
95169 begin
96- SurfaceMap.CommaText := Lines[i];
97- for j := 0 to SurfaceMap.Count-1 do
170+ Ghost2File.Values[SakuraName] := Ghost; //次からのショートカット
171+ Exit;
172+ end;
173+ end else if SameText(Key, 'surfacefile') then
174+ begin
175+ Result := Val;
176+ end else if SameText(Key, 'surface') or (Length(Key) = 0) then
177+ begin
178+ // サーフィス
179+ Dat := TStringList.Create;
180+ try
181+ Dat.CommaText := Val;
182+ for j := 0 to Dat.Count-1 do
98183 begin
184+ if System.Pos(':', Dat[j]) <= 0 then
185+ Continue;
186+ SurStr := Copy(Dat[j], 1, System.Pos(':', Dat[j])-1);
187+ PosStr := Copy(Dat[j], System.Pos(':', Dat[j])+1, High(integer));
99188 try
100- p := System.Pos(':', SurfaceMap[j]);
101- if p = 0 then
102- Continue;
103- sur := StrToInt(Copy(SurfaceMap[j], 1, p-1));
104- posstr := Copy(SurfaceMap[j], p+1, High(integer));
105- if posstr = '+' then
106- Pos := oldpos + 1
107- else
108- Pos := StrToInt(posstr);
109- if sur = Surface then
189+ if System.Pos('-', SurStr) > 0 then
110190 begin
111- Result := ALine[4]; // BMPファイル名
112- Exit;
191+ smin := StrToInt(Copy(SurStr, 1, System.Pos('-', SurStr)-1));
192+ smax := StrToInt(Copy(SurStr, System.Pos('-', SurStr)+1, High(integer)));
113193 end else
114- oldpos := Pos;
194+ begin
195+ smin := StrToInt(SurStr);
196+ smax := smin;
197+ end;
198+ for k := smin to smax do
199+ begin
200+ if PosStr = '*' then
201+ Sur2Pos.Values[IntToStr(k)] := IntToStr(k)
202+ else if PosStr = '-2' then
203+ Sur2Pos.Values[IntToStr(k)] := '' // 定義解除
204+ else if PosStr = '+' then
205+ begin
206+ Inc(oldsur);
207+ Sur2Pos.Values[IntToStr(k)] := IntToStr(oldsur);
208+ end else if StrToInt(PosStr) >= 0 then
209+ Sur2Pos.Values[IntToStr(k)] := PosStr;
210+ end;
115211 except
116- on EConvertError do; // nothing. 単なるコメント行扱い
212+ Continue;
117213 end;
118214 end;
215+ finally
216+ Dat.Free;
119217 end;
120- finally
121- SurfaceMap.Free;
122218 end;
219+ end;
220+ ShowMessage(Sur2Pos.Text);
221+ if SakuraName <> Ghost then //sakura=??の指定が抜けている定義ファイルの場合
222+ Result := ''
223+ else
224+ begin
225+ if Sur2Pos.Values[IntToStr(Surface)] <> '' then
226+ Pos := StrToInt(Sur2Pos.Values[IntToStr(Surface)])
227+ else
228+ Result := '';
229+ end;
230+ finally
231+ Sur2Pos.Free;
232+ end;
233+end;
123234
124- // BASICの場合の処理
125- if AnsiCompareText('BASIC', ALine[3]) = 0 then
126- begin
127- if (Surface >= 0) and (Surface <= 11) then
128- begin
129- Result := ALine[4]; // BMPファイル名
130- Pos := Surface; // BASICの場合は位置とサーフィス番号が一対一対応している
131- Exit;
132- end;
133- end;
134235
135- finally
136- ALine.Free;
137- end;
236+function LoadDefinitionFile(Ghost: String;
237+ Surface: integer; FileName: String; out Pos: integer): String;
238+var Lines: TStringList;
239+begin
240+ Lines := TStringList.Create;
241+ try
242+ if System.Pos('SVG3', Lines[0]) > 0 then
243+ Result := LoadDefinitionFileVer3(Ghost, Surface, Lines, FileName, Pos)
244+ else
245+ Result := LoadDefinitionFileVer2(Ghost, Surface, Lines, FileName, Pos);
138246 finally
139247 Lines.Free;
140248 end;
旧リポジトリブラウザで表示