/* SCCS Id: @(#)tile2bmp.c 3.3 1999/08/29 */ /* Copyright (c) NetHack PC Development Team 1995 */ /* NetHack may be freely redistributed. See license for details. */ /* * Edit History: * * Initial Creation M.Allison 94/01/11 * */ /* #pragma warning(4103:disable) */ #include "hack.h" #include "tile.h" #ifndef __DJGPP__ #include "win32api.h" #endif /* #define COLORS_IN_USE MAXCOLORMAPSIZE /* 256 colors */ #define COLORS_IN_USE 16 /* 16 colors */ #define BITCOUNT 8 extern char *FDECL(tilename, (int, int)); #if BITCOUNT==4 #define MAX_X 320 /* 2 per byte, 4 bits per pixel */ #else #define MAX_X 640 /* 1 per byte, 8 bits per pixel */ #endif #define MAX_Y 480 /* GCC fix by Paolo Bonzini 1999/03/28 */ #ifdef __GNUC__ #define PACK __attribute__((packed)) #else #define PACK #endif #if defined(__DJGPP__) typedef struct tagBMIH { unsigned long biSize; long biWidth; long biHeight; unsigned short biPlanes; unsigned short biBitCount; unsigned long biCompression; unsigned long biSizeImage; long biXPelsPerMeter; long biYPelsPerMeter; unsigned long biClrUsed; unsigned long biClrImportant; } PACK BITMAPINFOHEADER; typedef struct tagBMFH { unsigned short bfType; unsigned long bfSize; unsigned short bfReserved1; unsigned short bfReserved2; unsigned long bfOffBits; } PACK BITMAPFILEHEADER; typedef struct tagRGBQ { unsigned char rgbBlue; unsigned char rgbGreen; unsigned char rgbRed; unsigned char rgbReserved; } PACK RGBQUAD; #define UINT unsigned int #define DWORD unsigned long #define LONG long #define WORD unsigned short #define BI_RGB 0L #define BI_RLE8 1L #define BI_RLE4 2L #define BI_BITFIELDS 3L #endif /* defined(__DJGPP__) */ #pragma pack(1) struct tagBMP{ BITMAPFILEHEADER bmfh; BITMAPINFOHEADER bmih; #if BITCOUNT==4 #define RGBQUAD_COUNT 16 RGBQUAD bmaColors[RGBQUAD_COUNT]; #else #define RGBQUAD_COUNT 16 RGBQUAD bmaColors[RGBQUAD_COUNT]; #endif #if COLORS_IN_USE==16 uchar packtile[MAX_Y][MAX_X]; #else uchar packtile[TILE_Y][TILE_X]; #endif } PACK bmp; #pragma pack() #define BMPFILESIZE (sizeof(struct tagBMP)) FILE *tibfile2; pixel tilepixels[TILE_Y][TILE_X]; static void FDECL(build_bmfh,(BITMAPFILEHEADER *)); static void FDECL(build_bmih,(BITMAPINFOHEADER *)); static void FDECL(build_bmptile,(pixel (*)[TILE_X])); char *tilefiles[] = { "../win/share/monsters.txt", "../win/share/objects.txt", "../win/share/other.txt"}; int num_colors = 0; int tilecount; int max_tiles_in_row = 40; int tiles_in_row; int filenum; int initflag; int yoffset,xoffset; char bmpname[128]; FILE *fp; int main(argc, argv) int argc; char *argv[]; { int i; if (argc != 2) { Fprintf(stderr, "usage: tile2bmp outfile.bmp\n"); exit(EXIT_FAILURE); } else strcpy(bmpname, argv[1]); #ifdef OBSOLETE bmpfile2 = fopen(NETHACK_PACKED_TILEFILE, WRBMODE); if (bmpfile2 == (FILE *)0) { Fprintf(stderr, "Unable to open output file %s\n", NETHACK_PACKED_TILEFILE); exit(EXIT_FAILURE); } #endif tilecount = 0; xoffset = yoffset = 0; initflag = 0; filenum = 0; fp = fopen(bmpname,"wb"); if (!fp) { printf("Error creating tile file %s, aborting.\n",bmpname); exit(1); } while (filenum < 3) { if (!fopen_text_file(tilefiles[filenum], RDTMODE)) { Fprintf(stderr, "usage: tile2bmp (from the util directory)\n"); exit(EXIT_FAILURE); } num_colors = colorsinmap; if (num_colors > 62) { Fprintf(stderr, "too many colors (%d)\n", num_colors); exit(EXIT_FAILURE); } if (!initflag) { build_bmfh(&bmp.bmfh); build_bmih(&bmp.bmih); memset(&bmp.packtile,0, (MAX_X * MAX_Y * sizeof(uchar))); for (i = 0; i < num_colors; i++) { bmp.bmaColors[i].rgbRed = ColorMap[CM_RED][i]; bmp.bmaColors[i].rgbGreen = ColorMap[CM_GREEN][i]; bmp.bmaColors[i].rgbBlue = ColorMap[CM_BLUE][i]; bmp.bmaColors[i].rgbReserved = 0; } initflag = 1; } /* printf("Colormap initialized\n"); */ while (read_text_tile(tilepixels)) { build_bmptile(tilepixels); tilecount++; #if BITCOUNT==4 xoffset += (TILE_X / 2); #else xoffset += TILE_X; #endif if (xoffset >= MAX_X) { yoffset += TILE_Y; xoffset = 0; } } (void) fclose_text_file(); ++filenum; } fwrite(&bmp, sizeof(bmp), 1, fp); fclose(fp); Fprintf(stderr, "Total of %d tiles written to %s.\n", tilecount, bmpname); exit(EXIT_SUCCESS); /*NOTREACHED*/ return 0; } static void build_bmfh(pbmfh) BITMAPFILEHEADER *pbmfh; { pbmfh->bfType = (UINT)0x4D42; pbmfh->bfSize = (DWORD)BMPFILESIZE; pbmfh->bfReserved1 = (UINT)0; pbmfh->bfReserved2 = (UINT)0; pbmfh->bfOffBits = sizeof(bmp.bmfh) + sizeof(bmp.bmih) + (RGBQUAD_COUNT * sizeof(RGBQUAD)); } static void build_bmih(pbmih) BITMAPINFOHEADER *pbmih; { pbmih->biSize = (DWORD) sizeof(bmp.bmih); #if BITCOUNT==4 pbmih->biWidth = (LONG) MAX_X * 2; #else pbmih->biWidth = (LONG) MAX_X; #endif pbmih->biHeight = (LONG) MAX_Y; pbmih->biPlanes = (WORD) 1; #if BITCOUNT==4 pbmih->biBitCount = (WORD) 4; #else pbmih->biBitCount = (WORD) 8; #endif pbmih->biCompression = (DWORD) BI_RGB; pbmih->biSizeImage = (DWORD)0; pbmih->biXPelsPerMeter = (LONG)0; pbmih->biYPelsPerMeter = (LONG)0; pbmih->biClrUsed = (DWORD)RGBQUAD_COUNT; pbmih->biClrImportant = (DWORD)0; } static void build_bmptile(pixels) pixel (*pixels)[TILE_X]; { int cur_x, cur_y, cur_color; int x,y; for (cur_y = 0; cur_y < TILE_Y; cur_y++) { for (cur_x = 0; cur_x < TILE_X; cur_x++) { for (cur_color = 0; cur_color < num_colors; cur_color++) { if (ColorMap[CM_RED][cur_color] == pixels[cur_y][cur_x].r && ColorMap[CM_GREEN][cur_color]== pixels[cur_y][cur_x].g && ColorMap[CM_BLUE][cur_color] == pixels[cur_y][cur_x].b) break; } if (cur_color >= num_colors) Fprintf(stderr, "color not in colormap!\n"); y = (MAX_Y - 1) - (cur_y + yoffset); #if BITCOUNT==4 x = (cur_x / 2) + xoffset; bmp.packtile[y][x] = cur_x%2 ? (uchar)(bmp.packtile[y][x] | cur_color) : (uchar)(cur_color<<4); #else x = cur_x + xoffset; bmp.packtile[y][x] = (uchar)cur_color; #endif } } }