]> 4ch.mooo.com Git - 16.git/commitdiff
Beginning refactoring for better bitmap loading
authorRobert Lowe <pngwen@gmail.com>
Sun, 28 Sep 2014 01:59:41 +0000 (21:59 -0400)
committerRobert Lowe <pngwen@gmail.com>
Sun, 28 Sep 2014 01:59:41 +0000 (21:59 -0400)
16/modex16/BITMAP.C [new file with mode: 0644]
16/modex16/BITMAP.H [new file with mode: 0644]
16/modex16/makefile
16/modex16/modex16.h
16/modex16/pcxtest.c
16/modex16/pcxtest.exe
16/modex16/scroll.exe
16/modex16/test.exe
16/modex16/test2.exe

diff --git a/16/modex16/BITMAP.C b/16/modex16/BITMAP.C
new file mode 100644 (file)
index 0000000..108d8c3
--- /dev/null
@@ -0,0 +1,130 @@
+#include <stdio.h>\r
+#include <stdlib.h>\r
+#include "bitmap.h"\r
+#include "modex16.h"\r
+\r
+static struct pcxHeader {\r
+    byte id;\r
+    byte version;\r
+    byte encoding;\r
+    byte bpp;\r
+    word xmin;\r
+    word ymin;\r
+    word xmax;\r
+    word ymax;\r
+    word hres;\r
+    word vres;\r
+    byte pal16[48];\r
+    byte res1;\r
+    word bpplane;\r
+    word palType;\r
+    word hScreenSize;\r
+    word vScreenSize;\r
+    byte padding[54];\r
+};\r
+\r
+\r
+static void loadPcxStage1(FILE *file, bitmap_t *result) {\r
+    struct pcxHeader head;\r
+    long bufSize;\r
+    int index;\r
+    byte count, val;\r
+    long int pos;\r
+\r
+    /* read the header */\r
+    fread(&head, sizeof(char), sizeof(struct pcxHeader), file);\r
+\r
+    /* make sure this  is 8bpp */\r
+    if(head.bpp != 8) {\r
+       printf("I only know how to handle 8bpp pcx files!\n");\r
+       fclose(file);\r
+       exit(-2);\r
+    }\r
+\r
+    /* allocate the buffer */\r
+    result->width = head.xmax - head.xmin + 1;\r
+    result->height = head.ymax - head.ymin + 1;\r
+    bufSize = result->width * result->height;\r
+    result->data = malloc(bufSize);\r
+    if(!result->data) {\r
+       printf("Could not allocate memory for bitmap data.");\r
+       fclose(file);\r
+       exit(-1);\r
+    }\r
+\r
+    /* save the position of the pixel data */\r
+    pos = ftell(file);\r
+\r
+    /* handle the palette */\r
+    fseek(file, -769, SEEK_END);\r
+    val = fgetc(file);\r
+    result->palette = modexNewPal();\r
+    if(head.version == 5 && val == 12) {\r
+       /* use the vga palette */\r
+       for(index=0; !feof(file) && index < PAL_SIZE; index++) {\r
+           val = fgetc(file);\r
+           result->palette[index] = val >> 2;\r
+       }\r
+    } else {\r
+       /* use the 16 color palette */\r
+       for(index=0; index<48; index++) {\r
+           result->palette[index]  = head.pal16[index];\r
+       }\r
+    }\r
+\r
+    /* go back to the pixel data */\r
+    fseek(file, -pos, SEEK_END);\r
+}\r
+\r
+\r
+bitmap_t\r
+bitmapLoadPcx(char *filename) {\r
+    FILE *file;\r
+    bitmap_t result;\r
+    struct pcxHeader head;\r
+    long bufSize;\r
+    int index;\r
+    byte count, val;\r
+\r
+    /* open the PCX file for reading */\r
+    file = fopen(filename, "rb");\r
+    if(!file) {\r
+       printf("Could not open %s for reading.\n", filename);\r
+       exit(-2);\r
+    }\r
+\r
+    /* load the first part of the pcx file */\r
+    loadPcxStage1(file, &result);\r
+\r
+    /*  read the buffer in */\r
+    index = 0;\r
+    do {\r
+       /* get the run length and the value */\r
+       count = fgetc(file);\r
+       if(0xC0 ==  (count & 0xC0)) { /* this is the run count */\r
+           count &= 0x3f;\r
+           val = fgetc(file);\r
+       } else {\r
+           val = count;\r
+           count = 1;\r
+       }\r
+\r
+       /* write the pixel the specified number of times */\r
+       for(; count && index < bufSize; count--,index++)  {\r
+           result.data[index] = val;\r
+       }\r
+    } while(index < bufSize);\r
+\r
+\r
+    fclose(file);\r
+\r
+    return result;\r
+}\r
+\r
+\r
+tileset_t\r
+bitmapLoadPcxTiles(char *filename, word twidth, word theight) {\r
+    tileset_t ts;\r
+\r
+    return ts;\r
+}\r
diff --git a/16/modex16/BITMAP.H b/16/modex16/BITMAP.H
new file mode 100644 (file)
index 0000000..4c4af98
--- /dev/null
@@ -0,0 +1,24 @@
+/*\r
+ * Functions and types for loading and manipulating bitmaps.\r
+ */\r
+#ifndef BITMAP_H\r
+#define BITMAP_H\r
+#include "types.h"\r
+typedef struct {\r
+    byte *data;\r
+    word width;\r
+    word height;\r
+    byte *palette;\r
+} bitmap_t;\r
+\r
+typedef struct {\r
+    byte **data;\r
+    word ntiles;   /* the number of tiles */\r
+    word twidth;   /* width of the tiles */\r
+    word theight;  /* height of the tiles */\r
+    byte *palette; /* palette for the tile set */\r
+} tileset_t;\r
+\r
+bitmap_t bitmapLoadPcx(char *filename);\r
+tileset_t bitmapLoadPcxTiles(char *filename, word twidth, word theight);\r
+#endif\r
index bdf9d9489e79cd99e8d13199d1a921185c7988dc..b11f89a095dbf729c1e33080ac1993fd5a088acc 100644 (file)
@@ -1,18 +1,18 @@
 FLAGS=-0 \r
 all: test.exe pcxtest.exe test2.exe scroll.exe\r
 \r
-scroll.exe: scroll.obj modex16.obj dos_kb.obj\r
-       wcl $(FLAGS) scroll.obj modex16.obj dos_kb.obj\r
+scroll.exe: scroll.obj modex16.obj dos_kb.obj bitmap.obj\r
+       wcl $(FLAGS) scroll.obj modex16.obj dos_kb.obj bitmap.obj\r
 scroll.obj: scroll.c\r
        wcl $(FLAGS) -c scroll.c\r
-test.exe: test.obj modex16.obj\r
-       wcl $(FLAGS) test.obj modex16.obj\r
+test.exe: test.obj modex16.obj bitmap.obj\r
+       wcl $(FLAGS) test.obj modex16.obj bitmap.obj\r
        \r
-test2.exe: test2.obj modex16.obj\r
-       wcl $(FLAGS) test2.obj modex16.obj\r
+test2.exe: test2.obj modex16.obj bitmap.obj\r
+       wcl $(FLAGS) test2.obj modex16.obj bitmap.obj\r
        \r
-pcxtest.exe: pcxtest.obj modex16.obj\r
-       wcl $(FLAGS) pcxtest.obj modex16.obj\r
+pcxtest.exe: pcxtest.obj modex16.obj bitmap.obj\r
+       wcl $(FLAGS) pcxtest.obj modex16.obj bitmap.obj\r
 \r
 test.obj: test.c modex16.h\r
        wcl $(FLAGS) -c test.c\r
@@ -25,10 +25,13 @@ pcxtest.obj: pcxtest.c modex16.h
 \r
 modex16.obj: modex16.h modex16.c\r
        wcl $(FLAGS) -c modex16.c\r
-
+\r
 dos_kb.obj: dos_kb.h dos_kb.c\r
-       wcl $(FLAGS) -c dos_kb.c
+       wcl $(FLAGS) -c dos_kb.c\r
 \r
+bitmap.obj: bitmap.h bitmap.c\r
+       wcl $(FLAGS) -c bitmap.c\r
+       \r
 clean: \r
        del *.obj\r
        del *.exe\r
index 08e7b3606c123555757328154b5c841dcbd16eae..f45356b512ef049418cd23308e3fed0fe3012ad6 100644 (file)
@@ -5,17 +5,12 @@
 #define MODEX16_H\r
 #include <conio.h>\r
 #include "types.h"\r
+#include "bitmap.h"\r
 \r
 /* -========================== Types & Macros ==========================- */\r
 #define PAGE_OFFSET(x,y) (((y)<<6)+((y)<<4)+((x)>>2))\r
 #define PLANE(x) (1<< (x&3))\r
 #define SELECT_ALL_PLANES() outpw(0x03c4, 0xff02)\r
-typedef struct {\r
-    byte *data;\r
-    word width;\r
-    word height;\r
-    byte *palette;\r
-} bitmap_t;\r
 \r
 typedef struct {\r
     byte far* data;    /* the data for the page */\r
index d9099381253c6177e519af4b85735a7dd8ba698b..51b8427beddc43c3ebc3f7a275dbfd06d8c4fc3a 100644 (file)
@@ -1,5 +1,6 @@
 #include <stdio.h>\r
 #include "modex16.h"\r
+#include "bitmap.h"\r
 \r
 word far* clock= (word far*) 0x046C; /* 18.2hz clock */\r
 \r
index cf5180df896437afa51982fe08afc9cb716cf926..a57b981c0bc63df12eeb5a1cd057e0bfdd8635be 100644 (file)
Binary files a/16/modex16/pcxtest.exe and b/16/modex16/pcxtest.exe differ
index 83854efe94b6c28755b4daae800c78d56f5806f1..a259aeed2cd306c88636e97e43116b48e68fbe36 100755 (executable)
Binary files a/16/modex16/scroll.exe and b/16/modex16/scroll.exe differ
index e32a4751b3faf2bd8a8ed001ac4cdea2e28000f9..507cd456a6a2b655e899949e4f916ecfc922e636 100644 (file)
Binary files a/16/modex16/test.exe and b/16/modex16/test.exe differ
index 6476ebc1663e5b5fc4287069e2bcbcc9781f5af4..0aa470b93d960d5cc4babb8a862eef2f9b45b209 100644 (file)
Binary files a/16/modex16/test2.exe and b/16/modex16/test2.exe differ