+++ /dev/null
-/*
- zic2xpm.c
-
- Program to convert pieces from ZIICS format to XPM & XIM format.
- (C version) By Frank McIngvale <frankm@hiwaay.net>.
-
- Copyright (C) 1996, 2009, 2010, 2011, 2012, 2013 Free Software Foundation, Inc.
-
- NOTICE: The piece images distributed with ZIICS are
- copyrighted works of their original creators. Images
- converted with zic2xpm may not be redistributed without
- the permission of the copyright holders. Do not contact
- the authors of zic2xpm or of ZIICS itself to request
- permission.
-
- NOTICE: The format of the ZIICS piece file was gleaned from
- SHOWSETS.PAS, a part of ZIICS. Thanks to Andy McFarland
- (Zek on ICC) for making this source available! ZIICS is a
- completely separate and copyrighted work of Andy
- McFarland. Use and distribution of ZIICS falls under the
- ZIICS license, NOT the GNU General Public License.
-
- NOTICE: The format of the VGA imageblocks was determined
- by experimentation, and without access to any
- of Borland Inc.'s BGI library source code.
-
-
- GNU XBoard 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 3 of the License, or (at your option) any
- later version.
-
- GNU XBoard 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, see
- http://www.gnu.org/licenses/.
-
-
- ** If you find a bug in zic2xpm.c, please report it to me,
- Frank McIngvale (frankm@hiwaay.net) so that I may fix it. **
-*/
-
-/*
- Usage: zic2xpm file1 [file2 ...]
-
- We split the ZIICS file(s) into 24 XPM & 24 XIM files with names:
-
- <piece><type><size>.(xpm|xim).
-
- Where:
- piece = p, n, b, r, q, k
- type = ll, ld, dl, dd
- size = Piece size.
-
- Plus 4 files for the light & dark squares.
-
- This means that you can extract multiple SIZES in one directory
- without name clashes. Extracting two sets of the SAME
- size in a directory will cause the second to overwrite
- the first.
-*/
-
-/*
- Technical note: Yes, this file is huge. I made it by cramming
- `zic2xpm' and `zic2xim' together. This should
- be less confusing to use, though.
-*/
-
-#include "config.h"
-#include <stdio.h>
-#if STDC_HEADERS
-#include <stdlib.h>
-#endif
-
-#ifndef SEEK_SET
-#define SEEK_SET 0
-#endif
-
-/*
- XIM file format:
-
- width byte
- height byte
-
- Data (1 byte per pixel, row major)
-*/
-
-/*
- Map colors from ZIICS -> XIM :
-
- 0 0 Dark piece
- 2 1 Dark square
- 15 2 Light piece
- 14 3 Light square
-*/
-
-typedef struct {
- int zval; /* ZIICS value */
- int xval; /* XIM value */
-} z2xim;
-
-/* Associate VGA color with XPM color/sym */
-
-typedef struct {
- int cval; /* VGA pixel value */
- char xchar; /* XPM character for this color */
- char *csym; /* Symbolic name */
- char *cdefault; /* Default color */
-} z2xpm;
-
-#define NR_ZIICS_COLORS 4
-#define BUFLEN 100
-
-/* SHOWSETS.PAS (from ZIICS) states that images may only
- use color numbers 0, 2, 14, and 15 */
-
-z2xim z2xim_tab[NR_ZIICS_COLORS] = {
- { 0, 0 },
- { 2, 1 },
- { 15, 2 },
- { 14, 3 } };
-
-z2xpm z2xpm_tab[NR_ZIICS_COLORS] = {
- { 15, 'X', "light_piece", "white" },
- { 0, ' ', "dark_piece", "black" },
- { 14, '*', "light_square", "gray" },
- { 2, '.', "dark_square", "green" } };
-
-void
-fatal (char *str)
-{
- printf("Fatal error: %s\n", str );
- exit(1);
-}
-
-z2xim *
-lookup_xim_color (int color)
-{
- int i;
-
- for( i=0; i<NR_ZIICS_COLORS; ++i )
- {
- if ( z2xim_tab[i].zval == color )
- return (z2xim_tab + i);
- }
-
- fatal("Illegal color in image.");
-
- /* NOT REACHED */
- return NULL; /* Make compiler happy */
-}
-
-z2xpm *
-lookup_xpm_color (int color)
-{
- int i;
-
- for( i=0; i<NR_ZIICS_COLORS; ++i )
- {
- if ( z2xpm_tab[i].cval == color )
- return (z2xpm_tab + i);
- }
-
- fatal("Illegal color in image.");
-
- /* NOT REACHED */
- return NULL; /* Make compiler happy */
-}
-
-char *src_name;
-
-int
-up8 (int i)
-{
- int r;
-
- r = i % 8;
- if ( r == 0 )
- return i;
-
- return i + 8 - r;
-}
-
-unsigned int
-vga_imagesize (int w, int h)
-{
- int w8;
- unsigned int s;
-
- w8 = up8( w );
-
- s = 4 + w8/2 * h + 2;
-
- return s;
-}
-
-unsigned char *
-decode_byte (unsigned char *dest, unsigned char *b, int w)
-{
- int i, j;
- unsigned char byte, bit;
-
- for( i=7; w > 0; --i, --w )
- {
- byte = 0;
-
- /* 1 bit from each plane */
- for( j=0; j<4; ++j )
- {
- bit = b[j];
- bit &= (1 << i);
- bit >>= i;
- bit <<= 3-j;
- byte |= bit;
- }
-
- *(dest++) = byte;
- }
-
- return dest;
-}
-
-/*
- W is width of image in PIXELS.
- SRC is in packed pixel format.
- DEST is filled with 1 BYTE per PIXEL.
-*/
-unsigned char *
-decode_line (unsigned char *dest, unsigned char *src, int w)
-{
- unsigned int w8;
- unsigned int bpp;
- unsigned char b[4];
- int i;
- unsigned char *p;
-
- p = src;
- w8 = up8( w );
-
- /* 4 planes, bpp BYTES per plane */
- /* Planes are MSB -> LSB */
- bpp = w8 >> 3;
-
- while( w > 0 )
- {
- for( i=0; i<4; ++i )
- b[i] = p[i*bpp];
-
- if ( w > 8 )
- dest = decode_byte( dest, b, 8 );
- else
- dest = decode_byte( dest, b, w );
-
- w -= 8;
- ++p;
- }
-
- return (src + bpp * 4);
-}
-
-int
-write_xim_header (FILE *fp, int w, int h)
-{
- fputc( w, fp );
- fputc( h, fp );
-
- return 0;
-}
-
-int
-write_xpm_header (FILE *fp, int w, int h)
-{
- int i;
- z2xpm *cv;
-
- fprintf(fp, "/* XPM */\n");
- fprintf(fp, "/* This file was automatically generated from the file %s\n",
- src_name );
- fprintf(fp, "using the program ``zic2xpm''.\n");
- fprintf(fp, "\n %s\n %s\n %s\n %s\n %s\n %s */\n",
- "NOTICE: The piece images distributed with ZIICS are",
- " copyrighted works of their original creators. Images",
- " converted with zic2xpm may not be redistributed without",
- " the permission of the copyright holders. Do not contact",
- " the authors of zic2xpm or of ZIICS itself to request",
- " permission.");
- fprintf( fp, "static char * image_name[] = {\n" );
- fprintf( fp, "\"%d %d %d 1\",\n", h, w, NR_ZIICS_COLORS );
-
- cv = z2xpm_tab;
-
- for( i=0; i<NR_ZIICS_COLORS; ++i, ++cv )
- {
- fprintf( fp, "\"%c\tc %s s %s\",\n", cv->xchar,
- cv->cdefault, cv->csym );
- }
-
- return 0;
-}
-
-void
-create_piece_xim (char *outname, FILE *fpin, int W, int H)
-{
- FILE *fpout;
- int w, h, i, j, c;
- unsigned char *lump, *p, *line;
- long size;
- z2xim *ent;
-
- fpout = fopen( outname, "wb" );
- if ( !fpout )
- fatal( "Can't create output file.");
-
- /* Header is two ints -- Width then Height, x86 format */
- c = fgetc( fpin );
- w = (fgetc(fpin) << 8) | c;
-
- c = fgetc( fpin );
- h = (fgetc(fpin) << 8) | c;
-
- ++w; ++h;
-
- if ( w != W || h != H )
- fatal( "Bad header." );
-
- size = vga_imagesize( w, h ) - 4;
- lump = (unsigned char*)malloc( size );
- line = (unsigned char*)malloc( w );
-
- if ( !lump || !line )
- fatal( "Out of memory." );
-
- fread( lump, 1, size, fpin );
-
- /* Write XIM header */
- write_xim_header( fpout, w, h );
-
- p = lump;
-
- /* Write XIM data */
- for( i=0; i<h; ++i )
- {
- p = decode_line( line, p, w );
-
- for( j=0; j<w; ++j )
- {
- ent = lookup_xim_color( line[j] );
- fputc( ent->xval, fpout );
- }
- }
-
- free( lump );
- free( line );
- fclose( fpout );
-}
-
-void
-create_piece_xpm (char *outname, FILE *fpin, int W, int H)
-{
- FILE *fpout;
- int w, h, i, j, c;
- unsigned char *lump, *p, *line;
- long size;
- z2xpm *cv;
-
- fpout = fopen( outname, "wb" );
- if ( !fpout )
- fatal( "Can't create output file.");
-
- /* Header is two ints -- Width then Height, x86 format */
- c = fgetc( fpin );
- w = (fgetc(fpin) << 8) | c;
-
- c = fgetc( fpin );
- h = (fgetc(fpin) << 8) | c;
-
- ++w; ++h;
-
- if ( w != W || h != H )
- fatal( "Bad header." );
-
- size = vga_imagesize( w, h ) - 4;
- lump = (unsigned char*)malloc( size );
- line = (unsigned char*)malloc( w );
-
- if ( !lump || !line )
- fatal( "Out of memory." );
-
- fread( lump, 1, size, fpin );
-
- /* Write XPM header */
- write_xpm_header( fpout, w, h );
-
- p = lump;
-
- /* Write XPM data */
- for( i=0; i<h; ++i )
- {
- p = decode_line( line, p, w );
-
- fprintf( fpout, "\"" );
- for( j=0; j<w; ++j )
- {
- cv = lookup_xpm_color( line[j] );
- fprintf( fpout, "%c", cv->xchar );
- }
- fprintf( fpout, "\",\n" );
- }
-
- fprintf( fpout, "};\n" );
-
- free( lump );
- free( line );
- fclose( fpout );
-}
-
-/* The order of the pieces in the ZIICS piece file (from SHOWSETS.PAS) */
-char *pieces = "prkqbn";
-char *pname[] = { "Pawn", "Rook", "King", "Queen", "Bishop", "Knight" };
-
-/* The suborder - Light/Light, Light/Dark, etc. */
-char *prefixes[] = { "ll", "ld", "dl", "dd" };
-
-int
-process_file_xim (char *filename)
-{
- int w, h, piece, kind, c;
- int nr_pieces = 6;
- int nr_kinds = 4;
- FILE *fp;
- char buf[BUFLEN];
-
- src_name = filename;
-
- fp = fopen( filename, "rb" );
- if ( !fp )
- fatal( "Can't open input file." );
-
- /* Header is two ints -- Width then Height, x86 format */
- c = fgetc( fp );
- w = (fgetc(fp) << 8) | c;
-
- c = fgetc( fp );
- h = (fgetc(fp) << 8) | c;
-
- ++w; ++h;
-
- if ( w != h )
- {
- printf("ERROR: Can only convert square pieces.\n");
- printf(" (This set is %dx%d)\n", w, h );
- exit(1);
- }
-
- printf("Creating XIM files...\n");
- printf("File: %s, W=%d, H=%d\n", filename, w, h );
- fseek( fp, 0, SEEK_SET );
-
- /* Write .XIM files */
- for( piece = 0; piece < nr_pieces; ++piece )
- {
- printf("%s ", pname[piece] );
-
- for( kind = 0; kind < nr_kinds; ++kind )
- {
- printf( "." );
- /* Form output filename -- <piece><kind><size>.xim */
- snprintf(buf, BUFLEN, "%c%s%d.xim", pieces[piece], prefixes[kind], w);
- create_piece_xim( buf, fp, w, h );
- }
- printf("\n");
- }
-
- /* Write the light & dark squares */
- snprintf( buf, BUFLEN, "lsq%d.xim", w );
- printf("Light Square" );
- create_piece_xim( buf, fp, w, h );
-
- snprintf( buf, BUFLEN, "dsq%d.xim", w );
- printf("\nDark Square" );
- create_piece_xim( buf, fp, w, h );
- printf("\n");
-
- printf("Successfully converted!!\n" );
-
- fclose( fp );
-
- return 0;
-}
-
-int
-process_file_xpm (char *filename)
-{
- int w, h, piece, kind, c;
- int nr_pieces = 6;
- int nr_kinds = 4;
- FILE *fp;
- char buf[BUFLEN];
-
- src_name = filename;
-
- fp = fopen( filename, "rb" );
- if ( !fp )
- fatal( "Can't open input file." );
-
- /* Header is two ints -- Width then Height, x86 format */
- c = fgetc( fp );
- w = (fgetc(fp) << 8) | c;
-
- c = fgetc( fp );
- h = (fgetc(fp) << 8) | c;
-
- ++w; ++h;
-
- if ( w != h )
- {
- printf("ERROR: Can only convert square pieces.\n");
- printf(" (This set is %dx%d)\n", w, h );
- exit(1);
- }
-
- printf("Creating XPM files...\n");
- printf("File: %s, W=%d, H=%d\n", filename, w, h );
- fseek( fp, 0, SEEK_SET );
-
- /* Write .XPM files */
- for( piece = 0; piece < nr_pieces; ++piece )
- {
- printf("%s ", pname[piece] );
-
- for( kind = 0; kind < nr_kinds; ++kind )
- {
- printf( "." );
- /* Form output filename -- <piece><kind><size>.xpm */
- snprintf(buf, BUFLEN, "%c%s%d.xpm", pieces[piece], prefixes[kind], w);
- create_piece_xpm( buf, fp, w, h );
- }
- printf("\n");
- }
-
- /* Write the light & dark squares */
- snprintf( buf, BUFLEN, "lsq%d.xpm", w );
- printf("Light Square" );
- create_piece_xpm( buf, fp, w, h );
-
- snprintf( buf, BUFLEN, "dsq%d.xpm", w );
- printf("\nDark Square" );
- create_piece_xpm( buf, fp, w, h );
- printf("\n");
-
- printf("Successfully converted!!\n" );
-
- fclose( fp );
-
- return 0;
-}
-
-int
-main (int argc, char **argv)
-{
- int i;
-
- if ( argc < 2 )
- {
- printf("ZIC2XPM 2.01 - by Frank McIngvale (frankm@hiwaay.net)\n");
- printf("Copyright (C) 1996 Free Software Foundation, Inc.\n\n");
- printf("Usage: zic2xpm file1 [file2 ...]\n\n");
- printf(" Splits each file (ZIICS piece files) into 26 XPM & XIM files\n");
- printf(" suitable for use in XBoard 3.5 or later.\n");
- printf("\n* ZIICS is a copyrighted work of Andy McFarland (Zek on ICC) *\n");
- return 1;
- }
-
-
- setbuf( stdout, NULL );
-
- for( i=1; i<argc; ++i )
- {
- process_file_xpm( argv[i] );
- process_file_xim( argv[i] );
- }
-
- fprintf(stderr, "%s\n%s\n%s\n%s\n%s\n%s\n",
- "NOTICE: The piece images distributed with ZIICS are",
- " copyrighted works of their original creators. Images",
- " converted with zic2xpm may not be redistributed without",
- " the permission of the copyright holders. Do not contact",
- " the authors of zic2xpm or of ZIICS itself to request",
- " permission.");
- return 0;
-}