Login | ViewVC Help
View File | Revision Log | Show Annotations | Download File | View Changeset | Root Listing
root/ipe_artfile_utils/trunk/ipe32_bmpimport.c
Revision: 2
Committed: Thu Nov 8 11:19:36 2018 UTC (16 months, 2 weeks ago) by daniel-marschall
Content type: text/x-csrc
File size: 2476 byte(s)
Log Message:
Initial release to SVN

File Contents

# Content
1 /**
2 * Bitmap Import for Imagination Pilots Entertainment 32-bit games (IPE32)
3 * - Where's Waldo? Exploring Geography
4 * - Eraser Turnabout by Imagination Pilots
5 * - Virtual K'Nex by Imagination Pilots
6 * ART file packer and unpacker by Daniel Marschall, ViaThinkSoft (C) 2014-2018
7 * Revision: 2018-02-15
8 **/
9
10 #include <stdio.h>
11 #include <stdint.h>
12 #include <stdlib.h>
13 #include <string.h>
14 #include <math.h>
15
16 #include "bitmap.h"
17 #include "utils.h"
18 #include "ipe32_bmpimport.h"
19
20 #define BI_BITFIELDS 3
21
22 bool bmp_has_gap1(BITMAPFILEHEADER bitmapFileHeader, BITMAPINFOHEADER bitmapInfoHeader) {
23 int expected = 0;
24 expected = sizeof(bitmapFileHeader) + bitmapInfoHeader.biSize;
25
26 if (bitmapInfoHeader.biCompression == BI_BITFIELDS) {
27 expected += 3*sizeof(DWORD);
28 }
29
30 int numColorEntries;
31 if (bitmapInfoHeader.biClrUsed == 0) {
32 if ((bitmapInfoHeader.biBitCount == 1) || (bitmapInfoHeader.biBitCount == 4) || (bitmapInfoHeader.biBitCount == 8)) {
33 numColorEntries = pow(2, bitmapInfoHeader.biBitCount);
34 } else {
35 numColorEntries = 0;
36 }
37 } else {
38 numColorEntries = bitmapInfoHeader.biClrUsed;
39 }
40 expected += sizeof(RGBQUAD)*numColorEntries;
41
42 return bitmapFileHeader.bfOffBits != expected;
43 }
44
45 bool ipe32_bmp_import(FILE* fibBitmap, Ipe32BmpImportData* result) {
46 BITMAPFILEHEADER bitmapFileHeader;
47 BITMAPINFOHEADER bitmapInfoHeader;
48
49 #define EXIT_ERROR(msg) { sprintf(result->error, msg); return false; }
50
51 fseek(fibBitmap, 0, SEEK_SET);
52
53 if (!fread(&bitmapFileHeader, sizeof(BITMAPFILEHEADER), 1, fibBitmap) ||
54 (bitmapFileHeader.bfType != BI_SIGNATURE) ||
55 !fread(&bitmapInfoHeader, sizeof(BITMAPINFOHEADER), 1, fibBitmap)) {
56 EXIT_ERROR("Not a bitmap file");
57 }
58
59 if (bmp_has_gap1(bitmapFileHeader, bitmapInfoHeader)) {
60 EXIT_ERROR("Picture may not have a gap between header and bitmap data");
61 }
62
63 // TODO: Find out if the game has limitations in regards to compression, top-down/bottom-up, Bitmap version etc.
64 /*
65 if (bitmapInfoHeader.biCompression != BI_RGB) {
66 EXIT_ERROR("At the moment, only uncompressed files can be read.");
67 }
68
69 if (bitmapInfoHeader.biBitCount != 8) {
70 EXIT_ERROR("The color depth has to be 8 bpp.");
71 }
72 */
73
74 fseek(fibBitmap, sizeof(bitmapFileHeader), SEEK_SET);
75
76 result->error[0] = 0;
77 result->dataSize = file_size(fibBitmap)-sizeof(bitmapFileHeader);
78 return true;
79 }
80
81 void ipe32_free_bmpimport_result(Ipe32BmpImportData *res) {
82 }
83

Properties

Name Value
svn:mime-type text/x-csrc