*** empty log message ***
This commit is contained in:
272
win/win32/tile2bmp.c
Normal file
272
win/win32/tile2bmp.c
Normal file
@@ -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
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user