From: jwalz Date: Sat, 5 Jan 2002 21:06:02 +0000 (+0000) Subject: *** empty log message *** X-Git-Tag: MOVE2GIT~3558 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=be992b2f55d9b3aeab0855e7e42712ad841ee860;p=nethack *** empty log message *** --- diff --git a/win/win32/tile2bmp.c b/win/win32/tile2bmp.c new file mode 100644 index 000000000..2214516bb --- /dev/null +++ b/win/win32/tile2bmp.c @@ -0,0 +1,272 @@ +/* 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 + } + } +}