]> 4ch.mooo.com Git - 16.git/blob - src/lib/bitmap.c
c34e13d04bb83383d0e814e5c5e19f5f241db68c
[16.git] / src / lib / bitmap.c
1 #include <stdio.h>\r
2 #include <stdlib.h>
3 #include <malloc.h>
4 #include "src/lib/bitmap.h"\r
5 #include "src/lib/modex16.h"\r
6 \r
7 static struct pcxHeader {\r
8     byte id;\r
9     byte version;\r
10     byte encoding;\r
11     byte bpp;\r
12     word xmin;\r
13     word ymin;\r
14     word xmax;\r
15     word ymax;\r
16     word hres;\r
17     word vres;\r
18     byte pal16[48];\r
19     byte res1;\r
20     word bpplane;\r
21     word palType;\r
22     word hScreenSize;\r
23     word vScreenSize;\r
24     byte padding[54];\r
25 } head;\r
26 \r
27 \r
28 static void loadPcxStage1(FILE *file, bitmap_t *result) {\r
29     long bufSize;\r
30     int index;\r
31     byte count, val;\r
32     long int pos;\r
33 \r
34     /* read the header */\r
35     fread(&head, sizeof(char), sizeof(struct pcxHeader), file);\r
36 \r
37     /* get the width and height */\r
38     result->width = head.xmax - head.xmin + 1;\r
39     result->height = head.ymax - head.ymin + 1;\r
40 \r
41     /* make sure this  is 8bpp */\r
42     if(head.bpp != 8) {\r
43                 printf("I only know how to handle 8bpp pcx files!\n");\r
44                 fclose(file);\r
45                 exit(-2);\r
46     }\r
47 }\r
48 \r
49 \r
50 static void loadPcxPalette(FILE *file, bitmap_t *result) {\r
51     byte val;\r
52     int index;\r
53 \r
54     /* handle the palette */\r
55     fseek(file, -769, SEEK_END);\r
56     val = fgetc(file);\r
57     result->palette = modexNewPal();\r
58     if(head.version == 5 && val == 12) {\r
59         /* use the vga palette */\r
60         for(index=0; !feof(file) && index < PAL_SIZE; index++) {\r
61             val = fgetc(file);\r
62             result->palette[index] = val >> 2;\r
63         }\r
64     } else {\r
65         /* use the 16 color palette */\r
66         for(index=0; index<48; index++) {\r
67             result->palette[index]  = head.pal16[index];\r
68         }\r
69     }\r
70 }\r
71 \r
72 \r
73 bitmap_t\r
74 bitmapLoadPcx(char *filename) {\r
75     FILE *file;\r
76     bitmap_t result;\r
77     dword bufSize;\r
78     int index;\r
79     byte count, val;
80 \r
81     /* open the PCX file for reading */\r
82     file = fopen(filename, "rb");\r
83     if(!file) {\r
84                 printf("Could not open %s for reading.\n", filename);\r
85                 exit(-2);\r
86     }\r
87 \r
88     /* load the first part of the pcx file */\r
89     loadPcxStage1(file, &result);
90 \r
91         /* allocate the buffer */
92         //printf("%zu\n", _memmax());\r
93         bufSize = (/*(dword)*/result.width * result.height);
94         result.data = malloc(bufSize);
95 //      result.data = (byte far *)_fmalloc(bufSize);
96 //      result.data = (byte __huge *)halloc(bufSize, sizeof(byte));
97         /*printf("&bufSize=%p\n", &bufSize);
98         printf("&result.data=%p\n", result.data);
99         printf("Size of block is %zu bytes\n", _msize(result.data));
100         printf("Size of bufSize is %zu bytes\n", bufSize);
101         printf("Size of result.width is %zu \n", result.width);
102         printf("Size of result.height is %zu \n", result.height);
103         printf("Dimensions of result is %lu\n", (dword)result.width*result.height);*/
104         //exit(0);
105         if(!result.data) {
106                 fprintf(stderr, "Could not allocate memory for bitmap data.");\r
107                 fclose(file);\r
108                 exit(-1);\r
109         }\r
110 \r
111     /*  read the buffer in */\r
112     index = 0;\r
113     do {\r
114         /* get the run length and the value */\r
115         count = fgetc(file);\r
116         if(0xC0 ==  (count & 0xC0)) { /* this is the run count */\r
117                 count &= 0x3f;\r
118                 val = fgetc(file);\r
119         } else {\r
120                 val = count;\r
121                 count = 1;\r
122         }\r
123
124         /* write the pixel the specified number of times */\r
125         for(; count && index < bufSize; count--,index++)  {\r
126                 result.data[index] = val;\r
127         }\r
128     } while(index < bufSize);\r
129 \r
130     loadPcxPalette(file, &result);\r
131 \r
132     fclose(file);\r
133 \r
134     return result;\r
135 }\r
136 \r
137 //update!!\r
138 tileset_t\r
139 bitmapLoadPcxTiles(char *filename, word twidth, word theight) {\r
140     tileset_t ts;\r
141     FILE *file;\r
142     bitmap_t result;\r
143     int i;\r
144 \r
145     /* open the PCX file for reading */\r
146     file = fopen(filename, "rb");\r
147         if(!file) {\r
148                 printf("Could not open %s for reading.\n", filename);\r
149                 exit(-2);\r
150         }\r
151 \r
152     /* load the first part of the pcx file */\r
153     loadPcxStage1(file, &result);\r
154 \r
155     /* get the number of tiles and set up the result structure */\r
156     ts.twidth = twidth;\r
157     ts.theight = theight;\r
158     ts.ntiles = (result.width/twidth) * (result.height/theight);\r
159     ts.palette = result.palette;\r
160 \r
161         /* allocate the pixel storage for the tiles */\r
162         ts.data = malloc(sizeof(byte*) * ts.ntiles);\r
163         ts.data[0] = malloc(sizeof(byte) * ts.ntiles * twidth * theight);\r
164         for(i=1; i < ts.ntiles; i++) {\r
165                 ts.data[i] = ts.data[i-1] + twidth * theight;\r
166         }\r
167 \r
168     /* finish off the file */\r
169     loadPcxPalette(file, &result);\r
170 \r
171     fclose(file);\r
172 \r
173     return ts;\r
174 }\r