]> 4ch.mooo.com Git - 16.git/commitdiff
Refactored out the PCX functions.
authorRobert Lowe <pngwen@gmail.com>
Wed, 1 Oct 2014 02:01:10 +0000 (22:01 -0400)
committerRobert Lowe <pngwen@gmail.com>
Wed, 1 Oct 2014 02:01:10 +0000 (22:01 -0400)
Started on a better tile loader

16/modex16/BITMAP.C
16/modex16/modex16.c
16/modex16/modex16.h
16/modex16/pcxtest.exe
16/modex16/scroll.exe
16/modex16/test.exe
16/modex16/test2.exe

index b1521526f4969ff1b091ffeba946f545ed0c8eb1..8287e57d252a2554813b7dc828358b1f8d7f7cba 100644 (file)
@@ -126,6 +126,37 @@ bitmapLoadPcx(char *filename) {
 tileset_t\r
 bitmapLoadPcxTiles(char *filename, word twidth, word theight) {\r
     tileset_t ts;\r
+    FILE *file;\r
+    bitmap_t result;\r
+    int i;\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
+    /* get the number of tiles and set up the result structure */\r
+    ts.twidth = twidth;\r
+    ts.theight = theight;\r
+    ts.ntiles = (result.width/twidth) * (result.height/theight);\r
+    ts.palette = result.palette;\r
+\r
+    /* allocate the pixel storage for the tiles */\r
+    ts.data = malloc(sizeof(byte*) * ts.ntiles);\r
+    ts.data[0] = malloc(sizeof(byte) * ts.ntiles * twidth * theight);\r
+    for(i=1; i < ts.ntiles; i++) {\r
+       ts.data[i] = ts.data[i-1] + twidth * theight;\r
+    }\r
+    \r
+    /* finish off the file */\r
+    loadPcxPalette(file, &result);\r
+\r
+    fclose(file);\r
 \r
     return ts;\r
 }\r
index 71537b6672a3a37f2cb7561003365f380aafb52c..f01116b5257fbab4c24267157af17adc0b73ff20 100644 (file)
@@ -11,26 +11,6 @@ byte far* VGA=(byte far*) 0xA0000000;        /* this points to video memory. */
 \r
 static void fadePalette(sbyte fade, sbyte start, word iter, byte *palette);\r
 static byte tmppal[PAL_SIZE];\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\r
 vgaSetMode(byte mode)\r
@@ -623,82 +603,3 @@ modexWaitBorder() {
        /* spin */\r
     }\r
 }\r
-\r
-\r
-bitmap_t\r
-modexLoadPcx(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
-    /* 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
-    /*  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
-    /* 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
-    fclose(file);\r
-\r
-    return result;\r
-}\r
index f45356b512ef049418cd23308e3fed0fe3012ad6..77573105f8f260d95856d3dfcb0f86e68d4942c1 100644 (file)
@@ -55,9 +55,6 @@ void modexPalWhite();
 void modexPalUpdate(byte *p);\r
 void modexWaitBorder();\r
 \r
-/* bitmap functions */\r
-bitmap_t modexLoadPcx(char *filename);\r
-\r
 /* -======================= Constants & Vars ==========================- */\r
 extern byte far*  VGA;  /* The VGA Memory */\r
 #define SCREEN_SEG             0xa000\r
index 2ae847e58b06b76d2677dc7d17d032785442f6a1..20910efc5256fe0850a970f771f3855eac8beaf9 100644 (file)
Binary files a/16/modex16/pcxtest.exe and b/16/modex16/pcxtest.exe differ
index 5e87bdc4fe7f945f1a2eebdf4d3d0f9281967701..46167a51179064a08984c6438917b51f9d380607 100755 (executable)
Binary files a/16/modex16/scroll.exe and b/16/modex16/scroll.exe differ
index 8efde54edc09a739fd42eb6f5528cb63d7a13ff2..63a3da16d6ec199fa9baa5e9623d6ba1f5dc1e0e 100644 (file)
Binary files a/16/modex16/test.exe and b/16/modex16/test.exe differ
index ab46164163ee3b1e7250e0f2300b84026af9f1b9..d0b6755cbc11f3886c7edaf3ab1b55f5034146c9 100644 (file)
Binary files a/16/modex16/test2.exe and b/16/modex16/test2.exe differ