Files
scummvm/tools/mat2ppm.cpp
T
2008-06-15 13:00:53 +00:00

136 lines
3.2 KiB
C++

/* Residual - Virtual machine to run LucasArts' 3D adventure games
*
* Residual is the legal property of its developers, whose names
* are too numerous to list here. Please refer to the AUTHORS
* file distributed with this source distribution.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
* This library 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
* Lesser General Public License for more details.
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
*
* $URL$
* $Id$
*
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <ppm.h>
static pixel cmap[256];
int32_t read_LEint32(FILE *f) {
unsigned char c[4];
int i;
fread(c, 1, 4, f);
return (c[0]) | (c[1] << 8) | (c[2] << 16) | (c[3] << 24);
}
void read_cmp(const char *fname) {
unsigned char col[3];
FILE *cmp;
int i;
cmp = fopen(fname, "r");
if (cmp == NULL) {
perror(fname);
exit(1);
}
fseek(cmp, 48, SEEK_SET);
for (i = 0; i < 256; i++) {
col[0] = getc(cmp); col[1] = getc(cmp); col[2] = getc(cmp);
PPM_ASSIGN(cmap[i], col[0], col[1], col[2]);
}
fclose(cmp);
}
void write_img(FILE *f, const char *fname, int n, int num_img) {
FILE *out;
int32_t width, height;
int x, y;
unsigned char p;
pixel **img;
char newname[1024];
const char *basename;
fseek(f, 116 + 40 * (num_img - 1), SEEK_SET);
width = read_LEint32(f);
height = read_LEint32(f);
img = ppm_allocarray(width, height);
fseek(f, 100 + 40 * num_img + (width * height + 24) * n, SEEK_SET);
for (y = 0; y < height; y++)
for (x = 0; x < width; x++) {
p = getc(f);
img[y][x] = cmap[p];
}
basename = strrchr(fname, '/');
if (basename != NULL)
basename++;
else
basename = fname;
strcpy(newname, basename);
if (strlen(newname) > 4 &&
strcasecmp(newname + strlen(newname) - 4, ".mat") == 0)
newname[strlen(newname) - 4] = '\0';
sprintf(newname + strlen(newname), "_%d.ppm", n);
out = fopen(newname, "wb");
if (out == NULL) {
perror(newname);
exit(1);
}
ppm_writeppm(out, img, width, height, 255, 0);
ppm_freearray(img, height);
fclose(out);
}
void process_file(const char *fname) {
FILE *in;
int32_t num_img;
int i;
in = fopen(fname, "rb");
if (in == NULL) {
perror(fname);
exit(1);
}
fseek(in, 12, SEEK_SET);
num_img = read_LEint32(in);
for (i = 0; i < num_img; i++)
write_img(in, fname, i, num_img);
fclose(in);
}
int main(int argc, char **argv) {
int i;
ppm_init(&argc, argv);
for (i = 0; i < 256; i++)
PPM_ASSIGN(cmap[i], i, i, i);
i = 1;
if (argc >= 3 && strncmp(argv[1], "-c", 2) == 0) {
read_cmp(argv[2]);
i = 3;
}
for (; i < argc; i++)
process_file(argv[i]);
return 0;
}