Mercurial > otakunoraifu
diff system/file.h @ 0:223b71206888
Initial import
author | thib |
---|---|
date | Fri, 01 Aug 2008 16:32:45 +0000 |
parents | |
children | 3a6aaeab7b4e |
line wrap: on
line diff
new file mode 100644 --- /dev/null +++ b/system/file.h @@ -0,0 +1,225 @@ +/* file.h : KANON の圧縮ファイル・PDT ファイル(画像ファイル)の展開の + * ためのクラス + * class FILESEARCH : ファイルの管理を行う + * class ARCINFO : 書庫ファイルの中の1つのファイルを扱うクラス + * class PDTCONV : PDT ファイルの展開を行う。 + */ + +/* + * + * Copyright (C) 2000- Kazunori Ueno(JAGARL) <jagarl@creator.club.ne.jp> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * +*/ + +#ifndef __KANON_FILE_H__ +#define __KANON_FILE_H__ + +#ifndef DIR_SPLIT +#define DIR_SPLIT '/' /* UNIX */ +#endif + +// read 'KANON' compressed file + +#include<stdio.h> +#include<stdlib.h> +#include<string.h> +#include<sys/types.h> + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#if defined(__sparc) || defined(sparc) +# if !defined(WORDS_BIGENDIAN) +# define WORDS_BIGENDIAN 1 +# endif +#endif + +#define INT_SIZE 4 + +static int read_little_endian_int(const char* buf) { + const unsigned char *p = (const unsigned char *) buf; + return (p[3] << 24) | (p[2] << 16) | (p[1] << 8) | p[0]; +} + +static int read_little_endian_short(const char* buf) { + const unsigned char *p = (const unsigned char *) buf; + return (p[1] << 8) | p[0]; +} + +static int write_little_endian_int(char* buf, int number) { + int c = read_little_endian_int(buf); + unsigned char *p = (unsigned char *) buf; + unsigned int unum = (unsigned int) number; + p[0] = unum & 255; + unum >>= 8; + p[1] = unum & 255; + unum >>= 8; + p[2] = unum & 255; + unum >>= 8; + p[3] = unum & 255; + return c; +} + +static int write_little_endian_short(char* buf, int number) { + int c = read_little_endian_short(buf); + unsigned char *p = (unsigned char *) buf; + unsigned int unum = (unsigned int) number; + p[0] = unum & 255; + unum >>= 8; + p[1] = unum & 255; + return c; +} + + +/********************************************* +** FILESEARCH: +** 書庫ファイル/ディレクトリを含め、 +** 全ファイルの管理を行う。 +** +** 最初に、設定ファイルからファイルの種類ごとに +** 実際に入っているディレクトリ、書庫を設定する +** +** 以降はFind() メソッドで実際のファイルの内容を得る +** +*/ + +/* ARCFILE と DIRFILE はファイル種類ごとの情報 */ +class ARCFILE; +class DIRFILE; +class SCN2kFILE; +/* ARCINFO はファイルを読み込むために必要 */ +class ARCINFO; +class ARCFILE_ATOM; +class FILESEARCH { +public: +#define TYPEMAX 14 + enum FILETYPE { + /* 一応、0 - 15 まで reserved */ + ALL = 1, /* dat/ 以下のファイル(デフォルトの検索先) */ + ROOT= 2, /* ゲームのインストールディレクトリ */ + PDT = 3, /* default: PDT/ */ + SCN = 4, /* default: DAT/SEEN.TXT */ + ANM = 5, /* default: DAT/ALLANM.ANL */ + ARD = 6, /* default: DAT/ALLARD.ARD */ + CUR = 7, /* default: DAT/ALLCUR.CUR */ + MID = 8, /* default: ALL */ + WAV = 9, /* default: ALL */ + KOE = 10, /* default: KOE/ */ + BGM = 11, /* default: BGM */ + MOV = 12, /* default : MOV */ + GAN = 13 /* default : MOV */ + }; + enum ARCTYPE {ATYPE_DIR, ATYPE_ARC, ATYPE_SCN2k}; +private: + /* InitRoot() の時点で初期化される変数 */ + DIRFILE* root_dir; + DIRFILE* dat_dir; + ARCFILE* searcher[TYPEMAX]; + /* ファイルの存在位置の information */ + ARCTYPE is_archived[TYPEMAX]; + char* filenames[TYPEMAX]; + /* デフォルトの information */ + static ARCTYPE default_is_archived[TYPEMAX]; + static char* default_dirnames[TYPEMAX]; +public: + FILESEARCH(void); + ~FILESEARCH(); + /* 初めにゲームのデータがあるディレクトリを設定する必要がある */ + int InitRoot(char* root); + /* ファイルの型ごとの情報をセットする */ + void SetFileInformation(FILETYPE type, ARCTYPE is_arc, + char* filename); + /* 複数のファイルを一つの型に関連づける */ + void AppendFileInformation(FILETYPE type, ARCTYPE is_arc, + char* filename); + ARCFILE* MakeARCFILE(ARCTYPE tp, char* filename); + /* fname で指定された名前のファイルを検索 */ + class ARCINFO* Find(FILETYPE type, const char* fname, const char* ext=0); + /* ある種類のファイルをすべてリストアップ + ** 末尾は NULL pointer + */ + char** ListAll(FILETYPE type); +}; + +class ARCINFO { +protected: + /* ファイルそのものの情報 */ + ARCFILE_ATOM& info; + char* arcfile; + /* mmap している場合、その情報 */ + bool use_mmap; + char* mmapped_memory; + int fd; + /* ファイル内容の入っているバッファ */ + const char* data; + +protected: + ARCINFO(const char* arcfile, ARCFILE_ATOM& from); // only from ARCFILE + friend class ARCFILE; + friend class DIRFILE; + + virtual bool ExecExtract(void); +public: + /* dest は256byte 程度の余裕があること */ + static void Extract(char*& dest, char*& src, char* destend, char* srcend); + static void Extract2k(char*& dest, char*& src, char* destend, char* srcend); + virtual ~ARCINFO(); + /* 必要なら Read 前に呼ぶことで処理を分割できる */ + int Size(void) const; + char* CopyRead(void); /* Read() して内容のコピーを返す */ + const char* Read(void); + /* ファイルが regular file の場合、ファイル名を帰す */ + /* そうでないなら 0 を帰す */ + const char* Path(void) const; + FILE* OpenFile(int* length=0) const; /* 互換性のため:raw file の場合、ファイルを開く */ +}; + +class GRPCONV { +public: + int width; + int height; + bool is_mask; + + const char* filename; + const char* data; + int datalen; + + int Width(void) { return width;} + int Height(void) { return height;} + bool IsMask(void) { return is_mask;} + + GRPCONV(void); + virtual ~GRPCONV(); + void Init(const char* fname, const char* data, int dlen, int width, int height, bool is_mask); + + virtual bool Read(char* image) = 0; + static GRPCONV* AssignConverter(const char* inbuf, int inlen, const char* fname); + static GRPCONV* AssignConverter(ARCINFO* info) { + const char* dat = info->Read(); + if (dat == 0) return 0; + return AssignConverter(dat, info->Size(), "???"); + } + void CopyRGBA(char* image, const char* from); + void CopyRGB(char* image, const char* from); + void CopyRGBA_rev(char* image, const char* from); + void CopyRGB_rev(char* image, const char* from); +}; + +extern FILESEARCH file_searcher; + +#endif // !defined(__KANON_FILE_H__)