]> granicus.if.org Git - nethack/commitdiff
*** empty log message ***
authorjwalz <jwalz>
Sat, 5 Jan 2002 21:06:02 +0000 (21:06 +0000)
committerjwalz <jwalz>
Sat, 5 Jan 2002 21:06:02 +0000 (21:06 +0000)
win/win32/tile2bmp.c [new file with mode: 0644]

diff --git a/win/win32/tile2bmp.c b/win/win32/tile2bmp.c
new file mode 100644 (file)
index 0000000..2214516
--- /dev/null
@@ -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
+        }
+       }
+}