Some updates.
git-svn-id: svn://svn.code.sf.net/p/sc2/code/trunk@721 8092fc87-c524-0410-9efc-e669fe64eaf9
This commit is contained in:
+132
-19
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* .ani file extractor
|
* .ani file extractor
|
||||||
* By Serge van den Boom (svdb@stack.nl), 20021012
|
* By Serge van den Boom (svdb@stack.nl), 20021027
|
||||||
* The GPL applies.
|
* The GPL applies.
|
||||||
*
|
*
|
||||||
*
|
*
|
||||||
@@ -41,6 +41,8 @@ index_header *readIndex(const uint8 *buf);
|
|||||||
void printIndex(const index_header *h, const uint8 *buf, FILE *out);
|
void printIndex(const index_header *h, const uint8 *buf, FILE *out);
|
||||||
void generateAni(const index_header *h, const uint8 *buf, const char *prefix,
|
void generateAni(const index_header *h, const uint8 *buf, const char *prefix,
|
||||||
FILE *out);
|
FILE *out);
|
||||||
|
int findTransparentColourPacked(const char *name, const frame_desc *f,
|
||||||
|
const uint8 *data);
|
||||||
void writeFiles(const index_header *h, const uint8 *data, const char *path,
|
void writeFiles(const index_header *h, const uint8 *data, const char *path,
|
||||||
const char *prefix);
|
const char *prefix);
|
||||||
void parse_arguments(int argc, char *argv[], struct options *opts);
|
void parse_arguments(int argc, char *argv[], struct options *opts);
|
||||||
@@ -309,15 +311,37 @@ void
|
|||||||
generateAni(const index_header *h, const uint8 *buf, const char *prefix,
|
generateAni(const index_header *h, const uint8 *buf, const char *prefix,
|
||||||
FILE *out) {
|
FILE *out) {
|
||||||
int i;
|
int i;
|
||||||
|
int transparentPixel;
|
||||||
|
|
||||||
for (i = 0; i < h->num_frames; i++) {
|
for (i = 0; i < h->num_frames; i++) {
|
||||||
|
if (h->frames[i].flags & FLAG_DATA_PACKED) {
|
||||||
|
char tempbuf[sizeof("frame -2147483648")];
|
||||||
|
sprintf(tempbuf, "frame %d", i);
|
||||||
|
transparentPixel = findTransparentColourPacked(tempbuf,
|
||||||
|
&h->frames[i], h->frames[i].start);
|
||||||
|
} else
|
||||||
|
transparentPixel = -1;
|
||||||
|
fprintf(out, "%s.%d.%s %d %d %d %d\n",
|
||||||
|
prefix, h->frames[i].index,
|
||||||
|
(h->frames[i].flags & FLAG_DATA_HARDWARE) ? "png" :
|
||||||
|
(h->frames[i].flags & FLAG_DATA_PACKED) ? "png" : "???",
|
||||||
|
transparentPixel, h->frames[i].plut,
|
||||||
|
#if 1
|
||||||
|
(h->frames[i].flags & FLAG_X_FLIP) ?
|
||||||
|
h->frames[i].bounds.w - h->frames[i].hotspot.x /* - 1 */:
|
||||||
|
#endif
|
||||||
|
h->frames[i].hotspot.x,
|
||||||
|
h->frames[i].hotspot.y);
|
||||||
|
#if 0
|
||||||
fprintf(out, "%s.%d.%s %d %d %d %d %d %d %d %d\n",
|
fprintf(out, "%s.%d.%s %d %d %d %d %d %d %d %d\n",
|
||||||
prefix, h->frames[i].index,
|
prefix, h->frames[i].index,
|
||||||
(h->frames[i].flags & FLAG_DATA_HARDWARE) ? "cel" :
|
(h->frames[i].flags & FLAG_DATA_HARDWARE) ? "png" :
|
||||||
|
// (h->frames[i].flags & FLAG_DATA_HARDWARE) ? "cel" :
|
||||||
(h->frames[i].flags & FLAG_DATA_PACKED) ? "png" : "???",
|
(h->frames[i].flags & FLAG_DATA_PACKED) ? "png" : "???",
|
||||||
-1, h->frames[i].plut, 0, 0,
|
transparentPixel, h->frames[i].plut, 0, 0,
|
||||||
h->frames[i].bounds.w, h->frames[i].bounds.h,
|
h->frames[i].bounds.w, h->frames[i].bounds.h,
|
||||||
h->frames[i].hotspot.x, h->frames[i].hotspot.y);
|
h->frames[i].hotspot.x, h->frames[i].hotspot.y);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
(void) buf;
|
(void) buf;
|
||||||
}
|
}
|
||||||
@@ -372,10 +396,95 @@ writeFile(const char *file, const uint8 *data, size_t len) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
writeCel(const char *filename, const frame_desc *frame, const uint8 *data) {
|
writeCel(const char *filename, const frame_desc *f, const uint8 *data) {
|
||||||
|
if (f->flags & FLAG_X_FLIP) {
|
||||||
|
fprintf(stderr, "Warning: X_FLIP used with .cel image - "
|
||||||
|
"not implemented.\n");
|
||||||
|
}
|
||||||
writeFile(filename, data + 4,
|
writeFile(filename, data + 4,
|
||||||
MAKE_DWORD(data[3], data[2], data[1], data[0]));
|
MAKE_DWORD(data[3], data[2], data[1], data[0]));
|
||||||
(void) frame;
|
}
|
||||||
|
|
||||||
|
// If there are no transparent pixels, returns -1
|
||||||
|
// Otherwise, returns an index in the palette that is never used so can be
|
||||||
|
// used for transparancy. If all palette entries are used, a warning is
|
||||||
|
// printed and 0 is used.
|
||||||
|
int
|
||||||
|
findTransparentColourPacked(const char *name, const frame_desc *f,
|
||||||
|
const uint8 *data) {
|
||||||
|
const uint8 *src, *srclineend;
|
||||||
|
uint8 pack_type, num_pixels;
|
||||||
|
int i;
|
||||||
|
int dstlinecount;
|
||||||
|
bool paletteUsed[256];
|
||||||
|
bool haveTransparent;
|
||||||
|
|
||||||
|
memset(paletteUsed, '\0', sizeof (paletteUsed));
|
||||||
|
haveTransparent = FALSE;
|
||||||
|
src = data;
|
||||||
|
for (i = 0; i < f->bounds.h; i++) {
|
||||||
|
dstlinecount = 0;
|
||||||
|
srclineend = src + ((MAKE_WORD(src[1], src[0]) + 2) << 2);
|
||||||
|
src += 2;
|
||||||
|
while (src < srclineend) {
|
||||||
|
pack_type = PACK_TYPE(*src);
|
||||||
|
num_pixels = PACK_COUNT(*src);
|
||||||
|
src++;
|
||||||
|
switch (pack_type) {
|
||||||
|
case PACK_EOL:
|
||||||
|
if (dstlinecount != f->bounds.w) {
|
||||||
|
haveTransparent = TRUE;
|
||||||
|
dstlinecount = f->bounds.w;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case PACK_LITERAL:
|
||||||
|
while (num_pixels--) {
|
||||||
|
paletteUsed[*src] = TRUE;
|
||||||
|
src++;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case PACK_TRANS:
|
||||||
|
haveTransparent = TRUE;
|
||||||
|
break;
|
||||||
|
case PACK_REPEAT:
|
||||||
|
paletteUsed[*src] = TRUE;
|
||||||
|
src++;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!haveTransparent)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
for (i = 0; i < 256; i++) {
|
||||||
|
if (!paletteUsed[i])
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
fprintf(stderr, "Warning: Could not find an unused palette entry to use "
|
||||||
|
"for transparency for %s. Using 0 entry.\n", name);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline void
|
||||||
|
swap_bytes(uint8 *b1, uint8 *b2) {
|
||||||
|
uint8 temp;
|
||||||
|
|
||||||
|
temp = *b1;
|
||||||
|
*b1 = *b2;
|
||||||
|
*b2 = temp;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
flipX(uint8 **lines, int x, int y) {
|
||||||
|
int i;
|
||||||
|
|
||||||
|
while (y--) {
|
||||||
|
i = x / 2;
|
||||||
|
while (i--)
|
||||||
|
swap_bytes(&(*lines)[i], &(*lines)[x - i - 1]);
|
||||||
|
lines++;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
@@ -387,8 +496,10 @@ writePacked(const char *filename, const frame_desc *f,
|
|||||||
uint8 *dst, *dstlineend;
|
uint8 *dst, *dstlineend;
|
||||||
uint8 **lines;
|
uint8 **lines;
|
||||||
uint8 pack_type, num_pixels;
|
uint8 pack_type, num_pixels;
|
||||||
|
int transparentPixel;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
|
transparentPixel = findTransparentColourPacked(filename, f, data);
|
||||||
buf = alloca(f->bounds.w * f->bounds.h * sizeof (uint8));
|
buf = alloca(f->bounds.w * f->bounds.h * sizeof (uint8));
|
||||||
memset(buf, '\0', f->bounds.w * f->bounds.h * sizeof (uint8));
|
memset(buf, '\0', f->bounds.w * f->bounds.h * sizeof (uint8));
|
||||||
dst = buf;
|
dst = buf;
|
||||||
@@ -406,7 +517,7 @@ writePacked(const char *filename, const frame_desc *f,
|
|||||||
switch (pack_type) {
|
switch (pack_type) {
|
||||||
case PACK_EOL:
|
case PACK_EOL:
|
||||||
while (dst != dstlineend)
|
while (dst != dstlineend)
|
||||||
*(dst++) = 0; // rest is transparant
|
*(dst++) = transparentPixel; // rest is transparent
|
||||||
break;
|
break;
|
||||||
case PACK_LITERAL:
|
case PACK_LITERAL:
|
||||||
memcpy(dst, src, num_pixels);
|
memcpy(dst, src, num_pixels);
|
||||||
@@ -414,7 +525,7 @@ writePacked(const char *filename, const frame_desc *f,
|
|||||||
dst += num_pixels;
|
dst += num_pixels;
|
||||||
break;
|
break;
|
||||||
case PACK_TRANS:
|
case PACK_TRANS:
|
||||||
memset(dst, '\0', num_pixels);
|
memset(dst, transparentPixel, num_pixels);
|
||||||
dst += num_pixels;
|
dst += num_pixels;
|
||||||
break;
|
break;
|
||||||
case PACK_REPEAT:
|
case PACK_REPEAT:
|
||||||
@@ -426,12 +537,14 @@ writePacked(const char *filename, const frame_desc *f,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (f->flags & FLAG_X_FLIP)
|
||||||
|
flipX(lines, f->bounds.w, f->bounds.h);
|
||||||
|
|
||||||
{
|
{
|
||||||
FILE *file;
|
FILE *file;
|
||||||
png_structp png_ptr;
|
png_structp png_ptr;
|
||||||
png_infop info_ptr;
|
png_infop info_ptr;
|
||||||
png_color_8 sig_bit;
|
png_color_8 sig_bit;
|
||||||
png_byte trans[1];
|
|
||||||
|
|
||||||
png_ptr = png_create_write_struct
|
png_ptr = png_create_write_struct
|
||||||
(PNG_LIBPNG_VER_STRING, (png_voidp) NULL /* user_error_ptr */,
|
(PNG_LIBPNG_VER_STRING, (png_voidp) NULL /* user_error_ptr */,
|
||||||
@@ -465,24 +578,22 @@ writePacked(const char *filename, const frame_desc *f,
|
|||||||
8 /* bit_depth per channel */, PNG_COLOR_TYPE_PALETTE,
|
8 /* bit_depth per channel */, PNG_COLOR_TYPE_PALETTE,
|
||||||
PNG_INTERLACE_NONE, PNG_COMPRESSION_TYPE_DEFAULT,
|
PNG_INTERLACE_NONE, PNG_COMPRESSION_TYPE_DEFAULT,
|
||||||
PNG_FILTER_TYPE_DEFAULT);
|
PNG_FILTER_TYPE_DEFAULT);
|
||||||
#if 0
|
|
||||||
sig_bit.red = 8;
|
sig_bit.red = 8;
|
||||||
sig_bit.green = 8;
|
sig_bit.green = 8;
|
||||||
sig_bit.blue = 8;
|
sig_bit.blue = 8;
|
||||||
png_set_sBIT(png_ptr, info_ptr, &sig_bit);
|
png_set_sBIT(png_ptr, info_ptr, &sig_bit);
|
||||||
png_set_shift(png_ptr, &sig_bit);
|
|
||||||
#endif
|
|
||||||
png_set_PLTE(png_ptr, info_ptr, palettes[f->plut], 256);
|
png_set_PLTE(png_ptr, info_ptr, palettes[f->plut], 256);
|
||||||
|
if (transparentPixel >= 0) {
|
||||||
#if 0
|
png_byte trans[256];
|
||||||
trans[0] = 0;
|
memset(trans, 0x0, 256 * sizeof (png_byte));
|
||||||
png_set_tRNS(png_ptr, info_ptr, trans, 1, NULL);
|
trans[transparentPixel] = 0xff;
|
||||||
#endif
|
png_set_tRNS(png_ptr, info_ptr, trans, 1, NULL);
|
||||||
|
}
|
||||||
png_write_info(png_ptr, info_ptr);
|
png_write_info(png_ptr, info_ptr);
|
||||||
png_set_packing(png_ptr);
|
|
||||||
png_write_image(png_ptr, (png_byte **) lines);
|
png_write_image(png_ptr, (png_byte **) lines);
|
||||||
png_write_end(png_ptr, info_ptr);
|
png_write_end(png_ptr, info_ptr);
|
||||||
png_destroy_write_struct(&png_ptr, &info_ptr);
|
png_destroy_write_struct(&png_ptr, &info_ptr);
|
||||||
|
fclose(file);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -498,9 +609,11 @@ writeFiles(const index_header *h, const uint8 *data, const char *path,
|
|||||||
if (h->frames[i].flags & FLAG_DATA_HARDWARE) {
|
if (h->frames[i].flags & FLAG_DATA_HARDWARE) {
|
||||||
strcat(filename, "cel");
|
strcat(filename, "cel");
|
||||||
writeCel(filename, &h->frames[i], h->frames[i].start);
|
writeCel(filename, &h->frames[i], h->frames[i].start);
|
||||||
} if (h->frames[i].flags & FLAG_DATA_PACKED) {
|
} else if (h->frames[i].flags & FLAG_DATA_PACKED) {
|
||||||
strcat(filename, "png");
|
strcat(filename, "png");
|
||||||
writePacked(filename, &h->frames[i], h->frames[i].start);
|
writePacked(filename, &h->frames[i], h->frames[i].start);
|
||||||
|
} else if (h->frames[i].flags == 0) {
|
||||||
|
fprintf(stderr, "Empty frame %d skipped.\n", i);
|
||||||
} else {
|
} else {
|
||||||
fprintf(stderr, "Frame %d skipped - not supported.\n", i);
|
fprintf(stderr, "Frame %d skipped - not supported.\n", i);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,6 +4,9 @@ typedef unsigned char uint8;
|
|||||||
typedef unsigned short uint16;
|
typedef unsigned short uint16;
|
||||||
typedef unsigned int uint32;
|
typedef unsigned int uint32;
|
||||||
typedef short int16;
|
typedef short int16;
|
||||||
|
typedef uint8 bool;
|
||||||
|
#define TRUE 1
|
||||||
|
#define FALSE 0
|
||||||
|
|
||||||
#define MAKE_WORD(x1, x2) (((x2) << 8) | (x1))
|
#define MAKE_WORD(x1, x2) (((x2) << 8) | (x1))
|
||||||
#define MAKE_DWORD(x1, x2, x3, x4) (((x4) << 24) | ((x3) << 16) | \
|
#define MAKE_DWORD(x1, x2, x3, x4) (((x4) << 24) | ((x3) << 16) | \
|
||||||
|
|||||||
Executable
+52
@@ -0,0 +1,52 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
if [ $# -ne 2 ]; then
|
||||||
|
echo "Syntax: unani.sh <indir> <outdir>"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
INDIR="$1"
|
||||||
|
OUTDIR="$2"
|
||||||
|
|
||||||
|
UNANI="$PWD/unani"
|
||||||
|
|
||||||
|
if [ ! -d "$INDIR" ]; then
|
||||||
|
echo "\"${INDIR}\" is not a good source dir"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ ! -d "$OUTDIR" -o ! -w "$OUTDIR" ]; then
|
||||||
|
echo "\"${OUTDIR}\" is not a good destination"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
INDIR="${INDIR%/}/"
|
||||||
|
OUTDIR="${OUTDIR%/}/"
|
||||||
|
|
||||||
|
processone() {
|
||||||
|
FILE="$1"
|
||||||
|
FILE="${FILE#${INDIR}}"
|
||||||
|
DIR="${FILE%/*}"
|
||||||
|
echo "Now processing $FILE"
|
||||||
|
if [ "$DIR" != "$FILE" -a ! -d "${OUTDIR}${DIR}" ]; then
|
||||||
|
mkdir -p -- "${OUTDIR}${DIR}"
|
||||||
|
fi
|
||||||
|
PREFIX="${FILE##*/}"
|
||||||
|
PREFIX="${PREFIX%.*}"
|
||||||
|
EXT="${FILE##*.}"
|
||||||
|
echo "$EXT" "$PREFIX"
|
||||||
|
if [ "$EXT" = "ani" ]; then
|
||||||
|
"$UNANI" -c "$INDIR"lbm/scclrtab.ct -o "$OUTDIR$DIR" "$INDIR$FILE"
|
||||||
|
"$UNANI" -a "$INDIR$FILE" > "$OUTDIR$FILE"
|
||||||
|
else
|
||||||
|
"$UNANI" -c "$INDIR"lbm/scclrtab.ct -n "$PREFIX.$EXT" \
|
||||||
|
-o "$OUTDIR$DIR" "$INDIR$FILE"
|
||||||
|
"$UNANI" -a "$INDIR$FILE" -n "$PREFIX.$EXT" > "$OUTDIR$FILE"
|
||||||
|
fi
|
||||||
|
echo
|
||||||
|
}
|
||||||
|
|
||||||
|
for FILE in `find "$INDIR" -type f -a "(" -name "*.ani" -o -name "*.sml" -o \
|
||||||
|
-name "*.med" -o -name "*.big" ")"`; do
|
||||||
|
processone "$FILE"
|
||||||
|
done
|
||||||
Reference in New Issue
Block a user