Mercurial > otakunoraifu
comparison system/visarc.cc @ 52:15a18fbe6f21
* Known bugs added to the README
* Code cleaning (0 -> NULL when needed, indentation, spaces, ...)
author | thib |
---|---|
date | Sat, 18 Apr 2009 18:35:39 +0000 |
parents | 3a6aaeab7b4e |
children | 4416cfac86ae |
comparison
equal
deleted
inserted
replaced
51:cbb301016a4e | 52:15a18fbe6f21 |
---|---|
62 } | 62 } |
63 | 63 |
64 void List(char* path) { | 64 void List(char* path) { |
65 ARCFILE* file; | 65 ARCFILE* file; |
66 FILE* f = fopen(path, "rb"); | 66 FILE* f = fopen(path, "rb"); |
67 if (f == 0) return; | 67 if (f == NULL) return; |
68 char header[32]; | 68 char header[32]; |
69 fread(header, 32, 1, f); | 69 fread(header, 32, 1, f); |
70 fclose(f); | 70 fclose(f); |
71 char magic_raf[8] = {'C','A','P','F',1,0,0,0}; | 71 char magic_raf[8] = {'C','A','P','F',1,0,0,0}; |
72 if (strncmp(header, "PACL", 4) == 0) file = new ARCFILE(path); | 72 if (strncmp(header, "PACL", 4) == 0) file = new ARCFILE(path); |
73 else file = new SCN2kFILE(path); | 73 else file = new SCN2kFILE(path); |
74 file->Init(); | 74 file->Init(); |
75 file->ListFiles(stdout); | 75 file->ListFiles(stdout); |
76 delete file; | 76 delete file; |
77 return; | |
78 } | 77 } |
79 | 78 |
80 void ExtractOne(ARCFILE* arc, char* file) { | 79 void ExtractOne(ARCFILE* arc, char* file) { |
81 ARCINFO* info = arc->Find(file,""); | 80 ARCINFO* info = arc->Find(file,""); |
82 if (info == 0) { | 81 if (info == NULL) { |
83 fprintf(stderr, "Cannot find file %s in archive\n",file); | 82 fprintf(stderr, "Cannot find file %s in archive\n",file); |
84 return; | 83 return; |
85 } | 84 } |
86 FILE* out = fopen(file, "w"); | 85 FILE* out = fopen(file, "w"); |
87 if (out == 0) { | 86 if (out == NULL) { |
88 delete info; | 87 delete info; |
89 fprintf(stderr, "Cannot open output file %s\n",file); | 88 fprintf(stderr, "Cannot open output file %s\n",file); |
90 return; | 89 return; |
91 } | 90 } |
92 | 91 |
95 const char* data = info->Read(); | 94 const char* data = info->Read(); |
96 fwrite(data, size, 1, out); | 95 fwrite(data, size, 1, out); |
97 fclose(out); | 96 fclose(out); |
98 fprintf(stdout, "done\n"); | 97 fprintf(stdout, "done\n"); |
99 delete info; | 98 delete info; |
100 return; | |
101 } | 99 } |
102 | 100 |
103 void Extract(char* path, char** files, int fnum) { | 101 void Extract(char* path, char** files, int fnum) { |
104 ARCFILE* file; | 102 ARCFILE* file; |
105 FILE* f = fopen(path, "rb"); | 103 FILE* f = fopen(path, "rb"); |
106 if (f == 0) return; | 104 if (f == NULL) return; |
107 char header[32]; | 105 char header[32]; |
108 fread(header, 32, 1, f); | 106 fread(header, 32, 1, f); |
109 fclose(f); | 107 fclose(f); |
110 char magic_raf[8] = {'C','A','P','F',1,0,0,0}; | 108 char magic_raf[8] = {'C','A','P','F',1,0,0,0}; |
111 if (strncmp(header, "PACL", 4) == 0) file = new ARCFILE(path); | 109 if (strncmp(header, "PACL", 4) == 0) file = new ARCFILE(path); |
112 else file = new SCN2kFILE(path); | 110 else file = new SCN2kFILE(path); |
113 file->Init(); | 111 file->Init(); |
114 if (files != 0 && fnum != 0) { | 112 if (files != NULL && fnum != 0) { |
115 int i; for (i=0; i<fnum; i++) { | 113 int i; for (i=0; i<fnum; i++) { |
116 ExtractOne(file, files[i]); | 114 ExtractOne(file, files[i]); |
117 } | 115 } |
118 } else { | 116 } else { |
119 file->InitList(); | 117 file->InitList(); |
120 char* path; while( (path=file->ListItem()) != 0) { | 118 char* path; |
119 while( (path=file->ListItem()) != 0) { | |
121 ExtractOne(file, path); | 120 ExtractOne(file, path); |
122 } | 121 } |
123 } | 122 } |
124 delete file; | 123 delete file; |
125 return; | |
126 } | 124 } |
127 | 125 |
128 void ChangeExt(char* path, char* new_ext, char* buf) { | 126 void ChangeExt(char* path, char* new_ext, char* buf) { |
129 char* name = strrchr(path, DIR_SPLIT); | 127 char* name = strrchr(path, DIR_SPLIT); |
130 if (name == 0) name = path; | 128 if (name == NULL) name = path; |
131 else name++; | 129 else name++; |
132 int path_len = name - path; | 130 int path_len = name - path; |
133 | 131 |
134 char* ext = strrchr(name, '.'); | 132 char* ext = strrchr(name, '.'); |
135 int ext_len; | 133 int ext_len; |
140 strcpy(buf+path_len+ext_len, new_ext); | 138 strcpy(buf+path_len+ext_len, new_ext); |
141 } | 139 } |
142 | 140 |
143 char* ReadFile(char* fname, int* len) { | 141 char* ReadFile(char* fname, int* len) { |
144 FILE* in = fopen(fname, "rb"); | 142 FILE* in = fopen(fname, "rb"); |
145 if (in == 0) return 0; | 143 if (in == NULL) return 0; |
146 fseek(in,0,2); size_t s = ftell(in); fseek(in,0,0); | 144 fseek(in, 0, SEEK_END); |
145 size_t s = ftell(in); | |
146 fseek(in, 0, SEEK_SET); | |
147 char* buf = new char[s]; | 147 char* buf = new char[s]; |
148 fread(buf,s,1,in); | 148 fread(buf,s,1,in); |
149 fclose(in); | 149 fclose(in); |
150 if (len) *len = s; | 150 if (len) *len = s; |
151 return buf; | 151 return buf; |
213 } | 213 } |
214 png_write_rows(png_ptr, (png_byte**)&row, 1); | 214 png_write_rows(png_ptr, (png_byte**)&row, 1); |
215 } | 215 } |
216 png_write_end(png_ptr, info_ptr); | 216 png_write_end(png_ptr, info_ptr); |
217 png_destroy_write_struct(&png_ptr, &info_ptr); | 217 png_destroy_write_struct(&png_ptr, &info_ptr); |
218 return; | |
219 } | 218 } |
220 | 219 |
221 void ExtractPngRgbaGraphic(char* path,char* outpath = 0) { | 220 void ExtractPngRgbaGraphic(char* path,char* outpath = 0) { |
222 char buf[1024]; char* fname = buf; | 221 char buf[1024]; char* fname = buf; |
223 int len; | 222 int len; |
224 char* dat = ReadFile(path, &len); | 223 char* dat = ReadFile(path, &len); |
225 if (dat == 0) { | 224 if (dat == NULL) { |
226 fprintf(stderr, "Cannot open PDT file : %s\n",path); | 225 fprintf(stderr, "Cannot open PDT file : %s\n",path); |
227 return; | 226 return; |
228 } | 227 } |
229 GRPCONV* conv = GRPCONV::AssignConverter(dat, len, path); | 228 GRPCONV* conv = GRPCONV::AssignConverter(dat, len, path); |
230 if (conv == 0) { | 229 if (conv == NULL) { |
231 fprintf(stderr, "Invalid format\n"); | 230 fprintf(stderr, "Invalid format\n"); |
232 return; | 231 return; |
233 } | 232 } |
234 bool masked = conv->IsMask(); | 233 bool masked = conv->IsMask(); |
235 char* data = new char[conv->Width() * conv->Height() * 4 + 1024]; | 234 char* data = new char[conv->Width() * conv->Height() * 4 + 1024]; |
241 if (! masked) { | 240 if (! masked) { |
242 for (int i = 0; i < conv->Width() * conv->Height(); i++) { | 241 for (int i = 0; i < conv->Width() * conv->Height(); i++) { |
243 data[4*i+3] = 0xff; // 不透明度を最大にする | 242 data[4*i+3] = 0xff; // 不透明度を最大にする |
244 } | 243 } |
245 } | 244 } |
246 if (outpath == 0) ChangeExt(path,".png", buf); // path をつくる | 245 if (outpath == NULL) ChangeExt(path,".png", buf); // path をつくる |
247 else fname = outpath; | 246 else fname = outpath; |
248 FILE* out = fopen(fname, "wb"); // ファイルを開く | 247 FILE* out = fopen(fname, "wb"); // ファイルを開く |
249 if (out == 0) { | 248 if (out == NULL) { |
250 fprintf(stderr, "Cannot open raw file : %s\n",buf); | 249 fprintf(stderr, "Cannot open raw file : %s\n",buf); |
251 delete conv; | 250 delete conv; |
252 return; | 251 return; |
253 } | 252 } |
254 create_png(out, path, "", conv->Width(), conv->Height(), data); | 253 create_png(out, path, "", conv->Width(), conv->Height(), data); |