Mercurial > hg > dmlib
annotate tools/libgfx.c @ 2539:c6ee41fd98dd
Bump copyright years.
author | Matti Hamalainen <ccr@tnsp.org> |
---|---|
date | Sat, 02 Jan 2021 11:42:17 +0200 |
parents | a11ef670bd99 |
children | 92b93a12c014 |
rev | line source |
---|---|
435 | 1 /* |
1308
8f71ca1900ea
Update header blurps and copyrights.
Matti Hamalainen <ccr@tnsp.org>
parents:
1307
diff
changeset
|
2 * Functions for reading and converting various graphics file formats |
435 | 3 * Programmed and designed by Matti 'ccr' Hamalainen |
2539 | 4 * (C) Copyright 2012-2021 Tecnic Software productions (TNSP) |
435 | 5 * |
6 * Please read file 'COPYING' for information on license and distribution. | |
7 */ | |
8 #include "libgfx.h" | |
9 | |
10 #ifdef DM_USE_LIBPNG | |
11 #include <png.h> | |
12 #endif | |
13 | |
14 | |
1285
e4bda4909d72
Make libgfx error mode a global variable, at least for now.
Matti Hamalainen <ccr@tnsp.org>
parents:
1284
diff
changeset
|
15 int dmGFXErrorMode = DM_ERRMODE_FAIL; |
e4bda4909d72
Make libgfx error mode a global variable, at least for now.
Matti Hamalainen <ccr@tnsp.org>
parents:
1284
diff
changeset
|
16 |
e4bda4909d72
Make libgfx error mode a global variable, at least for now.
Matti Hamalainen <ccr@tnsp.org>
parents:
1284
diff
changeset
|
17 |
1309
5ad7d780a09b
Move bitstream reading functions to libgfx, as they were only used there.
Matti Hamalainen <ccr@tnsp.org>
parents:
1308
diff
changeset
|
18 void dmInitBitStreamContext(DMBitStreamContext *ctx) |
5ad7d780a09b
Move bitstream reading functions to libgfx, as they were only used there.
Matti Hamalainen <ccr@tnsp.org>
parents:
1308
diff
changeset
|
19 { |
5ad7d780a09b
Move bitstream reading functions to libgfx, as they were only used there.
Matti Hamalainen <ccr@tnsp.org>
parents:
1308
diff
changeset
|
20 ctx->outBuf = 0; |
5ad7d780a09b
Move bitstream reading functions to libgfx, as they were only used there.
Matti Hamalainen <ccr@tnsp.org>
parents:
1308
diff
changeset
|
21 ctx->outByteCount = 0; |
2086
aedadff9e116
Implement dmGetBits() to the DMBitStreamContext API. Also improve error handling.
Matti Hamalainen <ccr@tnsp.org>
parents:
2085
diff
changeset
|
22 ctx->outBitCount = 0; |
aedadff9e116
Implement dmGetBits() to the DMBitStreamContext API. Also improve error handling.
Matti Hamalainen <ccr@tnsp.org>
parents:
2085
diff
changeset
|
23 |
aedadff9e116
Implement dmGetBits() to the DMBitStreamContext API. Also improve error handling.
Matti Hamalainen <ccr@tnsp.org>
parents:
2085
diff
changeset
|
24 ctx->inBuf = 0; |
aedadff9e116
Implement dmGetBits() to the DMBitStreamContext API. Also improve error handling.
Matti Hamalainen <ccr@tnsp.org>
parents:
2085
diff
changeset
|
25 ctx->inByteCount = 0; |
aedadff9e116
Implement dmGetBits() to the DMBitStreamContext API. Also improve error handling.
Matti Hamalainen <ccr@tnsp.org>
parents:
2085
diff
changeset
|
26 ctx->inBitCount = 0; |
1309
5ad7d780a09b
Move bitstream reading functions to libgfx, as they were only used there.
Matti Hamalainen <ccr@tnsp.org>
parents:
1308
diff
changeset
|
27 } |
5ad7d780a09b
Move bitstream reading functions to libgfx, as they were only used there.
Matti Hamalainen <ccr@tnsp.org>
parents:
1308
diff
changeset
|
28 |
5ad7d780a09b
Move bitstream reading functions to libgfx, as they were only used there.
Matti Hamalainen <ccr@tnsp.org>
parents:
1308
diff
changeset
|
29 |
2086
aedadff9e116
Implement dmGetBits() to the DMBitStreamContext API. Also improve error handling.
Matti Hamalainen <ccr@tnsp.org>
parents:
2085
diff
changeset
|
30 int dmPutBits(DMBitStreamContext *ctx, const unsigned int val, const unsigned int n) |
1309
5ad7d780a09b
Move bitstream reading functions to libgfx, as they were only used there.
Matti Hamalainen <ccr@tnsp.org>
parents:
1308
diff
changeset
|
31 { |
2086
aedadff9e116
Implement dmGetBits() to the DMBitStreamContext API. Also improve error handling.
Matti Hamalainen <ccr@tnsp.org>
parents:
2085
diff
changeset
|
32 for (unsigned int i = 0; i < n; i++) |
1309
5ad7d780a09b
Move bitstream reading functions to libgfx, as they were only used there.
Matti Hamalainen <ccr@tnsp.org>
parents:
1308
diff
changeset
|
33 { |
5ad7d780a09b
Move bitstream reading functions to libgfx, as they were only used there.
Matti Hamalainen <ccr@tnsp.org>
parents:
1308
diff
changeset
|
34 ctx->outBuf <<= 1; |
5ad7d780a09b
Move bitstream reading functions to libgfx, as they were only used there.
Matti Hamalainen <ccr@tnsp.org>
parents:
1308
diff
changeset
|
35 |
2086
aedadff9e116
Implement dmGetBits() to the DMBitStreamContext API. Also improve error handling.
Matti Hamalainen <ccr@tnsp.org>
parents:
2085
diff
changeset
|
36 if (val & (1 << (n - 1 - i))) |
aedadff9e116
Implement dmGetBits() to the DMBitStreamContext API. Also improve error handling.
Matti Hamalainen <ccr@tnsp.org>
parents:
2085
diff
changeset
|
37 ctx->outBuf |= 1; |
aedadff9e116
Implement dmGetBits() to the DMBitStreamContext API. Also improve error handling.
Matti Hamalainen <ccr@tnsp.org>
parents:
2085
diff
changeset
|
38 |
aedadff9e116
Implement dmGetBits() to the DMBitStreamContext API. Also improve error handling.
Matti Hamalainen <ccr@tnsp.org>
parents:
2085
diff
changeset
|
39 ctx->outBitCount++; |
aedadff9e116
Implement dmGetBits() to the DMBitStreamContext API. Also improve error handling.
Matti Hamalainen <ccr@tnsp.org>
parents:
2085
diff
changeset
|
40 if (ctx->outBitCount == 8) |
1309
5ad7d780a09b
Move bitstream reading functions to libgfx, as they were only used there.
Matti Hamalainen <ccr@tnsp.org>
parents:
1308
diff
changeset
|
41 { |
2086
aedadff9e116
Implement dmGetBits() to the DMBitStreamContext API. Also improve error handling.
Matti Hamalainen <ccr@tnsp.org>
parents:
2085
diff
changeset
|
42 int ret; |
aedadff9e116
Implement dmGetBits() to the DMBitStreamContext API. Also improve error handling.
Matti Hamalainen <ccr@tnsp.org>
parents:
2085
diff
changeset
|
43 if ((ret = ctx->putByte(ctx)) != DMERR_OK) |
aedadff9e116
Implement dmGetBits() to the DMBitStreamContext API. Also improve error handling.
Matti Hamalainen <ccr@tnsp.org>
parents:
2085
diff
changeset
|
44 return ret; |
aedadff9e116
Implement dmGetBits() to the DMBitStreamContext API. Also improve error handling.
Matti Hamalainen <ccr@tnsp.org>
parents:
2085
diff
changeset
|
45 |
aedadff9e116
Implement dmGetBits() to the DMBitStreamContext API. Also improve error handling.
Matti Hamalainen <ccr@tnsp.org>
parents:
2085
diff
changeset
|
46 ctx->outBitCount = 0; |
1309
5ad7d780a09b
Move bitstream reading functions to libgfx, as they were only used there.
Matti Hamalainen <ccr@tnsp.org>
parents:
1308
diff
changeset
|
47 ctx->outByteCount++; |
5ad7d780a09b
Move bitstream reading functions to libgfx, as they were only used there.
Matti Hamalainen <ccr@tnsp.org>
parents:
1308
diff
changeset
|
48 } |
5ad7d780a09b
Move bitstream reading functions to libgfx, as they were only used there.
Matti Hamalainen <ccr@tnsp.org>
parents:
1308
diff
changeset
|
49 } |
5ad7d780a09b
Move bitstream reading functions to libgfx, as they were only used there.
Matti Hamalainen <ccr@tnsp.org>
parents:
1308
diff
changeset
|
50 |
2086
aedadff9e116
Implement dmGetBits() to the DMBitStreamContext API. Also improve error handling.
Matti Hamalainen <ccr@tnsp.org>
parents:
2085
diff
changeset
|
51 return DMERR_OK; |
aedadff9e116
Implement dmGetBits() to the DMBitStreamContext API. Also improve error handling.
Matti Hamalainen <ccr@tnsp.org>
parents:
2085
diff
changeset
|
52 } |
aedadff9e116
Implement dmGetBits() to the DMBitStreamContext API. Also improve error handling.
Matti Hamalainen <ccr@tnsp.org>
parents:
2085
diff
changeset
|
53 |
aedadff9e116
Implement dmGetBits() to the DMBitStreamContext API. Also improve error handling.
Matti Hamalainen <ccr@tnsp.org>
parents:
2085
diff
changeset
|
54 |
aedadff9e116
Implement dmGetBits() to the DMBitStreamContext API. Also improve error handling.
Matti Hamalainen <ccr@tnsp.org>
parents:
2085
diff
changeset
|
55 int dmGetBits(DMBitStreamContext *ctx, unsigned int *val, const unsigned int n) |
aedadff9e116
Implement dmGetBits() to the DMBitStreamContext API. Also improve error handling.
Matti Hamalainen <ccr@tnsp.org>
parents:
2085
diff
changeset
|
56 { |
aedadff9e116
Implement dmGetBits() to the DMBitStreamContext API. Also improve error handling.
Matti Hamalainen <ccr@tnsp.org>
parents:
2085
diff
changeset
|
57 *val = 0; |
aedadff9e116
Implement dmGetBits() to the DMBitStreamContext API. Also improve error handling.
Matti Hamalainen <ccr@tnsp.org>
parents:
2085
diff
changeset
|
58 |
aedadff9e116
Implement dmGetBits() to the DMBitStreamContext API. Also improve error handling.
Matti Hamalainen <ccr@tnsp.org>
parents:
2085
diff
changeset
|
59 for (unsigned int i = 0; i < n; i++) |
aedadff9e116
Implement dmGetBits() to the DMBitStreamContext API. Also improve error handling.
Matti Hamalainen <ccr@tnsp.org>
parents:
2085
diff
changeset
|
60 { |
aedadff9e116
Implement dmGetBits() to the DMBitStreamContext API. Also improve error handling.
Matti Hamalainen <ccr@tnsp.org>
parents:
2085
diff
changeset
|
61 if (ctx->inBitCount == 0) |
aedadff9e116
Implement dmGetBits() to the DMBitStreamContext API. Also improve error handling.
Matti Hamalainen <ccr@tnsp.org>
parents:
2085
diff
changeset
|
62 { |
aedadff9e116
Implement dmGetBits() to the DMBitStreamContext API. Also improve error handling.
Matti Hamalainen <ccr@tnsp.org>
parents:
2085
diff
changeset
|
63 int ret; |
aedadff9e116
Implement dmGetBits() to the DMBitStreamContext API. Also improve error handling.
Matti Hamalainen <ccr@tnsp.org>
parents:
2085
diff
changeset
|
64 if ((ret = ctx->getByte(ctx)) != DMERR_OK) |
aedadff9e116
Implement dmGetBits() to the DMBitStreamContext API. Also improve error handling.
Matti Hamalainen <ccr@tnsp.org>
parents:
2085
diff
changeset
|
65 return ret; |
aedadff9e116
Implement dmGetBits() to the DMBitStreamContext API. Also improve error handling.
Matti Hamalainen <ccr@tnsp.org>
parents:
2085
diff
changeset
|
66 |
aedadff9e116
Implement dmGetBits() to the DMBitStreamContext API. Also improve error handling.
Matti Hamalainen <ccr@tnsp.org>
parents:
2085
diff
changeset
|
67 ctx->inBitCount = 8; |
aedadff9e116
Implement dmGetBits() to the DMBitStreamContext API. Also improve error handling.
Matti Hamalainen <ccr@tnsp.org>
parents:
2085
diff
changeset
|
68 ctx->inByteCount++; |
aedadff9e116
Implement dmGetBits() to the DMBitStreamContext API. Also improve error handling.
Matti Hamalainen <ccr@tnsp.org>
parents:
2085
diff
changeset
|
69 } |
aedadff9e116
Implement dmGetBits() to the DMBitStreamContext API. Also improve error handling.
Matti Hamalainen <ccr@tnsp.org>
parents:
2085
diff
changeset
|
70 |
aedadff9e116
Implement dmGetBits() to the DMBitStreamContext API. Also improve error handling.
Matti Hamalainen <ccr@tnsp.org>
parents:
2085
diff
changeset
|
71 *val <<= 1; |
aedadff9e116
Implement dmGetBits() to the DMBitStreamContext API. Also improve error handling.
Matti Hamalainen <ccr@tnsp.org>
parents:
2085
diff
changeset
|
72 *val |= ctx->inBuf >> 7 & 1; |
aedadff9e116
Implement dmGetBits() to the DMBitStreamContext API. Also improve error handling.
Matti Hamalainen <ccr@tnsp.org>
parents:
2085
diff
changeset
|
73 |
aedadff9e116
Implement dmGetBits() to the DMBitStreamContext API. Also improve error handling.
Matti Hamalainen <ccr@tnsp.org>
parents:
2085
diff
changeset
|
74 ctx->inBuf <<= 1; |
aedadff9e116
Implement dmGetBits() to the DMBitStreamContext API. Also improve error handling.
Matti Hamalainen <ccr@tnsp.org>
parents:
2085
diff
changeset
|
75 ctx->inBitCount--; |
aedadff9e116
Implement dmGetBits() to the DMBitStreamContext API. Also improve error handling.
Matti Hamalainen <ccr@tnsp.org>
parents:
2085
diff
changeset
|
76 } |
aedadff9e116
Implement dmGetBits() to the DMBitStreamContext API. Also improve error handling.
Matti Hamalainen <ccr@tnsp.org>
parents:
2085
diff
changeset
|
77 |
aedadff9e116
Implement dmGetBits() to the DMBitStreamContext API. Also improve error handling.
Matti Hamalainen <ccr@tnsp.org>
parents:
2085
diff
changeset
|
78 return DMERR_OK; |
1309
5ad7d780a09b
Move bitstream reading functions to libgfx, as they were only used there.
Matti Hamalainen <ccr@tnsp.org>
parents:
1308
diff
changeset
|
79 } |
5ad7d780a09b
Move bitstream reading functions to libgfx, as they were only used there.
Matti Hamalainen <ccr@tnsp.org>
parents:
1308
diff
changeset
|
80 |
5ad7d780a09b
Move bitstream reading functions to libgfx, as they were only used there.
Matti Hamalainen <ccr@tnsp.org>
parents:
1308
diff
changeset
|
81 |
5ad7d780a09b
Move bitstream reading functions to libgfx, as they were only used there.
Matti Hamalainen <ccr@tnsp.org>
parents:
1308
diff
changeset
|
82 int dmFlushBitStream(DMBitStreamContext *ctx) |
5ad7d780a09b
Move bitstream reading functions to libgfx, as they were only used there.
Matti Hamalainen <ccr@tnsp.org>
parents:
1308
diff
changeset
|
83 { |
5ad7d780a09b
Move bitstream reading functions to libgfx, as they were only used there.
Matti Hamalainen <ccr@tnsp.org>
parents:
1308
diff
changeset
|
84 if (ctx == NULL) |
5ad7d780a09b
Move bitstream reading functions to libgfx, as they were only used there.
Matti Hamalainen <ccr@tnsp.org>
parents:
1308
diff
changeset
|
85 return DMERR_NULLPTR; |
5ad7d780a09b
Move bitstream reading functions to libgfx, as they were only used there.
Matti Hamalainen <ccr@tnsp.org>
parents:
1308
diff
changeset
|
86 |
2086
aedadff9e116
Implement dmGetBits() to the DMBitStreamContext API. Also improve error handling.
Matti Hamalainen <ccr@tnsp.org>
parents:
2085
diff
changeset
|
87 if (ctx->outBitCount > 0) |
aedadff9e116
Implement dmGetBits() to the DMBitStreamContext API. Also improve error handling.
Matti Hamalainen <ccr@tnsp.org>
parents:
2085
diff
changeset
|
88 return dmPutBits(ctx, 0, 8 - ctx->outBitCount); |
1309
5ad7d780a09b
Move bitstream reading functions to libgfx, as they were only used there.
Matti Hamalainen <ccr@tnsp.org>
parents:
1308
diff
changeset
|
89 |
2083
feed844a5ae1
Return DMERR_OK where appropriate instead of 0.
Matti Hamalainen <ccr@tnsp.org>
parents:
2082
diff
changeset
|
90 return DMERR_OK; |
1309
5ad7d780a09b
Move bitstream reading functions to libgfx, as they were only used there.
Matti Hamalainen <ccr@tnsp.org>
parents:
1308
diff
changeset
|
91 } |
5ad7d780a09b
Move bitstream reading functions to libgfx, as they were only used there.
Matti Hamalainen <ccr@tnsp.org>
parents:
1308
diff
changeset
|
92 |
5ad7d780a09b
Move bitstream reading functions to libgfx, as they were only used there.
Matti Hamalainen <ccr@tnsp.org>
parents:
1308
diff
changeset
|
93 |
2100
81fb21dd3265
Add dmGetNPlanesFromNColors() and use it.
Matti Hamalainen <ccr@tnsp.org>
parents:
2098
diff
changeset
|
94 int dmGetNPlanesFromNColors(const int ncolors) |
81fb21dd3265
Add dmGetNPlanesFromNColors() and use it.
Matti Hamalainen <ccr@tnsp.org>
parents:
2098
diff
changeset
|
95 { |
81fb21dd3265
Add dmGetNPlanesFromNColors() and use it.
Matti Hamalainen <ccr@tnsp.org>
parents:
2098
diff
changeset
|
96 if (ncolors <= 0) |
81fb21dd3265
Add dmGetNPlanesFromNColors() and use it.
Matti Hamalainen <ccr@tnsp.org>
parents:
2098
diff
changeset
|
97 return -1; |
81fb21dd3265
Add dmGetNPlanesFromNColors() and use it.
Matti Hamalainen <ccr@tnsp.org>
parents:
2098
diff
changeset
|
98 |
81fb21dd3265
Add dmGetNPlanesFromNColors() and use it.
Matti Hamalainen <ccr@tnsp.org>
parents:
2098
diff
changeset
|
99 for (int n = 8; n >= 0;) |
81fb21dd3265
Add dmGetNPlanesFromNColors() and use it.
Matti Hamalainen <ccr@tnsp.org>
parents:
2098
diff
changeset
|
100 { |
81fb21dd3265
Add dmGetNPlanesFromNColors() and use it.
Matti Hamalainen <ccr@tnsp.org>
parents:
2098
diff
changeset
|
101 if ((ncolors - 1) & (1 << n)) |
81fb21dd3265
Add dmGetNPlanesFromNColors() and use it.
Matti Hamalainen <ccr@tnsp.org>
parents:
2098
diff
changeset
|
102 return n + 1; |
81fb21dd3265
Add dmGetNPlanesFromNColors() and use it.
Matti Hamalainen <ccr@tnsp.org>
parents:
2098
diff
changeset
|
103 else |
81fb21dd3265
Add dmGetNPlanesFromNColors() and use it.
Matti Hamalainen <ccr@tnsp.org>
parents:
2098
diff
changeset
|
104 n--; |
81fb21dd3265
Add dmGetNPlanesFromNColors() and use it.
Matti Hamalainen <ccr@tnsp.org>
parents:
2098
diff
changeset
|
105 } |
81fb21dd3265
Add dmGetNPlanesFromNColors() and use it.
Matti Hamalainen <ccr@tnsp.org>
parents:
2098
diff
changeset
|
106 |
81fb21dd3265
Add dmGetNPlanesFromNColors() and use it.
Matti Hamalainen <ccr@tnsp.org>
parents:
2098
diff
changeset
|
107 return -2; |
81fb21dd3265
Add dmGetNPlanesFromNColors() and use it.
Matti Hamalainen <ccr@tnsp.org>
parents:
2098
diff
changeset
|
108 } |
81fb21dd3265
Add dmGetNPlanesFromNColors() and use it.
Matti Hamalainen <ccr@tnsp.org>
parents:
2098
diff
changeset
|
109 |
81fb21dd3265
Add dmGetNPlanesFromNColors() and use it.
Matti Hamalainen <ccr@tnsp.org>
parents:
2098
diff
changeset
|
110 |
1286 | 111 int dmImageGetBytesPerPixel(const int format) |
112 { | |
113 switch (format) | |
114 { | |
2157
9a9493809b3a
Rename DM_COLFMT_* constants to DM_PIXFMT_* and the 'format' field of DMImage
Matti Hamalainen <ccr@tnsp.org>
parents:
2156
diff
changeset
|
115 case DM_PIXFMT_GRAYSCALE : return 1; |
9a9493809b3a
Rename DM_COLFMT_* constants to DM_PIXFMT_* and the 'format' field of DMImage
Matti Hamalainen <ccr@tnsp.org>
parents:
2156
diff
changeset
|
116 case DM_PIXFMT_PALETTE : return 1; |
9a9493809b3a
Rename DM_COLFMT_* constants to DM_PIXFMT_* and the 'format' field of DMImage
Matti Hamalainen <ccr@tnsp.org>
parents:
2156
diff
changeset
|
117 case DM_PIXFMT_RGB : return 3; |
9a9493809b3a
Rename DM_COLFMT_* constants to DM_PIXFMT_* and the 'format' field of DMImage
Matti Hamalainen <ccr@tnsp.org>
parents:
2156
diff
changeset
|
118 case DM_PIXFMT_RGBA : return 4; |
1801 | 119 default : return -1; |
1286 | 120 } |
121 } | |
122 | |
123 | |
2091 | 124 int dmImageGetBitsPerPixel(const int format) |
125 { | |
126 return dmImageGetBytesPerPixel(format) * 8; | |
127 } | |
128 | |
129 | |
1286 | 130 DMImage * dmImageAlloc(const int width, const int height, const int format, const int bpp) |
435 | 131 { |
928
ebe0d93e03c0
Use dmMalloc0() instead of dmCalloc() here.
Matti Hamalainen <ccr@tnsp.org>
parents:
902
diff
changeset
|
132 DMImage *img = dmMalloc0(sizeof(DMImage)); |
435 | 133 if (img == NULL) |
134 return NULL; | |
1102
e06abfde6c39
Cosmetics pass: Remove excess whitespace.
Matti Hamalainen <ccr@tnsp.org>
parents:
958
diff
changeset
|
135 |
1286 | 136 img->width = width; |
137 img->height = height; | |
2157
9a9493809b3a
Rename DM_COLFMT_* constants to DM_PIXFMT_* and the 'format' field of DMImage
Matti Hamalainen <ccr@tnsp.org>
parents:
2156
diff
changeset
|
138 img->pixfmt = format; |
2093
d17512dbb4ef
Some work on reading >8bpp images.
Matti Hamalainen <ccr@tnsp.org>
parents:
2092
diff
changeset
|
139 img->bpp = (bpp <= 0) ? dmImageGetBitsPerPixel(format) : bpp; |
d17512dbb4ef
Some work on reading >8bpp images.
Matti Hamalainen <ccr@tnsp.org>
parents:
2092
diff
changeset
|
140 img->pitch = (width * img->bpp) / 8; |
1628
a549d33d543a
Add image aspect ratio information.
Matti Hamalainen <ccr@tnsp.org>
parents:
1627
diff
changeset
|
141 img->size = img->pitch * img->height; |
a549d33d543a
Add image aspect ratio information.
Matti Hamalainen <ccr@tnsp.org>
parents:
1627
diff
changeset
|
142 img->aspect = -1; |
930 | 143 |
929
e1378398be0f
Add size field for allocated data size in DMImage.
Matti Hamalainen <ccr@tnsp.org>
parents:
928
diff
changeset
|
144 if ((img->data = dmMalloc(img->size)) == NULL) |
435 | 145 { |
146 dmFree(img); | |
147 return NULL; | |
148 } | |
1102
e06abfde6c39
Cosmetics pass: Remove excess whitespace.
Matti Hamalainen <ccr@tnsp.org>
parents:
958
diff
changeset
|
149 |
435 | 150 return img; |
151 } | |
152 | |
153 | |
154 void dmImageFree(DMImage *img) | |
155 { | |
156 if (img != NULL) | |
157 { | |
158 if (!img->constpal) | |
2094
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
159 dmPaletteFree(img->pal); |
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
160 |
435 | 161 dmFree(img->data); |
162 dmFree(img); | |
163 } | |
164 } | |
165 | |
166 | |
2094
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
167 int dmPaletteAlloc(DMPalette **ppal, const int ncolors, const int ctransp) |
451
fdc91f2a0d27
Modularize palette reading and handling code.
Matti Hamalainen <ccr@tnsp.org>
parents:
449
diff
changeset
|
168 { |
2094
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
169 DMPalette *pal; |
451
fdc91f2a0d27
Modularize palette reading and handling code.
Matti Hamalainen <ccr@tnsp.org>
parents:
449
diff
changeset
|
170 if (ppal == NULL) |
2094
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
171 return DMERR_NULLPTR; |
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
172 |
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
173 *ppal = NULL; |
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
174 |
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
175 // Allocate palette struct |
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
176 if ((pal = dmMalloc0(sizeof(DMPalette))) == NULL) |
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
177 return DMERR_MALLOC; |
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
178 |
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
179 pal->ncolors = ncolors; |
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
180 pal->ctransp = ctransp; |
451
fdc91f2a0d27
Modularize palette reading and handling code.
Matti Hamalainen <ccr@tnsp.org>
parents:
449
diff
changeset
|
181 |
460
0af039b6c0ae
Improve transparent color handling.
Matti Hamalainen <ccr@tnsp.org>
parents:
453
diff
changeset
|
182 // Allocate desired amount of palette |
2094
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
183 if ((pal->colors = dmCalloc(pal->ncolors, sizeof(DMColor))) == NULL) |
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
184 { |
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
185 dmFree(pal); |
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
186 return DMERR_MALLOC; |
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
187 } |
460
0af039b6c0ae
Improve transparent color handling.
Matti Hamalainen <ccr@tnsp.org>
parents:
453
diff
changeset
|
188 |
0af039b6c0ae
Improve transparent color handling.
Matti Hamalainen <ccr@tnsp.org>
parents:
453
diff
changeset
|
189 // Set alpha values to max, except for transparent color |
2094
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
190 for (int i = 0; i < pal->ncolors; i++) |
460
0af039b6c0ae
Improve transparent color handling.
Matti Hamalainen <ccr@tnsp.org>
parents:
453
diff
changeset
|
191 { |
2094
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
192 pal->colors[i].a = (i == pal->ctransp) ? 0x00 : 0xff; |
460
0af039b6c0ae
Improve transparent color handling.
Matti Hamalainen <ccr@tnsp.org>
parents:
453
diff
changeset
|
193 } |
0af039b6c0ae
Improve transparent color handling.
Matti Hamalainen <ccr@tnsp.org>
parents:
453
diff
changeset
|
194 |
2094
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
195 *ppal = pal; |
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
196 |
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
197 return DMERR_OK; |
451
fdc91f2a0d27
Modularize palette reading and handling code.
Matti Hamalainen <ccr@tnsp.org>
parents:
449
diff
changeset
|
198 } |
fdc91f2a0d27
Modularize palette reading and handling code.
Matti Hamalainen <ccr@tnsp.org>
parents:
449
diff
changeset
|
199 |
fdc91f2a0d27
Modularize palette reading and handling code.
Matti Hamalainen <ccr@tnsp.org>
parents:
449
diff
changeset
|
200 |
2094
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
201 int dmPaletteResize(DMPalette **ppal, const int ncolors) |
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
202 { |
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
203 DMPalette *pal; |
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
204 |
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
205 if (ppal == NULL) |
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
206 return DMERR_NULLPTR; |
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
207 |
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
208 if (ncolors <= 0 || ncolors > 256) |
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
209 return DMERR_INVALID_ARGS; |
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
210 |
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
211 if (*ppal == NULL) |
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
212 return dmPaletteAlloc(ppal, ncolors, -1); |
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
213 |
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
214 pal = *ppal; |
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
215 |
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
216 if (pal->ncolors == ncolors) |
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
217 return DMERR_OK; |
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
218 |
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
219 if ((pal->colors = dmRealloc(pal->colors, sizeof(DMColor) * ncolors)) == NULL) |
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
220 return DMERR_MALLOC; |
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
221 |
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
222 if (ncolors - pal->ncolors > 0) |
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
223 memset(&(pal->colors[pal->ncolors]), 0, sizeof(DMColor) * (ncolors - pal->ncolors)); |
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
224 |
2208
90ec1ec89c56
Revamp the palette handling in lib64gfx somewhat, add helper functions to
Matti Hamalainen <ccr@tnsp.org>
parents:
2207
diff
changeset
|
225 pal->ncolors = ncolors; |
90ec1ec89c56
Revamp the palette handling in lib64gfx somewhat, add helper functions to
Matti Hamalainen <ccr@tnsp.org>
parents:
2207
diff
changeset
|
226 |
2094
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
227 return DMERR_OK; |
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
228 } |
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
229 |
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
230 |
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
231 int dmPaletteCopy(DMPalette **pdst, const DMPalette *src) |
451
fdc91f2a0d27
Modularize palette reading and handling code.
Matti Hamalainen <ccr@tnsp.org>
parents:
449
diff
changeset
|
232 { |
2094
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
233 DMPalette *pal; |
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
234 if (pdst == NULL) |
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
235 return DMERR_NULLPTR; |
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
236 |
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
237 *pdst = NULL; |
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
238 |
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
239 // Allocate palette struct |
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
240 if ((pal = dmMalloc(sizeof(DMPalette))) == NULL) |
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
241 return DMERR_MALLOC; |
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
242 |
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
243 memcpy(pal, src, sizeof(DMPalette)); |
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
244 |
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
245 // Allocate desired amount of palette |
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
246 if ((pal->colors = dmCalloc(pal->ncolors, sizeof(DMColor))) == NULL) |
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
247 { |
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
248 dmFree(pal); |
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
249 return DMERR_MALLOC; |
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
250 } |
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
251 |
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
252 memcpy(pal->colors, src->colors, sizeof(DMColor) * pal->ncolors); |
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
253 *pdst = pal; |
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
254 |
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
255 return DMERR_OK; |
451
fdc91f2a0d27
Modularize palette reading and handling code.
Matti Hamalainen <ccr@tnsp.org>
parents:
449
diff
changeset
|
256 } |
fdc91f2a0d27
Modularize palette reading and handling code.
Matti Hamalainen <ccr@tnsp.org>
parents:
449
diff
changeset
|
257 |
fdc91f2a0d27
Modularize palette reading and handling code.
Matti Hamalainen <ccr@tnsp.org>
parents:
449
diff
changeset
|
258 |
2094
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
259 void dmPaletteFree(DMPalette *pal) |
451
fdc91f2a0d27
Modularize palette reading and handling code.
Matti Hamalainen <ccr@tnsp.org>
parents:
449
diff
changeset
|
260 { |
2094
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
261 if (pal != NULL) |
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
262 { |
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
263 dmFree(pal->colors); |
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
264 dmFree(pal); |
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
265 } |
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
266 } |
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
267 |
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
268 |
2202 | 269 static int dmPaletteReadData(DMResource *fp, DMPalette *pal, const int ncolors) |
2094
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
270 { |
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
271 if (pal->ncolors < ncolors) |
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
272 return DMERR_INVALID_ARGS; |
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
273 |
1609
c29adf5ce240
Convert libgfx file format routines to use DMResource instead of stdio FILE.
Matti Hamalainen <ccr@tnsp.org>
parents:
1583
diff
changeset
|
274 for (int i = 0; i < ncolors; i++) |
451
fdc91f2a0d27
Modularize palette reading and handling code.
Matti Hamalainen <ccr@tnsp.org>
parents:
449
diff
changeset
|
275 { |
fdc91f2a0d27
Modularize palette reading and handling code.
Matti Hamalainen <ccr@tnsp.org>
parents:
449
diff
changeset
|
276 Uint8 colR, colG, colB; |
1609
c29adf5ce240
Convert libgfx file format routines to use DMResource instead of stdio FILE.
Matti Hamalainen <ccr@tnsp.org>
parents:
1583
diff
changeset
|
277 if (!dmf_read_byte(fp, &colR) || |
c29adf5ce240
Convert libgfx file format routines to use DMResource instead of stdio FILE.
Matti Hamalainen <ccr@tnsp.org>
parents:
1583
diff
changeset
|
278 !dmf_read_byte(fp, &colG) || |
c29adf5ce240
Convert libgfx file format routines to use DMResource instead of stdio FILE.
Matti Hamalainen <ccr@tnsp.org>
parents:
1583
diff
changeset
|
279 !dmf_read_byte(fp, &colB)) |
2094
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
280 return DMERR_FREAD; |
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
281 |
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
282 pal->colors[i].r = colR; |
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
283 pal->colors[i].g = colG; |
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
284 pal->colors[i].b = colB; |
451
fdc91f2a0d27
Modularize palette reading and handling code.
Matti Hamalainen <ccr@tnsp.org>
parents:
449
diff
changeset
|
285 } |
fdc91f2a0d27
Modularize palette reading and handling code.
Matti Hamalainen <ccr@tnsp.org>
parents:
449
diff
changeset
|
286 |
2094
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
287 return DMERR_OK; |
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
288 } |
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
289 |
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
290 |
2202 | 291 static int dmPaletteWriteData(DMResource *fp, const DMPalette *pal, |
292 const int ncolors, const int npad) | |
2094
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
293 { |
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
294 int i; |
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
295 |
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
296 if (pal == NULL || fp == NULL) |
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
297 return DMERR_NULLPTR; |
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
298 |
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
299 if (pal->ncolors < ncolors) |
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
300 return DMERR_INVALID_ARGS; |
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
301 |
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
302 for (i = 0; i < ncolors; i++) |
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
303 { |
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
304 DMColor *col = &pal->colors[i]; |
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
305 if (!dmf_write_byte(fp, col->r) || |
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
306 !dmf_write_byte(fp, col->g) || |
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
307 !dmf_write_byte(fp, col->b)) |
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
308 return DMERR_FWRITE; |
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
309 } |
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
310 |
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
311 for (; i < npad; i++) |
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
312 { |
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
313 if (!dmf_write_byte(fp, 0) || |
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
314 !dmf_write_byte(fp, 0) || |
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
315 !dmf_write_byte(fp, 0)) |
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
316 return DMERR_FWRITE; |
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
317 } |
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
318 |
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
319 return DMERR_OK; |
451
fdc91f2a0d27
Modularize palette reading and handling code.
Matti Hamalainen <ccr@tnsp.org>
parents:
449
diff
changeset
|
320 } |
fdc91f2a0d27
Modularize palette reading and handling code.
Matti Hamalainen <ccr@tnsp.org>
parents:
449
diff
changeset
|
321 |
fdc91f2a0d27
Modularize palette reading and handling code.
Matti Hamalainen <ccr@tnsp.org>
parents:
449
diff
changeset
|
322 |
2209
7a0af15fbe97
Add support for 'raw' 768 byte palette files.
Matti Hamalainen <ccr@tnsp.org>
parents:
2208
diff
changeset
|
323 static int fmtProbeACTPalette(const Uint8 *buf, const size_t len) |
2207
1ea48084055e
Add functionality for separate palette file handling, reading, writing and
Matti Hamalainen <ccr@tnsp.org>
parents:
2202
diff
changeset
|
324 { |
1ea48084055e
Add functionality for separate palette file handling, reading, writing and
Matti Hamalainen <ccr@tnsp.org>
parents:
2202
diff
changeset
|
325 if (len == 0x304 && |
2208
90ec1ec89c56
Revamp the palette handling in lib64gfx somewhat, add helper functions to
Matti Hamalainen <ccr@tnsp.org>
parents:
2207
diff
changeset
|
326 buf[0x300] == 0) |
2207
1ea48084055e
Add functionality for separate palette file handling, reading, writing and
Matti Hamalainen <ccr@tnsp.org>
parents:
2202
diff
changeset
|
327 return DM_PROBE_SCORE_MAX; |
1ea48084055e
Add functionality for separate palette file handling, reading, writing and
Matti Hamalainen <ccr@tnsp.org>
parents:
2202
diff
changeset
|
328 |
1ea48084055e
Add functionality for separate palette file handling, reading, writing and
Matti Hamalainen <ccr@tnsp.org>
parents:
2202
diff
changeset
|
329 return DM_PROBE_SCORE_FALSE; |
1ea48084055e
Add functionality for separate palette file handling, reading, writing and
Matti Hamalainen <ccr@tnsp.org>
parents:
2202
diff
changeset
|
330 } |
1ea48084055e
Add functionality for separate palette file handling, reading, writing and
Matti Hamalainen <ccr@tnsp.org>
parents:
2202
diff
changeset
|
331 |
1ea48084055e
Add functionality for separate palette file handling, reading, writing and
Matti Hamalainen <ccr@tnsp.org>
parents:
2202
diff
changeset
|
332 |
1ea48084055e
Add functionality for separate palette file handling, reading, writing and
Matti Hamalainen <ccr@tnsp.org>
parents:
2202
diff
changeset
|
333 int dmReadACTPalette(DMResource *fp, DMPalette **pdst) |
1ea48084055e
Add functionality for separate palette file handling, reading, writing and
Matti Hamalainen <ccr@tnsp.org>
parents:
2202
diff
changeset
|
334 { |
1ea48084055e
Add functionality for separate palette file handling, reading, writing and
Matti Hamalainen <ccr@tnsp.org>
parents:
2202
diff
changeset
|
335 int res; |
2208
90ec1ec89c56
Revamp the palette handling in lib64gfx somewhat, add helper functions to
Matti Hamalainen <ccr@tnsp.org>
parents:
2207
diff
changeset
|
336 Uint16 tmp1, tmp2; |
2207
1ea48084055e
Add functionality for separate palette file handling, reading, writing and
Matti Hamalainen <ccr@tnsp.org>
parents:
2202
diff
changeset
|
337 |
2457 | 338 // Allocate a palette with 256 entries |
2207
1ea48084055e
Add functionality for separate palette file handling, reading, writing and
Matti Hamalainen <ccr@tnsp.org>
parents:
2202
diff
changeset
|
339 if ((res = dmPaletteAlloc(pdst, 256, -1)) != DMERR_OK) |
1ea48084055e
Add functionality for separate palette file handling, reading, writing and
Matti Hamalainen <ccr@tnsp.org>
parents:
2202
diff
changeset
|
340 return res; |
1ea48084055e
Add functionality for separate palette file handling, reading, writing and
Matti Hamalainen <ccr@tnsp.org>
parents:
2202
diff
changeset
|
341 |
2457 | 342 // Read data for 256 entries |
2207
1ea48084055e
Add functionality for separate palette file handling, reading, writing and
Matti Hamalainen <ccr@tnsp.org>
parents:
2202
diff
changeset
|
343 if ((res = dmPaletteReadData(fp, *pdst, 256)) != DMERR_OK) |
1ea48084055e
Add functionality for separate palette file handling, reading, writing and
Matti Hamalainen <ccr@tnsp.org>
parents:
2202
diff
changeset
|
344 goto error; |
1ea48084055e
Add functionality for separate palette file handling, reading, writing and
Matti Hamalainen <ccr@tnsp.org>
parents:
2202
diff
changeset
|
345 |
2457 | 346 // Read the footer |
2208
90ec1ec89c56
Revamp the palette handling in lib64gfx somewhat, add helper functions to
Matti Hamalainen <ccr@tnsp.org>
parents:
2207
diff
changeset
|
347 if (!dmf_read_be16(fp, &tmp1) || |
90ec1ec89c56
Revamp the palette handling in lib64gfx somewhat, add helper functions to
Matti Hamalainen <ccr@tnsp.org>
parents:
2207
diff
changeset
|
348 !dmf_read_be16(fp, &tmp2)) |
2207
1ea48084055e
Add functionality for separate palette file handling, reading, writing and
Matti Hamalainen <ccr@tnsp.org>
parents:
2202
diff
changeset
|
349 { |
1ea48084055e
Add functionality for separate palette file handling, reading, writing and
Matti Hamalainen <ccr@tnsp.org>
parents:
2202
diff
changeset
|
350 res = DMERR_FREAD; |
1ea48084055e
Add functionality for separate palette file handling, reading, writing and
Matti Hamalainen <ccr@tnsp.org>
parents:
2202
diff
changeset
|
351 goto error; |
1ea48084055e
Add functionality for separate palette file handling, reading, writing and
Matti Hamalainen <ccr@tnsp.org>
parents:
2202
diff
changeset
|
352 } |
1ea48084055e
Add functionality for separate palette file handling, reading, writing and
Matti Hamalainen <ccr@tnsp.org>
parents:
2202
diff
changeset
|
353 |
2457 | 354 // Check for validity |
2208
90ec1ec89c56
Revamp the palette handling in lib64gfx somewhat, add helper functions to
Matti Hamalainen <ccr@tnsp.org>
parents:
2207
diff
changeset
|
355 if (tmp1 == 0 || tmp1 > 256) |
2207
1ea48084055e
Add functionality for separate palette file handling, reading, writing and
Matti Hamalainen <ccr@tnsp.org>
parents:
2202
diff
changeset
|
356 { |
1ea48084055e
Add functionality for separate palette file handling, reading, writing and
Matti Hamalainen <ccr@tnsp.org>
parents:
2202
diff
changeset
|
357 res = DMERR_INVALID_DATA; |
1ea48084055e
Add functionality for separate palette file handling, reading, writing and
Matti Hamalainen <ccr@tnsp.org>
parents:
2202
diff
changeset
|
358 goto error; |
1ea48084055e
Add functionality for separate palette file handling, reading, writing and
Matti Hamalainen <ccr@tnsp.org>
parents:
2202
diff
changeset
|
359 } |
1ea48084055e
Add functionality for separate palette file handling, reading, writing and
Matti Hamalainen <ccr@tnsp.org>
parents:
2202
diff
changeset
|
360 |
2457 | 361 // Resize the palette |
2208
90ec1ec89c56
Revamp the palette handling in lib64gfx somewhat, add helper functions to
Matti Hamalainen <ccr@tnsp.org>
parents:
2207
diff
changeset
|
362 if ((res = dmPaletteResize(pdst, tmp1)) != DMERR_OK) |
90ec1ec89c56
Revamp the palette handling in lib64gfx somewhat, add helper functions to
Matti Hamalainen <ccr@tnsp.org>
parents:
2207
diff
changeset
|
363 goto error; |
90ec1ec89c56
Revamp the palette handling in lib64gfx somewhat, add helper functions to
Matti Hamalainen <ccr@tnsp.org>
parents:
2207
diff
changeset
|
364 |
90ec1ec89c56
Revamp the palette handling in lib64gfx somewhat, add helper functions to
Matti Hamalainen <ccr@tnsp.org>
parents:
2207
diff
changeset
|
365 (*pdst)->ctransp = tmp2 < 256 ? tmp2 : -1; |
90ec1ec89c56
Revamp the palette handling in lib64gfx somewhat, add helper functions to
Matti Hamalainen <ccr@tnsp.org>
parents:
2207
diff
changeset
|
366 |
2207
1ea48084055e
Add functionality for separate palette file handling, reading, writing and
Matti Hamalainen <ccr@tnsp.org>
parents:
2202
diff
changeset
|
367 return res; |
1ea48084055e
Add functionality for separate palette file handling, reading, writing and
Matti Hamalainen <ccr@tnsp.org>
parents:
2202
diff
changeset
|
368 |
1ea48084055e
Add functionality for separate palette file handling, reading, writing and
Matti Hamalainen <ccr@tnsp.org>
parents:
2202
diff
changeset
|
369 error: |
1ea48084055e
Add functionality for separate palette file handling, reading, writing and
Matti Hamalainen <ccr@tnsp.org>
parents:
2202
diff
changeset
|
370 dmPaletteFree(*pdst); |
1ea48084055e
Add functionality for separate palette file handling, reading, writing and
Matti Hamalainen <ccr@tnsp.org>
parents:
2202
diff
changeset
|
371 *pdst = NULL; |
1ea48084055e
Add functionality for separate palette file handling, reading, writing and
Matti Hamalainen <ccr@tnsp.org>
parents:
2202
diff
changeset
|
372 return res; |
1ea48084055e
Add functionality for separate palette file handling, reading, writing and
Matti Hamalainen <ccr@tnsp.org>
parents:
2202
diff
changeset
|
373 } |
1ea48084055e
Add functionality for separate palette file handling, reading, writing and
Matti Hamalainen <ccr@tnsp.org>
parents:
2202
diff
changeset
|
374 |
1ea48084055e
Add functionality for separate palette file handling, reading, writing and
Matti Hamalainen <ccr@tnsp.org>
parents:
2202
diff
changeset
|
375 |
1ea48084055e
Add functionality for separate palette file handling, reading, writing and
Matti Hamalainen <ccr@tnsp.org>
parents:
2202
diff
changeset
|
376 int dmWriteACTPalette(DMResource *fp, const DMPalette *ppal) |
1ea48084055e
Add functionality for separate palette file handling, reading, writing and
Matti Hamalainen <ccr@tnsp.org>
parents:
2202
diff
changeset
|
377 { |
1ea48084055e
Add functionality for separate palette file handling, reading, writing and
Matti Hamalainen <ccr@tnsp.org>
parents:
2202
diff
changeset
|
378 int res; |
1ea48084055e
Add functionality for separate palette file handling, reading, writing and
Matti Hamalainen <ccr@tnsp.org>
parents:
2202
diff
changeset
|
379 |
1ea48084055e
Add functionality for separate palette file handling, reading, writing and
Matti Hamalainen <ccr@tnsp.org>
parents:
2202
diff
changeset
|
380 if ((res = dmPaletteWriteData(fp, ppal, ppal->ncolors, 256)) != DMERR_OK) |
1ea48084055e
Add functionality for separate palette file handling, reading, writing and
Matti Hamalainen <ccr@tnsp.org>
parents:
2202
diff
changeset
|
381 return res; |
1ea48084055e
Add functionality for separate palette file handling, reading, writing and
Matti Hamalainen <ccr@tnsp.org>
parents:
2202
diff
changeset
|
382 |
2208
90ec1ec89c56
Revamp the palette handling in lib64gfx somewhat, add helper functions to
Matti Hamalainen <ccr@tnsp.org>
parents:
2207
diff
changeset
|
383 if (!dmf_write_be16(fp, ppal->ncolors) || |
90ec1ec89c56
Revamp the palette handling in lib64gfx somewhat, add helper functions to
Matti Hamalainen <ccr@tnsp.org>
parents:
2207
diff
changeset
|
384 !dmf_write_be16(fp, ppal->ctransp >= 0 ? ppal->ctransp : 0xffff)) |
2207
1ea48084055e
Add functionality for separate palette file handling, reading, writing and
Matti Hamalainen <ccr@tnsp.org>
parents:
2202
diff
changeset
|
385 return DMERR_FWRITE; |
1ea48084055e
Add functionality for separate palette file handling, reading, writing and
Matti Hamalainen <ccr@tnsp.org>
parents:
2202
diff
changeset
|
386 |
1ea48084055e
Add functionality for separate palette file handling, reading, writing and
Matti Hamalainen <ccr@tnsp.org>
parents:
2202
diff
changeset
|
387 return DMERR_OK; |
1ea48084055e
Add functionality for separate palette file handling, reading, writing and
Matti Hamalainen <ccr@tnsp.org>
parents:
2202
diff
changeset
|
388 } |
1ea48084055e
Add functionality for separate palette file handling, reading, writing and
Matti Hamalainen <ccr@tnsp.org>
parents:
2202
diff
changeset
|
389 |
1ea48084055e
Add functionality for separate palette file handling, reading, writing and
Matti Hamalainen <ccr@tnsp.org>
parents:
2202
diff
changeset
|
390 |
2209
7a0af15fbe97
Add support for 'raw' 768 byte palette files.
Matti Hamalainen <ccr@tnsp.org>
parents:
2208
diff
changeset
|
391 static int fmtProbeRAWPalette(const Uint8 *buf, const size_t len) |
7a0af15fbe97
Add support for 'raw' 768 byte palette files.
Matti Hamalainen <ccr@tnsp.org>
parents:
2208
diff
changeset
|
392 { |
2211
ef9b55c879d6
Silence a unused function argument warning.
Matti Hamalainen <ccr@tnsp.org>
parents:
2209
diff
changeset
|
393 (void) buf; |
ef9b55c879d6
Silence a unused function argument warning.
Matti Hamalainen <ccr@tnsp.org>
parents:
2209
diff
changeset
|
394 |
2209
7a0af15fbe97
Add support for 'raw' 768 byte palette files.
Matti Hamalainen <ccr@tnsp.org>
parents:
2208
diff
changeset
|
395 if (len == 0x300) |
7a0af15fbe97
Add support for 'raw' 768 byte palette files.
Matti Hamalainen <ccr@tnsp.org>
parents:
2208
diff
changeset
|
396 return DM_PROBE_SCORE_MAX; |
7a0af15fbe97
Add support for 'raw' 768 byte palette files.
Matti Hamalainen <ccr@tnsp.org>
parents:
2208
diff
changeset
|
397 |
7a0af15fbe97
Add support for 'raw' 768 byte palette files.
Matti Hamalainen <ccr@tnsp.org>
parents:
2208
diff
changeset
|
398 return DM_PROBE_SCORE_FALSE; |
7a0af15fbe97
Add support for 'raw' 768 byte palette files.
Matti Hamalainen <ccr@tnsp.org>
parents:
2208
diff
changeset
|
399 } |
7a0af15fbe97
Add support for 'raw' 768 byte palette files.
Matti Hamalainen <ccr@tnsp.org>
parents:
2208
diff
changeset
|
400 |
7a0af15fbe97
Add support for 'raw' 768 byte palette files.
Matti Hamalainen <ccr@tnsp.org>
parents:
2208
diff
changeset
|
401 |
7a0af15fbe97
Add support for 'raw' 768 byte palette files.
Matti Hamalainen <ccr@tnsp.org>
parents:
2208
diff
changeset
|
402 int dmReadRAWPalette(DMResource *fp, DMPalette **pdst) |
7a0af15fbe97
Add support for 'raw' 768 byte palette files.
Matti Hamalainen <ccr@tnsp.org>
parents:
2208
diff
changeset
|
403 { |
7a0af15fbe97
Add support for 'raw' 768 byte palette files.
Matti Hamalainen <ccr@tnsp.org>
parents:
2208
diff
changeset
|
404 int res; |
7a0af15fbe97
Add support for 'raw' 768 byte palette files.
Matti Hamalainen <ccr@tnsp.org>
parents:
2208
diff
changeset
|
405 |
7a0af15fbe97
Add support for 'raw' 768 byte palette files.
Matti Hamalainen <ccr@tnsp.org>
parents:
2208
diff
changeset
|
406 if ((res = dmPaletteAlloc(pdst, 256, -1)) != DMERR_OK) |
7a0af15fbe97
Add support for 'raw' 768 byte palette files.
Matti Hamalainen <ccr@tnsp.org>
parents:
2208
diff
changeset
|
407 return res; |
7a0af15fbe97
Add support for 'raw' 768 byte palette files.
Matti Hamalainen <ccr@tnsp.org>
parents:
2208
diff
changeset
|
408 |
7a0af15fbe97
Add support for 'raw' 768 byte palette files.
Matti Hamalainen <ccr@tnsp.org>
parents:
2208
diff
changeset
|
409 if ((res = dmPaletteReadData(fp, *pdst, 256)) != DMERR_OK) |
7a0af15fbe97
Add support for 'raw' 768 byte palette files.
Matti Hamalainen <ccr@tnsp.org>
parents:
2208
diff
changeset
|
410 goto error; |
7a0af15fbe97
Add support for 'raw' 768 byte palette files.
Matti Hamalainen <ccr@tnsp.org>
parents:
2208
diff
changeset
|
411 |
7a0af15fbe97
Add support for 'raw' 768 byte palette files.
Matti Hamalainen <ccr@tnsp.org>
parents:
2208
diff
changeset
|
412 return res; |
7a0af15fbe97
Add support for 'raw' 768 byte palette files.
Matti Hamalainen <ccr@tnsp.org>
parents:
2208
diff
changeset
|
413 |
7a0af15fbe97
Add support for 'raw' 768 byte palette files.
Matti Hamalainen <ccr@tnsp.org>
parents:
2208
diff
changeset
|
414 error: |
7a0af15fbe97
Add support for 'raw' 768 byte palette files.
Matti Hamalainen <ccr@tnsp.org>
parents:
2208
diff
changeset
|
415 dmPaletteFree(*pdst); |
7a0af15fbe97
Add support for 'raw' 768 byte palette files.
Matti Hamalainen <ccr@tnsp.org>
parents:
2208
diff
changeset
|
416 *pdst = NULL; |
7a0af15fbe97
Add support for 'raw' 768 byte palette files.
Matti Hamalainen <ccr@tnsp.org>
parents:
2208
diff
changeset
|
417 return res; |
7a0af15fbe97
Add support for 'raw' 768 byte palette files.
Matti Hamalainen <ccr@tnsp.org>
parents:
2208
diff
changeset
|
418 } |
7a0af15fbe97
Add support for 'raw' 768 byte palette files.
Matti Hamalainen <ccr@tnsp.org>
parents:
2208
diff
changeset
|
419 |
7a0af15fbe97
Add support for 'raw' 768 byte palette files.
Matti Hamalainen <ccr@tnsp.org>
parents:
2208
diff
changeset
|
420 |
7a0af15fbe97
Add support for 'raw' 768 byte palette files.
Matti Hamalainen <ccr@tnsp.org>
parents:
2208
diff
changeset
|
421 int dmWriteRAWPalette(DMResource *fp, const DMPalette *ppal) |
7a0af15fbe97
Add support for 'raw' 768 byte palette files.
Matti Hamalainen <ccr@tnsp.org>
parents:
2208
diff
changeset
|
422 { |
7a0af15fbe97
Add support for 'raw' 768 byte palette files.
Matti Hamalainen <ccr@tnsp.org>
parents:
2208
diff
changeset
|
423 int res; |
7a0af15fbe97
Add support for 'raw' 768 byte palette files.
Matti Hamalainen <ccr@tnsp.org>
parents:
2208
diff
changeset
|
424 |
7a0af15fbe97
Add support for 'raw' 768 byte palette files.
Matti Hamalainen <ccr@tnsp.org>
parents:
2208
diff
changeset
|
425 if ((res = dmPaletteWriteData(fp, ppal, ppal->ncolors, 256)) != DMERR_OK) |
7a0af15fbe97
Add support for 'raw' 768 byte palette files.
Matti Hamalainen <ccr@tnsp.org>
parents:
2208
diff
changeset
|
426 return res; |
7a0af15fbe97
Add support for 'raw' 768 byte palette files.
Matti Hamalainen <ccr@tnsp.org>
parents:
2208
diff
changeset
|
427 |
7a0af15fbe97
Add support for 'raw' 768 byte palette files.
Matti Hamalainen <ccr@tnsp.org>
parents:
2208
diff
changeset
|
428 return DMERR_OK; |
7a0af15fbe97
Add support for 'raw' 768 byte palette files.
Matti Hamalainen <ccr@tnsp.org>
parents:
2208
diff
changeset
|
429 } |
7a0af15fbe97
Add support for 'raw' 768 byte palette files.
Matti Hamalainen <ccr@tnsp.org>
parents:
2208
diff
changeset
|
430 |
7a0af15fbe97
Add support for 'raw' 768 byte palette files.
Matti Hamalainen <ccr@tnsp.org>
parents:
2208
diff
changeset
|
431 |
2091 | 432 int dmWriteImageData(const DMImage *img, void *cbdata, |
433 int (*writeRowCB)(void *, const Uint8 *, const size_t), | |
2156
e6ec7fad9ce2
Rename DMImageConvSpec to DMImageWriteSpec to better reflec the struct's purpose.
Matti Hamalainen <ccr@tnsp.org>
parents:
2154
diff
changeset
|
434 const DMImageWriteSpec *spec) |
435 | 435 { |
436 int x, y, yscale, xscale, res = 0, rowSize, rowWidth; | |
437 Uint8 *row = NULL; | |
438 | |
439 // Allocate memory for row buffer | |
902
c6c480e8e1c8
Add separate X and Y scaling to gfxconv and libgfx outputters.
Matti Hamalainen <ccr@tnsp.org>
parents:
858
diff
changeset
|
440 rowWidth = img->width * spec->scaleX; |
2157
9a9493809b3a
Rename DM_COLFMT_* constants to DM_PIXFMT_* and the 'format' field of DMImage
Matti Hamalainen <ccr@tnsp.org>
parents:
2156
diff
changeset
|
441 rowSize = rowWidth * dmImageGetBytesPerPixel(spec->pixfmt); |
435 | 442 |
443 if ((row = dmMalloc(rowSize + 16)) == NULL) | |
444 { | |
445 res = DMERR_MALLOC; | |
446 goto done; | |
447 } | |
448 | |
449 // Generate the image | |
450 for (y = 0; y < img->height; y++) | |
451 { | |
436
86f956e4580f
Cosmetics, rename a variable.
Matti Hamalainen <ccr@tnsp.org>
parents:
435
diff
changeset
|
452 Uint8 *ptr1 = row, |
435 | 453 *ptr2 = ptr1 + rowWidth, |
1291 | 454 *ptr3 = ptr2 + rowWidth, |
455 *ptr4 = ptr3 + rowWidth; | |
435 | 456 |
2157
9a9493809b3a
Rename DM_COLFMT_* constants to DM_PIXFMT_* and the 'format' field of DMImage
Matti Hamalainen <ccr@tnsp.org>
parents:
2156
diff
changeset
|
457 if (img->pixfmt == DM_PIXFMT_GRAYSCALE) |
2098 | 458 { |
459 for (x = 0; x < img->width; x++) | |
460 { | |
461 Uint8 c = img->data[(y * img->pitch) + (x * img->bpp) / 8]; | |
462 | |
2157
9a9493809b3a
Rename DM_COLFMT_* constants to DM_PIXFMT_* and the 'format' field of DMImage
Matti Hamalainen <ccr@tnsp.org>
parents:
2156
diff
changeset
|
463 switch (spec->pixfmt) |
2098 | 464 { |
2157
9a9493809b3a
Rename DM_COLFMT_* constants to DM_PIXFMT_* and the 'format' field of DMImage
Matti Hamalainen <ccr@tnsp.org>
parents:
2156
diff
changeset
|
465 case DM_PIXFMT_PALETTE: |
9a9493809b3a
Rename DM_COLFMT_* constants to DM_PIXFMT_* and the 'format' field of DMImage
Matti Hamalainen <ccr@tnsp.org>
parents:
2156
diff
changeset
|
466 case DM_PIXFMT_GRAYSCALE: |
2098 | 467 for (xscale = 0; xscale < spec->scaleX; xscale++) |
468 *ptr1++ = c; | |
469 break; | |
470 | |
2157
9a9493809b3a
Rename DM_COLFMT_* constants to DM_PIXFMT_* and the 'format' field of DMImage
Matti Hamalainen <ccr@tnsp.org>
parents:
2156
diff
changeset
|
471 case DM_PIXFMT_RGBA: |
2098 | 472 if (spec->planar) |
473 { | |
474 for (xscale = 0; xscale < spec->scaleX; xscale++) | |
475 { | |
476 *ptr1++ = c; | |
477 *ptr2++ = c; | |
478 *ptr3++ = c; | |
479 *ptr4++ = 0xff; | |
480 } | |
481 } | |
482 else | |
483 { | |
484 for (xscale = 0; xscale < spec->scaleX; xscale++) | |
485 { | |
486 *ptr1++ = c; | |
487 *ptr1++ = c; | |
488 *ptr1++ = c; | |
489 *ptr1++ = 0xff; | |
490 } | |
491 } | |
492 break; | |
493 | |
2157
9a9493809b3a
Rename DM_COLFMT_* constants to DM_PIXFMT_* and the 'format' field of DMImage
Matti Hamalainen <ccr@tnsp.org>
parents:
2156
diff
changeset
|
494 case DM_PIXFMT_RGB: |
2098 | 495 if (spec->planar) |
496 { | |
497 for (xscale = 0; xscale < spec->scaleX; xscale++) | |
498 { | |
499 *ptr1++ = c; | |
500 *ptr2++ = c; | |
501 *ptr3++ = c; | |
502 } | |
503 } | |
504 else | |
505 { | |
506 for (xscale = 0; xscale < spec->scaleX; xscale++) | |
507 { | |
508 *ptr1++ = c; | |
509 *ptr1++ = c; | |
510 *ptr1++ = c; | |
511 } | |
512 } | |
513 break; | |
514 | |
515 default: | |
516 res = DMERR_NOT_SUPPORTED; | |
517 goto done; | |
518 } | |
519 } | |
520 } | |
521 else | |
2157
9a9493809b3a
Rename DM_COLFMT_* constants to DM_PIXFMT_* and the 'format' field of DMImage
Matti Hamalainen <ccr@tnsp.org>
parents:
2156
diff
changeset
|
522 if (img->pixfmt == DM_PIXFMT_PALETTE) |
435 | 523 { |
2094
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
524 for (x = 0; x < img->width; x++) |
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
525 { |
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
526 Uint8 c = img->data[(y * img->pitch) + (x * img->bpp) / 8], |
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
527 qr, qg, qb, qa; |
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
528 |
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
529 if (c >= img->pal->ncolors) |
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
530 { |
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
531 res = DMERR_INVALID_DATA; |
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
532 goto done; |
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
533 } |
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
534 |
2157
9a9493809b3a
Rename DM_COLFMT_* constants to DM_PIXFMT_* and the 'format' field of DMImage
Matti Hamalainen <ccr@tnsp.org>
parents:
2156
diff
changeset
|
535 switch (spec->pixfmt) |
2094
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
536 { |
2157
9a9493809b3a
Rename DM_COLFMT_* constants to DM_PIXFMT_* and the 'format' field of DMImage
Matti Hamalainen <ccr@tnsp.org>
parents:
2156
diff
changeset
|
537 case DM_PIXFMT_PALETTE: |
9a9493809b3a
Rename DM_COLFMT_* constants to DM_PIXFMT_* and the 'format' field of DMImage
Matti Hamalainen <ccr@tnsp.org>
parents:
2156
diff
changeset
|
538 case DM_PIXFMT_GRAYSCALE: |
2094
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
539 for (xscale = 0; xscale < spec->scaleX; xscale++) |
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
540 *ptr1++ = c; |
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
541 break; |
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
542 |
2157
9a9493809b3a
Rename DM_COLFMT_* constants to DM_PIXFMT_* and the 'format' field of DMImage
Matti Hamalainen <ccr@tnsp.org>
parents:
2156
diff
changeset
|
543 case DM_PIXFMT_RGBA: |
2094
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
544 qr = img->pal->colors[c].r; |
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
545 qg = img->pal->colors[c].g; |
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
546 qb = img->pal->colors[c].b; |
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
547 qa = img->pal->colors[c].a; |
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
548 |
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
549 if (spec->planar) |
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
550 { |
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
551 for (xscale = 0; xscale < spec->scaleX; xscale++) |
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
552 { |
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
553 *ptr1++ = qr; |
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
554 *ptr2++ = qg; |
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
555 *ptr3++ = qb; |
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
556 *ptr4++ = qa; |
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
557 } |
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
558 } |
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
559 else |
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
560 { |
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
561 for (xscale = 0; xscale < spec->scaleX; xscale++) |
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
562 { |
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
563 *ptr1++ = qr; |
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
564 *ptr1++ = qg; |
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
565 *ptr1++ = qb; |
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
566 *ptr1++ = qa; |
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
567 } |
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
568 } |
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
569 break; |
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
570 |
2157
9a9493809b3a
Rename DM_COLFMT_* constants to DM_PIXFMT_* and the 'format' field of DMImage
Matti Hamalainen <ccr@tnsp.org>
parents:
2156
diff
changeset
|
571 case DM_PIXFMT_RGB: |
2094
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
572 qr = img->pal->colors[c].r; |
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
573 qg = img->pal->colors[c].g; |
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
574 qb = img->pal->colors[c].b; |
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
575 |
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
576 if (spec->planar) |
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
577 { |
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
578 for (xscale = 0; xscale < spec->scaleX; xscale++) |
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
579 { |
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
580 *ptr1++ = qr; |
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
581 *ptr2++ = qg; |
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
582 *ptr3++ = qb; |
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
583 } |
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
584 } |
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
585 else |
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
586 { |
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
587 for (xscale = 0; xscale < spec->scaleX; xscale++) |
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
588 { |
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
589 *ptr1++ = qr; |
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
590 *ptr1++ = qg; |
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
591 *ptr1++ = qb; |
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
592 } |
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
593 } |
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
594 break; |
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
595 |
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
596 default: |
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
597 res = DMERR_NOT_SUPPORTED; |
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
598 goto done; |
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
599 } |
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
600 } |
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
601 } |
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
602 else |
2157
9a9493809b3a
Rename DM_COLFMT_* constants to DM_PIXFMT_* and the 'format' field of DMImage
Matti Hamalainen <ccr@tnsp.org>
parents:
2156
diff
changeset
|
603 if (img->pixfmt == DM_PIXFMT_RGB || |
9a9493809b3a
Rename DM_COLFMT_* constants to DM_PIXFMT_* and the 'format' field of DMImage
Matti Hamalainen <ccr@tnsp.org>
parents:
2156
diff
changeset
|
604 img->pixfmt == DM_PIXFMT_RGBA) |
2094
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
605 { |
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
606 Uint8 *sp = img->data + (y * img->pitch); |
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
607 |
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
608 for (x = 0; x < img->width; x++, sp += img->bpp / 8) |
2157
9a9493809b3a
Rename DM_COLFMT_* constants to DM_PIXFMT_* and the 'format' field of DMImage
Matti Hamalainen <ccr@tnsp.org>
parents:
2156
diff
changeset
|
609 switch (spec->pixfmt) |
435 | 610 { |
2157
9a9493809b3a
Rename DM_COLFMT_* constants to DM_PIXFMT_* and the 'format' field of DMImage
Matti Hamalainen <ccr@tnsp.org>
parents:
2156
diff
changeset
|
611 case DM_PIXFMT_RGBA: |
1291 | 612 if (spec->planar) |
435 | 613 { |
1291 | 614 for (xscale = 0; xscale < spec->scaleX; xscale++) |
615 { | |
2094
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
616 *ptr1++ = sp[0]; |
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
617 *ptr2++ = sp[1]; |
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
618 *ptr3++ = sp[2]; |
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
619 *ptr4++ = sp[3]; |
1291 | 620 } |
621 } | |
622 else | |
623 { | |
624 for (xscale = 0; xscale < spec->scaleX; xscale++) | |
625 { | |
2094
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
626 *ptr1++ = sp[0]; |
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
627 *ptr1++ = sp[1]; |
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
628 *ptr1++ = sp[2]; |
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
629 *ptr1++ = sp[3]; |
1291 | 630 } |
435 | 631 } |
632 break; | |
633 | |
2157
9a9493809b3a
Rename DM_COLFMT_* constants to DM_PIXFMT_* and the 'format' field of DMImage
Matti Hamalainen <ccr@tnsp.org>
parents:
2156
diff
changeset
|
634 case DM_PIXFMT_RGB: |
1291 | 635 if (spec->planar) |
435 | 636 { |
1291 | 637 for (xscale = 0; xscale < spec->scaleX; xscale++) |
638 { | |
2094
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
639 *ptr1++ = sp[0]; |
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
640 *ptr2++ = sp[1]; |
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
641 *ptr3++ = sp[2]; |
1291 | 642 } |
435 | 643 } |
1291 | 644 else |
435 | 645 { |
1291 | 646 for (xscale = 0; xscale < spec->scaleX; xscale++) |
647 { | |
2094
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
648 *ptr1++ = sp[0]; |
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
649 *ptr1++ = sp[1]; |
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
650 *ptr1++ = sp[2]; |
1291 | 651 } |
435 | 652 } |
653 break; | |
2094
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
654 |
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
655 default: |
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
656 res = DMERR_NOT_SUPPORTED; |
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
657 goto done; |
435 | 658 } |
659 } | |
660 | |
902
c6c480e8e1c8
Add separate X and Y scaling to gfxconv and libgfx outputters.
Matti Hamalainen <ccr@tnsp.org>
parents:
858
diff
changeset
|
661 for (yscale = 0; yscale < spec->scaleY; yscale++) |
435 | 662 { |
808
f8126fa1df9b
Use dmlib error code return value in cases where a plain boolean was used
Matti Hamalainen <ccr@tnsp.org>
parents:
800
diff
changeset
|
663 if ((res = writeRowCB(cbdata, row, rowSize)) != DMERR_OK) |
435 | 664 goto done; |
665 } | |
666 } | |
667 | |
668 done: | |
1102
e06abfde6c39
Cosmetics pass: Remove excess whitespace.
Matti Hamalainen <ccr@tnsp.org>
parents:
958
diff
changeset
|
669 dmFree(row); |
435 | 670 return res; |
671 } | |
672 | |
673 | |
1886
1af79412f249
Remove the stdio FILE support from libgfx API, now only DMResource is supported.
Matti Hamalainen <ccr@tnsp.org>
parents:
1881
diff
changeset
|
674 #define DMCOL(x) (((x) >> 4) & 0xf) |
1af79412f249
Remove the stdio FILE support from libgfx API, now only DMResource is supported.
Matti Hamalainen <ccr@tnsp.org>
parents:
1881
diff
changeset
|
675 |
1af79412f249
Remove the stdio FILE support from libgfx API, now only DMResource is supported.
Matti Hamalainen <ccr@tnsp.org>
parents:
1881
diff
changeset
|
676 int dmWriteIFFMasterRAWHeader( |
1af79412f249
Remove the stdio FILE support from libgfx API, now only DMResource is supported.
Matti Hamalainen <ccr@tnsp.org>
parents:
1881
diff
changeset
|
677 DMResource *fp, const char *filename, const char *prefix, |
2156
e6ec7fad9ce2
Rename DMImageConvSpec to DMImageWriteSpec to better reflec the struct's purpose.
Matti Hamalainen <ccr@tnsp.org>
parents:
2154
diff
changeset
|
678 const DMImage *img, const DMImageWriteSpec *spec) |
1886
1af79412f249
Remove the stdio FILE support from libgfx API, now only DMResource is supported.
Matti Hamalainen <ccr@tnsp.org>
parents:
1881
diff
changeset
|
679 { |
2049
a945a5f2fd70
Improve the cdump output format support of gfxconv. Also add some error handling.
Matti Hamalainen <ccr@tnsp.org>
parents:
2047
diff
changeset
|
680 if (dmfprintf(fp, |
1886
1af79412f249
Remove the stdio FILE support from libgfx API, now only DMResource is supported.
Matti Hamalainen <ccr@tnsp.org>
parents:
1881
diff
changeset
|
681 "%s_width: dw.w %d\n" |
1af79412f249
Remove the stdio FILE support from libgfx API, now only DMResource is supported.
Matti Hamalainen <ccr@tnsp.org>
parents:
1881
diff
changeset
|
682 "%s_height: dw.w %d\n" |
1af79412f249
Remove the stdio FILE support from libgfx API, now only DMResource is supported.
Matti Hamalainen <ccr@tnsp.org>
parents:
1881
diff
changeset
|
683 "%s_nplanes: dw.w %d\n", |
1af79412f249
Remove the stdio FILE support from libgfx API, now only DMResource is supported.
Matti Hamalainen <ccr@tnsp.org>
parents:
1881
diff
changeset
|
684 prefix, img->width * spec->scaleX, |
1af79412f249
Remove the stdio FILE support from libgfx API, now only DMResource is supported.
Matti Hamalainen <ccr@tnsp.org>
parents:
1881
diff
changeset
|
685 prefix, img->height * spec->scaleY, |
2049
a945a5f2fd70
Improve the cdump output format support of gfxconv. Also add some error handling.
Matti Hamalainen <ccr@tnsp.org>
parents:
2047
diff
changeset
|
686 prefix, spec->nplanes) < 0) |
a945a5f2fd70
Improve the cdump output format support of gfxconv. Also add some error handling.
Matti Hamalainen <ccr@tnsp.org>
parents:
2047
diff
changeset
|
687 return dmferror(fp); |
1886
1af79412f249
Remove the stdio FILE support from libgfx API, now only DMResource is supported.
Matti Hamalainen <ccr@tnsp.org>
parents:
1881
diff
changeset
|
688 |
2145
0905b2a87cbd
Write ARAW palette only if it exists.
Matti Hamalainen <ccr@tnsp.org>
parents:
2101
diff
changeset
|
689 if (spec->fmtid == DM_IMGFMT_ARAW && |
2157
9a9493809b3a
Rename DM_COLFMT_* constants to DM_PIXFMT_* and the 'format' field of DMImage
Matti Hamalainen <ccr@tnsp.org>
parents:
2156
diff
changeset
|
690 img->pixfmt == DM_PIXFMT_PALETTE && |
2145
0905b2a87cbd
Write ARAW palette only if it exists.
Matti Hamalainen <ccr@tnsp.org>
parents:
2101
diff
changeset
|
691 img->pal != NULL) |
1886
1af79412f249
Remove the stdio FILE support from libgfx API, now only DMResource is supported.
Matti Hamalainen <ccr@tnsp.org>
parents:
1881
diff
changeset
|
692 { |
2049
a945a5f2fd70
Improve the cdump output format support of gfxconv. Also add some error handling.
Matti Hamalainen <ccr@tnsp.org>
parents:
2047
diff
changeset
|
693 if (dmfprintf(fp, |
1886
1af79412f249
Remove the stdio FILE support from libgfx API, now only DMResource is supported.
Matti Hamalainen <ccr@tnsp.org>
parents:
1881
diff
changeset
|
694 "%s_ncolors: dw.w %d\n" |
1af79412f249
Remove the stdio FILE support from libgfx API, now only DMResource is supported.
Matti Hamalainen <ccr@tnsp.org>
parents:
1881
diff
changeset
|
695 "%s_palette:\n", |
2094
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
696 prefix, img->pal->ncolors, |
2049
a945a5f2fd70
Improve the cdump output format support of gfxconv. Also add some error handling.
Matti Hamalainen <ccr@tnsp.org>
parents:
2047
diff
changeset
|
697 prefix) < 0) |
a945a5f2fd70
Improve the cdump output format support of gfxconv. Also add some error handling.
Matti Hamalainen <ccr@tnsp.org>
parents:
2047
diff
changeset
|
698 return dmferror(fp); |
1886
1af79412f249
Remove the stdio FILE support from libgfx API, now only DMResource is supported.
Matti Hamalainen <ccr@tnsp.org>
parents:
1881
diff
changeset
|
699 |
1af79412f249
Remove the stdio FILE support from libgfx API, now only DMResource is supported.
Matti Hamalainen <ccr@tnsp.org>
parents:
1881
diff
changeset
|
700 for (int i = 0; i < (1 << spec->nplanes); i++) |
1af79412f249
Remove the stdio FILE support from libgfx API, now only DMResource is supported.
Matti Hamalainen <ccr@tnsp.org>
parents:
1881
diff
changeset
|
701 { |
1af79412f249
Remove the stdio FILE support from libgfx API, now only DMResource is supported.
Matti Hamalainen <ccr@tnsp.org>
parents:
1881
diff
changeset
|
702 Uint32 color; |
2094
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
703 if (i < img->pal->ncolors) |
1886
1af79412f249
Remove the stdio FILE support from libgfx API, now only DMResource is supported.
Matti Hamalainen <ccr@tnsp.org>
parents:
1881
diff
changeset
|
704 { |
2094
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
705 color = (DMCOL(img->pal->colors[i].r) << 8) | |
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
706 (DMCOL(img->pal->colors[i].g) << 4) | |
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
707 (DMCOL(img->pal->colors[i].b)); |
1886
1af79412f249
Remove the stdio FILE support from libgfx API, now only DMResource is supported.
Matti Hamalainen <ccr@tnsp.org>
parents:
1881
diff
changeset
|
708 } |
1af79412f249
Remove the stdio FILE support from libgfx API, now only DMResource is supported.
Matti Hamalainen <ccr@tnsp.org>
parents:
1881
diff
changeset
|
709 else |
1af79412f249
Remove the stdio FILE support from libgfx API, now only DMResource is supported.
Matti Hamalainen <ccr@tnsp.org>
parents:
1881
diff
changeset
|
710 color = 0; |
1af79412f249
Remove the stdio FILE support from libgfx API, now only DMResource is supported.
Matti Hamalainen <ccr@tnsp.org>
parents:
1881
diff
changeset
|
711 |
2049
a945a5f2fd70
Improve the cdump output format support of gfxconv. Also add some error handling.
Matti Hamalainen <ccr@tnsp.org>
parents:
2047
diff
changeset
|
712 if (dmfprintf(fp, |
1886
1af79412f249
Remove the stdio FILE support from libgfx API, now only DMResource is supported.
Matti Hamalainen <ccr@tnsp.org>
parents:
1881
diff
changeset
|
713 "\tdc.w $%04X\n", |
2049
a945a5f2fd70
Improve the cdump output format support of gfxconv. Also add some error handling.
Matti Hamalainen <ccr@tnsp.org>
parents:
2047
diff
changeset
|
714 color) < 0) |
a945a5f2fd70
Improve the cdump output format support of gfxconv. Also add some error handling.
Matti Hamalainen <ccr@tnsp.org>
parents:
2047
diff
changeset
|
715 return dmferror(fp); |
1886
1af79412f249
Remove the stdio FILE support from libgfx API, now only DMResource is supported.
Matti Hamalainen <ccr@tnsp.org>
parents:
1881
diff
changeset
|
716 } |
1af79412f249
Remove the stdio FILE support from libgfx API, now only DMResource is supported.
Matti Hamalainen <ccr@tnsp.org>
parents:
1881
diff
changeset
|
717 |
2049
a945a5f2fd70
Improve the cdump output format support of gfxconv. Also add some error handling.
Matti Hamalainen <ccr@tnsp.org>
parents:
2047
diff
changeset
|
718 if (dmfprintf(fp, |
1886
1af79412f249
Remove the stdio FILE support from libgfx API, now only DMResource is supported.
Matti Hamalainen <ccr@tnsp.org>
parents:
1881
diff
changeset
|
719 "%s: incbin \"%s\"\n", |
2049
a945a5f2fd70
Improve the cdump output format support of gfxconv. Also add some error handling.
Matti Hamalainen <ccr@tnsp.org>
parents:
2047
diff
changeset
|
720 prefix, filename) < 0) |
a945a5f2fd70
Improve the cdump output format support of gfxconv. Also add some error handling.
Matti Hamalainen <ccr@tnsp.org>
parents:
2047
diff
changeset
|
721 return dmferror(fp); |
1886
1af79412f249
Remove the stdio FILE support from libgfx API, now only DMResource is supported.
Matti Hamalainen <ccr@tnsp.org>
parents:
1881
diff
changeset
|
722 } |
1af79412f249
Remove the stdio FILE support from libgfx API, now only DMResource is supported.
Matti Hamalainen <ccr@tnsp.org>
parents:
1881
diff
changeset
|
723 |
1887
297aa8f0ca7f
Return DMERR_OK instead of dmferror(fp) dmWriteIFFMasterRAWHeader().
Matti Hamalainen <ccr@tnsp.org>
parents:
1886
diff
changeset
|
724 return DMERR_OK; |
1886
1af79412f249
Remove the stdio FILE support from libgfx API, now only DMResource is supported.
Matti Hamalainen <ccr@tnsp.org>
parents:
1881
diff
changeset
|
725 } |
1af79412f249
Remove the stdio FILE support from libgfx API, now only DMResource is supported.
Matti Hamalainen <ccr@tnsp.org>
parents:
1881
diff
changeset
|
726 |
1af79412f249
Remove the stdio FILE support from libgfx API, now only DMResource is supported.
Matti Hamalainen <ccr@tnsp.org>
parents:
1881
diff
changeset
|
727 |
2086
aedadff9e116
Implement dmGetBits() to the DMBitStreamContext API. Also improve error handling.
Matti Hamalainen <ccr@tnsp.org>
parents:
2085
diff
changeset
|
728 static int dmWriteRAWRow(DMBitStreamContext *bs, const DMImage *img, |
2156
e6ec7fad9ce2
Rename DMImageConvSpec to DMImageWriteSpec to better reflec the struct's purpose.
Matti Hamalainen <ccr@tnsp.org>
parents:
2154
diff
changeset
|
729 const DMImageWriteSpec *spec, const int yc, const int plane) |
1872
fe15412eec10
Actually fix also the ARAW/RAW image data writing to honor the scaling.
Matti Hamalainen <ccr@tnsp.org>
parents:
1814
diff
changeset
|
730 { |
fe15412eec10
Actually fix also the ARAW/RAW image data writing to honor the scaling.
Matti Hamalainen <ccr@tnsp.org>
parents:
1814
diff
changeset
|
731 const Uint8 *sp = img->data + (yc * img->pitch); |
fe15412eec10
Actually fix also the ARAW/RAW image data writing to honor the scaling.
Matti Hamalainen <ccr@tnsp.org>
parents:
1814
diff
changeset
|
732 for (int xc = 0; xc < img->width; xc++) |
fe15412eec10
Actually fix also the ARAW/RAW image data writing to honor the scaling.
Matti Hamalainen <ccr@tnsp.org>
parents:
1814
diff
changeset
|
733 { |
2086
aedadff9e116
Implement dmGetBits() to the DMBitStreamContext API. Also improve error handling.
Matti Hamalainen <ccr@tnsp.org>
parents:
2085
diff
changeset
|
734 int res; |
1872
fe15412eec10
Actually fix also the ARAW/RAW image data writing to honor the scaling.
Matti Hamalainen <ccr@tnsp.org>
parents:
1814
diff
changeset
|
735 for (int xscale = 0; xscale < spec->scaleX; xscale++) |
2086
aedadff9e116
Implement dmGetBits() to the DMBitStreamContext API. Also improve error handling.
Matti Hamalainen <ccr@tnsp.org>
parents:
2085
diff
changeset
|
736 if ((res = dmPutBits(bs, (sp[xc] >> plane) & 1, 1)) != DMERR_OK) |
aedadff9e116
Implement dmGetBits() to the DMBitStreamContext API. Also improve error handling.
Matti Hamalainen <ccr@tnsp.org>
parents:
2085
diff
changeset
|
737 return res; |
1872
fe15412eec10
Actually fix also the ARAW/RAW image data writing to honor the scaling.
Matti Hamalainen <ccr@tnsp.org>
parents:
1814
diff
changeset
|
738 } |
2086
aedadff9e116
Implement dmGetBits() to the DMBitStreamContext API. Also improve error handling.
Matti Hamalainen <ccr@tnsp.org>
parents:
2085
diff
changeset
|
739 return DMERR_OK; |
aedadff9e116
Implement dmGetBits() to the DMBitStreamContext API. Also improve error handling.
Matti Hamalainen <ccr@tnsp.org>
parents:
2085
diff
changeset
|
740 } |
aedadff9e116
Implement dmGetBits() to the DMBitStreamContext API. Also improve error handling.
Matti Hamalainen <ccr@tnsp.org>
parents:
2085
diff
changeset
|
741 |
aedadff9e116
Implement dmGetBits() to the DMBitStreamContext API. Also improve error handling.
Matti Hamalainen <ccr@tnsp.org>
parents:
2085
diff
changeset
|
742 |
aedadff9e116
Implement dmGetBits() to the DMBitStreamContext API. Also improve error handling.
Matti Hamalainen <ccr@tnsp.org>
parents:
2085
diff
changeset
|
743 static int dmPutByteRes(DMBitStreamContext *ctx) |
aedadff9e116
Implement dmGetBits() to the DMBitStreamContext API. Also improve error handling.
Matti Hamalainen <ccr@tnsp.org>
parents:
2085
diff
changeset
|
744 { |
aedadff9e116
Implement dmGetBits() to the DMBitStreamContext API. Also improve error handling.
Matti Hamalainen <ccr@tnsp.org>
parents:
2085
diff
changeset
|
745 DMResource *fp = (DMResource *) ctx->handle; |
aedadff9e116
Implement dmGetBits() to the DMBitStreamContext API. Also improve error handling.
Matti Hamalainen <ccr@tnsp.org>
parents:
2085
diff
changeset
|
746 |
aedadff9e116
Implement dmGetBits() to the DMBitStreamContext API. Also improve error handling.
Matti Hamalainen <ccr@tnsp.org>
parents:
2085
diff
changeset
|
747 if (!dmf_write_byte(fp, ctx->outBuf & 0xff)) |
aedadff9e116
Implement dmGetBits() to the DMBitStreamContext API. Also improve error handling.
Matti Hamalainen <ccr@tnsp.org>
parents:
2085
diff
changeset
|
748 return dmferror(fp); |
aedadff9e116
Implement dmGetBits() to the DMBitStreamContext API. Also improve error handling.
Matti Hamalainen <ccr@tnsp.org>
parents:
2085
diff
changeset
|
749 else |
aedadff9e116
Implement dmGetBits() to the DMBitStreamContext API. Also improve error handling.
Matti Hamalainen <ccr@tnsp.org>
parents:
2085
diff
changeset
|
750 return DMERR_OK; |
1872
fe15412eec10
Actually fix also the ARAW/RAW image data writing to honor the scaling.
Matti Hamalainen <ccr@tnsp.org>
parents:
1814
diff
changeset
|
751 } |
fe15412eec10
Actually fix also the ARAW/RAW image data writing to honor the scaling.
Matti Hamalainen <ccr@tnsp.org>
parents:
1814
diff
changeset
|
752 |
fe15412eec10
Actually fix also the ARAW/RAW image data writing to honor the scaling.
Matti Hamalainen <ccr@tnsp.org>
parents:
1814
diff
changeset
|
753 |
2156
e6ec7fad9ce2
Rename DMImageConvSpec to DMImageWriteSpec to better reflec the struct's purpose.
Matti Hamalainen <ccr@tnsp.org>
parents:
2154
diff
changeset
|
754 int dmWriteRAWImage(DMResource *fp, const DMImage *img, const DMImageWriteSpec *spec) |
435 | 755 { |
1622 | 756 int res; |
2086
aedadff9e116
Implement dmGetBits() to the DMBitStreamContext API. Also improve error handling.
Matti Hamalainen <ccr@tnsp.org>
parents:
2085
diff
changeset
|
757 DMBitStreamContext ctx; |
aedadff9e116
Implement dmGetBits() to the DMBitStreamContext API. Also improve error handling.
Matti Hamalainen <ccr@tnsp.org>
parents:
2085
diff
changeset
|
758 |
aedadff9e116
Implement dmGetBits() to the DMBitStreamContext API. Also improve error handling.
Matti Hamalainen <ccr@tnsp.org>
parents:
2085
diff
changeset
|
759 dmInitBitStreamContext(&ctx); |
aedadff9e116
Implement dmGetBits() to the DMBitStreamContext API. Also improve error handling.
Matti Hamalainen <ccr@tnsp.org>
parents:
2085
diff
changeset
|
760 ctx.putByte = dmPutByteRes; |
aedadff9e116
Implement dmGetBits() to the DMBitStreamContext API. Also improve error handling.
Matti Hamalainen <ccr@tnsp.org>
parents:
2085
diff
changeset
|
761 ctx.handle = (void *) fp; |
435 | 762 |
1291 | 763 if (spec->planar) |
435 | 764 { |
1339 | 765 // Output bitplanes in planar format |
766 // (each plane of line sequentially) | |
1622 | 767 for (int yc = 0; yc < img->height; yc++) |
1872
fe15412eec10
Actually fix also the ARAW/RAW image data writing to honor the scaling.
Matti Hamalainen <ccr@tnsp.org>
parents:
1814
diff
changeset
|
768 for (int yscale = 0; yscale < spec->scaleY; yscale++) |
1622 | 769 for (int plane = 0; plane < spec->nplanes; plane++) |
435 | 770 { |
2086
aedadff9e116
Implement dmGetBits() to the DMBitStreamContext API. Also improve error handling.
Matti Hamalainen <ccr@tnsp.org>
parents:
2085
diff
changeset
|
771 if ((res = dmWriteRAWRow(&ctx, img, spec, yc, plane)) != DMERR_OK) |
aedadff9e116
Implement dmGetBits() to the DMBitStreamContext API. Also improve error handling.
Matti Hamalainen <ccr@tnsp.org>
parents:
2085
diff
changeset
|
772 return res; |
435 | 773 } |
774 } | |
775 else | |
776 { | |
777 // Output each bitplane in sequence | |
1622 | 778 for (int plane = 0; plane < spec->nplanes; plane++) |
779 for (int yc = 0; yc < img->height; yc++) | |
1872
fe15412eec10
Actually fix also the ARAW/RAW image data writing to honor the scaling.
Matti Hamalainen <ccr@tnsp.org>
parents:
1814
diff
changeset
|
780 for (int yscale = 0; yscale < spec->scaleY; yscale++) |
435 | 781 { |
2086
aedadff9e116
Implement dmGetBits() to the DMBitStreamContext API. Also improve error handling.
Matti Hamalainen <ccr@tnsp.org>
parents:
2085
diff
changeset
|
782 if ((res = dmWriteRAWRow(&ctx, img, spec, yc, plane)) != DMERR_OK) |
aedadff9e116
Implement dmGetBits() to the DMBitStreamContext API. Also improve error handling.
Matti Hamalainen <ccr@tnsp.org>
parents:
2085
diff
changeset
|
783 return res; |
435 | 784 } |
785 } | |
1102
e06abfde6c39
Cosmetics pass: Remove excess whitespace.
Matti Hamalainen <ccr@tnsp.org>
parents:
958
diff
changeset
|
786 |
2086
aedadff9e116
Implement dmGetBits() to the DMBitStreamContext API. Also improve error handling.
Matti Hamalainen <ccr@tnsp.org>
parents:
2085
diff
changeset
|
787 return dmFlushBitStream(&ctx); |
435 | 788 } |
789 | |
566
d400e32b62d9
Add a slightly different raw output format.
Matti Hamalainen <ccr@tnsp.org>
parents:
487
diff
changeset
|
790 |
2086
aedadff9e116
Implement dmGetBits() to the DMBitStreamContext API. Also improve error handling.
Matti Hamalainen <ccr@tnsp.org>
parents:
2085
diff
changeset
|
791 static int dmPutByteCDump(DMBitStreamContext *ctx) |
2047
3829c292df02
Add 'cdump' image output format, mainly for debugging purposes.
Matti Hamalainen <ccr@tnsp.org>
parents:
2026
diff
changeset
|
792 { |
2086
aedadff9e116
Implement dmGetBits() to the DMBitStreamContext API. Also improve error handling.
Matti Hamalainen <ccr@tnsp.org>
parents:
2085
diff
changeset
|
793 DMResource *fp = (DMResource *) ctx->handle; |
aedadff9e116
Implement dmGetBits() to the DMBitStreamContext API. Also improve error handling.
Matti Hamalainen <ccr@tnsp.org>
parents:
2085
diff
changeset
|
794 |
aedadff9e116
Implement dmGetBits() to the DMBitStreamContext API. Also improve error handling.
Matti Hamalainen <ccr@tnsp.org>
parents:
2085
diff
changeset
|
795 if (dmfprintf(fp, "0x%02x, ", ctx->outBuf & 0xff) < 2) |
aedadff9e116
Implement dmGetBits() to the DMBitStreamContext API. Also improve error handling.
Matti Hamalainen <ccr@tnsp.org>
parents:
2085
diff
changeset
|
796 return dmferror(fp); |
aedadff9e116
Implement dmGetBits() to the DMBitStreamContext API. Also improve error handling.
Matti Hamalainen <ccr@tnsp.org>
parents:
2085
diff
changeset
|
797 else |
aedadff9e116
Implement dmGetBits() to the DMBitStreamContext API. Also improve error handling.
Matti Hamalainen <ccr@tnsp.org>
parents:
2085
diff
changeset
|
798 return DMERR_OK; |
2047
3829c292df02
Add 'cdump' image output format, mainly for debugging purposes.
Matti Hamalainen <ccr@tnsp.org>
parents:
2026
diff
changeset
|
799 } |
3829c292df02
Add 'cdump' image output format, mainly for debugging purposes.
Matti Hamalainen <ccr@tnsp.org>
parents:
2026
diff
changeset
|
800 |
3829c292df02
Add 'cdump' image output format, mainly for debugging purposes.
Matti Hamalainen <ccr@tnsp.org>
parents:
2026
diff
changeset
|
801 |
2156
e6ec7fad9ce2
Rename DMImageConvSpec to DMImageWriteSpec to better reflec the struct's purpose.
Matti Hamalainen <ccr@tnsp.org>
parents:
2154
diff
changeset
|
802 int dmWriteCDumpImage(DMResource *fp, const DMImage *img, const DMImageWriteSpec *spec) |
2047
3829c292df02
Add 'cdump' image output format, mainly for debugging purposes.
Matti Hamalainen <ccr@tnsp.org>
parents:
2026
diff
changeset
|
803 { |
3829c292df02
Add 'cdump' image output format, mainly for debugging purposes.
Matti Hamalainen <ccr@tnsp.org>
parents:
2026
diff
changeset
|
804 int res; |
2086
aedadff9e116
Implement dmGetBits() to the DMBitStreamContext API. Also improve error handling.
Matti Hamalainen <ccr@tnsp.org>
parents:
2085
diff
changeset
|
805 DMBitStreamContext ctx; |
2049
a945a5f2fd70
Improve the cdump output format support of gfxconv. Also add some error handling.
Matti Hamalainen <ccr@tnsp.org>
parents:
2047
diff
changeset
|
806 |
a945a5f2fd70
Improve the cdump output format support of gfxconv. Also add some error handling.
Matti Hamalainen <ccr@tnsp.org>
parents:
2047
diff
changeset
|
807 if (dmfprintf(fp, |
2047
3829c292df02
Add 'cdump' image output format, mainly for debugging purposes.
Matti Hamalainen <ccr@tnsp.org>
parents:
2026
diff
changeset
|
808 "#define SET_WIDTH %d\n" |
3829c292df02
Add 'cdump' image output format, mainly for debugging purposes.
Matti Hamalainen <ccr@tnsp.org>
parents:
2026
diff
changeset
|
809 "#define SET_HEIGHT %d\n" |
3829c292df02
Add 'cdump' image output format, mainly for debugging purposes.
Matti Hamalainen <ccr@tnsp.org>
parents:
2026
diff
changeset
|
810 "\n" |
3829c292df02
Add 'cdump' image output format, mainly for debugging purposes.
Matti Hamalainen <ccr@tnsp.org>
parents:
2026
diff
changeset
|
811 "Uint8 img_data[] = {\n", |
3829c292df02
Add 'cdump' image output format, mainly for debugging purposes.
Matti Hamalainen <ccr@tnsp.org>
parents:
2026
diff
changeset
|
812 img->width * spec->scaleX, |
2049
a945a5f2fd70
Improve the cdump output format support of gfxconv. Also add some error handling.
Matti Hamalainen <ccr@tnsp.org>
parents:
2047
diff
changeset
|
813 img->height * spec->scaleY) < 0) |
a945a5f2fd70
Improve the cdump output format support of gfxconv. Also add some error handling.
Matti Hamalainen <ccr@tnsp.org>
parents:
2047
diff
changeset
|
814 return dmferror(fp); |
a945a5f2fd70
Improve the cdump output format support of gfxconv. Also add some error handling.
Matti Hamalainen <ccr@tnsp.org>
parents:
2047
diff
changeset
|
815 |
2086
aedadff9e116
Implement dmGetBits() to the DMBitStreamContext API. Also improve error handling.
Matti Hamalainen <ccr@tnsp.org>
parents:
2085
diff
changeset
|
816 dmInitBitStreamContext(&ctx); |
aedadff9e116
Implement dmGetBits() to the DMBitStreamContext API. Also improve error handling.
Matti Hamalainen <ccr@tnsp.org>
parents:
2085
diff
changeset
|
817 ctx.putByte = dmPutByteCDump; |
aedadff9e116
Implement dmGetBits() to the DMBitStreamContext API. Also improve error handling.
Matti Hamalainen <ccr@tnsp.org>
parents:
2085
diff
changeset
|
818 ctx.handle = (void *) fp; |
2049
a945a5f2fd70
Improve the cdump output format support of gfxconv. Also add some error handling.
Matti Hamalainen <ccr@tnsp.org>
parents:
2047
diff
changeset
|
819 |
a945a5f2fd70
Improve the cdump output format support of gfxconv. Also add some error handling.
Matti Hamalainen <ccr@tnsp.org>
parents:
2047
diff
changeset
|
820 if (spec->planar) |
a945a5f2fd70
Improve the cdump output format support of gfxconv. Also add some error handling.
Matti Hamalainen <ccr@tnsp.org>
parents:
2047
diff
changeset
|
821 { |
a945a5f2fd70
Improve the cdump output format support of gfxconv. Also add some error handling.
Matti Hamalainen <ccr@tnsp.org>
parents:
2047
diff
changeset
|
822 // Output bitplanes in planar format |
a945a5f2fd70
Improve the cdump output format support of gfxconv. Also add some error handling.
Matti Hamalainen <ccr@tnsp.org>
parents:
2047
diff
changeset
|
823 // (each plane of line sequentially) |
a945a5f2fd70
Improve the cdump output format support of gfxconv. Also add some error handling.
Matti Hamalainen <ccr@tnsp.org>
parents:
2047
diff
changeset
|
824 for (int yc = 0; yc < img->height; yc++) |
a945a5f2fd70
Improve the cdump output format support of gfxconv. Also add some error handling.
Matti Hamalainen <ccr@tnsp.org>
parents:
2047
diff
changeset
|
825 for (int yscale = 0; yscale < spec->scaleY; yscale++) |
a945a5f2fd70
Improve the cdump output format support of gfxconv. Also add some error handling.
Matti Hamalainen <ccr@tnsp.org>
parents:
2047
diff
changeset
|
826 for (int plane = 0; plane < spec->nplanes; plane++) |
a945a5f2fd70
Improve the cdump output format support of gfxconv. Also add some error handling.
Matti Hamalainen <ccr@tnsp.org>
parents:
2047
diff
changeset
|
827 { |
2086
aedadff9e116
Implement dmGetBits() to the DMBitStreamContext API. Also improve error handling.
Matti Hamalainen <ccr@tnsp.org>
parents:
2085
diff
changeset
|
828 if ((res = dmWriteRAWRow(&ctx, img, spec, yc, plane)) != DMERR_OK) |
aedadff9e116
Implement dmGetBits() to the DMBitStreamContext API. Also improve error handling.
Matti Hamalainen <ccr@tnsp.org>
parents:
2085
diff
changeset
|
829 return res; |
2049
a945a5f2fd70
Improve the cdump output format support of gfxconv. Also add some error handling.
Matti Hamalainen <ccr@tnsp.org>
parents:
2047
diff
changeset
|
830 |
a945a5f2fd70
Improve the cdump output format support of gfxconv. Also add some error handling.
Matti Hamalainen <ccr@tnsp.org>
parents:
2047
diff
changeset
|
831 if (dmfprintf(fp, "\n") < 0) |
a945a5f2fd70
Improve the cdump output format support of gfxconv. Also add some error handling.
Matti Hamalainen <ccr@tnsp.org>
parents:
2047
diff
changeset
|
832 return dmferror(fp); |
a945a5f2fd70
Improve the cdump output format support of gfxconv. Also add some error handling.
Matti Hamalainen <ccr@tnsp.org>
parents:
2047
diff
changeset
|
833 } |
a945a5f2fd70
Improve the cdump output format support of gfxconv. Also add some error handling.
Matti Hamalainen <ccr@tnsp.org>
parents:
2047
diff
changeset
|
834 } |
a945a5f2fd70
Improve the cdump output format support of gfxconv. Also add some error handling.
Matti Hamalainen <ccr@tnsp.org>
parents:
2047
diff
changeset
|
835 else |
a945a5f2fd70
Improve the cdump output format support of gfxconv. Also add some error handling.
Matti Hamalainen <ccr@tnsp.org>
parents:
2047
diff
changeset
|
836 { |
a945a5f2fd70
Improve the cdump output format support of gfxconv. Also add some error handling.
Matti Hamalainen <ccr@tnsp.org>
parents:
2047
diff
changeset
|
837 // Output each bitplane in sequence |
a945a5f2fd70
Improve the cdump output format support of gfxconv. Also add some error handling.
Matti Hamalainen <ccr@tnsp.org>
parents:
2047
diff
changeset
|
838 for (int plane = 0; plane < spec->nplanes; plane++) |
a945a5f2fd70
Improve the cdump output format support of gfxconv. Also add some error handling.
Matti Hamalainen <ccr@tnsp.org>
parents:
2047
diff
changeset
|
839 for (int yc = 0; yc < img->height; yc++) |
a945a5f2fd70
Improve the cdump output format support of gfxconv. Also add some error handling.
Matti Hamalainen <ccr@tnsp.org>
parents:
2047
diff
changeset
|
840 for (int yscale = 0; yscale < spec->scaleY; yscale++) |
a945a5f2fd70
Improve the cdump output format support of gfxconv. Also add some error handling.
Matti Hamalainen <ccr@tnsp.org>
parents:
2047
diff
changeset
|
841 { |
2086
aedadff9e116
Implement dmGetBits() to the DMBitStreamContext API. Also improve error handling.
Matti Hamalainen <ccr@tnsp.org>
parents:
2085
diff
changeset
|
842 if ((res = dmWriteRAWRow(&ctx, img, spec, yc, plane)) != DMERR_OK) |
aedadff9e116
Implement dmGetBits() to the DMBitStreamContext API. Also improve error handling.
Matti Hamalainen <ccr@tnsp.org>
parents:
2085
diff
changeset
|
843 return res; |
2049
a945a5f2fd70
Improve the cdump output format support of gfxconv. Also add some error handling.
Matti Hamalainen <ccr@tnsp.org>
parents:
2047
diff
changeset
|
844 |
a945a5f2fd70
Improve the cdump output format support of gfxconv. Also add some error handling.
Matti Hamalainen <ccr@tnsp.org>
parents:
2047
diff
changeset
|
845 if (dmfprintf(fp, "\n") < 0) |
a945a5f2fd70
Improve the cdump output format support of gfxconv. Also add some error handling.
Matti Hamalainen <ccr@tnsp.org>
parents:
2047
diff
changeset
|
846 return dmferror(fp); |
a945a5f2fd70
Improve the cdump output format support of gfxconv. Also add some error handling.
Matti Hamalainen <ccr@tnsp.org>
parents:
2047
diff
changeset
|
847 } |
a945a5f2fd70
Improve the cdump output format support of gfxconv. Also add some error handling.
Matti Hamalainen <ccr@tnsp.org>
parents:
2047
diff
changeset
|
848 } |
a945a5f2fd70
Improve the cdump output format support of gfxconv. Also add some error handling.
Matti Hamalainen <ccr@tnsp.org>
parents:
2047
diff
changeset
|
849 |
2086
aedadff9e116
Implement dmGetBits() to the DMBitStreamContext API. Also improve error handling.
Matti Hamalainen <ccr@tnsp.org>
parents:
2085
diff
changeset
|
850 res = dmFlushBitStream(&ctx); |
2049
a945a5f2fd70
Improve the cdump output format support of gfxconv. Also add some error handling.
Matti Hamalainen <ccr@tnsp.org>
parents:
2047
diff
changeset
|
851 |
a945a5f2fd70
Improve the cdump output format support of gfxconv. Also add some error handling.
Matti Hamalainen <ccr@tnsp.org>
parents:
2047
diff
changeset
|
852 if (res == DMERR_OK && |
a945a5f2fd70
Improve the cdump output format support of gfxconv. Also add some error handling.
Matti Hamalainen <ccr@tnsp.org>
parents:
2047
diff
changeset
|
853 dmfprintf(fp, "};\n") < 0) |
a945a5f2fd70
Improve the cdump output format support of gfxconv. Also add some error handling.
Matti Hamalainen <ccr@tnsp.org>
parents:
2047
diff
changeset
|
854 res = dmferror(fp); |
2047
3829c292df02
Add 'cdump' image output format, mainly for debugging purposes.
Matti Hamalainen <ccr@tnsp.org>
parents:
2026
diff
changeset
|
855 |
3829c292df02
Add 'cdump' image output format, mainly for debugging purposes.
Matti Hamalainen <ccr@tnsp.org>
parents:
2026
diff
changeset
|
856 return res; |
3829c292df02
Add 'cdump' image output format, mainly for debugging purposes.
Matti Hamalainen <ccr@tnsp.org>
parents:
2026
diff
changeset
|
857 } |
3829c292df02
Add 'cdump' image output format, mainly for debugging purposes.
Matti Hamalainen <ccr@tnsp.org>
parents:
2026
diff
changeset
|
858 |
3829c292df02
Add 'cdump' image output format, mainly for debugging purposes.
Matti Hamalainen <ccr@tnsp.org>
parents:
2026
diff
changeset
|
859 |
1301 | 860 static int dmWritePPMRow(void *cbdata, const Uint8 *row, const size_t len) |
435 | 861 { |
1609
c29adf5ce240
Convert libgfx file format routines to use DMResource instead of stdio FILE.
Matti Hamalainen <ccr@tnsp.org>
parents:
1583
diff
changeset
|
862 if (dmf_write_str((DMResource *) cbdata, row, len)) |
808
f8126fa1df9b
Use dmlib error code return value in cases where a plain boolean was used
Matti Hamalainen <ccr@tnsp.org>
parents:
800
diff
changeset
|
863 return DMERR_OK; |
f8126fa1df9b
Use dmlib error code return value in cases where a plain boolean was used
Matti Hamalainen <ccr@tnsp.org>
parents:
800
diff
changeset
|
864 else |
f8126fa1df9b
Use dmlib error code return value in cases where a plain boolean was used
Matti Hamalainen <ccr@tnsp.org>
parents:
800
diff
changeset
|
865 return DMERR_FWRITE; |
435 | 866 } |
867 | |
868 | |
2156
e6ec7fad9ce2
Rename DMImageConvSpec to DMImageWriteSpec to better reflec the struct's purpose.
Matti Hamalainen <ccr@tnsp.org>
parents:
2154
diff
changeset
|
869 int dmWritePPMImage(DMResource *fp, const DMImage *img, const DMImageWriteSpec *spec) |
435 | 870 { |
2156
e6ec7fad9ce2
Rename DMImageConvSpec to DMImageWriteSpec to better reflec the struct's purpose.
Matti Hamalainen <ccr@tnsp.org>
parents:
2154
diff
changeset
|
871 DMImageWriteSpec tmpSpec; |
2092
614b161c0aa5
Initial support for reading PPM/PGM.
Matti Hamalainen <ccr@tnsp.org>
parents:
2091
diff
changeset
|
872 char *tmpFmt; |
614b161c0aa5
Initial support for reading PPM/PGM.
Matti Hamalainen <ccr@tnsp.org>
parents:
2091
diff
changeset
|
873 |
2154
1c111bfc17d4
Add check to PNG and PPM output as well.
Matti Hamalainen <ccr@tnsp.org>
parents:
2153
diff
changeset
|
874 // Check if we can do this |
2157
9a9493809b3a
Rename DM_COLFMT_* constants to DM_PIXFMT_* and the 'format' field of DMImage
Matti Hamalainen <ccr@tnsp.org>
parents:
2156
diff
changeset
|
875 if ((spec->pixfmt == DM_PIXFMT_PALETTE || spec->pixfmt == DM_PIXFMT_GRAYSCALE) && |
9a9493809b3a
Rename DM_COLFMT_* constants to DM_PIXFMT_* and the 'format' field of DMImage
Matti Hamalainen <ccr@tnsp.org>
parents:
2156
diff
changeset
|
876 img->pixfmt != spec->pixfmt) |
2154
1c111bfc17d4
Add check to PNG and PPM output as well.
Matti Hamalainen <ccr@tnsp.org>
parents:
2153
diff
changeset
|
877 { |
1c111bfc17d4
Add check to PNG and PPM output as well.
Matti Hamalainen <ccr@tnsp.org>
parents:
2153
diff
changeset
|
878 return dmError(DMERR_NOT_SUPPORTED, |
1c111bfc17d4
Add check to PNG and PPM output as well.
Matti Hamalainen <ccr@tnsp.org>
parents:
2153
diff
changeset
|
879 "Conversion of non-indexed image to indexed not supported yet.\n"); |
1c111bfc17d4
Add check to PNG and PPM output as well.
Matti Hamalainen <ccr@tnsp.org>
parents:
2153
diff
changeset
|
880 } |
1c111bfc17d4
Add check to PNG and PPM output as well.
Matti Hamalainen <ccr@tnsp.org>
parents:
2153
diff
changeset
|
881 |
2212
2edd3f2ddee2
Force non-planar for PPM output.
Matti Hamalainen <ccr@tnsp.org>
parents:
2211
diff
changeset
|
882 // Force non-planar etc |
2156
e6ec7fad9ce2
Rename DMImageConvSpec to DMImageWriteSpec to better reflec the struct's purpose.
Matti Hamalainen <ccr@tnsp.org>
parents:
2154
diff
changeset
|
883 memcpy(&tmpSpec, spec, sizeof(DMImageWriteSpec)); |
2212
2edd3f2ddee2
Force non-planar for PPM output.
Matti Hamalainen <ccr@tnsp.org>
parents:
2211
diff
changeset
|
884 tmpSpec.planar = FALSE; |
2edd3f2ddee2
Force non-planar for PPM output.
Matti Hamalainen <ccr@tnsp.org>
parents:
2211
diff
changeset
|
885 |
2edd3f2ddee2
Force non-planar for PPM output.
Matti Hamalainen <ccr@tnsp.org>
parents:
2211
diff
changeset
|
886 switch (tmpSpec.pixfmt) |
2092
614b161c0aa5
Initial support for reading PPM/PGM.
Matti Hamalainen <ccr@tnsp.org>
parents:
2091
diff
changeset
|
887 { |
2157
9a9493809b3a
Rename DM_COLFMT_* constants to DM_PIXFMT_* and the 'format' field of DMImage
Matti Hamalainen <ccr@tnsp.org>
parents:
2156
diff
changeset
|
888 case DM_PIXFMT_RGB: |
9a9493809b3a
Rename DM_COLFMT_* constants to DM_PIXFMT_* and the 'format' field of DMImage
Matti Hamalainen <ccr@tnsp.org>
parents:
2156
diff
changeset
|
889 case DM_PIXFMT_RGBA: |
9a9493809b3a
Rename DM_COLFMT_* constants to DM_PIXFMT_* and the 'format' field of DMImage
Matti Hamalainen <ccr@tnsp.org>
parents:
2156
diff
changeset
|
890 case DM_PIXFMT_PALETTE: |
9a9493809b3a
Rename DM_COLFMT_* constants to DM_PIXFMT_* and the 'format' field of DMImage
Matti Hamalainen <ccr@tnsp.org>
parents:
2156
diff
changeset
|
891 tmpSpec.pixfmt = DM_PIXFMT_RGB; |
2092
614b161c0aa5
Initial support for reading PPM/PGM.
Matti Hamalainen <ccr@tnsp.org>
parents:
2091
diff
changeset
|
892 tmpFmt = "6"; |
614b161c0aa5
Initial support for reading PPM/PGM.
Matti Hamalainen <ccr@tnsp.org>
parents:
2091
diff
changeset
|
893 break; |
614b161c0aa5
Initial support for reading PPM/PGM.
Matti Hamalainen <ccr@tnsp.org>
parents:
2091
diff
changeset
|
894 |
2157
9a9493809b3a
Rename DM_COLFMT_* constants to DM_PIXFMT_* and the 'format' field of DMImage
Matti Hamalainen <ccr@tnsp.org>
parents:
2156
diff
changeset
|
895 case DM_PIXFMT_GRAYSCALE: |
2092
614b161c0aa5
Initial support for reading PPM/PGM.
Matti Hamalainen <ccr@tnsp.org>
parents:
2091
diff
changeset
|
896 tmpFmt = "5"; |
614b161c0aa5
Initial support for reading PPM/PGM.
Matti Hamalainen <ccr@tnsp.org>
parents:
2091
diff
changeset
|
897 break; |
614b161c0aa5
Initial support for reading PPM/PGM.
Matti Hamalainen <ccr@tnsp.org>
parents:
2091
diff
changeset
|
898 |
614b161c0aa5
Initial support for reading PPM/PGM.
Matti Hamalainen <ccr@tnsp.org>
parents:
2091
diff
changeset
|
899 default: |
614b161c0aa5
Initial support for reading PPM/PGM.
Matti Hamalainen <ccr@tnsp.org>
parents:
2091
diff
changeset
|
900 return dmError(DMERR_NOT_SUPPORTED, |
614b161c0aa5
Initial support for reading PPM/PGM.
Matti Hamalainen <ccr@tnsp.org>
parents:
2091
diff
changeset
|
901 "PPM: Not a supported color format for PPM/PGM format image.\n"); |
614b161c0aa5
Initial support for reading PPM/PGM.
Matti Hamalainen <ccr@tnsp.org>
parents:
2091
diff
changeset
|
902 } |
1288 | 903 |
435 | 904 // Write PPM header |
1609
c29adf5ce240
Convert libgfx file format routines to use DMResource instead of stdio FILE.
Matti Hamalainen <ccr@tnsp.org>
parents:
1583
diff
changeset
|
905 char *tmp = dm_strdup_printf( |
2092
614b161c0aa5
Initial support for reading PPM/PGM.
Matti Hamalainen <ccr@tnsp.org>
parents:
2091
diff
changeset
|
906 "P%s\n%d %d\n255\n", |
614b161c0aa5
Initial support for reading PPM/PGM.
Matti Hamalainen <ccr@tnsp.org>
parents:
2091
diff
changeset
|
907 tmpFmt, |
2157
9a9493809b3a
Rename DM_COLFMT_* constants to DM_PIXFMT_* and the 'format' field of DMImage
Matti Hamalainen <ccr@tnsp.org>
parents:
2156
diff
changeset
|
908 img->width * tmpSpec.scaleX, |
9a9493809b3a
Rename DM_COLFMT_* constants to DM_PIXFMT_* and the 'format' field of DMImage
Matti Hamalainen <ccr@tnsp.org>
parents:
2156
diff
changeset
|
909 img->height * tmpSpec.scaleY); |
435 | 910 |
1609
c29adf5ce240
Convert libgfx file format routines to use DMResource instead of stdio FILE.
Matti Hamalainen <ccr@tnsp.org>
parents:
1583
diff
changeset
|
911 if (tmp == NULL) |
c29adf5ce240
Convert libgfx file format routines to use DMResource instead of stdio FILE.
Matti Hamalainen <ccr@tnsp.org>
parents:
1583
diff
changeset
|
912 return DMERR_MALLOC; |
c29adf5ce240
Convert libgfx file format routines to use DMResource instead of stdio FILE.
Matti Hamalainen <ccr@tnsp.org>
parents:
1583
diff
changeset
|
913 |
c29adf5ce240
Convert libgfx file format routines to use DMResource instead of stdio FILE.
Matti Hamalainen <ccr@tnsp.org>
parents:
1583
diff
changeset
|
914 dmfputs(tmp, fp); |
c29adf5ce240
Convert libgfx file format routines to use DMResource instead of stdio FILE.
Matti Hamalainen <ccr@tnsp.org>
parents:
1583
diff
changeset
|
915 dmFree(tmp); |
c29adf5ce240
Convert libgfx file format routines to use DMResource instead of stdio FILE.
Matti Hamalainen <ccr@tnsp.org>
parents:
1583
diff
changeset
|
916 |
435 | 917 // Write image data |
1288 | 918 return dmWriteImageData(img, (void *) fp, dmWritePPMRow, &tmpSpec); |
435 | 919 } |
920 | |
921 | |
2101
da886b8cbb09
Improve PPM/PGM/PNM probing and header parsing.
Matti Hamalainen <ccr@tnsp.org>
parents:
2100
diff
changeset
|
922 // Read a PPM/PGM/PNM header line, skipping comments |
da886b8cbb09
Improve PPM/PGM/PNM probing and header parsing.
Matti Hamalainen <ccr@tnsp.org>
parents:
2100
diff
changeset
|
923 static BOOL dmReadPPMHeader(DMResource *fp, char *buf, const size_t bufLen) |
da886b8cbb09
Improve PPM/PGM/PNM probing and header parsing.
Matti Hamalainen <ccr@tnsp.org>
parents:
2100
diff
changeset
|
924 { |
da886b8cbb09
Improve PPM/PGM/PNM probing and header parsing.
Matti Hamalainen <ccr@tnsp.org>
parents:
2100
diff
changeset
|
925 BOOL end = FALSE, comment = FALSE; |
da886b8cbb09
Improve PPM/PGM/PNM probing and header parsing.
Matti Hamalainen <ccr@tnsp.org>
parents:
2100
diff
changeset
|
926 size_t offs = 0; |
da886b8cbb09
Improve PPM/PGM/PNM probing and header parsing.
Matti Hamalainen <ccr@tnsp.org>
parents:
2100
diff
changeset
|
927 |
da886b8cbb09
Improve PPM/PGM/PNM probing and header parsing.
Matti Hamalainen <ccr@tnsp.org>
parents:
2100
diff
changeset
|
928 do |
da886b8cbb09
Improve PPM/PGM/PNM probing and header parsing.
Matti Hamalainen <ccr@tnsp.org>
parents:
2100
diff
changeset
|
929 { |
da886b8cbb09
Improve PPM/PGM/PNM probing and header parsing.
Matti Hamalainen <ccr@tnsp.org>
parents:
2100
diff
changeset
|
930 int ch = dmfgetc(fp); |
da886b8cbb09
Improve PPM/PGM/PNM probing and header parsing.
Matti Hamalainen <ccr@tnsp.org>
parents:
2100
diff
changeset
|
931 if (ch == EOF) |
da886b8cbb09
Improve PPM/PGM/PNM probing and header parsing.
Matti Hamalainen <ccr@tnsp.org>
parents:
2100
diff
changeset
|
932 return FALSE; |
da886b8cbb09
Improve PPM/PGM/PNM probing and header parsing.
Matti Hamalainen <ccr@tnsp.org>
parents:
2100
diff
changeset
|
933 else |
da886b8cbb09
Improve PPM/PGM/PNM probing and header parsing.
Matti Hamalainen <ccr@tnsp.org>
parents:
2100
diff
changeset
|
934 if (ch == '#') |
da886b8cbb09
Improve PPM/PGM/PNM probing and header parsing.
Matti Hamalainen <ccr@tnsp.org>
parents:
2100
diff
changeset
|
935 comment = TRUE; |
da886b8cbb09
Improve PPM/PGM/PNM probing and header parsing.
Matti Hamalainen <ccr@tnsp.org>
parents:
2100
diff
changeset
|
936 else |
da886b8cbb09
Improve PPM/PGM/PNM probing and header parsing.
Matti Hamalainen <ccr@tnsp.org>
parents:
2100
diff
changeset
|
937 if (ch == '\n') |
da886b8cbb09
Improve PPM/PGM/PNM probing and header parsing.
Matti Hamalainen <ccr@tnsp.org>
parents:
2100
diff
changeset
|
938 { |
da886b8cbb09
Improve PPM/PGM/PNM probing and header parsing.
Matti Hamalainen <ccr@tnsp.org>
parents:
2100
diff
changeset
|
939 if (!comment) |
da886b8cbb09
Improve PPM/PGM/PNM probing and header parsing.
Matti Hamalainen <ccr@tnsp.org>
parents:
2100
diff
changeset
|
940 end = TRUE; |
da886b8cbb09
Improve PPM/PGM/PNM probing and header parsing.
Matti Hamalainen <ccr@tnsp.org>
parents:
2100
diff
changeset
|
941 else |
da886b8cbb09
Improve PPM/PGM/PNM probing and header parsing.
Matti Hamalainen <ccr@tnsp.org>
parents:
2100
diff
changeset
|
942 comment = FALSE; |
da886b8cbb09
Improve PPM/PGM/PNM probing and header parsing.
Matti Hamalainen <ccr@tnsp.org>
parents:
2100
diff
changeset
|
943 } |
da886b8cbb09
Improve PPM/PGM/PNM probing and header parsing.
Matti Hamalainen <ccr@tnsp.org>
parents:
2100
diff
changeset
|
944 else |
da886b8cbb09
Improve PPM/PGM/PNM probing and header parsing.
Matti Hamalainen <ccr@tnsp.org>
parents:
2100
diff
changeset
|
945 if (!comment) |
da886b8cbb09
Improve PPM/PGM/PNM probing and header parsing.
Matti Hamalainen <ccr@tnsp.org>
parents:
2100
diff
changeset
|
946 { |
da886b8cbb09
Improve PPM/PGM/PNM probing and header parsing.
Matti Hamalainen <ccr@tnsp.org>
parents:
2100
diff
changeset
|
947 if (offs < bufLen - 1) |
da886b8cbb09
Improve PPM/PGM/PNM probing and header parsing.
Matti Hamalainen <ccr@tnsp.org>
parents:
2100
diff
changeset
|
948 buf[offs++] = ch; |
da886b8cbb09
Improve PPM/PGM/PNM probing and header parsing.
Matti Hamalainen <ccr@tnsp.org>
parents:
2100
diff
changeset
|
949 } |
da886b8cbb09
Improve PPM/PGM/PNM probing and header parsing.
Matti Hamalainen <ccr@tnsp.org>
parents:
2100
diff
changeset
|
950 } while (!end); |
da886b8cbb09
Improve PPM/PGM/PNM probing and header parsing.
Matti Hamalainen <ccr@tnsp.org>
parents:
2100
diff
changeset
|
951 |
da886b8cbb09
Improve PPM/PGM/PNM probing and header parsing.
Matti Hamalainen <ccr@tnsp.org>
parents:
2100
diff
changeset
|
952 buf[offs] = 0; |
da886b8cbb09
Improve PPM/PGM/PNM probing and header parsing.
Matti Hamalainen <ccr@tnsp.org>
parents:
2100
diff
changeset
|
953 return TRUE; |
da886b8cbb09
Improve PPM/PGM/PNM probing and header parsing.
Matti Hamalainen <ccr@tnsp.org>
parents:
2100
diff
changeset
|
954 } |
da886b8cbb09
Improve PPM/PGM/PNM probing and header parsing.
Matti Hamalainen <ccr@tnsp.org>
parents:
2100
diff
changeset
|
955 |
da886b8cbb09
Improve PPM/PGM/PNM probing and header parsing.
Matti Hamalainen <ccr@tnsp.org>
parents:
2100
diff
changeset
|
956 |
2092
614b161c0aa5
Initial support for reading PPM/PGM.
Matti Hamalainen <ccr@tnsp.org>
parents:
2091
diff
changeset
|
957 int dmReadPPMImage(DMResource *fp, DMImage **pimg) |
614b161c0aa5
Initial support for reading PPM/PGM.
Matti Hamalainen <ccr@tnsp.org>
parents:
2091
diff
changeset
|
958 { |
614b161c0aa5
Initial support for reading PPM/PGM.
Matti Hamalainen <ccr@tnsp.org>
parents:
2091
diff
changeset
|
959 DMImage *img = NULL; |
614b161c0aa5
Initial support for reading PPM/PGM.
Matti Hamalainen <ccr@tnsp.org>
parents:
2091
diff
changeset
|
960 unsigned int width, height; |
614b161c0aa5
Initial support for reading PPM/PGM.
Matti Hamalainen <ccr@tnsp.org>
parents:
2091
diff
changeset
|
961 int itype, res = DMERR_OK; |
614b161c0aa5
Initial support for reading PPM/PGM.
Matti Hamalainen <ccr@tnsp.org>
parents:
2091
diff
changeset
|
962 char hdr1[8], hdr2[32], hdr3[16]; |
614b161c0aa5
Initial support for reading PPM/PGM.
Matti Hamalainen <ccr@tnsp.org>
parents:
2091
diff
changeset
|
963 |
614b161c0aa5
Initial support for reading PPM/PGM.
Matti Hamalainen <ccr@tnsp.org>
parents:
2091
diff
changeset
|
964 // Read PPM header |
2101
da886b8cbb09
Improve PPM/PGM/PNM probing and header parsing.
Matti Hamalainen <ccr@tnsp.org>
parents:
2100
diff
changeset
|
965 if (!dmReadPPMHeader(fp, hdr1, sizeof(hdr1)) || |
da886b8cbb09
Improve PPM/PGM/PNM probing and header parsing.
Matti Hamalainen <ccr@tnsp.org>
parents:
2100
diff
changeset
|
966 !dmReadPPMHeader(fp, hdr2, sizeof(hdr2)) || |
da886b8cbb09
Improve PPM/PGM/PNM probing and header parsing.
Matti Hamalainen <ccr@tnsp.org>
parents:
2100
diff
changeset
|
967 !dmReadPPMHeader(fp, hdr3, sizeof(hdr3))) |
2092
614b161c0aa5
Initial support for reading PPM/PGM.
Matti Hamalainen <ccr@tnsp.org>
parents:
2091
diff
changeset
|
968 { |
614b161c0aa5
Initial support for reading PPM/PGM.
Matti Hamalainen <ccr@tnsp.org>
parents:
2091
diff
changeset
|
969 res = dmError(DMERR_FREAD, |
614b161c0aa5
Initial support for reading PPM/PGM.
Matti Hamalainen <ccr@tnsp.org>
parents:
2091
diff
changeset
|
970 "PPM: Could not read image header data.\n"); |
614b161c0aa5
Initial support for reading PPM/PGM.
Matti Hamalainen <ccr@tnsp.org>
parents:
2091
diff
changeset
|
971 goto error; |
614b161c0aa5
Initial support for reading PPM/PGM.
Matti Hamalainen <ccr@tnsp.org>
parents:
2091
diff
changeset
|
972 } |
614b161c0aa5
Initial support for reading PPM/PGM.
Matti Hamalainen <ccr@tnsp.org>
parents:
2091
diff
changeset
|
973 |
614b161c0aa5
Initial support for reading PPM/PGM.
Matti Hamalainen <ccr@tnsp.org>
parents:
2091
diff
changeset
|
974 if (hdr1[0] != 'P' || !isdigit(hdr1[1]) || |
614b161c0aa5
Initial support for reading PPM/PGM.
Matti Hamalainen <ccr@tnsp.org>
parents:
2091
diff
changeset
|
975 !isdigit(hdr2[0]) || !isdigit(hdr3[0])) |
614b161c0aa5
Initial support for reading PPM/PGM.
Matti Hamalainen <ccr@tnsp.org>
parents:
2091
diff
changeset
|
976 { |
614b161c0aa5
Initial support for reading PPM/PGM.
Matti Hamalainen <ccr@tnsp.org>
parents:
2091
diff
changeset
|
977 res = dmError(DMERR_NOT_SUPPORTED, |
614b161c0aa5
Initial support for reading PPM/PGM.
Matti Hamalainen <ccr@tnsp.org>
parents:
2091
diff
changeset
|
978 "PPM: Not a supported PPM/PGM format image.\n"); |
614b161c0aa5
Initial support for reading PPM/PGM.
Matti Hamalainen <ccr@tnsp.org>
parents:
2091
diff
changeset
|
979 goto error; |
614b161c0aa5
Initial support for reading PPM/PGM.
Matti Hamalainen <ccr@tnsp.org>
parents:
2091
diff
changeset
|
980 } |
614b161c0aa5
Initial support for reading PPM/PGM.
Matti Hamalainen <ccr@tnsp.org>
parents:
2091
diff
changeset
|
981 |
614b161c0aa5
Initial support for reading PPM/PGM.
Matti Hamalainen <ccr@tnsp.org>
parents:
2091
diff
changeset
|
982 switch (hdr1[1]) |
614b161c0aa5
Initial support for reading PPM/PGM.
Matti Hamalainen <ccr@tnsp.org>
parents:
2091
diff
changeset
|
983 { |
2157
9a9493809b3a
Rename DM_COLFMT_* constants to DM_PIXFMT_* and the 'format' field of DMImage
Matti Hamalainen <ccr@tnsp.org>
parents:
2156
diff
changeset
|
984 case '6': itype = DM_PIXFMT_RGB; break; |
9a9493809b3a
Rename DM_COLFMT_* constants to DM_PIXFMT_* and the 'format' field of DMImage
Matti Hamalainen <ccr@tnsp.org>
parents:
2156
diff
changeset
|
985 case '5': itype = DM_PIXFMT_GRAYSCALE; break; |
2092
614b161c0aa5
Initial support for reading PPM/PGM.
Matti Hamalainen <ccr@tnsp.org>
parents:
2091
diff
changeset
|
986 default: |
614b161c0aa5
Initial support for reading PPM/PGM.
Matti Hamalainen <ccr@tnsp.org>
parents:
2091
diff
changeset
|
987 res = dmError(DMERR_NOT_SUPPORTED, |
2094
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
988 "PPM: Unsupported PPM/PNM/PGM subtype.\n"); |
2092
614b161c0aa5
Initial support for reading PPM/PGM.
Matti Hamalainen <ccr@tnsp.org>
parents:
2091
diff
changeset
|
989 goto error; |
614b161c0aa5
Initial support for reading PPM/PGM.
Matti Hamalainen <ccr@tnsp.org>
parents:
2091
diff
changeset
|
990 } |
614b161c0aa5
Initial support for reading PPM/PGM.
Matti Hamalainen <ccr@tnsp.org>
parents:
2091
diff
changeset
|
991 |
614b161c0aa5
Initial support for reading PPM/PGM.
Matti Hamalainen <ccr@tnsp.org>
parents:
2091
diff
changeset
|
992 if (sscanf(hdr2, "%u %u", &width, &height) != 2) |
614b161c0aa5
Initial support for reading PPM/PGM.
Matti Hamalainen <ccr@tnsp.org>
parents:
2091
diff
changeset
|
993 { |
614b161c0aa5
Initial support for reading PPM/PGM.
Matti Hamalainen <ccr@tnsp.org>
parents:
2091
diff
changeset
|
994 res = dmError(DMERR_INVALID_DATA, |
614b161c0aa5
Initial support for reading PPM/PGM.
Matti Hamalainen <ccr@tnsp.org>
parents:
2091
diff
changeset
|
995 "PPM: Invalid PPM/PGM image dimensions.\n"); |
614b161c0aa5
Initial support for reading PPM/PGM.
Matti Hamalainen <ccr@tnsp.org>
parents:
2091
diff
changeset
|
996 goto error; |
614b161c0aa5
Initial support for reading PPM/PGM.
Matti Hamalainen <ccr@tnsp.org>
parents:
2091
diff
changeset
|
997 } |
614b161c0aa5
Initial support for reading PPM/PGM.
Matti Hamalainen <ccr@tnsp.org>
parents:
2091
diff
changeset
|
998 |
2094
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
999 dmMsg(2, "PPM: %d x %d, type=%d\n", |
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
1000 width, height, itype); |
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
1001 |
2257
c7495fcaffa9
Check image dimensions when loading PPM/PNG/PCX/IFF images.
Matti Hamalainen <ccr@tnsp.org>
parents:
2220
diff
changeset
|
1002 // Check image dimensions |
c7495fcaffa9
Check image dimensions when loading PPM/PNG/PCX/IFF images.
Matti Hamalainen <ccr@tnsp.org>
parents:
2220
diff
changeset
|
1003 if (width == 0 || height == 0) |
c7495fcaffa9
Check image dimensions when loading PPM/PNG/PCX/IFF images.
Matti Hamalainen <ccr@tnsp.org>
parents:
2220
diff
changeset
|
1004 { |
c7495fcaffa9
Check image dimensions when loading PPM/PNG/PCX/IFF images.
Matti Hamalainen <ccr@tnsp.org>
parents:
2220
diff
changeset
|
1005 return dmError(DMERR_INVALID_DATA, |
c7495fcaffa9
Check image dimensions when loading PPM/PNG/PCX/IFF images.
Matti Hamalainen <ccr@tnsp.org>
parents:
2220
diff
changeset
|
1006 "PPM: Invalid image dimensions.\n"); |
c7495fcaffa9
Check image dimensions when loading PPM/PNG/PCX/IFF images.
Matti Hamalainen <ccr@tnsp.org>
parents:
2220
diff
changeset
|
1007 } |
c7495fcaffa9
Check image dimensions when loading PPM/PNG/PCX/IFF images.
Matti Hamalainen <ccr@tnsp.org>
parents:
2220
diff
changeset
|
1008 |
2092
614b161c0aa5
Initial support for reading PPM/PGM.
Matti Hamalainen <ccr@tnsp.org>
parents:
2091
diff
changeset
|
1009 if ((*pimg = img = dmImageAlloc(width, height, itype, -1)) == NULL) |
614b161c0aa5
Initial support for reading PPM/PGM.
Matti Hamalainen <ccr@tnsp.org>
parents:
2091
diff
changeset
|
1010 { |
614b161c0aa5
Initial support for reading PPM/PGM.
Matti Hamalainen <ccr@tnsp.org>
parents:
2091
diff
changeset
|
1011 res = dmError(DMERR_MALLOC, |
614b161c0aa5
Initial support for reading PPM/PGM.
Matti Hamalainen <ccr@tnsp.org>
parents:
2091
diff
changeset
|
1012 "PPM: Could not allocate image data.\n"); |
614b161c0aa5
Initial support for reading PPM/PGM.
Matti Hamalainen <ccr@tnsp.org>
parents:
2091
diff
changeset
|
1013 goto error; |
614b161c0aa5
Initial support for reading PPM/PGM.
Matti Hamalainen <ccr@tnsp.org>
parents:
2091
diff
changeset
|
1014 } |
614b161c0aa5
Initial support for reading PPM/PGM.
Matti Hamalainen <ccr@tnsp.org>
parents:
2091
diff
changeset
|
1015 |
2094
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
1016 if (!dmf_read_str(fp, img->data, img->size)) |
2092
614b161c0aa5
Initial support for reading PPM/PGM.
Matti Hamalainen <ccr@tnsp.org>
parents:
2091
diff
changeset
|
1017 { |
614b161c0aa5
Initial support for reading PPM/PGM.
Matti Hamalainen <ccr@tnsp.org>
parents:
2091
diff
changeset
|
1018 res = dmError(DMERR_FREAD, |
614b161c0aa5
Initial support for reading PPM/PGM.
Matti Hamalainen <ccr@tnsp.org>
parents:
2091
diff
changeset
|
1019 "PPM: Could not read image data.\n"); |
614b161c0aa5
Initial support for reading PPM/PGM.
Matti Hamalainen <ccr@tnsp.org>
parents:
2091
diff
changeset
|
1020 goto error; |
614b161c0aa5
Initial support for reading PPM/PGM.
Matti Hamalainen <ccr@tnsp.org>
parents:
2091
diff
changeset
|
1021 } |
614b161c0aa5
Initial support for reading PPM/PGM.
Matti Hamalainen <ccr@tnsp.org>
parents:
2091
diff
changeset
|
1022 |
614b161c0aa5
Initial support for reading PPM/PGM.
Matti Hamalainen <ccr@tnsp.org>
parents:
2091
diff
changeset
|
1023 error: |
614b161c0aa5
Initial support for reading PPM/PGM.
Matti Hamalainen <ccr@tnsp.org>
parents:
2091
diff
changeset
|
1024 |
614b161c0aa5
Initial support for reading PPM/PGM.
Matti Hamalainen <ccr@tnsp.org>
parents:
2091
diff
changeset
|
1025 return res; |
614b161c0aa5
Initial support for reading PPM/PGM.
Matti Hamalainen <ccr@tnsp.org>
parents:
2091
diff
changeset
|
1026 } |
614b161c0aa5
Initial support for reading PPM/PGM.
Matti Hamalainen <ccr@tnsp.org>
parents:
2091
diff
changeset
|
1027 |
614b161c0aa5
Initial support for reading PPM/PGM.
Matti Hamalainen <ccr@tnsp.org>
parents:
2091
diff
changeset
|
1028 |
614b161c0aa5
Initial support for reading PPM/PGM.
Matti Hamalainen <ccr@tnsp.org>
parents:
2091
diff
changeset
|
1029 static int fmtProbePPM(const Uint8 *buf, const size_t len) |
614b161c0aa5
Initial support for reading PPM/PGM.
Matti Hamalainen <ccr@tnsp.org>
parents:
2091
diff
changeset
|
1030 { |
614b161c0aa5
Initial support for reading PPM/PGM.
Matti Hamalainen <ccr@tnsp.org>
parents:
2091
diff
changeset
|
1031 if (len > 32 && |
614b161c0aa5
Initial support for reading PPM/PGM.
Matti Hamalainen <ccr@tnsp.org>
parents:
2091
diff
changeset
|
1032 buf[0] == 'P' && |
2101
da886b8cbb09
Improve PPM/PGM/PNM probing and header parsing.
Matti Hamalainen <ccr@tnsp.org>
parents:
2100
diff
changeset
|
1033 (buf[1] == '5' || buf[1] == '6')) |
2092
614b161c0aa5
Initial support for reading PPM/PGM.
Matti Hamalainen <ccr@tnsp.org>
parents:
2091
diff
changeset
|
1034 return DM_PROBE_SCORE_MAX; |
614b161c0aa5
Initial support for reading PPM/PGM.
Matti Hamalainen <ccr@tnsp.org>
parents:
2091
diff
changeset
|
1035 |
614b161c0aa5
Initial support for reading PPM/PGM.
Matti Hamalainen <ccr@tnsp.org>
parents:
2091
diff
changeset
|
1036 return DM_PROBE_SCORE_FALSE; |
614b161c0aa5
Initial support for reading PPM/PGM.
Matti Hamalainen <ccr@tnsp.org>
parents:
2091
diff
changeset
|
1037 } |
614b161c0aa5
Initial support for reading PPM/PGM.
Matti Hamalainen <ccr@tnsp.org>
parents:
2091
diff
changeset
|
1038 |
614b161c0aa5
Initial support for reading PPM/PGM.
Matti Hamalainen <ccr@tnsp.org>
parents:
2091
diff
changeset
|
1039 |
435 | 1040 #ifdef DM_USE_LIBPNG |
1613
70b04c16aa40
Move format probe functions near to their other functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
1609
diff
changeset
|
1041 static int fmtProbePNG(const Uint8 *buf, const size_t len) |
70b04c16aa40
Move format probe functions near to their other functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
1609
diff
changeset
|
1042 { |
70b04c16aa40
Move format probe functions near to their other functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
1609
diff
changeset
|
1043 if (len > 64 && buf[0] == 0x89 && |
70b04c16aa40
Move format probe functions near to their other functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
1609
diff
changeset
|
1044 buf[1] == 'P' && buf[2] == 'N' && buf[3] == 'G' && |
70b04c16aa40
Move format probe functions near to their other functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
1609
diff
changeset
|
1045 buf[4] == 0x0d && buf[5] == 0x0a) |
70b04c16aa40
Move format probe functions near to their other functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
1609
diff
changeset
|
1046 { |
70b04c16aa40
Move format probe functions near to their other functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
1609
diff
changeset
|
1047 if (buf[12] == 'I' && buf[13] == 'H' && |
70b04c16aa40
Move format probe functions near to their other functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
1609
diff
changeset
|
1048 buf[14] == 'D' && buf[15] == 'R') |
70b04c16aa40
Move format probe functions near to their other functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
1609
diff
changeset
|
1049 return DM_PROBE_SCORE_MAX; |
70b04c16aa40
Move format probe functions near to their other functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
1609
diff
changeset
|
1050 else |
70b04c16aa40
Move format probe functions near to their other functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
1609
diff
changeset
|
1051 return DM_PROBE_SCORE_GOOD; |
70b04c16aa40
Move format probe functions near to their other functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
1609
diff
changeset
|
1052 } |
70b04c16aa40
Move format probe functions near to their other functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
1609
diff
changeset
|
1053 |
70b04c16aa40
Move format probe functions near to their other functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
1609
diff
changeset
|
1054 return DM_PROBE_SCORE_FALSE; |
70b04c16aa40
Move format probe functions near to their other functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
1609
diff
changeset
|
1055 } |
70b04c16aa40
Move format probe functions near to their other functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
1609
diff
changeset
|
1056 |
70b04c16aa40
Move format probe functions near to their other functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
1609
diff
changeset
|
1057 |
1301 | 1058 static int dmWritePNGRow(void *cbdata, const Uint8 *row, const size_t len) |
435 | 1059 { |
1060 png_structp png_ptr = cbdata; | |
1061 (void) len; | |
1062 | |
1063 if (setjmp(png_jmpbuf(png_ptr))) | |
808
f8126fa1df9b
Use dmlib error code return value in cases where a plain boolean was used
Matti Hamalainen <ccr@tnsp.org>
parents:
800
diff
changeset
|
1064 return DMERR_INTERNAL; |
435 | 1065 |
1066 png_write_row(png_ptr, row); | |
1067 | |
808
f8126fa1df9b
Use dmlib error code return value in cases where a plain boolean was used
Matti Hamalainen <ccr@tnsp.org>
parents:
800
diff
changeset
|
1068 return DMERR_OK; |
435 | 1069 } |
1070 | |
1071 | |
1609
c29adf5ce240
Convert libgfx file format routines to use DMResource instead of stdio FILE.
Matti Hamalainen <ccr@tnsp.org>
parents:
1583
diff
changeset
|
1072 static void dmPNGWriteData(png_structp png_ptr, png_bytep data, png_size_t length) |
c29adf5ce240
Convert libgfx file format routines to use DMResource instead of stdio FILE.
Matti Hamalainen <ccr@tnsp.org>
parents:
1583
diff
changeset
|
1073 { |
c29adf5ce240
Convert libgfx file format routines to use DMResource instead of stdio FILE.
Matti Hamalainen <ccr@tnsp.org>
parents:
1583
diff
changeset
|
1074 DMResource *res = (DMResource *) png_get_io_ptr(png_ptr); |
c29adf5ce240
Convert libgfx file format routines to use DMResource instead of stdio FILE.
Matti Hamalainen <ccr@tnsp.org>
parents:
1583
diff
changeset
|
1075 |
c29adf5ce240
Convert libgfx file format routines to use DMResource instead of stdio FILE.
Matti Hamalainen <ccr@tnsp.org>
parents:
1583
diff
changeset
|
1076 // XXX TODO: How the fuck does one do error handling here? |
c29adf5ce240
Convert libgfx file format routines to use DMResource instead of stdio FILE.
Matti Hamalainen <ccr@tnsp.org>
parents:
1583
diff
changeset
|
1077 dmf_write_str(res, data, length); |
c29adf5ce240
Convert libgfx file format routines to use DMResource instead of stdio FILE.
Matti Hamalainen <ccr@tnsp.org>
parents:
1583
diff
changeset
|
1078 } |
c29adf5ce240
Convert libgfx file format routines to use DMResource instead of stdio FILE.
Matti Hamalainen <ccr@tnsp.org>
parents:
1583
diff
changeset
|
1079 |
c29adf5ce240
Convert libgfx file format routines to use DMResource instead of stdio FILE.
Matti Hamalainen <ccr@tnsp.org>
parents:
1583
diff
changeset
|
1080 |
c29adf5ce240
Convert libgfx file format routines to use DMResource instead of stdio FILE.
Matti Hamalainen <ccr@tnsp.org>
parents:
1583
diff
changeset
|
1081 static void dmPNGWriteFlush(png_structp png_ptr) |
c29adf5ce240
Convert libgfx file format routines to use DMResource instead of stdio FILE.
Matti Hamalainen <ccr@tnsp.org>
parents:
1583
diff
changeset
|
1082 { |
c29adf5ce240
Convert libgfx file format routines to use DMResource instead of stdio FILE.
Matti Hamalainen <ccr@tnsp.org>
parents:
1583
diff
changeset
|
1083 (void) png_ptr; |
c29adf5ce240
Convert libgfx file format routines to use DMResource instead of stdio FILE.
Matti Hamalainen <ccr@tnsp.org>
parents:
1583
diff
changeset
|
1084 } |
c29adf5ce240
Convert libgfx file format routines to use DMResource instead of stdio FILE.
Matti Hamalainen <ccr@tnsp.org>
parents:
1583
diff
changeset
|
1085 |
c29adf5ce240
Convert libgfx file format routines to use DMResource instead of stdio FILE.
Matti Hamalainen <ccr@tnsp.org>
parents:
1583
diff
changeset
|
1086 |
2156
e6ec7fad9ce2
Rename DMImageConvSpec to DMImageWriteSpec to better reflec the struct's purpose.
Matti Hamalainen <ccr@tnsp.org>
parents:
2154
diff
changeset
|
1087 int dmWritePNGImage(DMResource *fp, const DMImage *img, const DMImageWriteSpec *spec) |
435 | 1088 { |
1089 png_structp png_ptr = NULL; | |
1090 png_infop info_ptr = NULL; | |
1304
e968b259605b
Fix a warning about potentially clobbered variable due to setjmp() use.
Matti Hamalainen <ccr@tnsp.org>
parents:
1303
diff
changeset
|
1091 int fmt, res; |
435 | 1092 |
2154
1c111bfc17d4
Add check to PNG and PPM output as well.
Matti Hamalainen <ccr@tnsp.org>
parents:
2153
diff
changeset
|
1093 // Check if we can do this |
2157
9a9493809b3a
Rename DM_COLFMT_* constants to DM_PIXFMT_* and the 'format' field of DMImage
Matti Hamalainen <ccr@tnsp.org>
parents:
2156
diff
changeset
|
1094 if ((spec->pixfmt == DM_PIXFMT_PALETTE || spec->pixfmt == DM_PIXFMT_GRAYSCALE) && |
9a9493809b3a
Rename DM_COLFMT_* constants to DM_PIXFMT_* and the 'format' field of DMImage
Matti Hamalainen <ccr@tnsp.org>
parents:
2156
diff
changeset
|
1095 img->pixfmt != spec->pixfmt) |
2154
1c111bfc17d4
Add check to PNG and PPM output as well.
Matti Hamalainen <ccr@tnsp.org>
parents:
2153
diff
changeset
|
1096 { |
1c111bfc17d4
Add check to PNG and PPM output as well.
Matti Hamalainen <ccr@tnsp.org>
parents:
2153
diff
changeset
|
1097 return dmError(DMERR_NOT_SUPPORTED, |
1c111bfc17d4
Add check to PNG and PPM output as well.
Matti Hamalainen <ccr@tnsp.org>
parents:
2153
diff
changeset
|
1098 "Conversion of non-indexed image to indexed not supported yet.\n"); |
1c111bfc17d4
Add check to PNG and PPM output as well.
Matti Hamalainen <ccr@tnsp.org>
parents:
2153
diff
changeset
|
1099 } |
1c111bfc17d4
Add check to PNG and PPM output as well.
Matti Hamalainen <ccr@tnsp.org>
parents:
2153
diff
changeset
|
1100 |
435 | 1101 // Create PNG structures |
1102 png_ptr = png_create_write_struct( | |
1103 PNG_LIBPNG_VER_STRING, | |
1104 NULL, NULL, NULL); | |
1105 | |
1106 if (png_ptr == NULL) | |
1107 { | |
958
985225a93aeb
Add error code parameter to dmError() and dmErrorVA().
Matti Hamalainen <ccr@tnsp.org>
parents:
930
diff
changeset
|
1108 res = dmError(DMERR_MALLOC, |
985225a93aeb
Add error code parameter to dmError() and dmErrorVA().
Matti Hamalainen <ccr@tnsp.org>
parents:
930
diff
changeset
|
1109 "PNG: png_create_write_struct() failed.\n"); |
435 | 1110 goto error; |
1111 } | |
1102
e06abfde6c39
Cosmetics pass: Remove excess whitespace.
Matti Hamalainen <ccr@tnsp.org>
parents:
958
diff
changeset
|
1112 |
435 | 1113 info_ptr = png_create_info_struct(png_ptr); |
1114 if (info_ptr == NULL) | |
1115 { | |
958
985225a93aeb
Add error code parameter to dmError() and dmErrorVA().
Matti Hamalainen <ccr@tnsp.org>
parents:
930
diff
changeset
|
1116 res = dmError(DMERR_INIT_FAIL, |
985225a93aeb
Add error code parameter to dmError() and dmErrorVA().
Matti Hamalainen <ccr@tnsp.org>
parents:
930
diff
changeset
|
1117 "PNG: png_create_info_struct(%p) failed.\n", |
985225a93aeb
Add error code parameter to dmError() and dmErrorVA().
Matti Hamalainen <ccr@tnsp.org>
parents:
930
diff
changeset
|
1118 png_ptr); |
435 | 1119 goto error; |
1120 } | |
1102
e06abfde6c39
Cosmetics pass: Remove excess whitespace.
Matti Hamalainen <ccr@tnsp.org>
parents:
958
diff
changeset
|
1121 |
435 | 1122 if (setjmp(png_jmpbuf(png_ptr))) |
1123 { | |
958
985225a93aeb
Add error code parameter to dmError() and dmErrorVA().
Matti Hamalainen <ccr@tnsp.org>
parents:
930
diff
changeset
|
1124 res = dmError(DMERR_INIT_FAIL, |
985225a93aeb
Add error code parameter to dmError() and dmErrorVA().
Matti Hamalainen <ccr@tnsp.org>
parents:
930
diff
changeset
|
1125 "PNG: Error during image writing..\n"); |
435 | 1126 goto error; |
1127 } | |
1128 | |
1304
e968b259605b
Fix a warning about potentially clobbered variable due to setjmp() use.
Matti Hamalainen <ccr@tnsp.org>
parents:
1303
diff
changeset
|
1129 res = DMERR_OK; |
1609
c29adf5ce240
Convert libgfx file format routines to use DMResource instead of stdio FILE.
Matti Hamalainen <ccr@tnsp.org>
parents:
1583
diff
changeset
|
1130 png_set_write_fn(png_ptr, fp, dmPNGWriteData, dmPNGWriteFlush); |
435 | 1131 |
1132 // Write PNG header info | |
2157
9a9493809b3a
Rename DM_COLFMT_* constants to DM_PIXFMT_* and the 'format' field of DMImage
Matti Hamalainen <ccr@tnsp.org>
parents:
2156
diff
changeset
|
1133 switch (spec->pixfmt) |
435 | 1134 { |
2157
9a9493809b3a
Rename DM_COLFMT_* constants to DM_PIXFMT_* and the 'format' field of DMImage
Matti Hamalainen <ccr@tnsp.org>
parents:
2156
diff
changeset
|
1135 case DM_PIXFMT_PALETTE : fmt = PNG_COLOR_TYPE_PALETTE; break; |
9a9493809b3a
Rename DM_COLFMT_* constants to DM_PIXFMT_* and the 'format' field of DMImage
Matti Hamalainen <ccr@tnsp.org>
parents:
2156
diff
changeset
|
1136 case DM_PIXFMT_GRAYSCALE : fmt = PNG_COLOR_TYPE_GRAY; break; |
9a9493809b3a
Rename DM_COLFMT_* constants to DM_PIXFMT_* and the 'format' field of DMImage
Matti Hamalainen <ccr@tnsp.org>
parents:
2156
diff
changeset
|
1137 case DM_PIXFMT_RGB : fmt = PNG_COLOR_TYPE_RGB; break; |
9a9493809b3a
Rename DM_COLFMT_* constants to DM_PIXFMT_* and the 'format' field of DMImage
Matti Hamalainen <ccr@tnsp.org>
parents:
2156
diff
changeset
|
1138 case DM_PIXFMT_RGBA : fmt = PNG_COLOR_TYPE_RGB_ALPHA; break; |
435 | 1139 default: |
958
985225a93aeb
Add error code parameter to dmError() and dmErrorVA().
Matti Hamalainen <ccr@tnsp.org>
parents:
930
diff
changeset
|
1140 res = dmError(DMERR_NOT_SUPPORTED, |
985225a93aeb
Add error code parameter to dmError() and dmErrorVA().
Matti Hamalainen <ccr@tnsp.org>
parents:
930
diff
changeset
|
1141 "PNG: Unsupported image format %d.\n", |
2157
9a9493809b3a
Rename DM_COLFMT_* constants to DM_PIXFMT_* and the 'format' field of DMImage
Matti Hamalainen <ccr@tnsp.org>
parents:
2156
diff
changeset
|
1142 spec->pixfmt); |
435 | 1143 goto error; |
1144 } | |
1102
e06abfde6c39
Cosmetics pass: Remove excess whitespace.
Matti Hamalainen <ccr@tnsp.org>
parents:
958
diff
changeset
|
1145 |
2022
eb6dafdd36dc
Add option -C for controlling output file compression (PNG and IFF for now) in gfxconv.
Matti Hamalainen <ccr@tnsp.org>
parents:
2020
diff
changeset
|
1146 png_set_compression_level(png_ptr, spec->compression); |
eb6dafdd36dc
Add option -C for controlling output file compression (PNG and IFF for now) in gfxconv.
Matti Hamalainen <ccr@tnsp.org>
parents:
2020
diff
changeset
|
1147 |
435 | 1148 png_set_IHDR(png_ptr, info_ptr, |
902
c6c480e8e1c8
Add separate X and Y scaling to gfxconv and libgfx outputters.
Matti Hamalainen <ccr@tnsp.org>
parents:
858
diff
changeset
|
1149 img->width * spec->scaleX, |
c6c480e8e1c8
Add separate X and Y scaling to gfxconv and libgfx outputters.
Matti Hamalainen <ccr@tnsp.org>
parents:
858
diff
changeset
|
1150 img->height * spec->scaleY, |
2091 | 1151 8, // bits per component: TODO: FIXME: calculate and use |
435 | 1152 fmt, |
1153 PNG_INTERLACE_NONE, | |
1154 PNG_COMPRESSION_TYPE_DEFAULT, | |
1155 PNG_FILTER_TYPE_DEFAULT); | |
1156 | |
1287
32051ad352c8
Adjust debug messages and debug message levels in libgfx.
Matti Hamalainen <ccr@tnsp.org>
parents:
1286
diff
changeset
|
1157 dmMsg(2, "PNG: %d x %d, depth=%d, type=%d\n", |
902
c6c480e8e1c8
Add separate X and Y scaling to gfxconv and libgfx outputters.
Matti Hamalainen <ccr@tnsp.org>
parents:
858
diff
changeset
|
1158 img->width * spec->scaleX, |
c6c480e8e1c8
Add separate X and Y scaling to gfxconv and libgfx outputters.
Matti Hamalainen <ccr@tnsp.org>
parents:
858
diff
changeset
|
1159 img->height * spec->scaleY, |
460
0af039b6c0ae
Improve transparent color handling.
Matti Hamalainen <ccr@tnsp.org>
parents:
453
diff
changeset
|
1160 8, fmt); |
0af039b6c0ae
Improve transparent color handling.
Matti Hamalainen <ccr@tnsp.org>
parents:
453
diff
changeset
|
1161 |
435 | 1162 // Palette |
2157
9a9493809b3a
Rename DM_COLFMT_* constants to DM_PIXFMT_* and the 'format' field of DMImage
Matti Hamalainen <ccr@tnsp.org>
parents:
2156
diff
changeset
|
1163 if (spec->pixfmt == DM_PIXFMT_PALETTE) |
435 | 1164 { |
858
e7019bd83cca
Fix potential longjmp clobbering of variable.
Matti Hamalainen <ccr@tnsp.org>
parents:
834
diff
changeset
|
1165 png_colorp palette = png_malloc(png_ptr, PNG_MAX_PALETTE_LENGTH * sizeof(png_color)); |
435 | 1166 |
1167 if (palette == NULL) | |
1168 { | |
958
985225a93aeb
Add error code parameter to dmError() and dmErrorVA().
Matti Hamalainen <ccr@tnsp.org>
parents:
930
diff
changeset
|
1169 res = dmError(DMERR_MALLOC, |
985225a93aeb
Add error code parameter to dmError() and dmErrorVA().
Matti Hamalainen <ccr@tnsp.org>
parents:
930
diff
changeset
|
1170 "PNG: Could not allocate palette structure."); |
435 | 1171 goto error; |
1172 } | |
1102
e06abfde6c39
Cosmetics pass: Remove excess whitespace.
Matti Hamalainen <ccr@tnsp.org>
parents:
958
diff
changeset
|
1173 |
2414
69a5af2eb1ea
Remove useless dmMemset().
Matti Hamalainen <ccr@tnsp.org>
parents:
2393
diff
changeset
|
1174 memset(palette, 0, PNG_MAX_PALETTE_LENGTH * sizeof(png_color)); |
435 | 1175 |
2094
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
1176 for (int i = 0; i < img->pal->ncolors; i++) |
435 | 1177 { |
2094
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
1178 palette[i].red = img->pal->colors[i].r; |
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
1179 palette[i].green = img->pal->colors[i].g; |
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
1180 palette[i].blue = img->pal->colors[i].b; |
435 | 1181 } |
1182 | |
2094
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
1183 png_set_PLTE(png_ptr, info_ptr, palette, img->pal->ncolors); |
1938
a8e475eede4a
Fix two memory leaks in the PNG writer/reader of libgfx.
Matti Hamalainen <ccr@tnsp.org>
parents:
1921
diff
changeset
|
1184 png_free(png_ptr, palette); |
435 | 1185 } |
1186 | |
1187 // png_set_gAMA(png_ptr, info_ptr, 2.2); | |
1188 | |
1189 png_write_info(png_ptr, info_ptr); | |
1190 | |
1191 | |
1192 // Write compressed image data | |
1193 dmWriteImageData(img, (void *) png_ptr, dmWritePNGRow, spec); | |
1194 | |
1195 // Write footer | |
1196 png_write_end(png_ptr, NULL); | |
1197 | |
1198 error: | |
1199 if (png_ptr && info_ptr) | |
1200 png_destroy_write_struct(&png_ptr, &info_ptr); | |
1201 | |
1202 return res; | |
1203 } | |
1204 | |
1205 | |
1609
c29adf5ce240
Convert libgfx file format routines to use DMResource instead of stdio FILE.
Matti Hamalainen <ccr@tnsp.org>
parents:
1583
diff
changeset
|
1206 void dmPNGReadData(png_structp png_ptr, png_bytep data, png_size_t length) |
c29adf5ce240
Convert libgfx file format routines to use DMResource instead of stdio FILE.
Matti Hamalainen <ccr@tnsp.org>
parents:
1583
diff
changeset
|
1207 { |
c29adf5ce240
Convert libgfx file format routines to use DMResource instead of stdio FILE.
Matti Hamalainen <ccr@tnsp.org>
parents:
1583
diff
changeset
|
1208 DMResource *res = (DMResource *) png_get_io_ptr(png_ptr); |
c29adf5ce240
Convert libgfx file format routines to use DMResource instead of stdio FILE.
Matti Hamalainen <ccr@tnsp.org>
parents:
1583
diff
changeset
|
1209 |
c29adf5ce240
Convert libgfx file format routines to use DMResource instead of stdio FILE.
Matti Hamalainen <ccr@tnsp.org>
parents:
1583
diff
changeset
|
1210 // XXX TODO: How the fuck does one do error handling here? |
c29adf5ce240
Convert libgfx file format routines to use DMResource instead of stdio FILE.
Matti Hamalainen <ccr@tnsp.org>
parents:
1583
diff
changeset
|
1211 dmf_read_str(res, data, length); |
c29adf5ce240
Convert libgfx file format routines to use DMResource instead of stdio FILE.
Matti Hamalainen <ccr@tnsp.org>
parents:
1583
diff
changeset
|
1212 } |
c29adf5ce240
Convert libgfx file format routines to use DMResource instead of stdio FILE.
Matti Hamalainen <ccr@tnsp.org>
parents:
1583
diff
changeset
|
1213 |
1886
1af79412f249
Remove the stdio FILE support from libgfx API, now only DMResource is supported.
Matti Hamalainen <ccr@tnsp.org>
parents:
1881
diff
changeset
|
1214 |
1af79412f249
Remove the stdio FILE support from libgfx API, now only DMResource is supported.
Matti Hamalainen <ccr@tnsp.org>
parents:
1881
diff
changeset
|
1215 int dmReadPNGImage(DMResource *fp, DMImage **pimg) |
453
349a2ff11531
Implement PNG (1-8bpp indexed) reading support via libPNG.
Matti Hamalainen <ccr@tnsp.org>
parents:
452
diff
changeset
|
1216 { |
349a2ff11531
Implement PNG (1-8bpp indexed) reading support via libPNG.
Matti Hamalainen <ccr@tnsp.org>
parents:
452
diff
changeset
|
1217 png_structp png_ptr = NULL; |
349a2ff11531
Implement PNG (1-8bpp indexed) reading support via libPNG.
Matti Hamalainen <ccr@tnsp.org>
parents:
452
diff
changeset
|
1218 png_infop info_ptr = NULL; |
349a2ff11531
Implement PNG (1-8bpp indexed) reading support via libPNG.
Matti Hamalainen <ccr@tnsp.org>
parents:
452
diff
changeset
|
1219 png_colorp palette = NULL; |
349a2ff11531
Implement PNG (1-8bpp indexed) reading support via libPNG.
Matti Hamalainen <ccr@tnsp.org>
parents:
452
diff
changeset
|
1220 png_bytep *row_pointers = NULL; |
460
0af039b6c0ae
Improve transparent color handling.
Matti Hamalainen <ccr@tnsp.org>
parents:
453
diff
changeset
|
1221 png_bytep trans = NULL; |
1940
c77019065b96
Initialize two variables to zero, as valgrind complains about them despite
Matti Hamalainen <ccr@tnsp.org>
parents:
1939
diff
changeset
|
1222 png_uint_32 width, height, res_x = 0, res_y = 0; |
2094
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
1223 int res, itype, bit_depth, color_type, ncolors, ntrans, unit_type; |
453
349a2ff11531
Implement PNG (1-8bpp indexed) reading support via libPNG.
Matti Hamalainen <ccr@tnsp.org>
parents:
452
diff
changeset
|
1224 DMImage *img; |
349a2ff11531
Implement PNG (1-8bpp indexed) reading support via libPNG.
Matti Hamalainen <ccr@tnsp.org>
parents:
452
diff
changeset
|
1225 |
349a2ff11531
Implement PNG (1-8bpp indexed) reading support via libPNG.
Matti Hamalainen <ccr@tnsp.org>
parents:
452
diff
changeset
|
1226 // Create PNG structures |
349a2ff11531
Implement PNG (1-8bpp indexed) reading support via libPNG.
Matti Hamalainen <ccr@tnsp.org>
parents:
452
diff
changeset
|
1227 png_ptr = png_create_read_struct( |
349a2ff11531
Implement PNG (1-8bpp indexed) reading support via libPNG.
Matti Hamalainen <ccr@tnsp.org>
parents:
452
diff
changeset
|
1228 PNG_LIBPNG_VER_STRING, |
349a2ff11531
Implement PNG (1-8bpp indexed) reading support via libPNG.
Matti Hamalainen <ccr@tnsp.org>
parents:
452
diff
changeset
|
1229 NULL, NULL, NULL); |
349a2ff11531
Implement PNG (1-8bpp indexed) reading support via libPNG.
Matti Hamalainen <ccr@tnsp.org>
parents:
452
diff
changeset
|
1230 |
349a2ff11531
Implement PNG (1-8bpp indexed) reading support via libPNG.
Matti Hamalainen <ccr@tnsp.org>
parents:
452
diff
changeset
|
1231 if (png_ptr == NULL) |
349a2ff11531
Implement PNG (1-8bpp indexed) reading support via libPNG.
Matti Hamalainen <ccr@tnsp.org>
parents:
452
diff
changeset
|
1232 { |
958
985225a93aeb
Add error code parameter to dmError() and dmErrorVA().
Matti Hamalainen <ccr@tnsp.org>
parents:
930
diff
changeset
|
1233 res = dmError(DMERR_MALLOC, |
985225a93aeb
Add error code parameter to dmError() and dmErrorVA().
Matti Hamalainen <ccr@tnsp.org>
parents:
930
diff
changeset
|
1234 "PNG: png_create_write_struct() failed.\n"); |
453
349a2ff11531
Implement PNG (1-8bpp indexed) reading support via libPNG.
Matti Hamalainen <ccr@tnsp.org>
parents:
452
diff
changeset
|
1235 goto error; |
349a2ff11531
Implement PNG (1-8bpp indexed) reading support via libPNG.
Matti Hamalainen <ccr@tnsp.org>
parents:
452
diff
changeset
|
1236 } |
349a2ff11531
Implement PNG (1-8bpp indexed) reading support via libPNG.
Matti Hamalainen <ccr@tnsp.org>
parents:
452
diff
changeset
|
1237 |
349a2ff11531
Implement PNG (1-8bpp indexed) reading support via libPNG.
Matti Hamalainen <ccr@tnsp.org>
parents:
452
diff
changeset
|
1238 info_ptr = png_create_info_struct(png_ptr); |
349a2ff11531
Implement PNG (1-8bpp indexed) reading support via libPNG.
Matti Hamalainen <ccr@tnsp.org>
parents:
452
diff
changeset
|
1239 if (info_ptr == NULL) |
349a2ff11531
Implement PNG (1-8bpp indexed) reading support via libPNG.
Matti Hamalainen <ccr@tnsp.org>
parents:
452
diff
changeset
|
1240 { |
958
985225a93aeb
Add error code parameter to dmError() and dmErrorVA().
Matti Hamalainen <ccr@tnsp.org>
parents:
930
diff
changeset
|
1241 res = dmError(DMERR_INIT_FAIL, |
985225a93aeb
Add error code parameter to dmError() and dmErrorVA().
Matti Hamalainen <ccr@tnsp.org>
parents:
930
diff
changeset
|
1242 "PNG: png_create_info_struct(%p) failed.\n", |
985225a93aeb
Add error code parameter to dmError() and dmErrorVA().
Matti Hamalainen <ccr@tnsp.org>
parents:
930
diff
changeset
|
1243 png_ptr); |
453
349a2ff11531
Implement PNG (1-8bpp indexed) reading support via libPNG.
Matti Hamalainen <ccr@tnsp.org>
parents:
452
diff
changeset
|
1244 goto error; |
349a2ff11531
Implement PNG (1-8bpp indexed) reading support via libPNG.
Matti Hamalainen <ccr@tnsp.org>
parents:
452
diff
changeset
|
1245 } |
1102
e06abfde6c39
Cosmetics pass: Remove excess whitespace.
Matti Hamalainen <ccr@tnsp.org>
parents:
958
diff
changeset
|
1246 |
453
349a2ff11531
Implement PNG (1-8bpp indexed) reading support via libPNG.
Matti Hamalainen <ccr@tnsp.org>
parents:
452
diff
changeset
|
1247 if (setjmp(png_jmpbuf(png_ptr))) |
349a2ff11531
Implement PNG (1-8bpp indexed) reading support via libPNG.
Matti Hamalainen <ccr@tnsp.org>
parents:
452
diff
changeset
|
1248 { |
958
985225a93aeb
Add error code parameter to dmError() and dmErrorVA().
Matti Hamalainen <ccr@tnsp.org>
parents:
930
diff
changeset
|
1249 res = dmError(DMERR_INIT_FAIL, |
1291 | 1250 "PNG: Error during image reading.\n"); |
453
349a2ff11531
Implement PNG (1-8bpp indexed) reading support via libPNG.
Matti Hamalainen <ccr@tnsp.org>
parents:
452
diff
changeset
|
1251 goto error; |
349a2ff11531
Implement PNG (1-8bpp indexed) reading support via libPNG.
Matti Hamalainen <ccr@tnsp.org>
parents:
452
diff
changeset
|
1252 } |
349a2ff11531
Implement PNG (1-8bpp indexed) reading support via libPNG.
Matti Hamalainen <ccr@tnsp.org>
parents:
452
diff
changeset
|
1253 |
2330 | 1254 res = DMERR_OK; |
1609
c29adf5ce240
Convert libgfx file format routines to use DMResource instead of stdio FILE.
Matti Hamalainen <ccr@tnsp.org>
parents:
1583
diff
changeset
|
1255 png_set_read_fn(png_ptr, fp, dmPNGReadData); |
453
349a2ff11531
Implement PNG (1-8bpp indexed) reading support via libPNG.
Matti Hamalainen <ccr@tnsp.org>
parents:
452
diff
changeset
|
1256 |
349a2ff11531
Implement PNG (1-8bpp indexed) reading support via libPNG.
Matti Hamalainen <ccr@tnsp.org>
parents:
452
diff
changeset
|
1257 // Read image information |
349a2ff11531
Implement PNG (1-8bpp indexed) reading support via libPNG.
Matti Hamalainen <ccr@tnsp.org>
parents:
452
diff
changeset
|
1258 png_read_info(png_ptr, info_ptr); |
349a2ff11531
Implement PNG (1-8bpp indexed) reading support via libPNG.
Matti Hamalainen <ccr@tnsp.org>
parents:
452
diff
changeset
|
1259 |
349a2ff11531
Implement PNG (1-8bpp indexed) reading support via libPNG.
Matti Hamalainen <ccr@tnsp.org>
parents:
452
diff
changeset
|
1260 png_get_IHDR(png_ptr, info_ptr, &width, &height, |
349a2ff11531
Implement PNG (1-8bpp indexed) reading support via libPNG.
Matti Hamalainen <ccr@tnsp.org>
parents:
452
diff
changeset
|
1261 &bit_depth, &color_type, NULL, NULL, NULL); |
349a2ff11531
Implement PNG (1-8bpp indexed) reading support via libPNG.
Matti Hamalainen <ccr@tnsp.org>
parents:
452
diff
changeset
|
1262 |
2257
c7495fcaffa9
Check image dimensions when loading PPM/PNG/PCX/IFF images.
Matti Hamalainen <ccr@tnsp.org>
parents:
2220
diff
changeset
|
1263 dmMsg(2, "PNG: %d x %d, bit_depth=%d, color_type=%d\n", |
c7495fcaffa9
Check image dimensions when loading PPM/PNG/PCX/IFF images.
Matti Hamalainen <ccr@tnsp.org>
parents:
2220
diff
changeset
|
1264 width, height, bit_depth, color_type); |
c7495fcaffa9
Check image dimensions when loading PPM/PNG/PCX/IFF images.
Matti Hamalainen <ccr@tnsp.org>
parents:
2220
diff
changeset
|
1265 |
453
349a2ff11531
Implement PNG (1-8bpp indexed) reading support via libPNG.
Matti Hamalainen <ccr@tnsp.org>
parents:
452
diff
changeset
|
1266 if (width < 1 || height < 1) |
349a2ff11531
Implement PNG (1-8bpp indexed) reading support via libPNG.
Matti Hamalainen <ccr@tnsp.org>
parents:
452
diff
changeset
|
1267 { |
958
985225a93aeb
Add error code parameter to dmError() and dmErrorVA().
Matti Hamalainen <ccr@tnsp.org>
parents:
930
diff
changeset
|
1268 res = dmError(DMERR_INVALID_DATA, |
2257
c7495fcaffa9
Check image dimensions when loading PPM/PNG/PCX/IFF images.
Matti Hamalainen <ccr@tnsp.org>
parents:
2220
diff
changeset
|
1269 "PNG: Invalid image dimensions.\n"); |
453
349a2ff11531
Implement PNG (1-8bpp indexed) reading support via libPNG.
Matti Hamalainen <ccr@tnsp.org>
parents:
452
diff
changeset
|
1270 goto error; |
349a2ff11531
Implement PNG (1-8bpp indexed) reading support via libPNG.
Matti Hamalainen <ccr@tnsp.org>
parents:
452
diff
changeset
|
1271 } |
349a2ff11531
Implement PNG (1-8bpp indexed) reading support via libPNG.
Matti Hamalainen <ccr@tnsp.org>
parents:
452
diff
changeset
|
1272 |
349a2ff11531
Implement PNG (1-8bpp indexed) reading support via libPNG.
Matti Hamalainen <ccr@tnsp.org>
parents:
452
diff
changeset
|
1273 switch (color_type) |
349a2ff11531
Implement PNG (1-8bpp indexed) reading support via libPNG.
Matti Hamalainen <ccr@tnsp.org>
parents:
452
diff
changeset
|
1274 { |
349a2ff11531
Implement PNG (1-8bpp indexed) reading support via libPNG.
Matti Hamalainen <ccr@tnsp.org>
parents:
452
diff
changeset
|
1275 case PNG_COLOR_TYPE_GRAY: |
349a2ff11531
Implement PNG (1-8bpp indexed) reading support via libPNG.
Matti Hamalainen <ccr@tnsp.org>
parents:
452
diff
changeset
|
1276 if (bit_depth > 8) |
349a2ff11531
Implement PNG (1-8bpp indexed) reading support via libPNG.
Matti Hamalainen <ccr@tnsp.org>
parents:
452
diff
changeset
|
1277 { |
958
985225a93aeb
Add error code parameter to dmError() and dmErrorVA().
Matti Hamalainen <ccr@tnsp.org>
parents:
930
diff
changeset
|
1278 res = dmError(DMERR_NOT_SUPPORTED, |
985225a93aeb
Add error code parameter to dmError() and dmErrorVA().
Matti Hamalainen <ccr@tnsp.org>
parents:
930
diff
changeset
|
1279 "PNG: Unsupported bit depth for grayscale image: %d\n", |
453
349a2ff11531
Implement PNG (1-8bpp indexed) reading support via libPNG.
Matti Hamalainen <ccr@tnsp.org>
parents:
452
diff
changeset
|
1280 bit_depth); |
349a2ff11531
Implement PNG (1-8bpp indexed) reading support via libPNG.
Matti Hamalainen <ccr@tnsp.org>
parents:
452
diff
changeset
|
1281 goto error; |
349a2ff11531
Implement PNG (1-8bpp indexed) reading support via libPNG.
Matti Hamalainen <ccr@tnsp.org>
parents:
452
diff
changeset
|
1282 } |
2093
d17512dbb4ef
Some work on reading >8bpp images.
Matti Hamalainen <ccr@tnsp.org>
parents:
2092
diff
changeset
|
1283 |
d17512dbb4ef
Some work on reading >8bpp images.
Matti Hamalainen <ccr@tnsp.org>
parents:
2092
diff
changeset
|
1284 if (bit_depth < 8) |
d17512dbb4ef
Some work on reading >8bpp images.
Matti Hamalainen <ccr@tnsp.org>
parents:
2092
diff
changeset
|
1285 png_set_expand_gray_1_2_4_to_8(png_ptr); |
d17512dbb4ef
Some work on reading >8bpp images.
Matti Hamalainen <ccr@tnsp.org>
parents:
2092
diff
changeset
|
1286 |
2157
9a9493809b3a
Rename DM_COLFMT_* constants to DM_PIXFMT_* and the 'format' field of DMImage
Matti Hamalainen <ccr@tnsp.org>
parents:
2156
diff
changeset
|
1287 itype = DM_PIXFMT_GRAYSCALE; |
453
349a2ff11531
Implement PNG (1-8bpp indexed) reading support via libPNG.
Matti Hamalainen <ccr@tnsp.org>
parents:
452
diff
changeset
|
1288 break; |
1102
e06abfde6c39
Cosmetics pass: Remove excess whitespace.
Matti Hamalainen <ccr@tnsp.org>
parents:
958
diff
changeset
|
1289 |
453
349a2ff11531
Implement PNG (1-8bpp indexed) reading support via libPNG.
Matti Hamalainen <ccr@tnsp.org>
parents:
452
diff
changeset
|
1290 case PNG_COLOR_TYPE_PALETTE: |
349a2ff11531
Implement PNG (1-8bpp indexed) reading support via libPNG.
Matti Hamalainen <ccr@tnsp.org>
parents:
452
diff
changeset
|
1291 png_set_packing(png_ptr); |
2157
9a9493809b3a
Rename DM_COLFMT_* constants to DM_PIXFMT_* and the 'format' field of DMImage
Matti Hamalainen <ccr@tnsp.org>
parents:
2156
diff
changeset
|
1292 itype = DM_PIXFMT_PALETTE; |
2093
d17512dbb4ef
Some work on reading >8bpp images.
Matti Hamalainen <ccr@tnsp.org>
parents:
2092
diff
changeset
|
1293 break; |
d17512dbb4ef
Some work on reading >8bpp images.
Matti Hamalainen <ccr@tnsp.org>
parents:
2092
diff
changeset
|
1294 |
d17512dbb4ef
Some work on reading >8bpp images.
Matti Hamalainen <ccr@tnsp.org>
parents:
2092
diff
changeset
|
1295 case PNG_COLOR_TYPE_RGB: |
2157
9a9493809b3a
Rename DM_COLFMT_* constants to DM_PIXFMT_* and the 'format' field of DMImage
Matti Hamalainen <ccr@tnsp.org>
parents:
2156
diff
changeset
|
1296 itype = DM_PIXFMT_RGB; |
2093
d17512dbb4ef
Some work on reading >8bpp images.
Matti Hamalainen <ccr@tnsp.org>
parents:
2092
diff
changeset
|
1297 break; |
d17512dbb4ef
Some work on reading >8bpp images.
Matti Hamalainen <ccr@tnsp.org>
parents:
2092
diff
changeset
|
1298 |
d17512dbb4ef
Some work on reading >8bpp images.
Matti Hamalainen <ccr@tnsp.org>
parents:
2092
diff
changeset
|
1299 case PNG_COLOR_TYPE_RGBA: |
2157
9a9493809b3a
Rename DM_COLFMT_* constants to DM_PIXFMT_* and the 'format' field of DMImage
Matti Hamalainen <ccr@tnsp.org>
parents:
2156
diff
changeset
|
1300 itype = DM_PIXFMT_RGBA; |
453
349a2ff11531
Implement PNG (1-8bpp indexed) reading support via libPNG.
Matti Hamalainen <ccr@tnsp.org>
parents:
452
diff
changeset
|
1301 break; |
349a2ff11531
Implement PNG (1-8bpp indexed) reading support via libPNG.
Matti Hamalainen <ccr@tnsp.org>
parents:
452
diff
changeset
|
1302 |
349a2ff11531
Implement PNG (1-8bpp indexed) reading support via libPNG.
Matti Hamalainen <ccr@tnsp.org>
parents:
452
diff
changeset
|
1303 default: |
958
985225a93aeb
Add error code parameter to dmError() and dmErrorVA().
Matti Hamalainen <ccr@tnsp.org>
parents:
930
diff
changeset
|
1304 res = dmError(DMERR_NOT_SUPPORTED, |
985225a93aeb
Add error code parameter to dmError() and dmErrorVA().
Matti Hamalainen <ccr@tnsp.org>
parents:
930
diff
changeset
|
1305 "PNG: RGB/RGBA images not supported for loading.\n"); |
453
349a2ff11531
Implement PNG (1-8bpp indexed) reading support via libPNG.
Matti Hamalainen <ccr@tnsp.org>
parents:
452
diff
changeset
|
1306 goto error; |
349a2ff11531
Implement PNG (1-8bpp indexed) reading support via libPNG.
Matti Hamalainen <ccr@tnsp.org>
parents:
452
diff
changeset
|
1307 } |
349a2ff11531
Implement PNG (1-8bpp indexed) reading support via libPNG.
Matti Hamalainen <ccr@tnsp.org>
parents:
452
diff
changeset
|
1308 |
349a2ff11531
Implement PNG (1-8bpp indexed) reading support via libPNG.
Matti Hamalainen <ccr@tnsp.org>
parents:
452
diff
changeset
|
1309 // Allocate image |
1287
32051ad352c8
Adjust debug messages and debug message levels in libgfx.
Matti Hamalainen <ccr@tnsp.org>
parents:
1286
diff
changeset
|
1310 dmMsg(2, "PNG: %d x %d, depth=%d, type=%d\n", |
453
349a2ff11531
Implement PNG (1-8bpp indexed) reading support via libPNG.
Matti Hamalainen <ccr@tnsp.org>
parents:
452
diff
changeset
|
1311 width, height, bit_depth, color_type); |
349a2ff11531
Implement PNG (1-8bpp indexed) reading support via libPNG.
Matti Hamalainen <ccr@tnsp.org>
parents:
452
diff
changeset
|
1312 |
1300
fd442faa705f
"Fix" the PNG/ILBM decoding to not use actual bitdepths for indexed images, but force 8bits.
Matti Hamalainen <ccr@tnsp.org>
parents:
1299
diff
changeset
|
1313 if ((*pimg = img = dmImageAlloc(width, height, |
2093
d17512dbb4ef
Some work on reading >8bpp images.
Matti Hamalainen <ccr@tnsp.org>
parents:
2092
diff
changeset
|
1314 itype, |
1300
fd442faa705f
"Fix" the PNG/ILBM decoding to not use actual bitdepths for indexed images, but force 8bits.
Matti Hamalainen <ccr@tnsp.org>
parents:
1299
diff
changeset
|
1315 // XXX TODO? When/if we ever handle < 8bit indexed correctly, we can use the actual bpp |
fd442faa705f
"Fix" the PNG/ILBM decoding to not use actual bitdepths for indexed images, but force 8bits.
Matti Hamalainen <ccr@tnsp.org>
parents:
1299
diff
changeset
|
1316 -1 /* bit_depth */)) == NULL) |
453
349a2ff11531
Implement PNG (1-8bpp indexed) reading support via libPNG.
Matti Hamalainen <ccr@tnsp.org>
parents:
452
diff
changeset
|
1317 { |
958
985225a93aeb
Add error code parameter to dmError() and dmErrorVA().
Matti Hamalainen <ccr@tnsp.org>
parents:
930
diff
changeset
|
1318 res = dmError(DMERR_MALLOC, |
985225a93aeb
Add error code parameter to dmError() and dmErrorVA().
Matti Hamalainen <ccr@tnsp.org>
parents:
930
diff
changeset
|
1319 "PNG: Could not allocate image data.\n"); |
453
349a2ff11531
Implement PNG (1-8bpp indexed) reading support via libPNG.
Matti Hamalainen <ccr@tnsp.org>
parents:
452
diff
changeset
|
1320 goto error; |
349a2ff11531
Implement PNG (1-8bpp indexed) reading support via libPNG.
Matti Hamalainen <ccr@tnsp.org>
parents:
452
diff
changeset
|
1321 } |
349a2ff11531
Implement PNG (1-8bpp indexed) reading support via libPNG.
Matti Hamalainen <ccr@tnsp.org>
parents:
452
diff
changeset
|
1322 |
1628
a549d33d543a
Add image aspect ratio information.
Matti Hamalainen <ccr@tnsp.org>
parents:
1627
diff
changeset
|
1323 // Set image aspect ratio |
a549d33d543a
Add image aspect ratio information.
Matti Hamalainen <ccr@tnsp.org>
parents:
1627
diff
changeset
|
1324 png_get_pHYs(png_ptr, info_ptr, &res_x, &res_y, &unit_type); |
a549d33d543a
Add image aspect ratio information.
Matti Hamalainen <ccr@tnsp.org>
parents:
1627
diff
changeset
|
1325 |
a549d33d543a
Add image aspect ratio information.
Matti Hamalainen <ccr@tnsp.org>
parents:
1627
diff
changeset
|
1326 if (res_x > 0 && res_y > 0 && |
a549d33d543a
Add image aspect ratio information.
Matti Hamalainen <ccr@tnsp.org>
parents:
1627
diff
changeset
|
1327 res_y / res_x != (unsigned) (img->height / img->width)) |
a549d33d543a
Add image aspect ratio information.
Matti Hamalainen <ccr@tnsp.org>
parents:
1627
diff
changeset
|
1328 img->aspect = (float) res_y / (float) res_x; |
a549d33d543a
Add image aspect ratio information.
Matti Hamalainen <ccr@tnsp.org>
parents:
1627
diff
changeset
|
1329 |
453
349a2ff11531
Implement PNG (1-8bpp indexed) reading support via libPNG.
Matti Hamalainen <ccr@tnsp.org>
parents:
452
diff
changeset
|
1330 // ... |
1938
a8e475eede4a
Fix two memory leaks in the PNG writer/reader of libgfx.
Matti Hamalainen <ccr@tnsp.org>
parents:
1921
diff
changeset
|
1331 if ((row_pointers = png_malloc(png_ptr, height * sizeof(png_bytep))) == NULL) |
a8e475eede4a
Fix two memory leaks in the PNG writer/reader of libgfx.
Matti Hamalainen <ccr@tnsp.org>
parents:
1921
diff
changeset
|
1332 goto error; |
a8e475eede4a
Fix two memory leaks in the PNG writer/reader of libgfx.
Matti Hamalainen <ccr@tnsp.org>
parents:
1921
diff
changeset
|
1333 |
2094
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
1334 for (int i = 0; i < img->height; i++) |
453
349a2ff11531
Implement PNG (1-8bpp indexed) reading support via libPNG.
Matti Hamalainen <ccr@tnsp.org>
parents:
452
diff
changeset
|
1335 row_pointers[i] = img->data + (i * img->pitch); |
349a2ff11531
Implement PNG (1-8bpp indexed) reading support via libPNG.
Matti Hamalainen <ccr@tnsp.org>
parents:
452
diff
changeset
|
1336 |
349a2ff11531
Implement PNG (1-8bpp indexed) reading support via libPNG.
Matti Hamalainen <ccr@tnsp.org>
parents:
452
diff
changeset
|
1337 png_read_image(png_ptr, row_pointers); |
349a2ff11531
Implement PNG (1-8bpp indexed) reading support via libPNG.
Matti Hamalainen <ccr@tnsp.org>
parents:
452
diff
changeset
|
1338 |
349a2ff11531
Implement PNG (1-8bpp indexed) reading support via libPNG.
Matti Hamalainen <ccr@tnsp.org>
parents:
452
diff
changeset
|
1339 png_read_end(png_ptr, NULL); |
1945
80d67f0e8567
Better fix for the PNG reader memory leak.
Matti Hamalainen <ccr@tnsp.org>
parents:
1942
diff
changeset
|
1340 png_free(png_ptr, row_pointers); |
453
349a2ff11531
Implement PNG (1-8bpp indexed) reading support via libPNG.
Matti Hamalainen <ccr@tnsp.org>
parents:
452
diff
changeset
|
1341 |
349a2ff11531
Implement PNG (1-8bpp indexed) reading support via libPNG.
Matti Hamalainen <ccr@tnsp.org>
parents:
452
diff
changeset
|
1342 // Create palette |
2093
d17512dbb4ef
Some work on reading >8bpp images.
Matti Hamalainen <ccr@tnsp.org>
parents:
2092
diff
changeset
|
1343 if (color_type == PNG_COLOR_TYPE_PALETTE) |
453
349a2ff11531
Implement PNG (1-8bpp indexed) reading support via libPNG.
Matti Hamalainen <ccr@tnsp.org>
parents:
452
diff
changeset
|
1344 { |
2093
d17512dbb4ef
Some work on reading >8bpp images.
Matti Hamalainen <ccr@tnsp.org>
parents:
2092
diff
changeset
|
1345 png_get_PLTE(png_ptr, info_ptr, &palette, &ncolors); |
d17512dbb4ef
Some work on reading >8bpp images.
Matti Hamalainen <ccr@tnsp.org>
parents:
2092
diff
changeset
|
1346 if (ncolors > 0 && palette != NULL) |
d17512dbb4ef
Some work on reading >8bpp images.
Matti Hamalainen <ccr@tnsp.org>
parents:
2092
diff
changeset
|
1347 { |
d17512dbb4ef
Some work on reading >8bpp images.
Matti Hamalainen <ccr@tnsp.org>
parents:
2092
diff
changeset
|
1348 dmMsg(2, "PNG: Palette of %d colors found.\n", ncolors); |
453
349a2ff11531
Implement PNG (1-8bpp indexed) reading support via libPNG.
Matti Hamalainen <ccr@tnsp.org>
parents:
452
diff
changeset
|
1349 |
2094
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
1350 if ((res = dmPaletteAlloc(&(img->pal), ncolors, -1)) != DMERR_OK) |
453
349a2ff11531
Implement PNG (1-8bpp indexed) reading support via libPNG.
Matti Hamalainen <ccr@tnsp.org>
parents:
452
diff
changeset
|
1351 goto error; |
2094
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
1352 |
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
1353 for (int i = 0; i < img->pal->ncolors; i++) |
453
349a2ff11531
Implement PNG (1-8bpp indexed) reading support via libPNG.
Matti Hamalainen <ccr@tnsp.org>
parents:
452
diff
changeset
|
1354 { |
2094
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
1355 img->pal->colors[i].r = palette[i].red; |
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
1356 img->pal->colors[i].g = palette[i].green; |
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
1357 img->pal->colors[i].b = palette[i].blue; |
453
349a2ff11531
Implement PNG (1-8bpp indexed) reading support via libPNG.
Matti Hamalainen <ccr@tnsp.org>
parents:
452
diff
changeset
|
1358 } |
2093
d17512dbb4ef
Some work on reading >8bpp images.
Matti Hamalainen <ccr@tnsp.org>
parents:
2092
diff
changeset
|
1359 } |
d17512dbb4ef
Some work on reading >8bpp images.
Matti Hamalainen <ccr@tnsp.org>
parents:
2092
diff
changeset
|
1360 |
460
0af039b6c0ae
Improve transparent color handling.
Matti Hamalainen <ccr@tnsp.org>
parents:
453
diff
changeset
|
1361 png_get_tRNS(png_ptr, info_ptr, &trans, &ntrans, NULL); |
467
80d09ea85e75
Check for NULL pointers from png_get_tRNS and png_get_PLTE.
Matti Hamalainen <ccr@tnsp.org>
parents:
465
diff
changeset
|
1362 if (trans != NULL && ntrans > 0) |
460
0af039b6c0ae
Improve transparent color handling.
Matti Hamalainen <ccr@tnsp.org>
parents:
453
diff
changeset
|
1363 { |
2091 | 1364 dmMsg(2, "PNG: %d transparent colors.\n", ntrans); |
2094
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
1365 for (int i = 0; i < img->pal->ncolors && i < ntrans; i++) |
467
80d09ea85e75
Check for NULL pointers from png_get_tRNS and png_get_PLTE.
Matti Hamalainen <ccr@tnsp.org>
parents:
465
diff
changeset
|
1366 { |
2094
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
1367 img->pal->colors[i].a = trans[i]; |
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
1368 if (img->pal->ctransp < 0 && trans[i] == 0) |
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
1369 img->pal->ctransp = i; |
467
80d09ea85e75
Check for NULL pointers from png_get_tRNS and png_get_PLTE.
Matti Hamalainen <ccr@tnsp.org>
parents:
465
diff
changeset
|
1370 } |
460
0af039b6c0ae
Improve transparent color handling.
Matti Hamalainen <ccr@tnsp.org>
parents:
453
diff
changeset
|
1371 } |
1102
e06abfde6c39
Cosmetics pass: Remove excess whitespace.
Matti Hamalainen <ccr@tnsp.org>
parents:
958
diff
changeset
|
1372 } |
460
0af039b6c0ae
Improve transparent color handling.
Matti Hamalainen <ccr@tnsp.org>
parents:
453
diff
changeset
|
1373 |
2094
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
1374 res = DMERR_OK; |
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
1375 |
453
349a2ff11531
Implement PNG (1-8bpp indexed) reading support via libPNG.
Matti Hamalainen <ccr@tnsp.org>
parents:
452
diff
changeset
|
1376 error: |
1939 | 1377 if (png_ptr != NULL && info_ptr != NULL) |
453
349a2ff11531
Implement PNG (1-8bpp indexed) reading support via libPNG.
Matti Hamalainen <ccr@tnsp.org>
parents:
452
diff
changeset
|
1378 png_destroy_read_struct(&png_ptr, &info_ptr, NULL); |
349a2ff11531
Implement PNG (1-8bpp indexed) reading support via libPNG.
Matti Hamalainen <ccr@tnsp.org>
parents:
452
diff
changeset
|
1379 |
349a2ff11531
Implement PNG (1-8bpp indexed) reading support via libPNG.
Matti Hamalainen <ccr@tnsp.org>
parents:
452
diff
changeset
|
1380 return res; |
349a2ff11531
Implement PNG (1-8bpp indexed) reading support via libPNG.
Matti Hamalainen <ccr@tnsp.org>
parents:
452
diff
changeset
|
1381 } |
435 | 1382 #endif |
1383 | |
1384 | |
1613
70b04c16aa40
Move format probe functions near to their other functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
1609
diff
changeset
|
1385 // |
70b04c16aa40
Move format probe functions near to their other functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
1609
diff
changeset
|
1386 // Z-Soft PCX format |
70b04c16aa40
Move format probe functions near to their other functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
1609
diff
changeset
|
1387 // |
2207
1ea48084055e
Add functionality for separate palette file handling, reading, writing and
Matti Hamalainen <ccr@tnsp.org>
parents:
2202
diff
changeset
|
1388 #define PCX_PAL_COLORS 16 // Number of internal palette colors |
1279
0d3f5f44c0c4
Somewhat improve PCX read support in libgfx.
Matti Hamalainen <ccr@tnsp.org>
parents:
1265
diff
changeset
|
1389 |
435 | 1390 typedef struct |
1391 { | |
1392 Uint8 r,g,b; | |
1393 } DMPCXColor; | |
1394 | |
1395 | |
1396 typedef struct | |
1397 { | |
2091 | 1398 Uint8 |
1399 manufacturer, // always 0x0a | |
1400 version, // Z-Soft PC Paintbrush version: | |
1288 | 1401 // 0 = v2.5 |
1402 // 2 = v2.8 with palette, | |
1403 // 3 = v2.8 without palette | |
1404 // 4 = PC Paintbrush for Windows | |
1405 // 5 = v3.0 or better | |
2091 | 1406 encoding, // usually 0x01 = RLE, 0x00 = uncompressed |
1407 bitsPerPlane; // bits per pixel per plane | |
1279
0d3f5f44c0c4
Somewhat improve PCX read support in libgfx.
Matti Hamalainen <ccr@tnsp.org>
parents:
1265
diff
changeset
|
1408 |
435 | 1409 Uint16 xmin, ymin, xmax, ymax; |
1279
0d3f5f44c0c4
Somewhat improve PCX read support in libgfx.
Matti Hamalainen <ccr@tnsp.org>
parents:
1265
diff
changeset
|
1410 Uint16 hres, vres; // resolution in DPI, can be image dimensions as well. |
2207
1ea48084055e
Add functionality for separate palette file handling, reading, writing and
Matti Hamalainen <ccr@tnsp.org>
parents:
2202
diff
changeset
|
1411 DMPCXColor colorMap[PCX_PAL_COLORS]; |
1279
0d3f5f44c0c4
Somewhat improve PCX read support in libgfx.
Matti Hamalainen <ccr@tnsp.org>
parents:
1265
diff
changeset
|
1412 Uint8 reserved; // should be set to 0 |
0d3f5f44c0c4
Somewhat improve PCX read support in libgfx.
Matti Hamalainen <ccr@tnsp.org>
parents:
1265
diff
changeset
|
1413 Uint8 nplanes; // number of planes |
0d3f5f44c0c4
Somewhat improve PCX read support in libgfx.
Matti Hamalainen <ccr@tnsp.org>
parents:
1265
diff
changeset
|
1414 Uint16 bpl; // bytes per plane LINE |
0d3f5f44c0c4
Somewhat improve PCX read support in libgfx.
Matti Hamalainen <ccr@tnsp.org>
parents:
1265
diff
changeset
|
1415 Uint16 palInfo; // 1 = color/BW, 2 = grayscale |
0d3f5f44c0c4
Somewhat improve PCX read support in libgfx.
Matti Hamalainen <ccr@tnsp.org>
parents:
1265
diff
changeset
|
1416 Uint16 hScreenSize, vScreenSize; |
0d3f5f44c0c4
Somewhat improve PCX read support in libgfx.
Matti Hamalainen <ccr@tnsp.org>
parents:
1265
diff
changeset
|
1417 Uint8 filler[54]; |
435 | 1418 } DMPCXHeader; |
1419 | |
1420 | |
1421 typedef struct | |
1422 { | |
1423 DMPCXHeader *header; | |
1424 Uint8 *buf; | |
1425 size_t bufLen, bufOffs; | |
1609
c29adf5ce240
Convert libgfx file format routines to use DMResource instead of stdio FILE.
Matti Hamalainen <ccr@tnsp.org>
parents:
1583
diff
changeset
|
1426 DMResource *fp; |
435 | 1427 } DMPCXData; |
1428 | |
1429 | |
1613
70b04c16aa40
Move format probe functions near to their other functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
1609
diff
changeset
|
1430 static int fmtProbePCX(const Uint8 *buf, const size_t len) |
70b04c16aa40
Move format probe functions near to their other functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
1609
diff
changeset
|
1431 { |
70b04c16aa40
Move format probe functions near to their other functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
1609
diff
changeset
|
1432 if (len > 128 + 32 && |
70b04c16aa40
Move format probe functions near to their other functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
1609
diff
changeset
|
1433 (buf[1] == 5 || buf[1] == 2 || buf[1] == 3) && |
70b04c16aa40
Move format probe functions near to their other functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
1609
diff
changeset
|
1434 buf[2] == 1 && |
70b04c16aa40
Move format probe functions near to their other functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
1609
diff
changeset
|
1435 (buf[3] == 8 || buf[3] == 4 || buf[3] == 3 || buf[3] == 1) && |
70b04c16aa40
Move format probe functions near to their other functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
1609
diff
changeset
|
1436 buf[65] >= 1 && buf[65] <= 4) |
70b04c16aa40
Move format probe functions near to their other functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
1609
diff
changeset
|
1437 return DM_PROBE_SCORE_GOOD; |
70b04c16aa40
Move format probe functions near to their other functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
1609
diff
changeset
|
1438 |
70b04c16aa40
Move format probe functions near to their other functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
1609
diff
changeset
|
1439 return DM_PROBE_SCORE_FALSE; |
70b04c16aa40
Move format probe functions near to their other functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
1609
diff
changeset
|
1440 } |
70b04c16aa40
Move format probe functions near to their other functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
1609
diff
changeset
|
1441 |
70b04c16aa40
Move format probe functions near to their other functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
1609
diff
changeset
|
1442 |
1298 | 1443 // Returns one byte from row buffer (of length len) at offset soffs, |
1444 // OR zero if the offset is outside buffer. | |
1301 | 1445 static inline Uint8 dmPCXGetByte(const Uint8 *row, const size_t len, const size_t soffs) |
435 | 1446 { |
1447 return (soffs < len) ? row[soffs] : 0; | |
1448 } | |
1449 | |
1450 static BOOL dmPCXFlush(DMPCXData *pcx) | |
1451 { | |
1452 BOOL ret = TRUE; | |
1453 if (pcx->bufOffs > 0) | |
1609
c29adf5ce240
Convert libgfx file format routines to use DMResource instead of stdio FILE.
Matti Hamalainen <ccr@tnsp.org>
parents:
1583
diff
changeset
|
1454 ret = dmf_write_str(pcx->fp, pcx->buf, pcx->bufOffs); |
1297 | 1455 |
435 | 1456 pcx->bufOffs = 0; |
1457 return ret; | |
1458 } | |
1459 | |
1460 static inline BOOL dmPCXPutByte(DMPCXData *pcx, const Uint8 val) | |
1461 { | |
1462 if (pcx->bufOffs < pcx->bufLen) | |
1463 { | |
1464 pcx->buf[pcx->bufOffs++] = val; | |
1465 return TRUE; | |
1466 } | |
1467 else | |
1468 return dmPCXFlush(pcx); | |
1469 } | |
1470 | |
1297 | 1471 |
1472 static int dmPCXPutData(DMPCXData *pcx, const Uint8 data, const int count) | |
1473 { | |
1474 if (count == 1 && (data & 0xC0) != 0xC0) | |
1475 { | |
1476 if (!dmPCXPutByte(pcx, data)) | |
1477 return DMERR_FWRITE; | |
1478 } | |
1479 else | |
1480 { | |
1481 if (!dmPCXPutByte(pcx, 0xC0 | count) || | |
1482 !dmPCXPutByte(pcx, data)) | |
1483 return DMERR_FWRITE; | |
1484 } | |
1485 return DMERR_OK; | |
1486 } | |
1487 | |
1488 | |
1301 | 1489 static int dmWritePCXRow(void *cbdata, const Uint8 *row, const size_t len) |
435 | 1490 { |
1491 DMPCXData *pcx = (DMPCXData *) cbdata; | |
1297 | 1492 int err; |
435 | 1493 size_t soffs = 0; |
1102
e06abfde6c39
Cosmetics pass: Remove excess whitespace.
Matti Hamalainen <ccr@tnsp.org>
parents:
958
diff
changeset
|
1494 |
435 | 1495 pcx->bufOffs = 0; |
1496 | |
1279
0d3f5f44c0c4
Somewhat improve PCX read support in libgfx.
Matti Hamalainen <ccr@tnsp.org>
parents:
1265
diff
changeset
|
1497 for (int plane = 0; plane < pcx->header->nplanes; plane++) |
435 | 1498 { |
1499 Uint8 data = dmPCXGetByte(row, len, soffs++), | |
1500 count = 1; | |
1501 | |
1297 | 1502 size_t blen = pcx->header->bpl * pcx->header->nplanes; |
435 | 1503 while (soffs < blen) |
1504 { | |
1297 | 1505 if (data == dmPCXGetByte(row, len, soffs) && count < 0x3F) |
435 | 1506 { |
1507 count++; | |
1508 soffs++; | |
1509 } | |
1510 else | |
1511 { | |
1297 | 1512 if ((err = dmPCXPutData(pcx, data, count)) != DMERR_OK) |
1513 return err; | |
435 | 1514 |
1515 data = dmPCXGetByte(row, len, soffs++); | |
1516 count = 1; | |
1517 } | |
1518 } | |
1519 | |
1297 | 1520 if ((err = dmPCXPutData(pcx, data, count)) != DMERR_OK) |
1521 return err; | |
435 | 1522 |
1523 if (!dmPCXFlush(pcx)) | |
808
f8126fa1df9b
Use dmlib error code return value in cases where a plain boolean was used
Matti Hamalainen <ccr@tnsp.org>
parents:
800
diff
changeset
|
1524 return DMERR_FWRITE; |
435 | 1525 } |
1526 | |
808
f8126fa1df9b
Use dmlib error code return value in cases where a plain boolean was used
Matti Hamalainen <ccr@tnsp.org>
parents:
800
diff
changeset
|
1527 return DMERR_OK; |
435 | 1528 } |
1529 | |
1530 | |
2156
e6ec7fad9ce2
Rename DMImageConvSpec to DMImageWriteSpec to better reflec the struct's purpose.
Matti Hamalainen <ccr@tnsp.org>
parents:
2154
diff
changeset
|
1531 int dmWritePCXImage(DMResource *fp, const DMImage *img, const DMImageWriteSpec *pspec) |
435 | 1532 { |
1533 DMPCXData pcx; | |
1534 DMPCXHeader hdr; | |
2156
e6ec7fad9ce2
Rename DMImageConvSpec to DMImageWriteSpec to better reflec the struct's purpose.
Matti Hamalainen <ccr@tnsp.org>
parents:
2154
diff
changeset
|
1535 DMImageWriteSpec spec; |
435 | 1536 int res; |
1302
38614c07c2e2
Now with "almost" working 24bit PCX output. Almost.
Matti Hamalainen <ccr@tnsp.org>
parents:
1301
diff
changeset
|
1537 |
1303 | 1538 // Always force planar for PCX |
2156
e6ec7fad9ce2
Rename DMImageConvSpec to DMImageWriteSpec to better reflec the struct's purpose.
Matti Hamalainen <ccr@tnsp.org>
parents:
2154
diff
changeset
|
1539 memcpy(&spec, pspec, sizeof(DMImageWriteSpec)); |
1302
38614c07c2e2
Now with "almost" working 24bit PCX output. Almost.
Matti Hamalainen <ccr@tnsp.org>
parents:
1301
diff
changeset
|
1540 spec.planar = TRUE; |
435 | 1541 |
1450
61a486e25dc7
24bit PCX writing does not work correctly, so return DMERR_NOT_SUPPORTED in the writer function.
Matti Hamalainen <ccr@tnsp.org>
parents:
1341
diff
changeset
|
1542 // XXX: 24bit PCX does not work yet .. |
2157
9a9493809b3a
Rename DM_COLFMT_* constants to DM_PIXFMT_* and the 'format' field of DMImage
Matti Hamalainen <ccr@tnsp.org>
parents:
2156
diff
changeset
|
1543 if ((img->pixfmt != DM_PIXFMT_PALETTE && img->pixfmt != DM_PIXFMT_GRAYSCALE) || |
9a9493809b3a
Rename DM_COLFMT_* constants to DM_PIXFMT_* and the 'format' field of DMImage
Matti Hamalainen <ccr@tnsp.org>
parents:
2156
diff
changeset
|
1544 (spec.pixfmt != DM_PIXFMT_PALETTE && spec.pixfmt != DM_PIXFMT_GRAYSCALE)) |
1800
45e7688336dc
Fix checks for NULL palette in index/palette images. Also improve error
Matti Hamalainen <ccr@tnsp.org>
parents:
1730
diff
changeset
|
1545 { |
45e7688336dc
Fix checks for NULL palette in index/palette images. Also improve error
Matti Hamalainen <ccr@tnsp.org>
parents:
1730
diff
changeset
|
1546 return dmError(DMERR_NOT_SUPPORTED, |
45e7688336dc
Fix checks for NULL palette in index/palette images. Also improve error
Matti Hamalainen <ccr@tnsp.org>
parents:
1730
diff
changeset
|
1547 "24bit PCX not supported yet.\n"); |
45e7688336dc
Fix checks for NULL palette in index/palette images. Also improve error
Matti Hamalainen <ccr@tnsp.org>
parents:
1730
diff
changeset
|
1548 } |
45e7688336dc
Fix checks for NULL palette in index/palette images. Also improve error
Matti Hamalainen <ccr@tnsp.org>
parents:
1730
diff
changeset
|
1549 |
2157
9a9493809b3a
Rename DM_COLFMT_* constants to DM_PIXFMT_* and the 'format' field of DMImage
Matti Hamalainen <ccr@tnsp.org>
parents:
2156
diff
changeset
|
1550 if (spec.pixfmt == DM_PIXFMT_PALETTE && img->pal == NULL) |
1800
45e7688336dc
Fix checks for NULL palette in index/palette images. Also improve error
Matti Hamalainen <ccr@tnsp.org>
parents:
1730
diff
changeset
|
1551 { |
45e7688336dc
Fix checks for NULL palette in index/palette images. Also improve error
Matti Hamalainen <ccr@tnsp.org>
parents:
1730
diff
changeset
|
1552 return dmError(DMERR_NULLPTR, |
45e7688336dc
Fix checks for NULL palette in index/palette images. Also improve error
Matti Hamalainen <ccr@tnsp.org>
parents:
1730
diff
changeset
|
1553 "Image spec says paletted/indexed image, but palette pointer is NULL.\n"); |
45e7688336dc
Fix checks for NULL palette in index/palette images. Also improve error
Matti Hamalainen <ccr@tnsp.org>
parents:
1730
diff
changeset
|
1554 } |
1450
61a486e25dc7
24bit PCX writing does not work correctly, so return DMERR_NOT_SUPPORTED in the writer function.
Matti Hamalainen <ccr@tnsp.org>
parents:
1341
diff
changeset
|
1555 |
435 | 1556 // Create output file |
1557 pcx.buf = NULL; | |
1558 pcx.header = &hdr; | |
1559 pcx.fp = fp; | |
1560 | |
1561 // Create PCX header | |
2414
69a5af2eb1ea
Remove useless dmMemset().
Matti Hamalainen <ccr@tnsp.org>
parents:
2393
diff
changeset
|
1562 memset(&hdr, 0, sizeof(hdr)); |
2157
9a9493809b3a
Rename DM_COLFMT_* constants to DM_PIXFMT_* and the 'format' field of DMImage
Matti Hamalainen <ccr@tnsp.org>
parents:
2156
diff
changeset
|
1563 if (spec.pixfmt == DM_PIXFMT_PALETTE || |
9a9493809b3a
Rename DM_COLFMT_* constants to DM_PIXFMT_* and the 'format' field of DMImage
Matti Hamalainen <ccr@tnsp.org>
parents:
2156
diff
changeset
|
1564 spec.pixfmt == DM_PIXFMT_GRAYSCALE) |
435 | 1565 { |
2207
1ea48084055e
Add functionality for separate palette file handling, reading, writing and
Matti Hamalainen <ccr@tnsp.org>
parents:
2202
diff
changeset
|
1566 const int ncolors = img->pal->ncolors > PCX_PAL_COLORS ? PCX_PAL_COLORS : img->pal->ncolors; |
2016 | 1567 for (int i = 0; i < ncolors; i++) |
435 | 1568 { |
2094
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
1569 hdr.colorMap[i].r = img->pal->colors[i].r; |
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
1570 hdr.colorMap[i].g = img->pal->colors[i].g; |
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
1571 hdr.colorMap[i].b = img->pal->colors[i].b; |
435 | 1572 } |
1573 } | |
1574 hdr.manufacturer = 10; | |
1575 hdr.version = 5; | |
1576 hdr.encoding = 1; | |
1302
38614c07c2e2
Now with "almost" working 24bit PCX output. Almost.
Matti Hamalainen <ccr@tnsp.org>
parents:
1301
diff
changeset
|
1577 hdr.hres = img->width * spec.scaleX; |
38614c07c2e2
Now with "almost" working 24bit PCX output. Almost.
Matti Hamalainen <ccr@tnsp.org>
parents:
1301
diff
changeset
|
1578 hdr.vres = img->height * spec.scaleY; |
435 | 1579 hdr.xmin = hdr.ymin = 0; |
1302
38614c07c2e2
Now with "almost" working 24bit PCX output. Almost.
Matti Hamalainen <ccr@tnsp.org>
parents:
1301
diff
changeset
|
1580 hdr.xmax = (img->width * spec.scaleX) - 1; |
38614c07c2e2
Now with "almost" working 24bit PCX output. Almost.
Matti Hamalainen <ccr@tnsp.org>
parents:
1301
diff
changeset
|
1581 hdr.ymax = (img->height * spec.scaleY) - 1; |
1283
642a0dd98c6e
Oops, forgot to adjust the writing and reading when adding two members to
Matti Hamalainen <ccr@tnsp.org>
parents:
1281
diff
changeset
|
1582 hdr.hScreenSize = hdr.hres; |
642a0dd98c6e
Oops, forgot to adjust the writing and reading when adding two members to
Matti Hamalainen <ccr@tnsp.org>
parents:
1281
diff
changeset
|
1583 hdr.vScreenSize = hdr.vres; |
435 | 1584 |
2220
a8b4e9c9f337
Set PCX header palette information correctly for grayscale data images.
Matti Hamalainen <ccr@tnsp.org>
parents:
2219
diff
changeset
|
1585 switch (spec.pixfmt) |
a8b4e9c9f337
Set PCX header palette information correctly for grayscale data images.
Matti Hamalainen <ccr@tnsp.org>
parents:
2219
diff
changeset
|
1586 { |
a8b4e9c9f337
Set PCX header palette information correctly for grayscale data images.
Matti Hamalainen <ccr@tnsp.org>
parents:
2219
diff
changeset
|
1587 case DM_PIXFMT_GRAYSCALE: hdr.palInfo = 2; break; |
a8b4e9c9f337
Set PCX header palette information correctly for grayscale data images.
Matti Hamalainen <ccr@tnsp.org>
parents:
2219
diff
changeset
|
1588 default: hdr.palInfo = 1; break; |
a8b4e9c9f337
Set PCX header palette information correctly for grayscale data images.
Matti Hamalainen <ccr@tnsp.org>
parents:
2219
diff
changeset
|
1589 } |
a8b4e9c9f337
Set PCX header palette information correctly for grayscale data images.
Matti Hamalainen <ccr@tnsp.org>
parents:
2219
diff
changeset
|
1590 |
1291 | 1591 // TODO XXX .. maybe actually compute these asdf |
1592 hdr.bitsPerPlane = 8; | |
2157
9a9493809b3a
Rename DM_COLFMT_* constants to DM_PIXFMT_* and the 'format' field of DMImage
Matti Hamalainen <ccr@tnsp.org>
parents:
2156
diff
changeset
|
1593 hdr.nplanes = dmImageGetBytesPerPixel(spec.pixfmt); |
1291 | 1594 |
2219 | 1595 // Compute bytes per line |
1302
38614c07c2e2
Now with "almost" working 24bit PCX output. Almost.
Matti Hamalainen <ccr@tnsp.org>
parents:
1301
diff
changeset
|
1596 res = img->width * spec.scaleX; |
435 | 1597 hdr.bpl = res / 2; |
1598 if (res % 2) hdr.bpl++; | |
1599 hdr.bpl *= 2; | |
1600 | |
1297 | 1601 dmMsg(2, |
1602 "PCX: xmin=%d, ymin=%d, xmax=%d, ymax=%d, res=%dx%d, scr=%dx%d\n", | |
1603 hdr.xmin, hdr.ymin, hdr.xmax, hdr.ymax, | |
1604 hdr.hres, hdr.vres, | |
1605 hdr.hScreenSize, hdr.vScreenSize); | |
1606 | |
2065
451980580189
Refactor how paletted/indexed formats are handled in libgfx.
Matti Hamalainen <ccr@tnsp.org>
parents:
2064
diff
changeset
|
1607 dmMsg(2, "PCX: nplanes=%d, bpp=%d, bpl=%d, colfmt=%d, planar=%s\n", |
1302
38614c07c2e2
Now with "almost" working 24bit PCX output. Almost.
Matti Hamalainen <ccr@tnsp.org>
parents:
1301
diff
changeset
|
1608 hdr.nplanes, hdr.bitsPerPlane, hdr.bpl, |
2157
9a9493809b3a
Rename DM_COLFMT_* constants to DM_PIXFMT_* and the 'format' field of DMImage
Matti Hamalainen <ccr@tnsp.org>
parents:
2156
diff
changeset
|
1609 spec.pixfmt, |
1302
38614c07c2e2
Now with "almost" working 24bit PCX output. Almost.
Matti Hamalainen <ccr@tnsp.org>
parents:
1301
diff
changeset
|
1610 spec.planar ? "yes" : "no" |
38614c07c2e2
Now with "almost" working 24bit PCX output. Almost.
Matti Hamalainen <ccr@tnsp.org>
parents:
1301
diff
changeset
|
1611 ); |
435 | 1612 |
1291 | 1613 // TODO XXX this is also bogus |
2219 | 1614 pcx.bufLen = hdr.bpl * 4; |
435 | 1615 if ((pcx.buf = dmMalloc(pcx.bufLen)) == NULL) |
1616 { | |
958
985225a93aeb
Add error code parameter to dmError() and dmErrorVA().
Matti Hamalainen <ccr@tnsp.org>
parents:
930
diff
changeset
|
1617 res = dmError(DMERR_MALLOC, |
2384
36edd316184a
Fix some format strings to use proper PRI*_SIZE_T where necessary.
Matti Hamalainen <ccr@tnsp.org>
parents:
2371
diff
changeset
|
1618 "PCX: Could not allocate %" DM_PRIu_SIZE_T |
36edd316184a
Fix some format strings to use proper PRI*_SIZE_T where necessary.
Matti Hamalainen <ccr@tnsp.org>
parents:
2371
diff
changeset
|
1619 " bytes for RLE compression buffer.\n", |
435 | 1620 pcx.bufLen); |
1621 goto error; | |
1622 } | |
1623 | |
1624 // Write PCX header | |
1609
c29adf5ce240
Convert libgfx file format routines to use DMResource instead of stdio FILE.
Matti Hamalainen <ccr@tnsp.org>
parents:
1583
diff
changeset
|
1625 if (!dmf_write_byte(pcx.fp, hdr.manufacturer) || |
c29adf5ce240
Convert libgfx file format routines to use DMResource instead of stdio FILE.
Matti Hamalainen <ccr@tnsp.org>
parents:
1583
diff
changeset
|
1626 !dmf_write_byte(pcx.fp, hdr.version) || |
c29adf5ce240
Convert libgfx file format routines to use DMResource instead of stdio FILE.
Matti Hamalainen <ccr@tnsp.org>
parents:
1583
diff
changeset
|
1627 !dmf_write_byte(pcx.fp, hdr.encoding) || |
2219 | 1628 !dmf_write_byte(pcx.fp, hdr.bitsPerPlane) || |
1629 !dmf_write_le16(pcx.fp, hdr.xmin) || | |
1609
c29adf5ce240
Convert libgfx file format routines to use DMResource instead of stdio FILE.
Matti Hamalainen <ccr@tnsp.org>
parents:
1583
diff
changeset
|
1630 !dmf_write_le16(pcx.fp, hdr.ymin) || |
c29adf5ce240
Convert libgfx file format routines to use DMResource instead of stdio FILE.
Matti Hamalainen <ccr@tnsp.org>
parents:
1583
diff
changeset
|
1631 !dmf_write_le16(pcx.fp, hdr.xmax) || |
c29adf5ce240
Convert libgfx file format routines to use DMResource instead of stdio FILE.
Matti Hamalainen <ccr@tnsp.org>
parents:
1583
diff
changeset
|
1632 !dmf_write_le16(pcx.fp, hdr.ymax) || |
c29adf5ce240
Convert libgfx file format routines to use DMResource instead of stdio FILE.
Matti Hamalainen <ccr@tnsp.org>
parents:
1583
diff
changeset
|
1633 !dmf_write_le16(pcx.fp, hdr.hres) || |
2219 | 1634 !dmf_write_le16(pcx.fp, hdr.vres) || |
1635 !dmf_write_str(pcx.fp, (Uint8 *) &hdr.colorMap, sizeof(hdr.colorMap)) || | |
1636 !dmf_write_byte(pcx.fp, hdr.reserved) || | |
1609
c29adf5ce240
Convert libgfx file format routines to use DMResource instead of stdio FILE.
Matti Hamalainen <ccr@tnsp.org>
parents:
1583
diff
changeset
|
1637 !dmf_write_byte(pcx.fp, hdr.nplanes) || |
c29adf5ce240
Convert libgfx file format routines to use DMResource instead of stdio FILE.
Matti Hamalainen <ccr@tnsp.org>
parents:
1583
diff
changeset
|
1638 !dmf_write_le16(pcx.fp, hdr.bpl) || |
c29adf5ce240
Convert libgfx file format routines to use DMResource instead of stdio FILE.
Matti Hamalainen <ccr@tnsp.org>
parents:
1583
diff
changeset
|
1639 !dmf_write_le16(pcx.fp, hdr.palInfo) || |
c29adf5ce240
Convert libgfx file format routines to use DMResource instead of stdio FILE.
Matti Hamalainen <ccr@tnsp.org>
parents:
1583
diff
changeset
|
1640 !dmf_write_le16(pcx.fp, hdr.hScreenSize) || |
c29adf5ce240
Convert libgfx file format routines to use DMResource instead of stdio FILE.
Matti Hamalainen <ccr@tnsp.org>
parents:
1583
diff
changeset
|
1641 !dmf_write_le16(pcx.fp, hdr.vScreenSize) || |
c29adf5ce240
Convert libgfx file format routines to use DMResource instead of stdio FILE.
Matti Hamalainen <ccr@tnsp.org>
parents:
1583
diff
changeset
|
1642 !dmf_write_str(pcx.fp, (Uint8 *) &hdr.filler, sizeof(hdr.filler))) |
435 | 1643 { |
958
985225a93aeb
Add error code parameter to dmError() and dmErrorVA().
Matti Hamalainen <ccr@tnsp.org>
parents:
930
diff
changeset
|
1644 res = dmError(DMERR_FWRITE, |
2219 | 1645 "PCX: Could not write header data.\n"); |
435 | 1646 goto error; |
1647 } | |
1648 | |
1649 // Write image data | |
1302
38614c07c2e2
Now with "almost" working 24bit PCX output. Almost.
Matti Hamalainen <ccr@tnsp.org>
parents:
1301
diff
changeset
|
1650 res = dmWriteImageData(img, (void *) &pcx, dmWritePCXRow, &spec); |
435 | 1651 |
1652 // Write VGA palette | |
2157
9a9493809b3a
Rename DM_COLFMT_* constants to DM_PIXFMT_* and the 'format' field of DMImage
Matti Hamalainen <ccr@tnsp.org>
parents:
2156
diff
changeset
|
1653 if (spec.pixfmt == DM_PIXFMT_PALETTE || |
9a9493809b3a
Rename DM_COLFMT_* constants to DM_PIXFMT_* and the 'format' field of DMImage
Matti Hamalainen <ccr@tnsp.org>
parents:
2156
diff
changeset
|
1654 spec.pixfmt == DM_PIXFMT_GRAYSCALE) |
435 | 1655 { |
2094
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
1656 dmMsg(2, "PCX: Writing palette of %d active entries.\n", img->pal->ncolors); |
1294
9f2117f1584a
Improve error checking in PCX writer.
Matti Hamalainen <ccr@tnsp.org>
parents:
1292
diff
changeset
|
1657 |
1609
c29adf5ce240
Convert libgfx file format routines to use DMResource instead of stdio FILE.
Matti Hamalainen <ccr@tnsp.org>
parents:
1583
diff
changeset
|
1658 dmf_write_byte(pcx.fp, 0x0C); |
435 | 1659 |
2094
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
1660 if ((res = dmPaletteWriteData(fp, img->pal, img->pal->ncolors, 256)) != DMERR_OK) |
435 | 1661 { |
2094
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
1662 res = dmError(DMERR_FWRITE, |
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
1663 "PCX: Could not write palette data.\n"); |
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
1664 goto error; |
435 | 1665 } |
1666 } | |
1102
e06abfde6c39
Cosmetics pass: Remove excess whitespace.
Matti Hamalainen <ccr@tnsp.org>
parents:
958
diff
changeset
|
1667 |
435 | 1668 error: |
1669 dmFree(pcx.buf); | |
1670 return res; | |
1671 } | |
1672 | |
1673 | |
1609
c29adf5ce240
Convert libgfx file format routines to use DMResource instead of stdio FILE.
Matti Hamalainen <ccr@tnsp.org>
parents:
1583
diff
changeset
|
1674 static BOOL dmPCXDecodeRLERow(DMResource *fp, Uint8 *buf, const size_t bufLen) |
435 | 1675 { |
1676 size_t offs = 0; | |
1677 do | |
1678 { | |
1679 int count; | |
1680 Uint8 data; | |
1681 | |
1609
c29adf5ce240
Convert libgfx file format routines to use DMResource instead of stdio FILE.
Matti Hamalainen <ccr@tnsp.org>
parents:
1583
diff
changeset
|
1682 if (!dmf_read_byte(fp, &data)) |
435 | 1683 return FALSE; |
1102
e06abfde6c39
Cosmetics pass: Remove excess whitespace.
Matti Hamalainen <ccr@tnsp.org>
parents:
958
diff
changeset
|
1684 |
435 | 1685 if ((data & 0xC0) == 0xC0) |
1686 { | |
1284 | 1687 BOOL skip = FALSE; |
435 | 1688 count = data & 0x3F; |
1284 | 1689 if (count == 0) |
1690 { | |
1285
e4bda4909d72
Make libgfx error mode a global variable, at least for now.
Matti Hamalainen <ccr@tnsp.org>
parents:
1284
diff
changeset
|
1691 switch (dmGFXErrorMode) |
1284 | 1692 { |
1285
e4bda4909d72
Make libgfx error mode a global variable, at least for now.
Matti Hamalainen <ccr@tnsp.org>
parents:
1284
diff
changeset
|
1693 case DM_ERRMODE_RECOV_1: |
1284 | 1694 // Use as literal |
1695 skip = TRUE; | |
1696 count = 1; | |
1697 break; | |
1698 | |
1285
e4bda4909d72
Make libgfx error mode a global variable, at least for now.
Matti Hamalainen <ccr@tnsp.org>
parents:
1284
diff
changeset
|
1699 case DM_ERRMODE_RECOV_2: |
1284 | 1700 // Ignore completely |
1701 skip = TRUE; | |
1702 break; | |
1703 | |
1285
e4bda4909d72
Make libgfx error mode a global variable, at least for now.
Matti Hamalainen <ccr@tnsp.org>
parents:
1284
diff
changeset
|
1704 case DM_ERRMODE_FAIL: |
1284 | 1705 default: |
1706 // Error out on "invalid" data | |
1707 return FALSE; | |
1708 } | |
1709 } | |
1710 | |
1609
c29adf5ce240
Convert libgfx file format routines to use DMResource instead of stdio FILE.
Matti Hamalainen <ccr@tnsp.org>
parents:
1583
diff
changeset
|
1711 if (!skip && !dmf_read_byte(fp, &data)) |
435 | 1712 return FALSE; |
1713 } | |
1714 else | |
1715 count = 1; | |
1716 | |
1717 while (count-- && offs < bufLen) | |
1718 buf[offs++] = data; | |
1719 | |
1284 | 1720 // Check for remaining output count, error out if we wish to |
1285
e4bda4909d72
Make libgfx error mode a global variable, at least for now.
Matti Hamalainen <ccr@tnsp.org>
parents:
1284
diff
changeset
|
1721 if (count > 0 && dmGFXErrorMode == DM_ERRMODE_FAIL) |
1284 | 1722 return FALSE; |
1723 | |
435 | 1724 } while (offs < bufLen); |
1725 | |
1726 return TRUE; | |
1727 } | |
1728 | |
1729 | |
1886
1af79412f249
Remove the stdio FILE support from libgfx API, now only DMResource is supported.
Matti Hamalainen <ccr@tnsp.org>
parents:
1881
diff
changeset
|
1730 int dmReadPCXImage(DMResource *fp, DMImage **pimg) |
435 | 1731 { |
1732 DMImage *img; | |
1733 DMPCXData pcx; | |
1734 DMPCXHeader hdr; | |
1279
0d3f5f44c0c4
Somewhat improve PCX read support in libgfx.
Matti Hamalainen <ccr@tnsp.org>
parents:
1265
diff
changeset
|
1735 int res = 0; |
1286 | 1736 BOOL isPaletted; |
435 | 1737 pcx.buf = NULL; |
1738 | |
1739 // Read PCX header | |
1609
c29adf5ce240
Convert libgfx file format routines to use DMResource instead of stdio FILE.
Matti Hamalainen <ccr@tnsp.org>
parents:
1583
diff
changeset
|
1740 if (!dmf_read_byte(fp, &hdr.manufacturer) || |
c29adf5ce240
Convert libgfx file format routines to use DMResource instead of stdio FILE.
Matti Hamalainen <ccr@tnsp.org>
parents:
1583
diff
changeset
|
1741 !dmf_read_byte(fp, &hdr.version) || |
c29adf5ce240
Convert libgfx file format routines to use DMResource instead of stdio FILE.
Matti Hamalainen <ccr@tnsp.org>
parents:
1583
diff
changeset
|
1742 !dmf_read_byte(fp, &hdr.encoding) || |
c29adf5ce240
Convert libgfx file format routines to use DMResource instead of stdio FILE.
Matti Hamalainen <ccr@tnsp.org>
parents:
1583
diff
changeset
|
1743 !dmf_read_byte(fp, &hdr.bitsPerPlane) || |
c29adf5ce240
Convert libgfx file format routines to use DMResource instead of stdio FILE.
Matti Hamalainen <ccr@tnsp.org>
parents:
1583
diff
changeset
|
1744 !dmf_read_le16(fp, &hdr.xmin) || |
c29adf5ce240
Convert libgfx file format routines to use DMResource instead of stdio FILE.
Matti Hamalainen <ccr@tnsp.org>
parents:
1583
diff
changeset
|
1745 !dmf_read_le16(fp, &hdr.ymin) || |
c29adf5ce240
Convert libgfx file format routines to use DMResource instead of stdio FILE.
Matti Hamalainen <ccr@tnsp.org>
parents:
1583
diff
changeset
|
1746 !dmf_read_le16(fp, &hdr.xmax) || |
c29adf5ce240
Convert libgfx file format routines to use DMResource instead of stdio FILE.
Matti Hamalainen <ccr@tnsp.org>
parents:
1583
diff
changeset
|
1747 !dmf_read_le16(fp, &hdr.ymax) || |
c29adf5ce240
Convert libgfx file format routines to use DMResource instead of stdio FILE.
Matti Hamalainen <ccr@tnsp.org>
parents:
1583
diff
changeset
|
1748 !dmf_read_le16(fp, &hdr.hres) || |
c29adf5ce240
Convert libgfx file format routines to use DMResource instead of stdio FILE.
Matti Hamalainen <ccr@tnsp.org>
parents:
1583
diff
changeset
|
1749 !dmf_read_le16(fp, &hdr.vres) || |
c29adf5ce240
Convert libgfx file format routines to use DMResource instead of stdio FILE.
Matti Hamalainen <ccr@tnsp.org>
parents:
1583
diff
changeset
|
1750 !dmf_read_str(fp, (Uint8 *) &hdr.colorMap, sizeof(hdr.colorMap)) || |
c29adf5ce240
Convert libgfx file format routines to use DMResource instead of stdio FILE.
Matti Hamalainen <ccr@tnsp.org>
parents:
1583
diff
changeset
|
1751 !dmf_read_byte(fp, &hdr.reserved) || |
c29adf5ce240
Convert libgfx file format routines to use DMResource instead of stdio FILE.
Matti Hamalainen <ccr@tnsp.org>
parents:
1583
diff
changeset
|
1752 !dmf_read_byte(fp, &hdr.nplanes) || |
c29adf5ce240
Convert libgfx file format routines to use DMResource instead of stdio FILE.
Matti Hamalainen <ccr@tnsp.org>
parents:
1583
diff
changeset
|
1753 !dmf_read_le16(fp, &hdr.bpl) || |
c29adf5ce240
Convert libgfx file format routines to use DMResource instead of stdio FILE.
Matti Hamalainen <ccr@tnsp.org>
parents:
1583
diff
changeset
|
1754 !dmf_read_le16(fp, &hdr.palInfo) || |
c29adf5ce240
Convert libgfx file format routines to use DMResource instead of stdio FILE.
Matti Hamalainen <ccr@tnsp.org>
parents:
1583
diff
changeset
|
1755 !dmf_read_le16(fp, &hdr.hScreenSize) || |
c29adf5ce240
Convert libgfx file format routines to use DMResource instead of stdio FILE.
Matti Hamalainen <ccr@tnsp.org>
parents:
1583
diff
changeset
|
1756 !dmf_read_le16(fp, &hdr.vScreenSize) || |
c29adf5ce240
Convert libgfx file format routines to use DMResource instead of stdio FILE.
Matti Hamalainen <ccr@tnsp.org>
parents:
1583
diff
changeset
|
1757 !dmf_read_str(fp, (Uint8 *) &hdr.filler, sizeof(hdr.filler))) |
435 | 1758 { |
958
985225a93aeb
Add error code parameter to dmError() and dmErrorVA().
Matti Hamalainen <ccr@tnsp.org>
parents:
930
diff
changeset
|
1759 res = dmError(DMERR_FREAD, |
1298 | 1760 "PCX: Could not read image header data.\n"); |
1761 goto error; | |
1762 } | |
1763 | |
1764 if (hdr.manufacturer != 10 || | |
1765 hdr.version > 5 || | |
1766 hdr.encoding != 1) | |
1767 { | |
1768 res = dmError(DMERR_NOT_SUPPORTED, | |
1769 "PCX: Not a PCX file, or unsupported variant.\n"); | |
435 | 1770 goto error; |
1771 } | |
1102
e06abfde6c39
Cosmetics pass: Remove excess whitespace.
Matti Hamalainen <ccr@tnsp.org>
parents:
958
diff
changeset
|
1772 |
1299
b0c0be4c76f9
Aaand some more work on PCX loader. Actually works with 4/1 planes/bpp images now.
Matti Hamalainen <ccr@tnsp.org>
parents:
1298
diff
changeset
|
1773 if (hdr.nplanes == 4 && hdr.bitsPerPlane == 4) |
b0c0be4c76f9
Aaand some more work on PCX loader. Actually works with 4/1 planes/bpp images now.
Matti Hamalainen <ccr@tnsp.org>
parents:
1298
diff
changeset
|
1774 { |
b0c0be4c76f9
Aaand some more work on PCX loader. Actually works with 4/1 planes/bpp images now.
Matti Hamalainen <ccr@tnsp.org>
parents:
1298
diff
changeset
|
1775 dmMsg(2, |
2078
b2f1ce24f81b
Be more informative when attempting to figure out broken PCX file.
Matti Hamalainen <ccr@tnsp.org>
parents:
2071
diff
changeset
|
1776 "PCX: Probably invalid combination of nplanes=%d and bpp=%d, attempting to fix ..\n", |
b2f1ce24f81b
Be more informative when attempting to figure out broken PCX file.
Matti Hamalainen <ccr@tnsp.org>
parents:
2071
diff
changeset
|
1777 hdr.nplanes, hdr.bitsPerPlane); |
1609
c29adf5ce240
Convert libgfx file format routines to use DMResource instead of stdio FILE.
Matti Hamalainen <ccr@tnsp.org>
parents:
1583
diff
changeset
|
1778 |
1299
b0c0be4c76f9
Aaand some more work on PCX loader. Actually works with 4/1 planes/bpp images now.
Matti Hamalainen <ccr@tnsp.org>
parents:
1298
diff
changeset
|
1779 hdr.bitsPerPlane = 1; |
b0c0be4c76f9
Aaand some more work on PCX loader. Actually works with 4/1 planes/bpp images now.
Matti Hamalainen <ccr@tnsp.org>
parents:
1298
diff
changeset
|
1780 } |
b0c0be4c76f9
Aaand some more work on PCX loader. Actually works with 4/1 planes/bpp images now.
Matti Hamalainen <ccr@tnsp.org>
parents:
1298
diff
changeset
|
1781 |
1295
7a986f33895e
Fix isPaletted check in PCX reader :P
Matti Hamalainen <ccr@tnsp.org>
parents:
1294
diff
changeset
|
1782 isPaletted = (hdr.bitsPerPlane * hdr.nplanes) <= 8; |
1291 | 1783 |
1784 dmMsg(2, | |
1785 "PCX: xmin=%d, ymin=%d, xmax=%d, ymax=%d, res=%dx%d, scr=%dx%d\n", | |
1786 hdr.xmin, hdr.ymin, hdr.xmax, hdr.ymax, | |
1787 hdr.hres, hdr.vres, | |
1788 hdr.hScreenSize, hdr.vScreenSize); | |
1789 | |
1790 dmMsg(2, | |
1791 "PCX: nplanes=%d, bpp=%d, bpl=%d, isPaletted=%s\n", | |
1792 hdr.nplanes, hdr.bitsPerPlane, hdr.bpl, isPaletted ? "yes" : "no"); | |
1793 | |
2257
c7495fcaffa9
Check image dimensions when loading PPM/PNG/PCX/IFF images.
Matti Hamalainen <ccr@tnsp.org>
parents:
2220
diff
changeset
|
1794 // Check image dimensions |
c7495fcaffa9
Check image dimensions when loading PPM/PNG/PCX/IFF images.
Matti Hamalainen <ccr@tnsp.org>
parents:
2220
diff
changeset
|
1795 if (hdr.xmin > hdr.xmax || hdr.ymin > hdr.ymax) |
c7495fcaffa9
Check image dimensions when loading PPM/PNG/PCX/IFF images.
Matti Hamalainen <ccr@tnsp.org>
parents:
2220
diff
changeset
|
1796 { |
c7495fcaffa9
Check image dimensions when loading PPM/PNG/PCX/IFF images.
Matti Hamalainen <ccr@tnsp.org>
parents:
2220
diff
changeset
|
1797 res = dmError(DMERR_INVALID_DATA, |
c7495fcaffa9
Check image dimensions when loading PPM/PNG/PCX/IFF images.
Matti Hamalainen <ccr@tnsp.org>
parents:
2220
diff
changeset
|
1798 "PCX: Invalid image dimensions.\n"); |
c7495fcaffa9
Check image dimensions when loading PPM/PNG/PCX/IFF images.
Matti Hamalainen <ccr@tnsp.org>
parents:
2220
diff
changeset
|
1799 goto error; |
c7495fcaffa9
Check image dimensions when loading PPM/PNG/PCX/IFF images.
Matti Hamalainen <ccr@tnsp.org>
parents:
2220
diff
changeset
|
1800 } |
c7495fcaffa9
Check image dimensions when loading PPM/PNG/PCX/IFF images.
Matti Hamalainen <ccr@tnsp.org>
parents:
2220
diff
changeset
|
1801 |
1279
0d3f5f44c0c4
Somewhat improve PCX read support in libgfx.
Matti Hamalainen <ccr@tnsp.org>
parents:
1265
diff
changeset
|
1802 if (hdr.nplanes < 1 || hdr.nplanes > 8) |
435 | 1803 { |
1279
0d3f5f44c0c4
Somewhat improve PCX read support in libgfx.
Matti Hamalainen <ccr@tnsp.org>
parents:
1265
diff
changeset
|
1804 res = dmError(DMERR_NOT_SUPPORTED, |
958
985225a93aeb
Add error code parameter to dmError() and dmErrorVA().
Matti Hamalainen <ccr@tnsp.org>
parents:
930
diff
changeset
|
1805 "PCX: Unsupported number of bitplanes %d.\n", |
985225a93aeb
Add error code parameter to dmError() and dmErrorVA().
Matti Hamalainen <ccr@tnsp.org>
parents:
930
diff
changeset
|
1806 hdr.nplanes); |
435 | 1807 goto error; |
1808 } | |
1809 | |
1286 | 1810 if (!isPaletted) |
1811 { | |
1812 res = dmError(DMERR_NOT_SUPPORTED, | |
1813 "PCX: Non-indexed (truecolour) PCX images not supported for loading.\n"); | |
1814 goto error; | |
1815 } | |
1816 | |
435 | 1817 // Allocate image |
1286 | 1818 if ((*pimg = img = dmImageAlloc(hdr.xmax - hdr.xmin + 1, hdr.ymax - hdr.ymin + 1, |
2157
9a9493809b3a
Rename DM_COLFMT_* constants to DM_PIXFMT_* and the 'format' field of DMImage
Matti Hamalainen <ccr@tnsp.org>
parents:
2156
diff
changeset
|
1819 isPaletted ? DM_PIXFMT_PALETTE : DM_PIXFMT_RGB, |
1299
b0c0be4c76f9
Aaand some more work on PCX loader. Actually works with 4/1 planes/bpp images now.
Matti Hamalainen <ccr@tnsp.org>
parents:
1298
diff
changeset
|
1820 // XXX TODO? When/if we ever handle < 8bit indexed correctly, we can use the actual bpp |
b0c0be4c76f9
Aaand some more work on PCX loader. Actually works with 4/1 planes/bpp images now.
Matti Hamalainen <ccr@tnsp.org>
parents:
1298
diff
changeset
|
1821 // isPaletted ? (hdr.bitsPerPlane * hdr.nplanes) : -1 |
b0c0be4c76f9
Aaand some more work on PCX loader. Actually works with 4/1 planes/bpp images now.
Matti Hamalainen <ccr@tnsp.org>
parents:
1298
diff
changeset
|
1822 -1 |
b0c0be4c76f9
Aaand some more work on PCX loader. Actually works with 4/1 planes/bpp images now.
Matti Hamalainen <ccr@tnsp.org>
parents:
1298
diff
changeset
|
1823 )) == NULL) |
435 | 1824 { |
958
985225a93aeb
Add error code parameter to dmError() and dmErrorVA().
Matti Hamalainen <ccr@tnsp.org>
parents:
930
diff
changeset
|
1825 res = dmError(DMERR_MALLOC, |
985225a93aeb
Add error code parameter to dmError() and dmErrorVA().
Matti Hamalainen <ccr@tnsp.org>
parents:
930
diff
changeset
|
1826 "PCX: Could not allocate image structure.\n"); |
435 | 1827 goto error; |
1828 } | |
1829 | |
1628
a549d33d543a
Add image aspect ratio information.
Matti Hamalainen <ccr@tnsp.org>
parents:
1627
diff
changeset
|
1830 // Set image aspect ratio |
a549d33d543a
Add image aspect ratio information.
Matti Hamalainen <ccr@tnsp.org>
parents:
1627
diff
changeset
|
1831 if (hdr.hScreenSize > 0 && hdr.vScreenSize > 0 && |
a549d33d543a
Add image aspect ratio information.
Matti Hamalainen <ccr@tnsp.org>
parents:
1627
diff
changeset
|
1832 hdr.vScreenSize / hdr.hScreenSize != img->height / img->width) |
a549d33d543a
Add image aspect ratio information.
Matti Hamalainen <ccr@tnsp.org>
parents:
1627
diff
changeset
|
1833 img->aspect = (float) hdr.vScreenSize / (float) hdr.hScreenSize; |
a549d33d543a
Add image aspect ratio information.
Matti Hamalainen <ccr@tnsp.org>
parents:
1627
diff
changeset
|
1834 |
1298 | 1835 // Sanity check bytes per line value |
1279
0d3f5f44c0c4
Somewhat improve PCX read support in libgfx.
Matti Hamalainen <ccr@tnsp.org>
parents:
1265
diff
changeset
|
1836 if (hdr.bpl < (img->width * hdr.bitsPerPlane) / 8) |
0d3f5f44c0c4
Somewhat improve PCX read support in libgfx.
Matti Hamalainen <ccr@tnsp.org>
parents:
1265
diff
changeset
|
1837 { |
0d3f5f44c0c4
Somewhat improve PCX read support in libgfx.
Matti Hamalainen <ccr@tnsp.org>
parents:
1265
diff
changeset
|
1838 res = dmError(DMERR_MALLOC, |
0d3f5f44c0c4
Somewhat improve PCX read support in libgfx.
Matti Hamalainen <ccr@tnsp.org>
parents:
1265
diff
changeset
|
1839 "PCX: The bytes per plane line value %d is smaller than width*bpp/8 = %d!\n", |
0d3f5f44c0c4
Somewhat improve PCX read support in libgfx.
Matti Hamalainen <ccr@tnsp.org>
parents:
1265
diff
changeset
|
1840 hdr.bpl, (img->width * hdr.bitsPerPlane) / 8); |
0d3f5f44c0c4
Somewhat improve PCX read support in libgfx.
Matti Hamalainen <ccr@tnsp.org>
parents:
1265
diff
changeset
|
1841 goto error; |
0d3f5f44c0c4
Somewhat improve PCX read support in libgfx.
Matti Hamalainen <ccr@tnsp.org>
parents:
1265
diff
changeset
|
1842 } |
0d3f5f44c0c4
Somewhat improve PCX read support in libgfx.
Matti Hamalainen <ccr@tnsp.org>
parents:
1265
diff
changeset
|
1843 |
435 | 1844 pcx.bufLen = hdr.nplanes * hdr.bpl; |
1845 if ((pcx.buf = dmMalloc(pcx.bufLen)) == NULL) | |
1846 { | |
958
985225a93aeb
Add error code parameter to dmError() and dmErrorVA().
Matti Hamalainen <ccr@tnsp.org>
parents:
930
diff
changeset
|
1847 res = dmError(DMERR_MALLOC, |
985225a93aeb
Add error code parameter to dmError() and dmErrorVA().
Matti Hamalainen <ccr@tnsp.org>
parents:
930
diff
changeset
|
1848 "PCX: Could not allocate RLE buffer.\n"); |
435 | 1849 goto error; |
1850 } | |
1851 | |
1299
b0c0be4c76f9
Aaand some more work on PCX loader. Actually works with 4/1 planes/bpp images now.
Matti Hamalainen <ccr@tnsp.org>
parents:
1298
diff
changeset
|
1852 dmMsg(2, |
2384
36edd316184a
Fix some format strings to use proper PRI*_SIZE_T where necessary.
Matti Hamalainen <ccr@tnsp.org>
parents:
2371
diff
changeset
|
1853 "PCX: bufLen=%" DM_PRIu_SIZE_T "\n", |
1299
b0c0be4c76f9
Aaand some more work on PCX loader. Actually works with 4/1 planes/bpp images now.
Matti Hamalainen <ccr@tnsp.org>
parents:
1298
diff
changeset
|
1854 pcx.bufLen); |
b0c0be4c76f9
Aaand some more work on PCX loader. Actually works with 4/1 planes/bpp images now.
Matti Hamalainen <ccr@tnsp.org>
parents:
1298
diff
changeset
|
1855 |
435 | 1856 // Read image data |
1279
0d3f5f44c0c4
Somewhat improve PCX read support in libgfx.
Matti Hamalainen <ccr@tnsp.org>
parents:
1265
diff
changeset
|
1857 Uint8 *dp = img->data; |
0d3f5f44c0c4
Somewhat improve PCX read support in libgfx.
Matti Hamalainen <ccr@tnsp.org>
parents:
1265
diff
changeset
|
1858 for (int yc = 0; yc < img->height; yc++) |
435 | 1859 { |
1860 // Decode row of RLE'd data | |
1285
e4bda4909d72
Make libgfx error mode a global variable, at least for now.
Matti Hamalainen <ccr@tnsp.org>
parents:
1284
diff
changeset
|
1861 if (!dmPCXDecodeRLERow(fp, pcx.buf, pcx.bufLen)) |
435 | 1862 { |
958
985225a93aeb
Add error code parameter to dmError() and dmErrorVA().
Matti Hamalainen <ccr@tnsp.org>
parents:
930
diff
changeset
|
1863 res = dmError(DMERR_INVALID_DATA, |
1279
0d3f5f44c0c4
Somewhat improve PCX read support in libgfx.
Matti Hamalainen <ccr@tnsp.org>
parents:
1265
diff
changeset
|
1864 "PCX: Error decoding RLE compressed data.\n"); |
435 | 1865 goto error; |
1866 } | |
1609
c29adf5ce240
Convert libgfx file format routines to use DMResource instead of stdio FILE.
Matti Hamalainen <ccr@tnsp.org>
parents:
1583
diff
changeset
|
1867 |
435 | 1868 // Decode bitplanes |
1279
0d3f5f44c0c4
Somewhat improve PCX read support in libgfx.
Matti Hamalainen <ccr@tnsp.org>
parents:
1265
diff
changeset
|
1869 switch (hdr.bitsPerPlane) |
435 | 1870 { |
1296 | 1871 case 24: |
1279
0d3f5f44c0c4
Somewhat improve PCX read support in libgfx.
Matti Hamalainen <ccr@tnsp.org>
parents:
1265
diff
changeset
|
1872 case 8: |
0d3f5f44c0c4
Somewhat improve PCX read support in libgfx.
Matti Hamalainen <ccr@tnsp.org>
parents:
1265
diff
changeset
|
1873 { |
1286 | 1874 // Actually bytes and bits per plane per pixel .. |
1875 const int bytesPerPlane = hdr.bitsPerPlane / 8; | |
1279
0d3f5f44c0c4
Somewhat improve PCX read support in libgfx.
Matti Hamalainen <ccr@tnsp.org>
parents:
1265
diff
changeset
|
1876 |
1286 | 1877 for (int nplane = 0; nplane < hdr.nplanes; nplane++) |
1878 { | |
1879 Uint8 *dptr = dp + (nplane * bytesPerPlane), | |
1880 *sptr = pcx.buf + (hdr.bpl * nplane); | |
1881 | |
1882 memcpy(dptr, sptr, img->width * bytesPerPlane); | |
1883 } | |
1279
0d3f5f44c0c4
Somewhat improve PCX read support in libgfx.
Matti Hamalainen <ccr@tnsp.org>
parents:
1265
diff
changeset
|
1884 } |
435 | 1885 break; |
1102
e06abfde6c39
Cosmetics pass: Remove excess whitespace.
Matti Hamalainen <ccr@tnsp.org>
parents:
958
diff
changeset
|
1886 |
1280
300a51e98fc3
Bump version and copyright.
Matti Hamalainen <ccr@tnsp.org>
parents:
1279
diff
changeset
|
1887 case 1: |
2414
69a5af2eb1ea
Remove useless dmMemset().
Matti Hamalainen <ccr@tnsp.org>
parents:
2393
diff
changeset
|
1888 memset(dp, 0, img->width); |
1296 | 1889 |
1280
300a51e98fc3
Bump version and copyright.
Matti Hamalainen <ccr@tnsp.org>
parents:
1279
diff
changeset
|
1890 for (int nplane = 0; nplane < hdr.nplanes; nplane++) |
300a51e98fc3
Bump version and copyright.
Matti Hamalainen <ccr@tnsp.org>
parents:
1279
diff
changeset
|
1891 { |
1296 | 1892 Uint8 *sptr = pcx.buf + (hdr.bpl * nplane); |
1280
300a51e98fc3
Bump version and copyright.
Matti Hamalainen <ccr@tnsp.org>
parents:
1279
diff
changeset
|
1893 |
300a51e98fc3
Bump version and copyright.
Matti Hamalainen <ccr@tnsp.org>
parents:
1279
diff
changeset
|
1894 for (int xc = 0; xc < img->width; xc++) |
1296 | 1895 { |
1299
b0c0be4c76f9
Aaand some more work on PCX loader. Actually works with 4/1 planes/bpp images now.
Matti Hamalainen <ccr@tnsp.org>
parents:
1298
diff
changeset
|
1896 const int px = 7 - (xc & 7); |
b0c0be4c76f9
Aaand some more work on PCX loader. Actually works with 4/1 planes/bpp images now.
Matti Hamalainen <ccr@tnsp.org>
parents:
1298
diff
changeset
|
1897 dp[xc] |= ((sptr[xc / 8] & (1 << px)) >> px) << nplane; |
1296 | 1898 } |
1280
300a51e98fc3
Bump version and copyright.
Matti Hamalainen <ccr@tnsp.org>
parents:
1279
diff
changeset
|
1899 } |
300a51e98fc3
Bump version and copyright.
Matti Hamalainen <ccr@tnsp.org>
parents:
1279
diff
changeset
|
1900 break; |
300a51e98fc3
Bump version and copyright.
Matti Hamalainen <ccr@tnsp.org>
parents:
1279
diff
changeset
|
1901 |
1279
0d3f5f44c0c4
Somewhat improve PCX read support in libgfx.
Matti Hamalainen <ccr@tnsp.org>
parents:
1265
diff
changeset
|
1902 default: |
1285
e4bda4909d72
Make libgfx error mode a global variable, at least for now.
Matti Hamalainen <ccr@tnsp.org>
parents:
1284
diff
changeset
|
1903 res = dmError(DMERR_NOT_SUPPORTED, |
1279
0d3f5f44c0c4
Somewhat improve PCX read support in libgfx.
Matti Hamalainen <ccr@tnsp.org>
parents:
1265
diff
changeset
|
1904 "PCX: Unsupported number of bits per plane %d.\n", |
0d3f5f44c0c4
Somewhat improve PCX read support in libgfx.
Matti Hamalainen <ccr@tnsp.org>
parents:
1265
diff
changeset
|
1905 hdr.bitsPerPlane); |
0d3f5f44c0c4
Somewhat improve PCX read support in libgfx.
Matti Hamalainen <ccr@tnsp.org>
parents:
1265
diff
changeset
|
1906 goto error; |
435 | 1907 } |
1102
e06abfde6c39
Cosmetics pass: Remove excess whitespace.
Matti Hamalainen <ccr@tnsp.org>
parents:
958
diff
changeset
|
1908 |
435 | 1909 dp += img->pitch; |
1910 } | |
1911 | |
1279
0d3f5f44c0c4
Somewhat improve PCX read support in libgfx.
Matti Hamalainen <ccr@tnsp.org>
parents:
1265
diff
changeset
|
1912 // Read additional VGA palette, if available |
1286 | 1913 if (isPaletted) |
435 | 1914 { |
1279
0d3f5f44c0c4
Somewhat improve PCX read support in libgfx.
Matti Hamalainen <ccr@tnsp.org>
parents:
1265
diff
changeset
|
1915 int ncolors; |
435 | 1916 Uint8 tmpb; |
1917 BOOL read; | |
1918 | |
1609
c29adf5ce240
Convert libgfx file format routines to use DMResource instead of stdio FILE.
Matti Hamalainen <ccr@tnsp.org>
parents:
1583
diff
changeset
|
1919 if (!dmf_read_byte(fp, &tmpb) || tmpb != 0x0C) |
435 | 1920 { |
1921 read = FALSE; | |
2207
1ea48084055e
Add functionality for separate palette file handling, reading, writing and
Matti Hamalainen <ccr@tnsp.org>
parents:
2202
diff
changeset
|
1922 ncolors = PCX_PAL_COLORS; |
435 | 1923 } |
1924 else | |
1925 { | |
1926 read = TRUE; | |
451
fdc91f2a0d27
Modularize palette reading and handling code.
Matti Hamalainen <ccr@tnsp.org>
parents:
449
diff
changeset
|
1927 ncolors = 256; |
435 | 1928 } |
1929 | |
2094
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
1930 if ((res = dmPaletteAlloc(&(img->pal), ncolors, -1)) != DMERR_OK) |
435 | 1931 { |
2094
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
1932 res = dmError(res, |
958
985225a93aeb
Add error code parameter to dmError() and dmErrorVA().
Matti Hamalainen <ccr@tnsp.org>
parents:
930
diff
changeset
|
1933 "PCX: Could not allocate palette data!\n"); |
435 | 1934 goto error; |
1935 } | |
1102
e06abfde6c39
Cosmetics pass: Remove excess whitespace.
Matti Hamalainen <ccr@tnsp.org>
parents:
958
diff
changeset
|
1936 |
435 | 1937 if (read) |
1938 { | |
1279
0d3f5f44c0c4
Somewhat improve PCX read support in libgfx.
Matti Hamalainen <ccr@tnsp.org>
parents:
1265
diff
changeset
|
1939 // Okay, attempt to read the palette data |
1296 | 1940 dmMsg(2, "PCX: Reading palette of %d colors\n", ncolors); |
2094
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
1941 if ((res = dmPaletteReadData(fp, img->pal, ncolors)) != DMERR_OK) |
435 | 1942 { |
2094
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
1943 dmErrorMsg("PCX: Error reading palette.\n"); |
958
985225a93aeb
Add error code parameter to dmError() and dmErrorVA().
Matti Hamalainen <ccr@tnsp.org>
parents:
930
diff
changeset
|
1944 goto error; |
435 | 1945 } |
1946 } | |
1947 else | |
1948 { | |
2207
1ea48084055e
Add functionality for separate palette file handling, reading, writing and
Matti Hamalainen <ccr@tnsp.org>
parents:
2202
diff
changeset
|
1949 const int nmax = img->pal->ncolors > PCX_PAL_COLORS ? PCX_PAL_COLORS : img->pal->ncolors; |
2094
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
1950 |
1279
0d3f5f44c0c4
Somewhat improve PCX read support in libgfx.
Matti Hamalainen <ccr@tnsp.org>
parents:
1265
diff
changeset
|
1951 // If the extra palette is not available, copy the colors from |
0d3f5f44c0c4
Somewhat improve PCX read support in libgfx.
Matti Hamalainen <ccr@tnsp.org>
parents:
1265
diff
changeset
|
1952 // the header palette to our internal palette structure. |
2094
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
1953 dmMsg(2, "PCX: Initializing palette from header of %d colors (%d)\n", ncolors, nmax); |
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
1954 |
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
1955 for (int i = 0; i < nmax; i++) |
435 | 1956 { |
2094
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
1957 img->pal->colors[i].r = hdr.colorMap[i].r; |
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
1958 img->pal->colors[i].g = hdr.colorMap[i].g; |
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
1959 img->pal->colors[i].b = hdr.colorMap[i].b; |
435 | 1960 } |
1961 } | |
1962 } | |
1963 | |
1964 error: | |
1965 dmFree(pcx.buf); | |
1966 return res; | |
1967 } | |
1968 | |
1969 | |
1613
70b04c16aa40
Move format probe functions near to their other functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
1609
diff
changeset
|
1970 // |
70b04c16aa40
Move format probe functions near to their other functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
1609
diff
changeset
|
1971 // IFF ILBM / PBM format |
70b04c16aa40
Move format probe functions near to their other functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
1609
diff
changeset
|
1972 // |
443
f7c9d1619c74
Beginnings of IFF ILBM reader. Not functional, only chunk parsing,
Matti Hamalainen <ccr@tnsp.org>
parents:
442
diff
changeset
|
1973 #define IFF_ID_FORM 0x464F524D // "FORM" |
f7c9d1619c74
Beginnings of IFF ILBM reader. Not functional, only chunk parsing,
Matti Hamalainen <ccr@tnsp.org>
parents:
442
diff
changeset
|
1974 #define IFF_ID_ILBM 0x494C424D // "ILBM" |
464 | 1975 #define IFF_ID_PBM 0x50424D20 // "PBM " |
443
f7c9d1619c74
Beginnings of IFF ILBM reader. Not functional, only chunk parsing,
Matti Hamalainen <ccr@tnsp.org>
parents:
442
diff
changeset
|
1976 #define IFF_ID_BMHD 0x424D4844 // "BMHD" |
f7c9d1619c74
Beginnings of IFF ILBM reader. Not functional, only chunk parsing,
Matti Hamalainen <ccr@tnsp.org>
parents:
442
diff
changeset
|
1977 #define IFF_ID_CMAP 0x434D4150 // "CMAP" |
f7c9d1619c74
Beginnings of IFF ILBM reader. Not functional, only chunk parsing,
Matti Hamalainen <ccr@tnsp.org>
parents:
442
diff
changeset
|
1978 #define IFF_ID_BODY 0x424F4459 // "BODY" |
449
117f94b253af
Add support for CAMG chunk reading and possibly half-brite handling in IFF ILBM reader.
Matti Hamalainen <ccr@tnsp.org>
parents:
448
diff
changeset
|
1979 #define IFF_ID_CAMG 0x43414D47 // "CAMG" |
2053
6dfbe976d740
Implement basic initial support for IFF ACBM format images.
Matti Hamalainen <ccr@tnsp.org>
parents:
2050
diff
changeset
|
1980 #define IFF_ID_ACBM 0x4143424D // "ACBM" |
6dfbe976d740
Implement basic initial support for IFF ACBM format images.
Matti Hamalainen <ccr@tnsp.org>
parents:
2050
diff
changeset
|
1981 #define IFF_ID_ABIT 0x41424954 // "ABIT" |
443
f7c9d1619c74
Beginnings of IFF ILBM reader. Not functional, only chunk parsing,
Matti Hamalainen <ccr@tnsp.org>
parents:
442
diff
changeset
|
1982 |
f7c9d1619c74
Beginnings of IFF ILBM reader. Not functional, only chunk parsing,
Matti Hamalainen <ccr@tnsp.org>
parents:
442
diff
changeset
|
1983 #define IFF_MASK_NONE 0 |
f7c9d1619c74
Beginnings of IFF ILBM reader. Not functional, only chunk parsing,
Matti Hamalainen <ccr@tnsp.org>
parents:
442
diff
changeset
|
1984 #define IFF_MASK_HAS_MASK 1 |
f7c9d1619c74
Beginnings of IFF ILBM reader. Not functional, only chunk parsing,
Matti Hamalainen <ccr@tnsp.org>
parents:
442
diff
changeset
|
1985 #define IFF_MASK_TRANSP 2 |
f7c9d1619c74
Beginnings of IFF ILBM reader. Not functional, only chunk parsing,
Matti Hamalainen <ccr@tnsp.org>
parents:
442
diff
changeset
|
1986 #define IFF_MASK_LASSO 3 |
f7c9d1619c74
Beginnings of IFF ILBM reader. Not functional, only chunk parsing,
Matti Hamalainen <ccr@tnsp.org>
parents:
442
diff
changeset
|
1987 |
f7c9d1619c74
Beginnings of IFF ILBM reader. Not functional, only chunk parsing,
Matti Hamalainen <ccr@tnsp.org>
parents:
442
diff
changeset
|
1988 #define IFF_COMP_NONE 0 |
f7c9d1619c74
Beginnings of IFF ILBM reader. Not functional, only chunk parsing,
Matti Hamalainen <ccr@tnsp.org>
parents:
442
diff
changeset
|
1989 #define IFF_COMP_BYTERUN1 1 |
f7c9d1619c74
Beginnings of IFF ILBM reader. Not functional, only chunk parsing,
Matti Hamalainen <ccr@tnsp.org>
parents:
442
diff
changeset
|
1990 |
449
117f94b253af
Add support for CAMG chunk reading and possibly half-brite handling in IFF ILBM reader.
Matti Hamalainen <ccr@tnsp.org>
parents:
448
diff
changeset
|
1991 #define IFF_CAMG_LACE 0x00000004 |
117f94b253af
Add support for CAMG chunk reading and possibly half-brite handling in IFF ILBM reader.
Matti Hamalainen <ccr@tnsp.org>
parents:
448
diff
changeset
|
1992 #define IFF_CAMG_HALFBRITE 0x00000080 |
117f94b253af
Add support for CAMG chunk reading and possibly half-brite handling in IFF ILBM reader.
Matti Hamalainen <ccr@tnsp.org>
parents:
448
diff
changeset
|
1993 #define IFF_CAMG_HAM 0x00000800 |
443
f7c9d1619c74
Beginnings of IFF ILBM reader. Not functional, only chunk parsing,
Matti Hamalainen <ccr@tnsp.org>
parents:
442
diff
changeset
|
1994 |
f7c9d1619c74
Beginnings of IFF ILBM reader. Not functional, only chunk parsing,
Matti Hamalainen <ccr@tnsp.org>
parents:
442
diff
changeset
|
1995 typedef struct |
f7c9d1619c74
Beginnings of IFF ILBM reader. Not functional, only chunk parsing,
Matti Hamalainen <ccr@tnsp.org>
parents:
442
diff
changeset
|
1996 { |
f7c9d1619c74
Beginnings of IFF ILBM reader. Not functional, only chunk parsing,
Matti Hamalainen <ccr@tnsp.org>
parents:
442
diff
changeset
|
1997 Uint32 id; |
f7c9d1619c74
Beginnings of IFF ILBM reader. Not functional, only chunk parsing,
Matti Hamalainen <ccr@tnsp.org>
parents:
442
diff
changeset
|
1998 Uint32 size; |
f7c9d1619c74
Beginnings of IFF ILBM reader. Not functional, only chunk parsing,
Matti Hamalainen <ccr@tnsp.org>
parents:
442
diff
changeset
|
1999 int count; |
1656
2de258f2eb2e
Get rid of a basically redundant function in IFF reader.
Matti Hamalainen <ccr@tnsp.org>
parents:
1655
diff
changeset
|
2000 char idStr[6]; |
1895
eb03869a10d3
Clean up the IFF reader and make it more robust.
Matti Hamalainen <ccr@tnsp.org>
parents:
1894
diff
changeset
|
2001 off_t offs; |
443
f7c9d1619c74
Beginnings of IFF ILBM reader. Not functional, only chunk parsing,
Matti Hamalainen <ccr@tnsp.org>
parents:
442
diff
changeset
|
2002 } DMIFFChunk; |
f7c9d1619c74
Beginnings of IFF ILBM reader. Not functional, only chunk parsing,
Matti Hamalainen <ccr@tnsp.org>
parents:
442
diff
changeset
|
2003 |
f7c9d1619c74
Beginnings of IFF ILBM reader. Not functional, only chunk parsing,
Matti Hamalainen <ccr@tnsp.org>
parents:
442
diff
changeset
|
2004 |
f7c9d1619c74
Beginnings of IFF ILBM reader. Not functional, only chunk parsing,
Matti Hamalainen <ccr@tnsp.org>
parents:
442
diff
changeset
|
2005 typedef struct |
f7c9d1619c74
Beginnings of IFF ILBM reader. Not functional, only chunk parsing,
Matti Hamalainen <ccr@tnsp.org>
parents:
442
diff
changeset
|
2006 { |
f7c9d1619c74
Beginnings of IFF ILBM reader. Not functional, only chunk parsing,
Matti Hamalainen <ccr@tnsp.org>
parents:
442
diff
changeset
|
2007 Uint16 w, h; |
f7c9d1619c74
Beginnings of IFF ILBM reader. Not functional, only chunk parsing,
Matti Hamalainen <ccr@tnsp.org>
parents:
442
diff
changeset
|
2008 Sint16 x, y; |
f7c9d1619c74
Beginnings of IFF ILBM reader. Not functional, only chunk parsing,
Matti Hamalainen <ccr@tnsp.org>
parents:
442
diff
changeset
|
2009 Uint8 nplanes; |
f7c9d1619c74
Beginnings of IFF ILBM reader. Not functional, only chunk parsing,
Matti Hamalainen <ccr@tnsp.org>
parents:
442
diff
changeset
|
2010 Uint8 masking; |
f7c9d1619c74
Beginnings of IFF ILBM reader. Not functional, only chunk parsing,
Matti Hamalainen <ccr@tnsp.org>
parents:
442
diff
changeset
|
2011 Uint8 compression; |
f7c9d1619c74
Beginnings of IFF ILBM reader. Not functional, only chunk parsing,
Matti Hamalainen <ccr@tnsp.org>
parents:
442
diff
changeset
|
2012 Uint8 pad1; |
f7c9d1619c74
Beginnings of IFF ILBM reader. Not functional, only chunk parsing,
Matti Hamalainen <ccr@tnsp.org>
parents:
442
diff
changeset
|
2013 Uint16 transp; |
f7c9d1619c74
Beginnings of IFF ILBM reader. Not functional, only chunk parsing,
Matti Hamalainen <ccr@tnsp.org>
parents:
442
diff
changeset
|
2014 Uint8 xasp, yasp; |
f7c9d1619c74
Beginnings of IFF ILBM reader. Not functional, only chunk parsing,
Matti Hamalainen <ccr@tnsp.org>
parents:
442
diff
changeset
|
2015 Sint16 pagew, pageh; |
f7c9d1619c74
Beginnings of IFF ILBM reader. Not functional, only chunk parsing,
Matti Hamalainen <ccr@tnsp.org>
parents:
442
diff
changeset
|
2016 } DMIFFBMHD; |
f7c9d1619c74
Beginnings of IFF ILBM reader. Not functional, only chunk parsing,
Matti Hamalainen <ccr@tnsp.org>
parents:
442
diff
changeset
|
2017 |
f7c9d1619c74
Beginnings of IFF ILBM reader. Not functional, only chunk parsing,
Matti Hamalainen <ccr@tnsp.org>
parents:
442
diff
changeset
|
2018 |
444
7d588807f91d
Clean up the IFF parser a bit.
Matti Hamalainen <ccr@tnsp.org>
parents:
443
diff
changeset
|
2019 typedef struct |
7d588807f91d
Clean up the IFF parser a bit.
Matti Hamalainen <ccr@tnsp.org>
parents:
443
diff
changeset
|
2020 { |
1810 | 2021 DMIFFChunk chFORM, chBMHD, chCMAP, chBODY; |
444
7d588807f91d
Clean up the IFF parser a bit.
Matti Hamalainen <ccr@tnsp.org>
parents:
443
diff
changeset
|
2022 DMIFFBMHD bmhd; |
1810 | 2023 Uint32 camg; |
444
7d588807f91d
Clean up the IFF parser a bit.
Matti Hamalainen <ccr@tnsp.org>
parents:
443
diff
changeset
|
2024 int ncolors; |
2094
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
2025 DMPalette *pal; |
2053
6dfbe976d740
Implement basic initial support for IFF ACBM format images.
Matti Hamalainen <ccr@tnsp.org>
parents:
2050
diff
changeset
|
2026 Uint32 idsig; |
2064
3617ef01c1de
Separate ILBM and PBM subformats of IFF images.
Matti Hamalainen <ccr@tnsp.org>
parents:
2063
diff
changeset
|
2027 char *idstr; |
444
7d588807f91d
Clean up the IFF parser a bit.
Matti Hamalainen <ccr@tnsp.org>
parents:
443
diff
changeset
|
2028 } DMIFF; |
7d588807f91d
Clean up the IFF parser a bit.
Matti Hamalainen <ccr@tnsp.org>
parents:
443
diff
changeset
|
2029 |
7d588807f91d
Clean up the IFF parser a bit.
Matti Hamalainen <ccr@tnsp.org>
parents:
443
diff
changeset
|
2030 |
2068 | 2031 static int fmtProbeIFF(const Uint8 *buf, const size_t len, const Uint32 id) |
1613
70b04c16aa40
Move format probe functions near to their other functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
1609
diff
changeset
|
2032 { |
70b04c16aa40
Move format probe functions near to their other functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
1609
diff
changeset
|
2033 if (len > 32 && |
2068 | 2034 DM_BE32_TO_NATIVE(*(Uint32 *) (buf + 0)) == IFF_ID_FORM && |
2035 DM_BE32_TO_NATIVE(*(Uint32 *) (buf + 8)) == id) | |
1613
70b04c16aa40
Move format probe functions near to their other functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
1609
diff
changeset
|
2036 { |
2063 | 2037 if (DM_BE32_TO_NATIVE(*(Uint32 *) (buf + 12)) == IFF_ID_BMHD) |
1613
70b04c16aa40
Move format probe functions near to their other functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
1609
diff
changeset
|
2038 return DM_PROBE_SCORE_MAX; |
70b04c16aa40
Move format probe functions near to their other functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
1609
diff
changeset
|
2039 else |
70b04c16aa40
Move format probe functions near to their other functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
1609
diff
changeset
|
2040 return DM_PROBE_SCORE_GOOD; |
70b04c16aa40
Move format probe functions near to their other functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
1609
diff
changeset
|
2041 } |
70b04c16aa40
Move format probe functions near to their other functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
1609
diff
changeset
|
2042 |
70b04c16aa40
Move format probe functions near to their other functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
1609
diff
changeset
|
2043 return DM_PROBE_SCORE_FALSE; |
70b04c16aa40
Move format probe functions near to their other functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
1609
diff
changeset
|
2044 } |
70b04c16aa40
Move format probe functions near to their other functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
1609
diff
changeset
|
2045 |
70b04c16aa40
Move format probe functions near to their other functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
1609
diff
changeset
|
2046 |
2068 | 2047 static int fmtProbeIFF_ILBM(const Uint8 *buf, const size_t len) |
2048 { | |
2049 return fmtProbeIFF(buf, len, IFF_ID_ILBM); | |
2050 } | |
2051 | |
2052 | |
2053 static int fmtProbeIFF_PBM(const Uint8 *buf, const size_t len) | |
2054 { | |
2055 return fmtProbeIFF(buf, len, IFF_ID_PBM); | |
2056 } | |
2057 | |
2058 | |
2059 static int fmtProbeIFF_ACBM(const Uint8 *buf, const size_t len) | |
2060 { | |
2061 return fmtProbeIFF(buf, len, IFF_ID_ACBM); | |
2062 } | |
2063 | |
2064 | |
1657
2b6dbdd602b5
Split IFF chunk id string from id creation into separate function.
Matti Hamalainen <ccr@tnsp.org>
parents:
1656
diff
changeset
|
2065 static void dmMakeIFFChunkIDStr(DMIFFChunk *chunk) |
2b6dbdd602b5
Split IFF chunk id string from id creation into separate function.
Matti Hamalainen <ccr@tnsp.org>
parents:
1656
diff
changeset
|
2066 { |
2b6dbdd602b5
Split IFF chunk id string from id creation into separate function.
Matti Hamalainen <ccr@tnsp.org>
parents:
1656
diff
changeset
|
2067 chunk->idStr[0] = (chunk->id >> 24) & 0xff; |
2b6dbdd602b5
Split IFF chunk id string from id creation into separate function.
Matti Hamalainen <ccr@tnsp.org>
parents:
1656
diff
changeset
|
2068 chunk->idStr[1] = (chunk->id >> 16) & 0xff; |
2b6dbdd602b5
Split IFF chunk id string from id creation into separate function.
Matti Hamalainen <ccr@tnsp.org>
parents:
1656
diff
changeset
|
2069 chunk->idStr[2] = (chunk->id >> 8) & 0xff; |
2b6dbdd602b5
Split IFF chunk id string from id creation into separate function.
Matti Hamalainen <ccr@tnsp.org>
parents:
1656
diff
changeset
|
2070 chunk->idStr[3] = (chunk->id) & 0xff; |
2b6dbdd602b5
Split IFF chunk id string from id creation into separate function.
Matti Hamalainen <ccr@tnsp.org>
parents:
1656
diff
changeset
|
2071 chunk->idStr[4] = 0; |
2b6dbdd602b5
Split IFF chunk id string from id creation into separate function.
Matti Hamalainen <ccr@tnsp.org>
parents:
1656
diff
changeset
|
2072 } |
2b6dbdd602b5
Split IFF chunk id string from id creation into separate function.
Matti Hamalainen <ccr@tnsp.org>
parents:
1656
diff
changeset
|
2073 |
2b6dbdd602b5
Split IFF chunk id string from id creation into separate function.
Matti Hamalainen <ccr@tnsp.org>
parents:
1656
diff
changeset
|
2074 |
1654
92656ad7f706
Improve IFF reader error handling.
Matti Hamalainen <ccr@tnsp.org>
parents:
1641
diff
changeset
|
2075 static int dmReadIFFChunkHdr(DMResource *fp, DMIFFChunk *chunk) |
443
f7c9d1619c74
Beginnings of IFF ILBM reader. Not functional, only chunk parsing,
Matti Hamalainen <ccr@tnsp.org>
parents:
442
diff
changeset
|
2076 { |
1609
c29adf5ce240
Convert libgfx file format routines to use DMResource instead of stdio FILE.
Matti Hamalainen <ccr@tnsp.org>
parents:
1583
diff
changeset
|
2077 if (!dmf_read_be32(fp, &chunk->id) || |
c29adf5ce240
Convert libgfx file format routines to use DMResource instead of stdio FILE.
Matti Hamalainen <ccr@tnsp.org>
parents:
1583
diff
changeset
|
2078 !dmf_read_be32(fp, &chunk->size)) |
443
f7c9d1619c74
Beginnings of IFF ILBM reader. Not functional, only chunk parsing,
Matti Hamalainen <ccr@tnsp.org>
parents:
442
diff
changeset
|
2079 { |
1654
92656ad7f706
Improve IFF reader error handling.
Matti Hamalainen <ccr@tnsp.org>
parents:
1641
diff
changeset
|
2080 return dmError(DMERR_FREAD, |
1892
cbc911ffd21e
Rename ILBM functions to IFF, which is more approriate as we support both ILBM and PBM variants of the IFF images.
Matti Hamalainen <ccr@tnsp.org>
parents:
1887
diff
changeset
|
2081 "IFF: Could not read IFF chunk header.\n"); |
443
f7c9d1619c74
Beginnings of IFF ILBM reader. Not functional, only chunk parsing,
Matti Hamalainen <ccr@tnsp.org>
parents:
442
diff
changeset
|
2082 } |
f7c9d1619c74
Beginnings of IFF ILBM reader. Not functional, only chunk parsing,
Matti Hamalainen <ccr@tnsp.org>
parents:
442
diff
changeset
|
2083 else |
1656
2de258f2eb2e
Get rid of a basically redundant function in IFF reader.
Matti Hamalainen <ccr@tnsp.org>
parents:
1655
diff
changeset
|
2084 { |
1895
eb03869a10d3
Clean up the IFF reader and make it more robust.
Matti Hamalainen <ccr@tnsp.org>
parents:
1894
diff
changeset
|
2085 chunk->offs = dmftell(fp); |
1657
2b6dbdd602b5
Split IFF chunk id string from id creation into separate function.
Matti Hamalainen <ccr@tnsp.org>
parents:
1656
diff
changeset
|
2086 dmMakeIFFChunkIDStr(chunk); |
1654
92656ad7f706
Improve IFF reader error handling.
Matti Hamalainen <ccr@tnsp.org>
parents:
1641
diff
changeset
|
2087 return DMERR_OK; |
1656
2de258f2eb2e
Get rid of a basically redundant function in IFF reader.
Matti Hamalainen <ccr@tnsp.org>
parents:
1655
diff
changeset
|
2088 } |
443
f7c9d1619c74
Beginnings of IFF ILBM reader. Not functional, only chunk parsing,
Matti Hamalainen <ccr@tnsp.org>
parents:
442
diff
changeset
|
2089 } |
f7c9d1619c74
Beginnings of IFF ILBM reader. Not functional, only chunk parsing,
Matti Hamalainen <ccr@tnsp.org>
parents:
442
diff
changeset
|
2090 |
f7c9d1619c74
Beginnings of IFF ILBM reader. Not functional, only chunk parsing,
Matti Hamalainen <ccr@tnsp.org>
parents:
442
diff
changeset
|
2091 |
1895
eb03869a10d3
Clean up the IFF reader and make it more robust.
Matti Hamalainen <ccr@tnsp.org>
parents:
1894
diff
changeset
|
2092 static int dmSkipIFFChunkRest(DMResource *fp, const DMIFFChunk *chunk) |
444
7d588807f91d
Clean up the IFF parser a bit.
Matti Hamalainen <ccr@tnsp.org>
parents:
443
diff
changeset
|
2093 { |
1901
636d3c8bcd35
Fix uneven chunk size handling in IFF reader.
Matti Hamalainen <ccr@tnsp.org>
parents:
1900
diff
changeset
|
2094 off_t read = dmftell(fp) - chunk->offs, |
636d3c8bcd35
Fix uneven chunk size handling in IFF reader.
Matti Hamalainen <ccr@tnsp.org>
parents:
1900
diff
changeset
|
2095 size = chunk->size; |
636d3c8bcd35
Fix uneven chunk size handling in IFF reader.
Matti Hamalainen <ccr@tnsp.org>
parents:
1900
diff
changeset
|
2096 |
636d3c8bcd35
Fix uneven chunk size handling in IFF reader.
Matti Hamalainen <ccr@tnsp.org>
parents:
1900
diff
changeset
|
2097 if (size & 1) |
447
0e27860ddcfe
Finish initial implementation of IFF ILBM loader. And whoa .. it seems to be working.
Matti Hamalainen <ccr@tnsp.org>
parents:
445
diff
changeset
|
2098 { |
2393
85700c9b7dc8
Add new DM_PRI*_OFF_T specifiers for off_t type.
Matti Hamalainen <ccr@tnsp.org>
parents:
2384
diff
changeset
|
2099 dmMsg(3, "IFF: Chunk size %" DM_PRId_OFF_T |
85700c9b7dc8
Add new DM_PRI*_OFF_T specifiers for off_t type.
Matti Hamalainen <ccr@tnsp.org>
parents:
2384
diff
changeset
|
2100 " is uneven, adjusting to %" DM_PRId_OFF_T ".\n", |
1901
636d3c8bcd35
Fix uneven chunk size handling in IFF reader.
Matti Hamalainen <ccr@tnsp.org>
parents:
1900
diff
changeset
|
2101 size, size + 1); |
636d3c8bcd35
Fix uneven chunk size handling in IFF reader.
Matti Hamalainen <ccr@tnsp.org>
parents:
1900
diff
changeset
|
2102 size++; |
636d3c8bcd35
Fix uneven chunk size handling in IFF reader.
Matti Hamalainen <ccr@tnsp.org>
parents:
1900
diff
changeset
|
2103 } |
958
985225a93aeb
Add error code parameter to dmError() and dmErrorVA().
Matti Hamalainen <ccr@tnsp.org>
parents:
930
diff
changeset
|
2104 |
1901
636d3c8bcd35
Fix uneven chunk size handling in IFF reader.
Matti Hamalainen <ccr@tnsp.org>
parents:
1900
diff
changeset
|
2105 if (size > read) |
636d3c8bcd35
Fix uneven chunk size handling in IFF reader.
Matti Hamalainen <ccr@tnsp.org>
parents:
1900
diff
changeset
|
2106 { |
2393
85700c9b7dc8
Add new DM_PRI*_OFF_T specifiers for off_t type.
Matti Hamalainen <ccr@tnsp.org>
parents:
2384
diff
changeset
|
2107 dmMsg(3, "IFF: Skipping %" DM_PRId_OFF_T |
85700c9b7dc8
Add new DM_PRI*_OFF_T specifiers for off_t type.
Matti Hamalainen <ccr@tnsp.org>
parents:
2384
diff
changeset
|
2108 " bytes (%" DM_PRId_OFF_T |
85700c9b7dc8
Add new DM_PRI*_OFF_T specifiers for off_t type.
Matti Hamalainen <ccr@tnsp.org>
parents:
2384
diff
changeset
|
2109 " of %" DM_PRId_OFF_T " consumed)\n", |
1901
636d3c8bcd35
Fix uneven chunk size handling in IFF reader.
Matti Hamalainen <ccr@tnsp.org>
parents:
1900
diff
changeset
|
2110 size - read, read, size); |
636d3c8bcd35
Fix uneven chunk size handling in IFF reader.
Matti Hamalainen <ccr@tnsp.org>
parents:
1900
diff
changeset
|
2111 |
636d3c8bcd35
Fix uneven chunk size handling in IFF reader.
Matti Hamalainen <ccr@tnsp.org>
parents:
1900
diff
changeset
|
2112 if (dmfseek(fp, size - read, SEEK_CUR) != 0) |
958
985225a93aeb
Add error code parameter to dmError() and dmErrorVA().
Matti Hamalainen <ccr@tnsp.org>
parents:
930
diff
changeset
|
2113 { |
985225a93aeb
Add error code parameter to dmError() and dmErrorVA().
Matti Hamalainen <ccr@tnsp.org>
parents:
930
diff
changeset
|
2114 return dmError(DMERR_FSEEK, |
1892
cbc911ffd21e
Rename ILBM functions to IFF, which is more approriate as we support both ILBM and PBM variants of the IFF images.
Matti Hamalainen <ccr@tnsp.org>
parents:
1887
diff
changeset
|
2115 "IFF: Failed to skip chunk end.\n"); |
958
985225a93aeb
Add error code parameter to dmError() and dmErrorVA().
Matti Hamalainen <ccr@tnsp.org>
parents:
930
diff
changeset
|
2116 } |
447
0e27860ddcfe
Finish initial implementation of IFF ILBM loader. And whoa .. it seems to be working.
Matti Hamalainen <ccr@tnsp.org>
parents:
445
diff
changeset
|
2117 } |
1903 | 2118 |
1901
636d3c8bcd35
Fix uneven chunk size handling in IFF reader.
Matti Hamalainen <ccr@tnsp.org>
parents:
1900
diff
changeset
|
2119 return DMERR_OK; |
444
7d588807f91d
Clean up the IFF parser a bit.
Matti Hamalainen <ccr@tnsp.org>
parents:
443
diff
changeset
|
2120 } |
7d588807f91d
Clean up the IFF parser a bit.
Matti Hamalainen <ccr@tnsp.org>
parents:
443
diff
changeset
|
2121 |
1656
2de258f2eb2e
Get rid of a basically redundant function in IFF reader.
Matti Hamalainen <ccr@tnsp.org>
parents:
1655
diff
changeset
|
2122 |
2053
6dfbe976d740
Implement basic initial support for IFF ACBM format images.
Matti Hamalainen <ccr@tnsp.org>
parents:
2050
diff
changeset
|
2123 static int dmCheckIFFChunk(DMIFFChunk *dest, const DMIFFChunk *chunk, |
445 | 2124 const BOOL multi, const Uint32 minSize) |
443
f7c9d1619c74
Beginnings of IFF ILBM reader. Not functional, only chunk parsing,
Matti Hamalainen <ccr@tnsp.org>
parents:
442
diff
changeset
|
2125 { |
f7c9d1619c74
Beginnings of IFF ILBM reader. Not functional, only chunk parsing,
Matti Hamalainen <ccr@tnsp.org>
parents:
442
diff
changeset
|
2126 if (dest->count > 0 && !multi) |
f7c9d1619c74
Beginnings of IFF ILBM reader. Not functional, only chunk parsing,
Matti Hamalainen <ccr@tnsp.org>
parents:
442
diff
changeset
|
2127 { |
958
985225a93aeb
Add error code parameter to dmError() and dmErrorVA().
Matti Hamalainen <ccr@tnsp.org>
parents:
930
diff
changeset
|
2128 return dmError(DMERR_INVALID_DATA, |
1892
cbc911ffd21e
Rename ILBM functions to IFF, which is more approriate as we support both ILBM and PBM variants of the IFF images.
Matti Hamalainen <ccr@tnsp.org>
parents:
1887
diff
changeset
|
2129 "IFF: Multiple instances of chunk %s found.\n", |
1656
2de258f2eb2e
Get rid of a basically redundant function in IFF reader.
Matti Hamalainen <ccr@tnsp.org>
parents:
1655
diff
changeset
|
2130 chunk->idStr); |
443
f7c9d1619c74
Beginnings of IFF ILBM reader. Not functional, only chunk parsing,
Matti Hamalainen <ccr@tnsp.org>
parents:
442
diff
changeset
|
2131 } |
958
985225a93aeb
Add error code parameter to dmError() and dmErrorVA().
Matti Hamalainen <ccr@tnsp.org>
parents:
930
diff
changeset
|
2132 |
443
f7c9d1619c74
Beginnings of IFF ILBM reader. Not functional, only chunk parsing,
Matti Hamalainen <ccr@tnsp.org>
parents:
442
diff
changeset
|
2133 dest->count++; |
f7c9d1619c74
Beginnings of IFF ILBM reader. Not functional, only chunk parsing,
Matti Hamalainen <ccr@tnsp.org>
parents:
442
diff
changeset
|
2134 |
f7c9d1619c74
Beginnings of IFF ILBM reader. Not functional, only chunk parsing,
Matti Hamalainen <ccr@tnsp.org>
parents:
442
diff
changeset
|
2135 if (chunk->size < minSize) |
958
985225a93aeb
Add error code parameter to dmError() and dmErrorVA().
Matti Hamalainen <ccr@tnsp.org>
parents:
930
diff
changeset
|
2136 { |
985225a93aeb
Add error code parameter to dmError() and dmErrorVA().
Matti Hamalainen <ccr@tnsp.org>
parents:
930
diff
changeset
|
2137 return dmError(DMERR_OUT_OF_DATA, |
1907
571109a14967
Add some more informative messages in IFF loader.
Matti Hamalainen <ccr@tnsp.org>
parents:
1906
diff
changeset
|
2138 "IFF: Chunk %s is too small (%d < %d).\n", |
571109a14967
Add some more informative messages in IFF loader.
Matti Hamalainen <ccr@tnsp.org>
parents:
1906
diff
changeset
|
2139 chunk->idStr, chunk->size, minSize); |
958
985225a93aeb
Add error code parameter to dmError() and dmErrorVA().
Matti Hamalainen <ccr@tnsp.org>
parents:
930
diff
changeset
|
2140 } |
985225a93aeb
Add error code parameter to dmError() and dmErrorVA().
Matti Hamalainen <ccr@tnsp.org>
parents:
930
diff
changeset
|
2141 |
985225a93aeb
Add error code parameter to dmError() and dmErrorVA().
Matti Hamalainen <ccr@tnsp.org>
parents:
930
diff
changeset
|
2142 return DMERR_OK; |
443
f7c9d1619c74
Beginnings of IFF ILBM reader. Not functional, only chunk parsing,
Matti Hamalainen <ccr@tnsp.org>
parents:
442
diff
changeset
|
2143 } |
f7c9d1619c74
Beginnings of IFF ILBM reader. Not functional, only chunk parsing,
Matti Hamalainen <ccr@tnsp.org>
parents:
442
diff
changeset
|
2144 |
f7c9d1619c74
Beginnings of IFF ILBM reader. Not functional, only chunk parsing,
Matti Hamalainen <ccr@tnsp.org>
parents:
442
diff
changeset
|
2145 |
2055
6c6a4ea67540
Make two functions static and one not.
Matti Hamalainen <ccr@tnsp.org>
parents:
2054
diff
changeset
|
2146 BOOL dmIFFDecodeByteRun1Row(DMResource *fp, Uint8 *buf, const size_t bufLen) |
447
0e27860ddcfe
Finish initial implementation of IFF ILBM loader. And whoa .. it seems to be working.
Matti Hamalainen <ccr@tnsp.org>
parents:
445
diff
changeset
|
2147 { |
0e27860ddcfe
Finish initial implementation of IFF ILBM loader. And whoa .. it seems to be working.
Matti Hamalainen <ccr@tnsp.org>
parents:
445
diff
changeset
|
2148 size_t offs = 0; |
0e27860ddcfe
Finish initial implementation of IFF ILBM loader. And whoa .. it seems to be working.
Matti Hamalainen <ccr@tnsp.org>
parents:
445
diff
changeset
|
2149 do |
0e27860ddcfe
Finish initial implementation of IFF ILBM loader. And whoa .. it seems to be working.
Matti Hamalainen <ccr@tnsp.org>
parents:
445
diff
changeset
|
2150 { |
1905
425259977bc5
Don't use signed arithmatic in IFF ByteRun1 decoder.
Matti Hamalainen <ccr@tnsp.org>
parents:
1904
diff
changeset
|
2151 Uint8 data, ucount; |
447
0e27860ddcfe
Finish initial implementation of IFF ILBM loader. And whoa .. it seems to be working.
Matti Hamalainen <ccr@tnsp.org>
parents:
445
diff
changeset
|
2152 |
1905
425259977bc5
Don't use signed arithmatic in IFF ByteRun1 decoder.
Matti Hamalainen <ccr@tnsp.org>
parents:
1904
diff
changeset
|
2153 if (!dmf_read_byte(fp, &ucount)) |
447
0e27860ddcfe
Finish initial implementation of IFF ILBM loader. And whoa .. it seems to be working.
Matti Hamalainen <ccr@tnsp.org>
parents:
445
diff
changeset
|
2154 return FALSE; |
1102
e06abfde6c39
Cosmetics pass: Remove excess whitespace.
Matti Hamalainen <ccr@tnsp.org>
parents:
958
diff
changeset
|
2155 |
1905
425259977bc5
Don't use signed arithmatic in IFF ByteRun1 decoder.
Matti Hamalainen <ccr@tnsp.org>
parents:
1904
diff
changeset
|
2156 if (ucount == 0x80) |
447
0e27860ddcfe
Finish initial implementation of IFF ILBM loader. And whoa .. it seems to be working.
Matti Hamalainen <ccr@tnsp.org>
parents:
445
diff
changeset
|
2157 { |
1609
c29adf5ce240
Convert libgfx file format routines to use DMResource instead of stdio FILE.
Matti Hamalainen <ccr@tnsp.org>
parents:
1583
diff
changeset
|
2158 if (!dmf_read_byte(fp, &data)) |
447
0e27860ddcfe
Finish initial implementation of IFF ILBM loader. And whoa .. it seems to be working.
Matti Hamalainen <ccr@tnsp.org>
parents:
445
diff
changeset
|
2159 return FALSE; |
0e27860ddcfe
Finish initial implementation of IFF ILBM loader. And whoa .. it seems to be working.
Matti Hamalainen <ccr@tnsp.org>
parents:
445
diff
changeset
|
2160 } |
0e27860ddcfe
Finish initial implementation of IFF ILBM loader. And whoa .. it seems to be working.
Matti Hamalainen <ccr@tnsp.org>
parents:
445
diff
changeset
|
2161 else |
1905
425259977bc5
Don't use signed arithmatic in IFF ByteRun1 decoder.
Matti Hamalainen <ccr@tnsp.org>
parents:
1904
diff
changeset
|
2162 if (ucount & 0x80) |
447
0e27860ddcfe
Finish initial implementation of IFF ILBM loader. And whoa .. it seems to be working.
Matti Hamalainen <ccr@tnsp.org>
parents:
445
diff
changeset
|
2163 { |
1905
425259977bc5
Don't use signed arithmatic in IFF ByteRun1 decoder.
Matti Hamalainen <ccr@tnsp.org>
parents:
1904
diff
changeset
|
2164 Uint8 count = (ucount ^ 0xff) + 2; |
1609
c29adf5ce240
Convert libgfx file format routines to use DMResource instead of stdio FILE.
Matti Hamalainen <ccr@tnsp.org>
parents:
1583
diff
changeset
|
2165 if (!dmf_read_byte(fp, &data)) |
447
0e27860ddcfe
Finish initial implementation of IFF ILBM loader. And whoa .. it seems to be working.
Matti Hamalainen <ccr@tnsp.org>
parents:
445
diff
changeset
|
2166 return FALSE; |
0e27860ddcfe
Finish initial implementation of IFF ILBM loader. And whoa .. it seems to be working.
Matti Hamalainen <ccr@tnsp.org>
parents:
445
diff
changeset
|
2167 |
0e27860ddcfe
Finish initial implementation of IFF ILBM loader. And whoa .. it seems to be working.
Matti Hamalainen <ccr@tnsp.org>
parents:
445
diff
changeset
|
2168 while (count-- && offs < bufLen) |
0e27860ddcfe
Finish initial implementation of IFF ILBM loader. And whoa .. it seems to be working.
Matti Hamalainen <ccr@tnsp.org>
parents:
445
diff
changeset
|
2169 buf[offs++] = data; |
0e27860ddcfe
Finish initial implementation of IFF ILBM loader. And whoa .. it seems to be working.
Matti Hamalainen <ccr@tnsp.org>
parents:
445
diff
changeset
|
2170 } |
0e27860ddcfe
Finish initial implementation of IFF ILBM loader. And whoa .. it seems to be working.
Matti Hamalainen <ccr@tnsp.org>
parents:
445
diff
changeset
|
2171 else |
0e27860ddcfe
Finish initial implementation of IFF ILBM loader. And whoa .. it seems to be working.
Matti Hamalainen <ccr@tnsp.org>
parents:
445
diff
changeset
|
2172 { |
1905
425259977bc5
Don't use signed arithmatic in IFF ByteRun1 decoder.
Matti Hamalainen <ccr@tnsp.org>
parents:
1904
diff
changeset
|
2173 Uint8 count = ucount + 1; |
447
0e27860ddcfe
Finish initial implementation of IFF ILBM loader. And whoa .. it seems to be working.
Matti Hamalainen <ccr@tnsp.org>
parents:
445
diff
changeset
|
2174 while (count-- && offs < bufLen) |
0e27860ddcfe
Finish initial implementation of IFF ILBM loader. And whoa .. it seems to be working.
Matti Hamalainen <ccr@tnsp.org>
parents:
445
diff
changeset
|
2175 { |
1609
c29adf5ce240
Convert libgfx file format routines to use DMResource instead of stdio FILE.
Matti Hamalainen <ccr@tnsp.org>
parents:
1583
diff
changeset
|
2176 if (!dmf_read_byte(fp, &data)) |
447
0e27860ddcfe
Finish initial implementation of IFF ILBM loader. And whoa .. it seems to be working.
Matti Hamalainen <ccr@tnsp.org>
parents:
445
diff
changeset
|
2177 return FALSE; |
0e27860ddcfe
Finish initial implementation of IFF ILBM loader. And whoa .. it seems to be working.
Matti Hamalainen <ccr@tnsp.org>
parents:
445
diff
changeset
|
2178 |
0e27860ddcfe
Finish initial implementation of IFF ILBM loader. And whoa .. it seems to be working.
Matti Hamalainen <ccr@tnsp.org>
parents:
445
diff
changeset
|
2179 buf[offs++] = data; |
0e27860ddcfe
Finish initial implementation of IFF ILBM loader. And whoa .. it seems to be working.
Matti Hamalainen <ccr@tnsp.org>
parents:
445
diff
changeset
|
2180 } |
0e27860ddcfe
Finish initial implementation of IFF ILBM loader. And whoa .. it seems to be working.
Matti Hamalainen <ccr@tnsp.org>
parents:
445
diff
changeset
|
2181 } |
0e27860ddcfe
Finish initial implementation of IFF ILBM loader. And whoa .. it seems to be working.
Matti Hamalainen <ccr@tnsp.org>
parents:
445
diff
changeset
|
2182 } while (offs < bufLen); |
0e27860ddcfe
Finish initial implementation of IFF ILBM loader. And whoa .. it seems to be working.
Matti Hamalainen <ccr@tnsp.org>
parents:
445
diff
changeset
|
2183 |
0e27860ddcfe
Finish initial implementation of IFF ILBM loader. And whoa .. it seems to be working.
Matti Hamalainen <ccr@tnsp.org>
parents:
445
diff
changeset
|
2184 return TRUE; |
0e27860ddcfe
Finish initial implementation of IFF ILBM loader. And whoa .. it seems to be working.
Matti Hamalainen <ccr@tnsp.org>
parents:
445
diff
changeset
|
2185 } |
0e27860ddcfe
Finish initial implementation of IFF ILBM loader. And whoa .. it seems to be working.
Matti Hamalainen <ccr@tnsp.org>
parents:
445
diff
changeset
|
2186 |
0e27860ddcfe
Finish initial implementation of IFF ILBM loader. And whoa .. it seems to be working.
Matti Hamalainen <ccr@tnsp.org>
parents:
445
diff
changeset
|
2187 |
1609
c29adf5ce240
Convert libgfx file format routines to use DMResource instead of stdio FILE.
Matti Hamalainen <ccr@tnsp.org>
parents:
1583
diff
changeset
|
2188 static BOOL dmIFFReadOneRow(DMResource *fp, DMIFF *iff, Uint8 *buf, const size_t bufLen) |
447
0e27860ddcfe
Finish initial implementation of IFF ILBM loader. And whoa .. it seems to be working.
Matti Hamalainen <ccr@tnsp.org>
parents:
445
diff
changeset
|
2189 { |
0e27860ddcfe
Finish initial implementation of IFF ILBM loader. And whoa .. it seems to be working.
Matti Hamalainen <ccr@tnsp.org>
parents:
445
diff
changeset
|
2190 if (iff->bmhd.compression == IFF_COMP_BYTERUN1) |
0e27860ddcfe
Finish initial implementation of IFF ILBM loader. And whoa .. it seems to be working.
Matti Hamalainen <ccr@tnsp.org>
parents:
445
diff
changeset
|
2191 return dmIFFDecodeByteRun1Row(fp, buf, bufLen); |
0e27860ddcfe
Finish initial implementation of IFF ILBM loader. And whoa .. it seems to be working.
Matti Hamalainen <ccr@tnsp.org>
parents:
445
diff
changeset
|
2192 else |
1609
c29adf5ce240
Convert libgfx file format routines to use DMResource instead of stdio FILE.
Matti Hamalainen <ccr@tnsp.org>
parents:
1583
diff
changeset
|
2193 return dmf_read_str(fp, buf, bufLen); |
447
0e27860ddcfe
Finish initial implementation of IFF ILBM loader. And whoa .. it seems to be working.
Matti Hamalainen <ccr@tnsp.org>
parents:
445
diff
changeset
|
2194 } |
0e27860ddcfe
Finish initial implementation of IFF ILBM loader. And whoa .. it seems to be working.
Matti Hamalainen <ccr@tnsp.org>
parents:
445
diff
changeset
|
2195 |
0e27860ddcfe
Finish initial implementation of IFF ILBM loader. And whoa .. it seems to be working.
Matti Hamalainen <ccr@tnsp.org>
parents:
445
diff
changeset
|
2196 |
1622 | 2197 static inline Uint8 dmDecodeBit(const Uint8 *buf, const int xc) |
1619
dacf4c2f7a86
Remove slight code duplication.
Matti Hamalainen <ccr@tnsp.org>
parents:
1618
diff
changeset
|
2198 { |
dacf4c2f7a86
Remove slight code duplication.
Matti Hamalainen <ccr@tnsp.org>
parents:
1618
diff
changeset
|
2199 return (buf[xc / 8] >> (7 - (xc & 7))) & 1; |
dacf4c2f7a86
Remove slight code duplication.
Matti Hamalainen <ccr@tnsp.org>
parents:
1618
diff
changeset
|
2200 } |
dacf4c2f7a86
Remove slight code duplication.
Matti Hamalainen <ccr@tnsp.org>
parents:
1618
diff
changeset
|
2201 |
dacf4c2f7a86
Remove slight code duplication.
Matti Hamalainen <ccr@tnsp.org>
parents:
1618
diff
changeset
|
2202 |
1903 | 2203 static int dmDecodeIFFBody(DMResource *fp, DMIFF *iff, DMImage *img) |
444
7d588807f91d
Clean up the IFF parser a bit.
Matti Hamalainen <ccr@tnsp.org>
parents:
443
diff
changeset
|
2204 { |
1903 | 2205 Uint8 *buf = NULL; |
2206 size_t bufLen = 0; | |
1618 | 2207 int res = DMERR_OK; |
1659 | 2208 const int nplanes = iff->bmhd.nplanes; |
1102
e06abfde6c39
Cosmetics pass: Remove excess whitespace.
Matti Hamalainen <ccr@tnsp.org>
parents:
958
diff
changeset
|
2209 |
2053
6dfbe976d740
Implement basic initial support for IFF ACBM format images.
Matti Hamalainen <ccr@tnsp.org>
parents:
2050
diff
changeset
|
2210 if (iff->idsig == IFF_ID_ILBM) |
1903 | 2211 { |
2212 bufLen = ((img->width + 15) / 16) * 2; | |
2384
36edd316184a
Fix some format strings to use proper PRI*_SIZE_T where necessary.
Matti Hamalainen <ccr@tnsp.org>
parents:
2371
diff
changeset
|
2213 dmMsg(2, "IFF: Line / plane row size %" DM_PRIu_SIZE_T " bytes.\n", |
36edd316184a
Fix some format strings to use proper PRI*_SIZE_T where necessary.
Matti Hamalainen <ccr@tnsp.org>
parents:
2371
diff
changeset
|
2214 bufLen); |
2053
6dfbe976d740
Implement basic initial support for IFF ACBM format images.
Matti Hamalainen <ccr@tnsp.org>
parents:
2050
diff
changeset
|
2215 |
1903 | 2216 } |
2053
6dfbe976d740
Implement basic initial support for IFF ACBM format images.
Matti Hamalainen <ccr@tnsp.org>
parents:
2050
diff
changeset
|
2217 else |
6dfbe976d740
Implement basic initial support for IFF ACBM format images.
Matti Hamalainen <ccr@tnsp.org>
parents:
2050
diff
changeset
|
2218 if (iff->idsig == IFF_ID_ACBM) |
6dfbe976d740
Implement basic initial support for IFF ACBM format images.
Matti Hamalainen <ccr@tnsp.org>
parents:
2050
diff
changeset
|
2219 { |
2082
a0a6f5a3fbbf
Fix plane buffer size calculation for IFF ACBM to round up to nearest byte (minimum of 1).
Matti Hamalainen <ccr@tnsp.org>
parents:
2081
diff
changeset
|
2220 bufLen = (img->width * img->height + 7) / 8; |
2384
36edd316184a
Fix some format strings to use proper PRI*_SIZE_T where necessary.
Matti Hamalainen <ccr@tnsp.org>
parents:
2371
diff
changeset
|
2221 dmMsg(2, "IFF: Plane buffer size %" DM_PRIu_SIZE_T " bytes.\n", |
36edd316184a
Fix some format strings to use proper PRI*_SIZE_T where necessary.
Matti Hamalainen <ccr@tnsp.org>
parents:
2371
diff
changeset
|
2222 bufLen); |
2053
6dfbe976d740
Implement basic initial support for IFF ACBM format images.
Matti Hamalainen <ccr@tnsp.org>
parents:
2050
diff
changeset
|
2223 } |
6dfbe976d740
Implement basic initial support for IFF ACBM format images.
Matti Hamalainen <ccr@tnsp.org>
parents:
2050
diff
changeset
|
2224 |
6dfbe976d740
Implement basic initial support for IFF ACBM format images.
Matti Hamalainen <ccr@tnsp.org>
parents:
2050
diff
changeset
|
2225 if (bufLen > 0 && (buf = dmMalloc(bufLen)) == NULL) |
6dfbe976d740
Implement basic initial support for IFF ACBM format images.
Matti Hamalainen <ccr@tnsp.org>
parents:
2050
diff
changeset
|
2226 return DMERR_MALLOC; |
1102
e06abfde6c39
Cosmetics pass: Remove excess whitespace.
Matti Hamalainen <ccr@tnsp.org>
parents:
958
diff
changeset
|
2227 |
447
0e27860ddcfe
Finish initial implementation of IFF ILBM loader. And whoa .. it seems to be working.
Matti Hamalainen <ccr@tnsp.org>
parents:
445
diff
changeset
|
2228 // Decode the chunk |
2053
6dfbe976d740
Implement basic initial support for IFF ACBM format images.
Matti Hamalainen <ccr@tnsp.org>
parents:
2050
diff
changeset
|
2229 if (iff->idsig == IFF_ID_ACBM) |
6dfbe976d740
Implement basic initial support for IFF ACBM format images.
Matti Hamalainen <ccr@tnsp.org>
parents:
2050
diff
changeset
|
2230 { |
2081
a14286e2710e
Initialize the destination image data in case of IFF ACBM loading.
Matti Hamalainen <ccr@tnsp.org>
parents:
2078
diff
changeset
|
2231 // Initialize destination image data |
2414
69a5af2eb1ea
Remove useless dmMemset().
Matti Hamalainen <ccr@tnsp.org>
parents:
2393
diff
changeset
|
2232 memset(img->data, 0, img->size); |
2081
a14286e2710e
Initialize the destination image data in case of IFF ACBM loading.
Matti Hamalainen <ccr@tnsp.org>
parents:
2078
diff
changeset
|
2233 |
2053
6dfbe976d740
Implement basic initial support for IFF ACBM format images.
Matti Hamalainen <ccr@tnsp.org>
parents:
2050
diff
changeset
|
2234 for (int plane = 0; plane < nplanes; plane++) |
6dfbe976d740
Implement basic initial support for IFF ACBM format images.
Matti Hamalainen <ccr@tnsp.org>
parents:
2050
diff
changeset
|
2235 { |
2069 | 2236 // Decompress or read data |
2237 if (!dmIFFReadOneRow(fp, iff, buf, bufLen)) | |
2053
6dfbe976d740
Implement basic initial support for IFF ACBM format images.
Matti Hamalainen <ccr@tnsp.org>
parents:
2050
diff
changeset
|
2238 { |
6dfbe976d740
Implement basic initial support for IFF ACBM format images.
Matti Hamalainen <ccr@tnsp.org>
parents:
2050
diff
changeset
|
2239 res = dmError(DMERR_FREAD, |
2069 | 2240 "IFF: Error in reading ACBM image plane #%d.\n", |
2053
6dfbe976d740
Implement basic initial support for IFF ACBM format images.
Matti Hamalainen <ccr@tnsp.org>
parents:
2050
diff
changeset
|
2241 plane); |
6dfbe976d740
Implement basic initial support for IFF ACBM format images.
Matti Hamalainen <ccr@tnsp.org>
parents:
2050
diff
changeset
|
2242 goto out; |
6dfbe976d740
Implement basic initial support for IFF ACBM format images.
Matti Hamalainen <ccr@tnsp.org>
parents:
2050
diff
changeset
|
2243 } |
6dfbe976d740
Implement basic initial support for IFF ACBM format images.
Matti Hamalainen <ccr@tnsp.org>
parents:
2050
diff
changeset
|
2244 |
6dfbe976d740
Implement basic initial support for IFF ACBM format images.
Matti Hamalainen <ccr@tnsp.org>
parents:
2050
diff
changeset
|
2245 for (int yc = 0; yc < img->height; yc++) |
6dfbe976d740
Implement basic initial support for IFF ACBM format images.
Matti Hamalainen <ccr@tnsp.org>
parents:
2050
diff
changeset
|
2246 { |
6dfbe976d740
Implement basic initial support for IFF ACBM format images.
Matti Hamalainen <ccr@tnsp.org>
parents:
2050
diff
changeset
|
2247 Uint8 *dp = img->data + (yc * img->pitch); |
2067
430c010d97c1
Fix hardcoding in ACBM decoding.
Matti Hamalainen <ccr@tnsp.org>
parents:
2065
diff
changeset
|
2248 Uint8 *sp = buf + (yc * img->width) / 8; |
2053
6dfbe976d740
Implement basic initial support for IFF ACBM format images.
Matti Hamalainen <ccr@tnsp.org>
parents:
2050
diff
changeset
|
2249 for (int xc = 0; xc < img->width; xc++) |
6dfbe976d740
Implement basic initial support for IFF ACBM format images.
Matti Hamalainen <ccr@tnsp.org>
parents:
2050
diff
changeset
|
2250 { |
2067
430c010d97c1
Fix hardcoding in ACBM decoding.
Matti Hamalainen <ccr@tnsp.org>
parents:
2065
diff
changeset
|
2251 dp[xc] |= dmDecodeBit(sp, xc) << plane; |
2053
6dfbe976d740
Implement basic initial support for IFF ACBM format images.
Matti Hamalainen <ccr@tnsp.org>
parents:
2050
diff
changeset
|
2252 } |
6dfbe976d740
Implement basic initial support for IFF ACBM format images.
Matti Hamalainen <ccr@tnsp.org>
parents:
2050
diff
changeset
|
2253 } |
6dfbe976d740
Implement basic initial support for IFF ACBM format images.
Matti Hamalainen <ccr@tnsp.org>
parents:
2050
diff
changeset
|
2254 } |
6dfbe976d740
Implement basic initial support for IFF ACBM format images.
Matti Hamalainen <ccr@tnsp.org>
parents:
2050
diff
changeset
|
2255 } |
6dfbe976d740
Implement basic initial support for IFF ACBM format images.
Matti Hamalainen <ccr@tnsp.org>
parents:
2050
diff
changeset
|
2256 else |
1618 | 2257 for (int yc = 0; yc < img->height; yc++) |
447
0e27860ddcfe
Finish initial implementation of IFF ILBM loader. And whoa .. it seems to be working.
Matti Hamalainen <ccr@tnsp.org>
parents:
445
diff
changeset
|
2258 { |
0e27860ddcfe
Finish initial implementation of IFF ILBM loader. And whoa .. it seems to be working.
Matti Hamalainen <ccr@tnsp.org>
parents:
445
diff
changeset
|
2259 Uint8 *dp = img->data + (yc * img->pitch); |
0e27860ddcfe
Finish initial implementation of IFF ILBM loader. And whoa .. it seems to be working.
Matti Hamalainen <ccr@tnsp.org>
parents:
445
diff
changeset
|
2260 |
2053
6dfbe976d740
Implement basic initial support for IFF ACBM format images.
Matti Hamalainen <ccr@tnsp.org>
parents:
2050
diff
changeset
|
2261 if (iff->idsig == IFF_ID_ILBM) |
447
0e27860ddcfe
Finish initial implementation of IFF ILBM loader. And whoa .. it seems to be working.
Matti Hamalainen <ccr@tnsp.org>
parents:
445
diff
changeset
|
2262 { |
1907
571109a14967
Add some more informative messages in IFF loader.
Matti Hamalainen <ccr@tnsp.org>
parents:
1906
diff
changeset
|
2263 // Clear planar decoding buffer |
2414
69a5af2eb1ea
Remove useless dmMemset().
Matti Hamalainen <ccr@tnsp.org>
parents:
2393
diff
changeset
|
2264 memset(dp, 0, img->pitch); |
1903 | 2265 |
2266 for (int plane = 0; plane < nplanes; plane++) | |
447
0e27860ddcfe
Finish initial implementation of IFF ILBM loader. And whoa .. it seems to be working.
Matti Hamalainen <ccr@tnsp.org>
parents:
445
diff
changeset
|
2267 { |
1903 | 2268 // Decompress or read data |
2269 if (!dmIFFReadOneRow(fp, iff, buf, bufLen)) | |
2270 { | |
2271 res = dmError(DMERR_FREAD, | |
2069 | 2272 "IFF: Error in reading ILBM image plane #%d @ %d.\n", |
1903 | 2273 plane, yc); |
2274 goto out; | |
2275 } | |
2276 | |
2277 // Decode bitplane | |
2278 for (int xc = 0; xc < img->width; xc++) | |
2279 dp[xc] |= dmDecodeBit(buf, xc) << plane; | |
447
0e27860ddcfe
Finish initial implementation of IFF ILBM loader. And whoa .. it seems to be working.
Matti Hamalainen <ccr@tnsp.org>
parents:
445
diff
changeset
|
2280 } |
0e27860ddcfe
Finish initial implementation of IFF ILBM loader. And whoa .. it seems to be working.
Matti Hamalainen <ccr@tnsp.org>
parents:
445
diff
changeset
|
2281 |
1903 | 2282 // Read mask data |
2283 if (iff->bmhd.masking == IFF_MASK_HAS_MASK) | |
2284 { | |
2285 // Decompress or read data | |
2286 if (!dmIFFReadOneRow(fp, iff, buf, bufLen)) | |
2287 { | |
2288 res = dmError(DMERR_FREAD, | |
2069 | 2289 "IFF: Error in reading ILBM mask plane.\n"); |
1903 | 2290 goto out; |
2291 } | |
447
0e27860ddcfe
Finish initial implementation of IFF ILBM loader. And whoa .. it seems to be working.
Matti Hamalainen <ccr@tnsp.org>
parents:
445
diff
changeset
|
2292 |
1903 | 2293 // Decode mask |
2294 for (int xc = 0; xc < img->width; xc++) | |
2295 { | |
2296 const Uint8 data = dmDecodeBit(buf, xc); | |
2297 | |
2298 // Black out any pixels with mask bit 0 | |
2299 if (!data) | |
2094
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
2300 dp[xc] = img->pal->ctransp < 0 ? 0 : img->pal->ctransp; |
1903 | 2301 } |
2302 } | |
2303 } | |
2304 else | |
2053
6dfbe976d740
Implement basic initial support for IFF ACBM format images.
Matti Hamalainen <ccr@tnsp.org>
parents:
2050
diff
changeset
|
2305 if (iff->idsig == IFF_ID_PBM) |
447
0e27860ddcfe
Finish initial implementation of IFF ILBM loader. And whoa .. it seems to be working.
Matti Hamalainen <ccr@tnsp.org>
parents:
445
diff
changeset
|
2306 { |
1903 | 2307 if (!dmIFFReadOneRow(fp, iff, dp, img->width)) |
447
0e27860ddcfe
Finish initial implementation of IFF ILBM loader. And whoa .. it seems to be working.
Matti Hamalainen <ccr@tnsp.org>
parents:
445
diff
changeset
|
2308 { |
958
985225a93aeb
Add error code parameter to dmError() and dmErrorVA().
Matti Hamalainen <ccr@tnsp.org>
parents:
930
diff
changeset
|
2309 res = dmError(DMERR_FREAD, |
1903 | 2310 "IFF: Error reading PBM image row #%d.\n", yc); |
2311 goto out; | |
447
0e27860ddcfe
Finish initial implementation of IFF ILBM loader. And whoa .. it seems to be working.
Matti Hamalainen <ccr@tnsp.org>
parents:
445
diff
changeset
|
2312 } |
0e27860ddcfe
Finish initial implementation of IFF ILBM loader. And whoa .. it seems to be working.
Matti Hamalainen <ccr@tnsp.org>
parents:
445
diff
changeset
|
2313 } |
0e27860ddcfe
Finish initial implementation of IFF ILBM loader. And whoa .. it seems to be working.
Matti Hamalainen <ccr@tnsp.org>
parents:
445
diff
changeset
|
2314 } |
0e27860ddcfe
Finish initial implementation of IFF ILBM loader. And whoa .. it seems to be working.
Matti Hamalainen <ccr@tnsp.org>
parents:
445
diff
changeset
|
2315 |
1903 | 2316 out: |
447
0e27860ddcfe
Finish initial implementation of IFF ILBM loader. And whoa .. it seems to be working.
Matti Hamalainen <ccr@tnsp.org>
parents:
445
diff
changeset
|
2317 dmFree(buf); |
0e27860ddcfe
Finish initial implementation of IFF ILBM loader. And whoa .. it seems to be working.
Matti Hamalainen <ccr@tnsp.org>
parents:
445
diff
changeset
|
2318 return res; |
444
7d588807f91d
Clean up the IFF parser a bit.
Matti Hamalainen <ccr@tnsp.org>
parents:
443
diff
changeset
|
2319 } |
7d588807f91d
Clean up the IFF parser a bit.
Matti Hamalainen <ccr@tnsp.org>
parents:
443
diff
changeset
|
2320 |
7d588807f91d
Clean up the IFF parser a bit.
Matti Hamalainen <ccr@tnsp.org>
parents:
443
diff
changeset
|
2321 |
1892
cbc911ffd21e
Rename ILBM functions to IFF, which is more approriate as we support both ILBM and PBM variants of the IFF images.
Matti Hamalainen <ccr@tnsp.org>
parents:
1887
diff
changeset
|
2322 int dmReadIFFImage(DMResource *fp, DMImage **pimg) |
443
f7c9d1619c74
Beginnings of IFF ILBM reader. Not functional, only chunk parsing,
Matti Hamalainen <ccr@tnsp.org>
parents:
442
diff
changeset
|
2323 { |
444
7d588807f91d
Clean up the IFF parser a bit.
Matti Hamalainen <ccr@tnsp.org>
parents:
443
diff
changeset
|
2324 DMIFFChunk chunk; |
7d588807f91d
Clean up the IFF parser a bit.
Matti Hamalainen <ccr@tnsp.org>
parents:
443
diff
changeset
|
2325 DMIFF iff; |
1903 | 2326 BOOL parsed = FALSE; |
1627 | 2327 int res = DMERR_OK; |
443
f7c9d1619c74
Beginnings of IFF ILBM reader. Not functional, only chunk parsing,
Matti Hamalainen <ccr@tnsp.org>
parents:
442
diff
changeset
|
2328 |
2414
69a5af2eb1ea
Remove useless dmMemset().
Matti Hamalainen <ccr@tnsp.org>
parents:
2393
diff
changeset
|
2329 memset(&iff, 0, sizeof(iff)); |
443
f7c9d1619c74
Beginnings of IFF ILBM reader. Not functional, only chunk parsing,
Matti Hamalainen <ccr@tnsp.org>
parents:
442
diff
changeset
|
2330 |
f7c9d1619c74
Beginnings of IFF ILBM reader. Not functional, only chunk parsing,
Matti Hamalainen <ccr@tnsp.org>
parents:
442
diff
changeset
|
2331 // Read IFF FORM header |
1654
92656ad7f706
Improve IFF reader error handling.
Matti Hamalainen <ccr@tnsp.org>
parents:
1641
diff
changeset
|
2332 if ((res = dmReadIFFChunkHdr(fp, &chunk)) != DMERR_OK) |
92656ad7f706
Improve IFF reader error handling.
Matti Hamalainen <ccr@tnsp.org>
parents:
1641
diff
changeset
|
2333 return res; |
92656ad7f706
Improve IFF reader error handling.
Matti Hamalainen <ccr@tnsp.org>
parents:
1641
diff
changeset
|
2334 |
92656ad7f706
Improve IFF reader error handling.
Matti Hamalainen <ccr@tnsp.org>
parents:
1641
diff
changeset
|
2335 if (chunk.id != IFF_ID_FORM || chunk.size < 32) |
443
f7c9d1619c74
Beginnings of IFF ILBM reader. Not functional, only chunk parsing,
Matti Hamalainen <ccr@tnsp.org>
parents:
442
diff
changeset
|
2336 { |
958
985225a93aeb
Add error code parameter to dmError() and dmErrorVA().
Matti Hamalainen <ccr@tnsp.org>
parents:
930
diff
changeset
|
2337 return dmError(DMERR_NOT_SUPPORTED, |
1892
cbc911ffd21e
Rename ILBM functions to IFF, which is more approriate as we support both ILBM and PBM variants of the IFF images.
Matti Hamalainen <ccr@tnsp.org>
parents:
1887
diff
changeset
|
2338 "IFF: Not a IFF file (%08X vs %08X / %d).\n", |
1265
4e074b9b4789
Improve IFF FORM validity error message.
Matti Hamalainen <ccr@tnsp.org>
parents:
1264
diff
changeset
|
2339 chunk.id, IFF_ID_FORM, chunk.size); |
443
f7c9d1619c74
Beginnings of IFF ILBM reader. Not functional, only chunk parsing,
Matti Hamalainen <ccr@tnsp.org>
parents:
442
diff
changeset
|
2340 } |
1102
e06abfde6c39
Cosmetics pass: Remove excess whitespace.
Matti Hamalainen <ccr@tnsp.org>
parents:
958
diff
changeset
|
2341 |
1892
cbc911ffd21e
Rename ILBM functions to IFF, which is more approriate as we support both ILBM and PBM variants of the IFF images.
Matti Hamalainen <ccr@tnsp.org>
parents:
1887
diff
changeset
|
2342 // Check IFF ILBM/PBM signature |
2053
6dfbe976d740
Implement basic initial support for IFF ACBM format images.
Matti Hamalainen <ccr@tnsp.org>
parents:
2050
diff
changeset
|
2343 if (!dmf_read_be32(fp, &iff.idsig) || |
6dfbe976d740
Implement basic initial support for IFF ACBM format images.
Matti Hamalainen <ccr@tnsp.org>
parents:
2050
diff
changeset
|
2344 (iff.idsig != IFF_ID_ILBM && |
6dfbe976d740
Implement basic initial support for IFF ACBM format images.
Matti Hamalainen <ccr@tnsp.org>
parents:
2050
diff
changeset
|
2345 iff.idsig != IFF_ID_PBM && |
6dfbe976d740
Implement basic initial support for IFF ACBM format images.
Matti Hamalainen <ccr@tnsp.org>
parents:
2050
diff
changeset
|
2346 iff.idsig != IFF_ID_ACBM)) |
443
f7c9d1619c74
Beginnings of IFF ILBM reader. Not functional, only chunk parsing,
Matti Hamalainen <ccr@tnsp.org>
parents:
442
diff
changeset
|
2347 { |
958
985225a93aeb
Add error code parameter to dmError() and dmErrorVA().
Matti Hamalainen <ccr@tnsp.org>
parents:
930
diff
changeset
|
2348 return dmError(DMERR_INVALID_DATA, |
2053
6dfbe976d740
Implement basic initial support for IFF ACBM format images.
Matti Hamalainen <ccr@tnsp.org>
parents:
2050
diff
changeset
|
2349 "IFF: Not a IFF ILBM/PBM/ACBM file.\n"); |
443
f7c9d1619c74
Beginnings of IFF ILBM reader. Not functional, only chunk parsing,
Matti Hamalainen <ccr@tnsp.org>
parents:
442
diff
changeset
|
2350 } |
f7c9d1619c74
Beginnings of IFF ILBM reader. Not functional, only chunk parsing,
Matti Hamalainen <ccr@tnsp.org>
parents:
442
diff
changeset
|
2351 |
2023
362fb8295f0c
Be more informative about the actual sub-format of the IFF image (PBM/ILBM).
Matti Hamalainen <ccr@tnsp.org>
parents:
2022
diff
changeset
|
2352 dmMsg(3, "IFF: FORM is %s format image, with size %d bytes.\n", |
2064
3617ef01c1de
Separate ILBM and PBM subformats of IFF images.
Matti Hamalainen <ccr@tnsp.org>
parents:
2063
diff
changeset
|
2353 iff.idsig == IFF_ID_ILBM ? "ILBM" : |
3617ef01c1de
Separate ILBM and PBM subformats of IFF images.
Matti Hamalainen <ccr@tnsp.org>
parents:
2063
diff
changeset
|
2354 (iff.idsig == IFF_ID_PBM ? "PBM" : "ACBM"), |
2053
6dfbe976d740
Implement basic initial support for IFF ACBM format images.
Matti Hamalainen <ccr@tnsp.org>
parents:
2050
diff
changeset
|
2355 chunk.size); |
1907
571109a14967
Add some more informative messages in IFF loader.
Matti Hamalainen <ccr@tnsp.org>
parents:
1906
diff
changeset
|
2356 |
1609
c29adf5ce240
Convert libgfx file format routines to use DMResource instead of stdio FILE.
Matti Hamalainen <ccr@tnsp.org>
parents:
1583
diff
changeset
|
2357 while (!parsed && !dmfeof(fp)) |
443
f7c9d1619c74
Beginnings of IFF ILBM reader. Not functional, only chunk parsing,
Matti Hamalainen <ccr@tnsp.org>
parents:
442
diff
changeset
|
2358 { |
1895
eb03869a10d3
Clean up the IFF reader and make it more robust.
Matti Hamalainen <ccr@tnsp.org>
parents:
1894
diff
changeset
|
2359 // Read chunk header |
1654
92656ad7f706
Improve IFF reader error handling.
Matti Hamalainen <ccr@tnsp.org>
parents:
1641
diff
changeset
|
2360 if ((res = dmReadIFFChunkHdr(fp, &chunk)) != DMERR_OK) |
92656ad7f706
Improve IFF reader error handling.
Matti Hamalainen <ccr@tnsp.org>
parents:
1641
diff
changeset
|
2361 return res; |
1102
e06abfde6c39
Cosmetics pass: Remove excess whitespace.
Matti Hamalainen <ccr@tnsp.org>
parents:
958
diff
changeset
|
2362 |
443
f7c9d1619c74
Beginnings of IFF ILBM reader. Not functional, only chunk parsing,
Matti Hamalainen <ccr@tnsp.org>
parents:
442
diff
changeset
|
2363 switch (chunk.id) |
f7c9d1619c74
Beginnings of IFF ILBM reader. Not functional, only chunk parsing,
Matti Hamalainen <ccr@tnsp.org>
parents:
442
diff
changeset
|
2364 { |
f7c9d1619c74
Beginnings of IFF ILBM reader. Not functional, only chunk parsing,
Matti Hamalainen <ccr@tnsp.org>
parents:
442
diff
changeset
|
2365 case IFF_ID_BMHD: |
447
0e27860ddcfe
Finish initial implementation of IFF ILBM loader. And whoa .. it seems to be working.
Matti Hamalainen <ccr@tnsp.org>
parents:
445
diff
changeset
|
2366 // Check for multiple occurences of BMHD |
958
985225a93aeb
Add error code parameter to dmError() and dmErrorVA().
Matti Hamalainen <ccr@tnsp.org>
parents:
930
diff
changeset
|
2367 if ((res = dmCheckIFFChunk(&iff.chBMHD, &chunk, FALSE, sizeof(iff.bmhd))) != DMERR_OK) |
985225a93aeb
Add error code parameter to dmError() and dmErrorVA().
Matti Hamalainen <ccr@tnsp.org>
parents:
930
diff
changeset
|
2368 return res; |
443
f7c9d1619c74
Beginnings of IFF ILBM reader. Not functional, only chunk parsing,
Matti Hamalainen <ccr@tnsp.org>
parents:
442
diff
changeset
|
2369 |
447
0e27860ddcfe
Finish initial implementation of IFF ILBM loader. And whoa .. it seems to be working.
Matti Hamalainen <ccr@tnsp.org>
parents:
445
diff
changeset
|
2370 // Read BMHD data |
1609
c29adf5ce240
Convert libgfx file format routines to use DMResource instead of stdio FILE.
Matti Hamalainen <ccr@tnsp.org>
parents:
1583
diff
changeset
|
2371 if (!dmf_read_be16(fp, &iff.bmhd.w) || |
c29adf5ce240
Convert libgfx file format routines to use DMResource instead of stdio FILE.
Matti Hamalainen <ccr@tnsp.org>
parents:
1583
diff
changeset
|
2372 !dmf_read_be16(fp, &iff.bmhd.h) || |
c29adf5ce240
Convert libgfx file format routines to use DMResource instead of stdio FILE.
Matti Hamalainen <ccr@tnsp.org>
parents:
1583
diff
changeset
|
2373 !dmf_read_be16(fp, (Uint16 *) &iff.bmhd.x) || |
c29adf5ce240
Convert libgfx file format routines to use DMResource instead of stdio FILE.
Matti Hamalainen <ccr@tnsp.org>
parents:
1583
diff
changeset
|
2374 !dmf_read_be16(fp, (Uint16 *) &iff.bmhd.y) || |
c29adf5ce240
Convert libgfx file format routines to use DMResource instead of stdio FILE.
Matti Hamalainen <ccr@tnsp.org>
parents:
1583
diff
changeset
|
2375 !dmf_read_byte(fp, &iff.bmhd.nplanes) || |
c29adf5ce240
Convert libgfx file format routines to use DMResource instead of stdio FILE.
Matti Hamalainen <ccr@tnsp.org>
parents:
1583
diff
changeset
|
2376 !dmf_read_byte(fp, &iff.bmhd.masking) || |
c29adf5ce240
Convert libgfx file format routines to use DMResource instead of stdio FILE.
Matti Hamalainen <ccr@tnsp.org>
parents:
1583
diff
changeset
|
2377 !dmf_read_byte(fp, &iff.bmhd.compression) || |
c29adf5ce240
Convert libgfx file format routines to use DMResource instead of stdio FILE.
Matti Hamalainen <ccr@tnsp.org>
parents:
1583
diff
changeset
|
2378 !dmf_read_byte(fp, &iff.bmhd.pad1) || |
c29adf5ce240
Convert libgfx file format routines to use DMResource instead of stdio FILE.
Matti Hamalainen <ccr@tnsp.org>
parents:
1583
diff
changeset
|
2379 !dmf_read_be16(fp, &iff.bmhd.transp) || |
c29adf5ce240
Convert libgfx file format routines to use DMResource instead of stdio FILE.
Matti Hamalainen <ccr@tnsp.org>
parents:
1583
diff
changeset
|
2380 !dmf_read_byte(fp, &iff.bmhd.xasp) || |
c29adf5ce240
Convert libgfx file format routines to use DMResource instead of stdio FILE.
Matti Hamalainen <ccr@tnsp.org>
parents:
1583
diff
changeset
|
2381 !dmf_read_byte(fp, &iff.bmhd.yasp) || |
c29adf5ce240
Convert libgfx file format routines to use DMResource instead of stdio FILE.
Matti Hamalainen <ccr@tnsp.org>
parents:
1583
diff
changeset
|
2382 !dmf_read_be16(fp, (Uint16 *) &iff.bmhd.pagew) || |
c29adf5ce240
Convert libgfx file format routines to use DMResource instead of stdio FILE.
Matti Hamalainen <ccr@tnsp.org>
parents:
1583
diff
changeset
|
2383 !dmf_read_be16(fp, (Uint16 *) &iff.bmhd.pageh)) |
443
f7c9d1619c74
Beginnings of IFF ILBM reader. Not functional, only chunk parsing,
Matti Hamalainen <ccr@tnsp.org>
parents:
442
diff
changeset
|
2384 { |
958
985225a93aeb
Add error code parameter to dmError() and dmErrorVA().
Matti Hamalainen <ccr@tnsp.org>
parents:
930
diff
changeset
|
2385 return dmError(DMERR_FREAD, |
1892
cbc911ffd21e
Rename ILBM functions to IFF, which is more approriate as we support both ILBM and PBM variants of the IFF images.
Matti Hamalainen <ccr@tnsp.org>
parents:
1887
diff
changeset
|
2386 "IFF: Error reading BMHD chunk.\n"); |
443
f7c9d1619c74
Beginnings of IFF ILBM reader. Not functional, only chunk parsing,
Matti Hamalainen <ccr@tnsp.org>
parents:
442
diff
changeset
|
2387 } |
958
985225a93aeb
Add error code parameter to dmError() and dmErrorVA().
Matti Hamalainen <ccr@tnsp.org>
parents:
930
diff
changeset
|
2388 |
1892
cbc911ffd21e
Rename ILBM functions to IFF, which is more approriate as we support both ILBM and PBM variants of the IFF images.
Matti Hamalainen <ccr@tnsp.org>
parents:
1887
diff
changeset
|
2389 dmMsg(1, "IFF: BMHD %d x %d @ %d, %d : nplanes=%d, comp=%d, mask=%d, transp=%d\n", |
447
0e27860ddcfe
Finish initial implementation of IFF ILBM loader. And whoa .. it seems to be working.
Matti Hamalainen <ccr@tnsp.org>
parents:
445
diff
changeset
|
2390 iff.bmhd.w, iff.bmhd.h, iff.bmhd.x, iff.bmhd.y, |
1655 | 2391 iff.bmhd.nplanes, iff.bmhd.compression, iff.bmhd.masking, |
2392 iff.bmhd.transp); | |
1102
e06abfde6c39
Cosmetics pass: Remove excess whitespace.
Matti Hamalainen <ccr@tnsp.org>
parents:
958
diff
changeset
|
2393 |
447
0e27860ddcfe
Finish initial implementation of IFF ILBM loader. And whoa .. it seems to be working.
Matti Hamalainen <ccr@tnsp.org>
parents:
445
diff
changeset
|
2394 // Sanity check |
0e27860ddcfe
Finish initial implementation of IFF ILBM loader. And whoa .. it seems to be working.
Matti Hamalainen <ccr@tnsp.org>
parents:
445
diff
changeset
|
2395 if (iff.bmhd.nplanes < 1 || iff.bmhd.nplanes > 8 || |
0e27860ddcfe
Finish initial implementation of IFF ILBM loader. And whoa .. it seems to be working.
Matti Hamalainen <ccr@tnsp.org>
parents:
445
diff
changeset
|
2396 (iff.bmhd.compression != IFF_COMP_NONE && |
0e27860ddcfe
Finish initial implementation of IFF ILBM loader. And whoa .. it seems to be working.
Matti Hamalainen <ccr@tnsp.org>
parents:
445
diff
changeset
|
2397 iff.bmhd.compression != IFF_COMP_BYTERUN1) || |
0e27860ddcfe
Finish initial implementation of IFF ILBM loader. And whoa .. it seems to be working.
Matti Hamalainen <ccr@tnsp.org>
parents:
445
diff
changeset
|
2398 (iff.bmhd.masking != IFF_MASK_NONE && |
448
f1aab48a76fe
Add transp mask support to IFF ILBM loader.
Matti Hamalainen <ccr@tnsp.org>
parents:
447
diff
changeset
|
2399 iff.bmhd.masking != IFF_MASK_HAS_MASK && |
f1aab48a76fe
Add transp mask support to IFF ILBM loader.
Matti Hamalainen <ccr@tnsp.org>
parents:
447
diff
changeset
|
2400 iff.bmhd.masking != IFF_MASK_TRANSP)) |
447
0e27860ddcfe
Finish initial implementation of IFF ILBM loader. And whoa .. it seems to be working.
Matti Hamalainen <ccr@tnsp.org>
parents:
445
diff
changeset
|
2401 { |
958
985225a93aeb
Add error code parameter to dmError() and dmErrorVA().
Matti Hamalainen <ccr@tnsp.org>
parents:
930
diff
changeset
|
2402 return dmError(DMERR_NOT_SUPPORTED, |
1892
cbc911ffd21e
Rename ILBM functions to IFF, which is more approriate as we support both ILBM and PBM variants of the IFF images.
Matti Hamalainen <ccr@tnsp.org>
parents:
1887
diff
changeset
|
2403 "IFF: Unsupported features, refusing to load.\n"); |
447
0e27860ddcfe
Finish initial implementation of IFF ILBM loader. And whoa .. it seems to be working.
Matti Hamalainen <ccr@tnsp.org>
parents:
445
diff
changeset
|
2404 } |
2069 | 2405 |
2406 if (iff.idsig == IFF_ID_ACBM && | |
2407 iff.bmhd.compression != IFF_COMP_NONE) | |
2408 { | |
2409 dmMsg(1, "IFF: ACBM image with compression != none (%d). Ignoring.\n", | |
2410 iff.bmhd.compression); | |
2411 | |
2412 iff.bmhd.compression = IFF_COMP_NONE; | |
2413 } | |
443
f7c9d1619c74
Beginnings of IFF ILBM reader. Not functional, only chunk parsing,
Matti Hamalainen <ccr@tnsp.org>
parents:
442
diff
changeset
|
2414 break; |
444
7d588807f91d
Clean up the IFF parser a bit.
Matti Hamalainen <ccr@tnsp.org>
parents:
443
diff
changeset
|
2415 |
443
f7c9d1619c74
Beginnings of IFF ILBM reader. Not functional, only chunk parsing,
Matti Hamalainen <ccr@tnsp.org>
parents:
442
diff
changeset
|
2416 |
f7c9d1619c74
Beginnings of IFF ILBM reader. Not functional, only chunk parsing,
Matti Hamalainen <ccr@tnsp.org>
parents:
442
diff
changeset
|
2417 case IFF_ID_CMAP: |
f7c9d1619c74
Beginnings of IFF ILBM reader. Not functional, only chunk parsing,
Matti Hamalainen <ccr@tnsp.org>
parents:
442
diff
changeset
|
2418 // Check for multiple occurences of CMAP |
958
985225a93aeb
Add error code parameter to dmError() and dmErrorVA().
Matti Hamalainen <ccr@tnsp.org>
parents:
930
diff
changeset
|
2419 if ((res = dmCheckIFFChunk(&iff.chCMAP, &chunk, FALSE, 3)) != DMERR_OK) |
985225a93aeb
Add error code parameter to dmError() and dmErrorVA().
Matti Hamalainen <ccr@tnsp.org>
parents:
930
diff
changeset
|
2420 return res; |
443
f7c9d1619c74
Beginnings of IFF ILBM reader. Not functional, only chunk parsing,
Matti Hamalainen <ccr@tnsp.org>
parents:
442
diff
changeset
|
2421 |
f7c9d1619c74
Beginnings of IFF ILBM reader. Not functional, only chunk parsing,
Matti Hamalainen <ccr@tnsp.org>
parents:
442
diff
changeset
|
2422 // Check for sanity |
f7c9d1619c74
Beginnings of IFF ILBM reader. Not functional, only chunk parsing,
Matti Hamalainen <ccr@tnsp.org>
parents:
442
diff
changeset
|
2423 if (chunk.size % 3 != 0) |
958
985225a93aeb
Add error code parameter to dmError() and dmErrorVA().
Matti Hamalainen <ccr@tnsp.org>
parents:
930
diff
changeset
|
2424 { |
985225a93aeb
Add error code parameter to dmError() and dmErrorVA().
Matti Hamalainen <ccr@tnsp.org>
parents:
930
diff
changeset
|
2425 // Non-fatal |
985225a93aeb
Add error code parameter to dmError() and dmErrorVA().
Matti Hamalainen <ccr@tnsp.org>
parents:
930
diff
changeset
|
2426 dmError(DMERR_INVALID_DATA, |
1892
cbc911ffd21e
Rename ILBM functions to IFF, which is more approriate as we support both ILBM and PBM variants of the IFF images.
Matti Hamalainen <ccr@tnsp.org>
parents:
1887
diff
changeset
|
2427 "IFF: CMAP chunk size not divisible by 3, possibly broken file.\n"); |
958
985225a93aeb
Add error code parameter to dmError() and dmErrorVA().
Matti Hamalainen <ccr@tnsp.org>
parents:
930
diff
changeset
|
2428 } |
443
f7c9d1619c74
Beginnings of IFF ILBM reader. Not functional, only chunk parsing,
Matti Hamalainen <ccr@tnsp.org>
parents:
442
diff
changeset
|
2429 |
444
7d588807f91d
Clean up the IFF parser a bit.
Matti Hamalainen <ccr@tnsp.org>
parents:
443
diff
changeset
|
2430 iff.ncolors = chunk.size / 3; |
1892
cbc911ffd21e
Rename ILBM functions to IFF, which is more approriate as we support both ILBM and PBM variants of the IFF images.
Matti Hamalainen <ccr@tnsp.org>
parents:
1887
diff
changeset
|
2431 dmMsg(2, "IFF: CMAP %d entries (%d bytes)\n", |
1624
9a8395b56d1a
Remove unused message argument.
Matti Hamalainen <ccr@tnsp.org>
parents:
1623
diff
changeset
|
2432 iff.ncolors, chunk.size); |
443
f7c9d1619c74
Beginnings of IFF ILBM reader. Not functional, only chunk parsing,
Matti Hamalainen <ccr@tnsp.org>
parents:
442
diff
changeset
|
2433 |
444
7d588807f91d
Clean up the IFF parser a bit.
Matti Hamalainen <ccr@tnsp.org>
parents:
443
diff
changeset
|
2434 if (iff.bmhd.nplanes > 0 && iff.ncolors != 1 << iff.bmhd.nplanes) |
1892
cbc911ffd21e
Rename ILBM functions to IFF, which is more approriate as we support both ILBM and PBM variants of the IFF images.
Matti Hamalainen <ccr@tnsp.org>
parents:
1887
diff
changeset
|
2435 dmMsg(2, "IFF: Expected %d entries in CMAP.\n", 1 << iff.bmhd.nplanes); |
1102
e06abfde6c39
Cosmetics pass: Remove excess whitespace.
Matti Hamalainen <ccr@tnsp.org>
parents:
958
diff
changeset
|
2436 |
451
fdc91f2a0d27
Modularize palette reading and handling code.
Matti Hamalainen <ccr@tnsp.org>
parents:
449
diff
changeset
|
2437 // Read palette |
fdc91f2a0d27
Modularize palette reading and handling code.
Matti Hamalainen <ccr@tnsp.org>
parents:
449
diff
changeset
|
2438 if (iff.ncolors > 0) |
443
f7c9d1619c74
Beginnings of IFF ILBM reader. Not functional, only chunk parsing,
Matti Hamalainen <ccr@tnsp.org>
parents:
442
diff
changeset
|
2439 { |
2094
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
2440 if ((res = dmPaletteAlloc(&iff.pal, iff.ncolors, |
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
2441 (iff.bmhd.masking == IFF_MASK_TRANSP) ? iff.bmhd.transp : -1)) != DMERR_OK) |
443
f7c9d1619c74
Beginnings of IFF ILBM reader. Not functional, only chunk parsing,
Matti Hamalainen <ccr@tnsp.org>
parents:
442
diff
changeset
|
2442 { |
2094
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
2443 dmErrorMsg("IFF: Could not allocate palette data.\n"); |
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
2444 return res; |
451
fdc91f2a0d27
Modularize palette reading and handling code.
Matti Hamalainen <ccr@tnsp.org>
parents:
449
diff
changeset
|
2445 } |
2094
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
2446 if ((res = dmPaletteReadData(fp, iff.pal, iff.ncolors)) != DMERR_OK) |
451
fdc91f2a0d27
Modularize palette reading and handling code.
Matti Hamalainen <ccr@tnsp.org>
parents:
449
diff
changeset
|
2447 { |
2094
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
2448 dmErrorMsg("IFF: Error reading CMAP.\n"); |
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
2449 return res; |
443
f7c9d1619c74
Beginnings of IFF ILBM reader. Not functional, only chunk parsing,
Matti Hamalainen <ccr@tnsp.org>
parents:
442
diff
changeset
|
2450 } |
f7c9d1619c74
Beginnings of IFF ILBM reader. Not functional, only chunk parsing,
Matti Hamalainen <ccr@tnsp.org>
parents:
442
diff
changeset
|
2451 } |
f7c9d1619c74
Beginnings of IFF ILBM reader. Not functional, only chunk parsing,
Matti Hamalainen <ccr@tnsp.org>
parents:
442
diff
changeset
|
2452 |
444
7d588807f91d
Clean up the IFF parser a bit.
Matti Hamalainen <ccr@tnsp.org>
parents:
443
diff
changeset
|
2453 if (iff.chBMHD.count && iff.chBODY.count) |
443
f7c9d1619c74
Beginnings of IFF ILBM reader. Not functional, only chunk parsing,
Matti Hamalainen <ccr@tnsp.org>
parents:
442
diff
changeset
|
2454 parsed = TRUE; |
f7c9d1619c74
Beginnings of IFF ILBM reader. Not functional, only chunk parsing,
Matti Hamalainen <ccr@tnsp.org>
parents:
442
diff
changeset
|
2455 break; |
1102
e06abfde6c39
Cosmetics pass: Remove excess whitespace.
Matti Hamalainen <ccr@tnsp.org>
parents:
958
diff
changeset
|
2456 |
443
f7c9d1619c74
Beginnings of IFF ILBM reader. Not functional, only chunk parsing,
Matti Hamalainen <ccr@tnsp.org>
parents:
442
diff
changeset
|
2457 case IFF_ID_BODY: |
2053
6dfbe976d740
Implement basic initial support for IFF ACBM format images.
Matti Hamalainen <ccr@tnsp.org>
parents:
2050
diff
changeset
|
2458 case IFF_ID_ABIT: |
1621 | 2459 // Check for multiple occurences of BODY |
958
985225a93aeb
Add error code parameter to dmError() and dmErrorVA().
Matti Hamalainen <ccr@tnsp.org>
parents:
930
diff
changeset
|
2460 if ((res = dmCheckIFFChunk(&iff.chBODY, &chunk, FALSE, 1)) != DMERR_OK) |
985225a93aeb
Add error code parameter to dmError() and dmErrorVA().
Matti Hamalainen <ccr@tnsp.org>
parents:
930
diff
changeset
|
2461 return res; |
443
f7c9d1619c74
Beginnings of IFF ILBM reader. Not functional, only chunk parsing,
Matti Hamalainen <ccr@tnsp.org>
parents:
442
diff
changeset
|
2462 |
447
0e27860ddcfe
Finish initial implementation of IFF ILBM loader. And whoa .. it seems to be working.
Matti Hamalainen <ccr@tnsp.org>
parents:
445
diff
changeset
|
2463 // Check for sanity |
444
7d588807f91d
Clean up the IFF parser a bit.
Matti Hamalainen <ccr@tnsp.org>
parents:
443
diff
changeset
|
2464 if (!iff.chBMHD.count) |
443
f7c9d1619c74
Beginnings of IFF ILBM reader. Not functional, only chunk parsing,
Matti Hamalainen <ccr@tnsp.org>
parents:
442
diff
changeset
|
2465 { |
958
985225a93aeb
Add error code parameter to dmError() and dmErrorVA().
Matti Hamalainen <ccr@tnsp.org>
parents:
930
diff
changeset
|
2466 return dmError(DMERR_INVALID_DATA, |
2053
6dfbe976d740
Implement basic initial support for IFF ACBM format images.
Matti Hamalainen <ccr@tnsp.org>
parents:
2050
diff
changeset
|
2467 "IFF: %s chunk before BMHD?\n", chunk.idStr); |
443
f7c9d1619c74
Beginnings of IFF ILBM reader. Not functional, only chunk parsing,
Matti Hamalainen <ccr@tnsp.org>
parents:
442
diff
changeset
|
2468 } |
f7c9d1619c74
Beginnings of IFF ILBM reader. Not functional, only chunk parsing,
Matti Hamalainen <ccr@tnsp.org>
parents:
442
diff
changeset
|
2469 |
2053
6dfbe976d740
Implement basic initial support for IFF ACBM format images.
Matti Hamalainen <ccr@tnsp.org>
parents:
2050
diff
changeset
|
2470 dmMsg(2, "IFF: %s chunk size %d bytes\n", chunk.idStr, chunk.size); |
1102
e06abfde6c39
Cosmetics pass: Remove excess whitespace.
Matti Hamalainen <ccr@tnsp.org>
parents:
958
diff
changeset
|
2471 |
2257
c7495fcaffa9
Check image dimensions when loading PPM/PNG/PCX/IFF images.
Matti Hamalainen <ccr@tnsp.org>
parents:
2220
diff
changeset
|
2472 // Check image dimensions |
c7495fcaffa9
Check image dimensions when loading PPM/PNG/PCX/IFF images.
Matti Hamalainen <ccr@tnsp.org>
parents:
2220
diff
changeset
|
2473 if (iff.bmhd.w == 0 || iff.bmhd.h == 0) |
c7495fcaffa9
Check image dimensions when loading PPM/PNG/PCX/IFF images.
Matti Hamalainen <ccr@tnsp.org>
parents:
2220
diff
changeset
|
2474 { |
c7495fcaffa9
Check image dimensions when loading PPM/PNG/PCX/IFF images.
Matti Hamalainen <ccr@tnsp.org>
parents:
2220
diff
changeset
|
2475 return dmError(DMERR_INVALID_DATA, |
c7495fcaffa9
Check image dimensions when loading PPM/PNG/PCX/IFF images.
Matti Hamalainen <ccr@tnsp.org>
parents:
2220
diff
changeset
|
2476 "IFF: Invalid image dimensions.\n"); |
c7495fcaffa9
Check image dimensions when loading PPM/PNG/PCX/IFF images.
Matti Hamalainen <ccr@tnsp.org>
parents:
2220
diff
changeset
|
2477 } |
c7495fcaffa9
Check image dimensions when loading PPM/PNG/PCX/IFF images.
Matti Hamalainen <ccr@tnsp.org>
parents:
2220
diff
changeset
|
2478 |
1626
1793fc1496da
Remove some code duplication.
Matti Hamalainen <ccr@tnsp.org>
parents:
1625
diff
changeset
|
2479 // Allocate image |
1793fc1496da
Remove some code duplication.
Matti Hamalainen <ccr@tnsp.org>
parents:
1625
diff
changeset
|
2480 if ((*pimg = dmImageAlloc(iff.bmhd.w, iff.bmhd.h, |
2157
9a9493809b3a
Rename DM_COLFMT_* constants to DM_PIXFMT_* and the 'format' field of DMImage
Matti Hamalainen <ccr@tnsp.org>
parents:
2156
diff
changeset
|
2481 iff.bmhd.nplanes <= 8 ? DM_PIXFMT_PALETTE : DM_PIXFMT_RGBA, |
1626
1793fc1496da
Remove some code duplication.
Matti Hamalainen <ccr@tnsp.org>
parents:
1625
diff
changeset
|
2482 // XXX TODO? When/if we ever handle < 8bit indexed correctly, we can use the actual bpp |
1793fc1496da
Remove some code duplication.
Matti Hamalainen <ccr@tnsp.org>
parents:
1625
diff
changeset
|
2483 //iff->bmhd.nplanes <= 8 ? iff->bmhd.nplanes : -1 |
1793fc1496da
Remove some code duplication.
Matti Hamalainen <ccr@tnsp.org>
parents:
1625
diff
changeset
|
2484 -1 |
1793fc1496da
Remove some code duplication.
Matti Hamalainen <ccr@tnsp.org>
parents:
1625
diff
changeset
|
2485 )) == NULL) |
1793fc1496da
Remove some code duplication.
Matti Hamalainen <ccr@tnsp.org>
parents:
1625
diff
changeset
|
2486 return DMERR_MALLOC; |
1793fc1496da
Remove some code duplication.
Matti Hamalainen <ccr@tnsp.org>
parents:
1625
diff
changeset
|
2487 |
1628
a549d33d543a
Add image aspect ratio information.
Matti Hamalainen <ccr@tnsp.org>
parents:
1627
diff
changeset
|
2488 // Set image aspect ratio |
a549d33d543a
Add image aspect ratio information.
Matti Hamalainen <ccr@tnsp.org>
parents:
1627
diff
changeset
|
2489 if (iff.bmhd.xasp > 0 && iff.bmhd.yasp > 0) |
a549d33d543a
Add image aspect ratio information.
Matti Hamalainen <ccr@tnsp.org>
parents:
1627
diff
changeset
|
2490 (*pimg)->aspect = (float) iff.bmhd.yasp / (float) iff.bmhd.xasp; |
1626
1793fc1496da
Remove some code duplication.
Matti Hamalainen <ccr@tnsp.org>
parents:
1625
diff
changeset
|
2491 |
447
0e27860ddcfe
Finish initial implementation of IFF ILBM loader. And whoa .. it seems to be working.
Matti Hamalainen <ccr@tnsp.org>
parents:
445
diff
changeset
|
2492 // Decode the body |
1903 | 2493 if ((res = dmDecodeIFFBody(fp, &iff, *pimg)) != DMERR_OK) |
2494 return res; | |
444
7d588807f91d
Clean up the IFF parser a bit.
Matti Hamalainen <ccr@tnsp.org>
parents:
443
diff
changeset
|
2495 |
1895
eb03869a10d3
Clean up the IFF reader and make it more robust.
Matti Hamalainen <ccr@tnsp.org>
parents:
1894
diff
changeset
|
2496 if ((res = dmSkipIFFChunkRest(fp, &chunk)) != DMERR_OK) |
958
985225a93aeb
Add error code parameter to dmError() and dmErrorVA().
Matti Hamalainen <ccr@tnsp.org>
parents:
930
diff
changeset
|
2497 return res; |
447
0e27860ddcfe
Finish initial implementation of IFF ILBM loader. And whoa .. it seems to be working.
Matti Hamalainen <ccr@tnsp.org>
parents:
445
diff
changeset
|
2498 |
444
7d588807f91d
Clean up the IFF parser a bit.
Matti Hamalainen <ccr@tnsp.org>
parents:
443
diff
changeset
|
2499 if (iff.chCMAP.count) |
443
f7c9d1619c74
Beginnings of IFF ILBM reader. Not functional, only chunk parsing,
Matti Hamalainen <ccr@tnsp.org>
parents:
442
diff
changeset
|
2500 parsed = TRUE; |
f7c9d1619c74
Beginnings of IFF ILBM reader. Not functional, only chunk parsing,
Matti Hamalainen <ccr@tnsp.org>
parents:
442
diff
changeset
|
2501 break; |
449
117f94b253af
Add support for CAMG chunk reading and possibly half-brite handling in IFF ILBM reader.
Matti Hamalainen <ccr@tnsp.org>
parents:
448
diff
changeset
|
2502 |
117f94b253af
Add support for CAMG chunk reading and possibly half-brite handling in IFF ILBM reader.
Matti Hamalainen <ccr@tnsp.org>
parents:
448
diff
changeset
|
2503 case IFF_ID_CAMG: |
1609
c29adf5ce240
Convert libgfx file format routines to use DMResource instead of stdio FILE.
Matti Hamalainen <ccr@tnsp.org>
parents:
1583
diff
changeset
|
2504 if (!dmf_read_be32(fp, &iff.camg)) |
449
117f94b253af
Add support for CAMG chunk reading and possibly half-brite handling in IFF ILBM reader.
Matti Hamalainen <ccr@tnsp.org>
parents:
448
diff
changeset
|
2505 { |
958
985225a93aeb
Add error code parameter to dmError() and dmErrorVA().
Matti Hamalainen <ccr@tnsp.org>
parents:
930
diff
changeset
|
2506 return dmError(DMERR_FREAD, |
1892
cbc911ffd21e
Rename ILBM functions to IFF, which is more approriate as we support both ILBM and PBM variants of the IFF images.
Matti Hamalainen <ccr@tnsp.org>
parents:
1887
diff
changeset
|
2507 "IFF: Error reading CAMG chunk.\n"); |
449
117f94b253af
Add support for CAMG chunk reading and possibly half-brite handling in IFF ILBM reader.
Matti Hamalainen <ccr@tnsp.org>
parents:
448
diff
changeset
|
2508 } |
1102
e06abfde6c39
Cosmetics pass: Remove excess whitespace.
Matti Hamalainen <ccr@tnsp.org>
parents:
958
diff
changeset
|
2509 |
1892
cbc911ffd21e
Rename ILBM functions to IFF, which is more approriate as we support both ILBM and PBM variants of the IFF images.
Matti Hamalainen <ccr@tnsp.org>
parents:
1887
diff
changeset
|
2510 dmMsg(2, "IFF: CAMG value 0x%08x\n", iff.camg); |
449
117f94b253af
Add support for CAMG chunk reading and possibly half-brite handling in IFF ILBM reader.
Matti Hamalainen <ccr@tnsp.org>
parents:
448
diff
changeset
|
2511 |
117f94b253af
Add support for CAMG chunk reading and possibly half-brite handling in IFF ILBM reader.
Matti Hamalainen <ccr@tnsp.org>
parents:
448
diff
changeset
|
2512 if ((iff.camg & IFF_CAMG_HAM)) |
117f94b253af
Add support for CAMG chunk reading and possibly half-brite handling in IFF ILBM reader.
Matti Hamalainen <ccr@tnsp.org>
parents:
448
diff
changeset
|
2513 { |
958
985225a93aeb
Add error code parameter to dmError() and dmErrorVA().
Matti Hamalainen <ccr@tnsp.org>
parents:
930
diff
changeset
|
2514 return dmError(DMERR_NOT_SUPPORTED, |
1892
cbc911ffd21e
Rename ILBM functions to IFF, which is more approriate as we support both ILBM and PBM variants of the IFF images.
Matti Hamalainen <ccr@tnsp.org>
parents:
1887
diff
changeset
|
2515 "IFF: HAM files are not supported.\n"); |
449
117f94b253af
Add support for CAMG chunk reading and possibly half-brite handling in IFF ILBM reader.
Matti Hamalainen <ccr@tnsp.org>
parents:
448
diff
changeset
|
2516 } |
117f94b253af
Add support for CAMG chunk reading and possibly half-brite handling in IFF ILBM reader.
Matti Hamalainen <ccr@tnsp.org>
parents:
448
diff
changeset
|
2517 break; |
117f94b253af
Add support for CAMG chunk reading and possibly half-brite handling in IFF ILBM reader.
Matti Hamalainen <ccr@tnsp.org>
parents:
448
diff
changeset
|
2518 |
958
985225a93aeb
Add error code parameter to dmError() and dmErrorVA().
Matti Hamalainen <ccr@tnsp.org>
parents:
930
diff
changeset
|
2519 |
443
f7c9d1619c74
Beginnings of IFF ILBM reader. Not functional, only chunk parsing,
Matti Hamalainen <ccr@tnsp.org>
parents:
442
diff
changeset
|
2520 default: |
1901
636d3c8bcd35
Fix uneven chunk size handling in IFF reader.
Matti Hamalainen <ccr@tnsp.org>
parents:
1900
diff
changeset
|
2521 dmMsg(3, "Unknown chunk ID '%s', size %d\n", |
636d3c8bcd35
Fix uneven chunk size handling in IFF reader.
Matti Hamalainen <ccr@tnsp.org>
parents:
1900
diff
changeset
|
2522 chunk.idStr, chunk.size); |
1102
e06abfde6c39
Cosmetics pass: Remove excess whitespace.
Matti Hamalainen <ccr@tnsp.org>
parents:
958
diff
changeset
|
2523 |
1901
636d3c8bcd35
Fix uneven chunk size handling in IFF reader.
Matti Hamalainen <ccr@tnsp.org>
parents:
1900
diff
changeset
|
2524 if (dmfseek(fp, chunk.size, SEEK_CUR) != 0) |
636d3c8bcd35
Fix uneven chunk size handling in IFF reader.
Matti Hamalainen <ccr@tnsp.org>
parents:
1900
diff
changeset
|
2525 { |
636d3c8bcd35
Fix uneven chunk size handling in IFF reader.
Matti Hamalainen <ccr@tnsp.org>
parents:
1900
diff
changeset
|
2526 return dmError(DMERR_FSEEK, |
636d3c8bcd35
Fix uneven chunk size handling in IFF reader.
Matti Hamalainen <ccr@tnsp.org>
parents:
1900
diff
changeset
|
2527 "IFF: Error skipping in file."); |
443
f7c9d1619c74
Beginnings of IFF ILBM reader. Not functional, only chunk parsing,
Matti Hamalainen <ccr@tnsp.org>
parents:
442
diff
changeset
|
2528 } |
f7c9d1619c74
Beginnings of IFF ILBM reader. Not functional, only chunk parsing,
Matti Hamalainen <ccr@tnsp.org>
parents:
442
diff
changeset
|
2529 break; |
f7c9d1619c74
Beginnings of IFF ILBM reader. Not functional, only chunk parsing,
Matti Hamalainen <ccr@tnsp.org>
parents:
442
diff
changeset
|
2530 } |
1102
e06abfde6c39
Cosmetics pass: Remove excess whitespace.
Matti Hamalainen <ccr@tnsp.org>
parents:
958
diff
changeset
|
2531 |
1895
eb03869a10d3
Clean up the IFF reader and make it more robust.
Matti Hamalainen <ccr@tnsp.org>
parents:
1894
diff
changeset
|
2532 if ((res = dmSkipIFFChunkRest(fp, &chunk)) != DMERR_OK) |
eb03869a10d3
Clean up the IFF reader and make it more robust.
Matti Hamalainen <ccr@tnsp.org>
parents:
1894
diff
changeset
|
2533 return res; |
443
f7c9d1619c74
Beginnings of IFF ILBM reader. Not functional, only chunk parsing,
Matti Hamalainen <ccr@tnsp.org>
parents:
442
diff
changeset
|
2534 } |
f7c9d1619c74
Beginnings of IFF ILBM reader. Not functional, only chunk parsing,
Matti Hamalainen <ccr@tnsp.org>
parents:
442
diff
changeset
|
2535 |
1948
5790b52c339e
Check that we have a CMAP/palette for IFF images that should have it.
Matti Hamalainen <ccr@tnsp.org>
parents:
1945
diff
changeset
|
2536 // Check if we should have a palette |
2157
9a9493809b3a
Rename DM_COLFMT_* constants to DM_PIXFMT_* and the 'format' field of DMImage
Matti Hamalainen <ccr@tnsp.org>
parents:
2156
diff
changeset
|
2537 if (*pimg != NULL && (*pimg)->pixfmt == DM_PIXFMT_PALETTE) |
447
0e27860ddcfe
Finish initial implementation of IFF ILBM loader. And whoa .. it seems to be working.
Matti Hamalainen <ccr@tnsp.org>
parents:
445
diff
changeset
|
2538 { |
1948
5790b52c339e
Check that we have a CMAP/palette for IFF images that should have it.
Matti Hamalainen <ccr@tnsp.org>
parents:
1945
diff
changeset
|
2539 // Check that we DO have a palette .. |
2094
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
2540 if (iff.pal == NULL || iff.pal->ncolors == 0) |
1948
5790b52c339e
Check that we have a CMAP/palette for IFF images that should have it.
Matti Hamalainen <ccr@tnsp.org>
parents:
1945
diff
changeset
|
2541 { |
5790b52c339e
Check that we have a CMAP/palette for IFF images that should have it.
Matti Hamalainen <ccr@tnsp.org>
parents:
1945
diff
changeset
|
2542 return dmError(DMERR_INVALID_DATA, |
5790b52c339e
Check that we have a CMAP/palette for IFF images that should have it.
Matti Hamalainen <ccr@tnsp.org>
parents:
1945
diff
changeset
|
2543 "IFF: A paletted/indexed color image with no CMAP. Bailing out.\n"); |
5790b52c339e
Check that we have a CMAP/palette for IFF images that should have it.
Matti Hamalainen <ccr@tnsp.org>
parents:
1945
diff
changeset
|
2544 } |
5790b52c339e
Check that we have a CMAP/palette for IFF images that should have it.
Matti Hamalainen <ccr@tnsp.org>
parents:
1945
diff
changeset
|
2545 |
449
117f94b253af
Add support for CAMG chunk reading and possibly half-brite handling in IFF ILBM reader.
Matti Hamalainen <ccr@tnsp.org>
parents:
448
diff
changeset
|
2546 // If halfbrite is used, duplicate the palette |
117f94b253af
Add support for CAMG chunk reading and possibly half-brite handling in IFF ILBM reader.
Matti Hamalainen <ccr@tnsp.org>
parents:
448
diff
changeset
|
2547 if (iff.camg & IFF_CAMG_HALFBRITE) |
117f94b253af
Add support for CAMG chunk reading and possibly half-brite handling in IFF ILBM reader.
Matti Hamalainen <ccr@tnsp.org>
parents:
448
diff
changeset
|
2548 { |
2094
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
2549 int ncolors = iff.ncolors; |
2053
6dfbe976d740
Implement basic initial support for IFF ACBM format images.
Matti Hamalainen <ccr@tnsp.org>
parents:
2050
diff
changeset
|
2550 if (iff.idsig != IFF_ID_ILBM) |
1625
c8afa3e6c413
Print an error/warning about PBM files that have half-brite set.
Matti Hamalainen <ccr@tnsp.org>
parents:
1624
diff
changeset
|
2551 { |
1892
cbc911ffd21e
Rename ILBM functions to IFF, which is more approriate as we support both ILBM and PBM variants of the IFF images.
Matti Hamalainen <ccr@tnsp.org>
parents:
1887
diff
changeset
|
2552 dmErrorMsg("IFF: Non-planar PBM file with Halfbrite enabled! This might not work.\n"); |
1625
c8afa3e6c413
Print an error/warning about PBM files that have half-brite set.
Matti Hamalainen <ccr@tnsp.org>
parents:
1624
diff
changeset
|
2553 } |
834 | 2554 |
449
117f94b253af
Add support for CAMG chunk reading and possibly half-brite handling in IFF ILBM reader.
Matti Hamalainen <ccr@tnsp.org>
parents:
448
diff
changeset
|
2555 if (iff.ncolors > 128) |
117f94b253af
Add support for CAMG chunk reading and possibly half-brite handling in IFF ILBM reader.
Matti Hamalainen <ccr@tnsp.org>
parents:
448
diff
changeset
|
2556 { |
958
985225a93aeb
Add error code parameter to dmError() and dmErrorVA().
Matti Hamalainen <ccr@tnsp.org>
parents:
930
diff
changeset
|
2557 return dmError(DMERR_NOT_SUPPORTED, |
1892
cbc911ffd21e
Rename ILBM functions to IFF, which is more approriate as we support both ILBM and PBM variants of the IFF images.
Matti Hamalainen <ccr@tnsp.org>
parents:
1887
diff
changeset
|
2558 "IFF: Halfbrite enabled, but ncolors > 128.\n"); |
449
117f94b253af
Add support for CAMG chunk reading and possibly half-brite handling in IFF ILBM reader.
Matti Hamalainen <ccr@tnsp.org>
parents:
448
diff
changeset
|
2559 } |
117f94b253af
Add support for CAMG chunk reading and possibly half-brite handling in IFF ILBM reader.
Matti Hamalainen <ccr@tnsp.org>
parents:
448
diff
changeset
|
2560 |
2094
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
2561 if ((res = dmPaletteResize(&iff.pal, ncolors * 2)) != DMERR_OK) |
834 | 2562 { |
2094
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
2563 dmPaletteFree(iff.pal); |
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
2564 return res; |
834 | 2565 } |
2094
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
2566 |
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
2567 for (int i = 0; i < ncolors; i++) |
449
117f94b253af
Add support for CAMG chunk reading and possibly half-brite handling in IFF ILBM reader.
Matti Hamalainen <ccr@tnsp.org>
parents:
448
diff
changeset
|
2568 { |
2094
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
2569 int i2 = ncolors + i; |
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
2570 iff.pal->colors[i2].r = iff.pal->colors[i].r / 2; |
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
2571 iff.pal->colors[i2].g = iff.pal->colors[i].g / 2; |
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
2572 iff.pal->colors[i2].b = iff.pal->colors[i].b / 2; |
449
117f94b253af
Add support for CAMG chunk reading and possibly half-brite handling in IFF ILBM reader.
Matti Hamalainen <ccr@tnsp.org>
parents:
448
diff
changeset
|
2573 } |
117f94b253af
Add support for CAMG chunk reading and possibly half-brite handling in IFF ILBM reader.
Matti Hamalainen <ccr@tnsp.org>
parents:
448
diff
changeset
|
2574 } |
1102
e06abfde6c39
Cosmetics pass: Remove excess whitespace.
Matti Hamalainen <ccr@tnsp.org>
parents:
958
diff
changeset
|
2575 |
447
0e27860ddcfe
Finish initial implementation of IFF ILBM loader. And whoa .. it seems to be working.
Matti Hamalainen <ccr@tnsp.org>
parents:
445
diff
changeset
|
2576 (*pimg)->pal = iff.pal; |
0e27860ddcfe
Finish initial implementation of IFF ILBM loader. And whoa .. it seems to be working.
Matti Hamalainen <ccr@tnsp.org>
parents:
445
diff
changeset
|
2577 } |
0e27860ddcfe
Finish initial implementation of IFF ILBM loader. And whoa .. it seems to be working.
Matti Hamalainen <ccr@tnsp.org>
parents:
445
diff
changeset
|
2578 |
443
f7c9d1619c74
Beginnings of IFF ILBM reader. Not functional, only chunk parsing,
Matti Hamalainen <ccr@tnsp.org>
parents:
442
diff
changeset
|
2579 return res; |
f7c9d1619c74
Beginnings of IFF ILBM reader. Not functional, only chunk parsing,
Matti Hamalainen <ccr@tnsp.org>
parents:
442
diff
changeset
|
2580 } |
f7c9d1619c74
Beginnings of IFF ILBM reader. Not functional, only chunk parsing,
Matti Hamalainen <ccr@tnsp.org>
parents:
442
diff
changeset
|
2581 |
f7c9d1619c74
Beginnings of IFF ILBM reader. Not functional, only chunk parsing,
Matti Hamalainen <ccr@tnsp.org>
parents:
442
diff
changeset
|
2582 |
1896
f80b2dc77c30
Work begins on IFF ILBM/PBM image writer. It is pretty broken, some things
Matti Hamalainen <ccr@tnsp.org>
parents:
1895
diff
changeset
|
2583 static int dmWriteIFFChunkHdr(DMResource *fp, DMIFFChunk *chunk, const Uint32 id) |
f80b2dc77c30
Work begins on IFF ILBM/PBM image writer. It is pretty broken, some things
Matti Hamalainen <ccr@tnsp.org>
parents:
1895
diff
changeset
|
2584 { |
f80b2dc77c30
Work begins on IFF ILBM/PBM image writer. It is pretty broken, some things
Matti Hamalainen <ccr@tnsp.org>
parents:
1895
diff
changeset
|
2585 chunk->offs = dmftell(fp); |
f80b2dc77c30
Work begins on IFF ILBM/PBM image writer. It is pretty broken, some things
Matti Hamalainen <ccr@tnsp.org>
parents:
1895
diff
changeset
|
2586 chunk->id = id; |
f80b2dc77c30
Work begins on IFF ILBM/PBM image writer. It is pretty broken, some things
Matti Hamalainen <ccr@tnsp.org>
parents:
1895
diff
changeset
|
2587 dmMakeIFFChunkIDStr(chunk); |
f80b2dc77c30
Work begins on IFF ILBM/PBM image writer. It is pretty broken, some things
Matti Hamalainen <ccr@tnsp.org>
parents:
1895
diff
changeset
|
2588 |
f80b2dc77c30
Work begins on IFF ILBM/PBM image writer. It is pretty broken, some things
Matti Hamalainen <ccr@tnsp.org>
parents:
1895
diff
changeset
|
2589 if (!dmf_write_be32(fp, chunk->id) || |
1942
f171b929b631
Do not reference uninitialized value in IFF writer, although in this case
Matti Hamalainen <ccr@tnsp.org>
parents:
1940
diff
changeset
|
2590 !dmf_write_be32(fp, 0)) |
1896
f80b2dc77c30
Work begins on IFF ILBM/PBM image writer. It is pretty broken, some things
Matti Hamalainen <ccr@tnsp.org>
parents:
1895
diff
changeset
|
2591 { |
f80b2dc77c30
Work begins on IFF ILBM/PBM image writer. It is pretty broken, some things
Matti Hamalainen <ccr@tnsp.org>
parents:
1895
diff
changeset
|
2592 return dmError(DMERR_FREAD, |
f80b2dc77c30
Work begins on IFF ILBM/PBM image writer. It is pretty broken, some things
Matti Hamalainen <ccr@tnsp.org>
parents:
1895
diff
changeset
|
2593 "IFF: Could not write IFF '%s' chunk header.\n", |
f80b2dc77c30
Work begins on IFF ILBM/PBM image writer. It is pretty broken, some things
Matti Hamalainen <ccr@tnsp.org>
parents:
1895
diff
changeset
|
2594 chunk->idStr); |
f80b2dc77c30
Work begins on IFF ILBM/PBM image writer. It is pretty broken, some things
Matti Hamalainen <ccr@tnsp.org>
parents:
1895
diff
changeset
|
2595 } |
f80b2dc77c30
Work begins on IFF ILBM/PBM image writer. It is pretty broken, some things
Matti Hamalainen <ccr@tnsp.org>
parents:
1895
diff
changeset
|
2596 else |
f80b2dc77c30
Work begins on IFF ILBM/PBM image writer. It is pretty broken, some things
Matti Hamalainen <ccr@tnsp.org>
parents:
1895
diff
changeset
|
2597 return DMERR_OK; |
f80b2dc77c30
Work begins on IFF ILBM/PBM image writer. It is pretty broken, some things
Matti Hamalainen <ccr@tnsp.org>
parents:
1895
diff
changeset
|
2598 } |
f80b2dc77c30
Work begins on IFF ILBM/PBM image writer. It is pretty broken, some things
Matti Hamalainen <ccr@tnsp.org>
parents:
1895
diff
changeset
|
2599 |
f80b2dc77c30
Work begins on IFF ILBM/PBM image writer. It is pretty broken, some things
Matti Hamalainen <ccr@tnsp.org>
parents:
1895
diff
changeset
|
2600 |
f80b2dc77c30
Work begins on IFF ILBM/PBM image writer. It is pretty broken, some things
Matti Hamalainen <ccr@tnsp.org>
parents:
1895
diff
changeset
|
2601 static int dmWriteIFFChunkFinish(DMResource *fp, DMIFFChunk *chunk) |
f80b2dc77c30
Work begins on IFF ILBM/PBM image writer. It is pretty broken, some things
Matti Hamalainen <ccr@tnsp.org>
parents:
1895
diff
changeset
|
2602 { |
f80b2dc77c30
Work begins on IFF ILBM/PBM image writer. It is pretty broken, some things
Matti Hamalainen <ccr@tnsp.org>
parents:
1895
diff
changeset
|
2603 off_t curr = dmftell(fp); |
f80b2dc77c30
Work begins on IFF ILBM/PBM image writer. It is pretty broken, some things
Matti Hamalainen <ccr@tnsp.org>
parents:
1895
diff
changeset
|
2604 if (curr < 0) |
f80b2dc77c30
Work begins on IFF ILBM/PBM image writer. It is pretty broken, some things
Matti Hamalainen <ccr@tnsp.org>
parents:
1895
diff
changeset
|
2605 return dmferror(fp); |
f80b2dc77c30
Work begins on IFF ILBM/PBM image writer. It is pretty broken, some things
Matti Hamalainen <ccr@tnsp.org>
parents:
1895
diff
changeset
|
2606 |
f80b2dc77c30
Work begins on IFF ILBM/PBM image writer. It is pretty broken, some things
Matti Hamalainen <ccr@tnsp.org>
parents:
1895
diff
changeset
|
2607 chunk->size = curr - chunk->offs - (sizeof(Uint32) * 2); |
1900 | 2608 if (chunk->size & 1) |
2609 { | |
2020 | 2610 dmMsg(3, "Padding chunk ID '%s', size %d ++\n", |
2611 chunk->idStr, chunk->size); | |
2612 | |
1900 | 2613 if (!dmf_write_byte(fp, 0)) |
2614 return dmferror(fp); | |
2615 | |
2020 | 2616 curr++; |
1900 | 2617 } |
1896
f80b2dc77c30
Work begins on IFF ILBM/PBM image writer. It is pretty broken, some things
Matti Hamalainen <ccr@tnsp.org>
parents:
1895
diff
changeset
|
2618 |
f80b2dc77c30
Work begins on IFF ILBM/PBM image writer. It is pretty broken, some things
Matti Hamalainen <ccr@tnsp.org>
parents:
1895
diff
changeset
|
2619 if (dmfseek(fp, chunk->offs, SEEK_SET) < 0) |
f80b2dc77c30
Work begins on IFF ILBM/PBM image writer. It is pretty broken, some things
Matti Hamalainen <ccr@tnsp.org>
parents:
1895
diff
changeset
|
2620 return dmferror(fp); |
f80b2dc77c30
Work begins on IFF ILBM/PBM image writer. It is pretty broken, some things
Matti Hamalainen <ccr@tnsp.org>
parents:
1895
diff
changeset
|
2621 |
f80b2dc77c30
Work begins on IFF ILBM/PBM image writer. It is pretty broken, some things
Matti Hamalainen <ccr@tnsp.org>
parents:
1895
diff
changeset
|
2622 if (!dmf_write_be32(fp, chunk->id) || |
f80b2dc77c30
Work begins on IFF ILBM/PBM image writer. It is pretty broken, some things
Matti Hamalainen <ccr@tnsp.org>
parents:
1895
diff
changeset
|
2623 !dmf_write_be32(fp, chunk->size)) |
f80b2dc77c30
Work begins on IFF ILBM/PBM image writer. It is pretty broken, some things
Matti Hamalainen <ccr@tnsp.org>
parents:
1895
diff
changeset
|
2624 { |
f80b2dc77c30
Work begins on IFF ILBM/PBM image writer. It is pretty broken, some things
Matti Hamalainen <ccr@tnsp.org>
parents:
1895
diff
changeset
|
2625 return dmError(DMERR_FREAD, |
f80b2dc77c30
Work begins on IFF ILBM/PBM image writer. It is pretty broken, some things
Matti Hamalainen <ccr@tnsp.org>
parents:
1895
diff
changeset
|
2626 "IFF: Could not write IFF '%s' chunk header.\n", |
f80b2dc77c30
Work begins on IFF ILBM/PBM image writer. It is pretty broken, some things
Matti Hamalainen <ccr@tnsp.org>
parents:
1895
diff
changeset
|
2627 chunk->idStr); |
f80b2dc77c30
Work begins on IFF ILBM/PBM image writer. It is pretty broken, some things
Matti Hamalainen <ccr@tnsp.org>
parents:
1895
diff
changeset
|
2628 } |
f80b2dc77c30
Work begins on IFF ILBM/PBM image writer. It is pretty broken, some things
Matti Hamalainen <ccr@tnsp.org>
parents:
1895
diff
changeset
|
2629 |
f80b2dc77c30
Work begins on IFF ILBM/PBM image writer. It is pretty broken, some things
Matti Hamalainen <ccr@tnsp.org>
parents:
1895
diff
changeset
|
2630 if (dmfseek(fp, curr, SEEK_SET) < 0) |
f80b2dc77c30
Work begins on IFF ILBM/PBM image writer. It is pretty broken, some things
Matti Hamalainen <ccr@tnsp.org>
parents:
1895
diff
changeset
|
2631 return dmferror(fp); |
f80b2dc77c30
Work begins on IFF ILBM/PBM image writer. It is pretty broken, some things
Matti Hamalainen <ccr@tnsp.org>
parents:
1895
diff
changeset
|
2632 |
f80b2dc77c30
Work begins on IFF ILBM/PBM image writer. It is pretty broken, some things
Matti Hamalainen <ccr@tnsp.org>
parents:
1895
diff
changeset
|
2633 return DMERR_OK; |
f80b2dc77c30
Work begins on IFF ILBM/PBM image writer. It is pretty broken, some things
Matti Hamalainen <ccr@tnsp.org>
parents:
1895
diff
changeset
|
2634 } |
f80b2dc77c30
Work begins on IFF ILBM/PBM image writer. It is pretty broken, some things
Matti Hamalainen <ccr@tnsp.org>
parents:
1895
diff
changeset
|
2635 |
f80b2dc77c30
Work begins on IFF ILBM/PBM image writer. It is pretty broken, some things
Matti Hamalainen <ccr@tnsp.org>
parents:
1895
diff
changeset
|
2636 |
f80b2dc77c30
Work begins on IFF ILBM/PBM image writer. It is pretty broken, some things
Matti Hamalainen <ccr@tnsp.org>
parents:
1895
diff
changeset
|
2637 enum |
f80b2dc77c30
Work begins on IFF ILBM/PBM image writer. It is pretty broken, some things
Matti Hamalainen <ccr@tnsp.org>
parents:
1895
diff
changeset
|
2638 { |
f80b2dc77c30
Work begins on IFF ILBM/PBM image writer. It is pretty broken, some things
Matti Hamalainen <ccr@tnsp.org>
parents:
1895
diff
changeset
|
2639 DMODE_LIT, |
f80b2dc77c30
Work begins on IFF ILBM/PBM image writer. It is pretty broken, some things
Matti Hamalainen <ccr@tnsp.org>
parents:
1895
diff
changeset
|
2640 DMODE_RLE, |
f80b2dc77c30
Work begins on IFF ILBM/PBM image writer. It is pretty broken, some things
Matti Hamalainen <ccr@tnsp.org>
parents:
1895
diff
changeset
|
2641 }; |
f80b2dc77c30
Work begins on IFF ILBM/PBM image writer. It is pretty broken, some things
Matti Hamalainen <ccr@tnsp.org>
parents:
1895
diff
changeset
|
2642 |
f80b2dc77c30
Work begins on IFF ILBM/PBM image writer. It is pretty broken, some things
Matti Hamalainen <ccr@tnsp.org>
parents:
1895
diff
changeset
|
2643 |
2055
6c6a4ea67540
Make two functions static and one not.
Matti Hamalainen <ccr@tnsp.org>
parents:
2054
diff
changeset
|
2644 static BOOL dmIFFEncodeByteRun1LIT(DMResource *fp, |
2050
416af5a842ec
Fixes to the ByteRun1 encoder. Could use some cleanups now, tho.
Matti Hamalainen <ccr@tnsp.org>
parents:
2049
diff
changeset
|
2645 const Uint8 *buf, const size_t offs, |
416af5a842ec
Fixes to the ByteRun1 encoder. Could use some cleanups now, tho.
Matti Hamalainen <ccr@tnsp.org>
parents:
2049
diff
changeset
|
2646 const size_t count) |
1896
f80b2dc77c30
Work begins on IFF ILBM/PBM image writer. It is pretty broken, some things
Matti Hamalainen <ccr@tnsp.org>
parents:
1895
diff
changeset
|
2647 { |
2050
416af5a842ec
Fixes to the ByteRun1 encoder. Could use some cleanups now, tho.
Matti Hamalainen <ccr@tnsp.org>
parents:
2049
diff
changeset
|
2648 if (count <= 0) |
416af5a842ec
Fixes to the ByteRun1 encoder. Could use some cleanups now, tho.
Matti Hamalainen <ccr@tnsp.org>
parents:
2049
diff
changeset
|
2649 return TRUE; |
416af5a842ec
Fixes to the ByteRun1 encoder. Could use some cleanups now, tho.
Matti Hamalainen <ccr@tnsp.org>
parents:
2049
diff
changeset
|
2650 |
416af5a842ec
Fixes to the ByteRun1 encoder. Could use some cleanups now, tho.
Matti Hamalainen <ccr@tnsp.org>
parents:
2049
diff
changeset
|
2651 Uint8 tmp = count - 1; |
416af5a842ec
Fixes to the ByteRun1 encoder. Could use some cleanups now, tho.
Matti Hamalainen <ccr@tnsp.org>
parents:
2049
diff
changeset
|
2652 |
416af5a842ec
Fixes to the ByteRun1 encoder. Could use some cleanups now, tho.
Matti Hamalainen <ccr@tnsp.org>
parents:
2049
diff
changeset
|
2653 return |
416af5a842ec
Fixes to the ByteRun1 encoder. Could use some cleanups now, tho.
Matti Hamalainen <ccr@tnsp.org>
parents:
2049
diff
changeset
|
2654 dmf_write_byte(fp, tmp) && |
416af5a842ec
Fixes to the ByteRun1 encoder. Could use some cleanups now, tho.
Matti Hamalainen <ccr@tnsp.org>
parents:
2049
diff
changeset
|
2655 dmf_write_str(fp, buf + offs, count); |
416af5a842ec
Fixes to the ByteRun1 encoder. Could use some cleanups now, tho.
Matti Hamalainen <ccr@tnsp.org>
parents:
2049
diff
changeset
|
2656 } |
416af5a842ec
Fixes to the ByteRun1 encoder. Could use some cleanups now, tho.
Matti Hamalainen <ccr@tnsp.org>
parents:
2049
diff
changeset
|
2657 |
416af5a842ec
Fixes to the ByteRun1 encoder. Could use some cleanups now, tho.
Matti Hamalainen <ccr@tnsp.org>
parents:
2049
diff
changeset
|
2658 |
2055
6c6a4ea67540
Make two functions static and one not.
Matti Hamalainen <ccr@tnsp.org>
parents:
2054
diff
changeset
|
2659 static BOOL dmIFFEncodeByteRun1RLE(DMResource *fp, |
2050
416af5a842ec
Fixes to the ByteRun1 encoder. Could use some cleanups now, tho.
Matti Hamalainen <ccr@tnsp.org>
parents:
2049
diff
changeset
|
2660 const Uint8 *buf, const size_t offs, |
416af5a842ec
Fixes to the ByteRun1 encoder. Could use some cleanups now, tho.
Matti Hamalainen <ccr@tnsp.org>
parents:
2049
diff
changeset
|
2661 const size_t count) |
416af5a842ec
Fixes to the ByteRun1 encoder. Could use some cleanups now, tho.
Matti Hamalainen <ccr@tnsp.org>
parents:
2049
diff
changeset
|
2662 { |
416af5a842ec
Fixes to the ByteRun1 encoder. Could use some cleanups now, tho.
Matti Hamalainen <ccr@tnsp.org>
parents:
2049
diff
changeset
|
2663 if (count <= 0) |
416af5a842ec
Fixes to the ByteRun1 encoder. Could use some cleanups now, tho.
Matti Hamalainen <ccr@tnsp.org>
parents:
2049
diff
changeset
|
2664 return TRUE; |
416af5a842ec
Fixes to the ByteRun1 encoder. Could use some cleanups now, tho.
Matti Hamalainen <ccr@tnsp.org>
parents:
2049
diff
changeset
|
2665 |
416af5a842ec
Fixes to the ByteRun1 encoder. Could use some cleanups now, tho.
Matti Hamalainen <ccr@tnsp.org>
parents:
2049
diff
changeset
|
2666 Uint8 |
416af5a842ec
Fixes to the ByteRun1 encoder. Could use some cleanups now, tho.
Matti Hamalainen <ccr@tnsp.org>
parents:
2049
diff
changeset
|
2667 tmp = ((Uint8) count - 2) ^ 0xff, |
416af5a842ec
Fixes to the ByteRun1 encoder. Could use some cleanups now, tho.
Matti Hamalainen <ccr@tnsp.org>
parents:
2049
diff
changeset
|
2668 data = buf[offs]; |
416af5a842ec
Fixes to the ByteRun1 encoder. Could use some cleanups now, tho.
Matti Hamalainen <ccr@tnsp.org>
parents:
2049
diff
changeset
|
2669 |
416af5a842ec
Fixes to the ByteRun1 encoder. Could use some cleanups now, tho.
Matti Hamalainen <ccr@tnsp.org>
parents:
2049
diff
changeset
|
2670 return |
416af5a842ec
Fixes to the ByteRun1 encoder. Could use some cleanups now, tho.
Matti Hamalainen <ccr@tnsp.org>
parents:
2049
diff
changeset
|
2671 dmf_write_byte(fp, tmp) && |
416af5a842ec
Fixes to the ByteRun1 encoder. Could use some cleanups now, tho.
Matti Hamalainen <ccr@tnsp.org>
parents:
2049
diff
changeset
|
2672 dmf_write_byte(fp, data); |
1896
f80b2dc77c30
Work begins on IFF ILBM/PBM image writer. It is pretty broken, some things
Matti Hamalainen <ccr@tnsp.org>
parents:
1895
diff
changeset
|
2673 } |
f80b2dc77c30
Work begins on IFF ILBM/PBM image writer. It is pretty broken, some things
Matti Hamalainen <ccr@tnsp.org>
parents:
1895
diff
changeset
|
2674 |
f80b2dc77c30
Work begins on IFF ILBM/PBM image writer. It is pretty broken, some things
Matti Hamalainen <ccr@tnsp.org>
parents:
1895
diff
changeset
|
2675 |
f80b2dc77c30
Work begins on IFF ILBM/PBM image writer. It is pretty broken, some things
Matti Hamalainen <ccr@tnsp.org>
parents:
1895
diff
changeset
|
2676 BOOL dmIFFEncodeByteRun1Row(DMResource *fp, const Uint8 *buf, const size_t bufLen) |
f80b2dc77c30
Work begins on IFF ILBM/PBM image writer. It is pretty broken, some things
Matti Hamalainen <ccr@tnsp.org>
parents:
1895
diff
changeset
|
2677 { |
f80b2dc77c30
Work begins on IFF ILBM/PBM image writer. It is pretty broken, some things
Matti Hamalainen <ccr@tnsp.org>
parents:
1895
diff
changeset
|
2678 int prev = -1, mode = DMODE_LIT; |
2050
416af5a842ec
Fixes to the ByteRun1 encoder. Could use some cleanups now, tho.
Matti Hamalainen <ccr@tnsp.org>
parents:
2049
diff
changeset
|
2679 size_t offs, l_offs, r_offs; |
416af5a842ec
Fixes to the ByteRun1 encoder. Could use some cleanups now, tho.
Matti Hamalainen <ccr@tnsp.org>
parents:
2049
diff
changeset
|
2680 BOOL ret = TRUE; |
416af5a842ec
Fixes to the ByteRun1 encoder. Could use some cleanups now, tho.
Matti Hamalainen <ccr@tnsp.org>
parents:
2049
diff
changeset
|
2681 |
416af5a842ec
Fixes to the ByteRun1 encoder. Could use some cleanups now, tho.
Matti Hamalainen <ccr@tnsp.org>
parents:
2049
diff
changeset
|
2682 for (offs = l_offs = r_offs = 0; offs < bufLen; offs++) |
1896
f80b2dc77c30
Work begins on IFF ILBM/PBM image writer. It is pretty broken, some things
Matti Hamalainen <ccr@tnsp.org>
parents:
1895
diff
changeset
|
2683 { |
f80b2dc77c30
Work begins on IFF ILBM/PBM image writer. It is pretty broken, some things
Matti Hamalainen <ccr@tnsp.org>
parents:
1895
diff
changeset
|
2684 Uint8 data = buf[offs]; |
2050
416af5a842ec
Fixes to the ByteRun1 encoder. Could use some cleanups now, tho.
Matti Hamalainen <ccr@tnsp.org>
parents:
2049
diff
changeset
|
2685 BOOL flush = FALSE; |
416af5a842ec
Fixes to the ByteRun1 encoder. Could use some cleanups now, tho.
Matti Hamalainen <ccr@tnsp.org>
parents:
2049
diff
changeset
|
2686 int pmode = mode; |
1896
f80b2dc77c30
Work begins on IFF ILBM/PBM image writer. It is pretty broken, some things
Matti Hamalainen <ccr@tnsp.org>
parents:
1895
diff
changeset
|
2687 |
f80b2dc77c30
Work begins on IFF ILBM/PBM image writer. It is pretty broken, some things
Matti Hamalainen <ccr@tnsp.org>
parents:
1895
diff
changeset
|
2688 if (data == prev) |
f80b2dc77c30
Work begins on IFF ILBM/PBM image writer. It is pretty broken, some things
Matti Hamalainen <ccr@tnsp.org>
parents:
1895
diff
changeset
|
2689 { |
2050
416af5a842ec
Fixes to the ByteRun1 encoder. Could use some cleanups now, tho.
Matti Hamalainen <ccr@tnsp.org>
parents:
2049
diff
changeset
|
2690 if (mode == DMODE_LIT && |
416af5a842ec
Fixes to the ByteRun1 encoder. Could use some cleanups now, tho.
Matti Hamalainen <ccr@tnsp.org>
parents:
2049
diff
changeset
|
2691 offs - r_offs >= 2) |
416af5a842ec
Fixes to the ByteRun1 encoder. Could use some cleanups now, tho.
Matti Hamalainen <ccr@tnsp.org>
parents:
2049
diff
changeset
|
2692 { |
416af5a842ec
Fixes to the ByteRun1 encoder. Could use some cleanups now, tho.
Matti Hamalainen <ccr@tnsp.org>
parents:
2049
diff
changeset
|
2693 ret = dmIFFEncodeByteRun1LIT(fp, buf, l_offs, r_offs - l_offs); |
416af5a842ec
Fixes to the ByteRun1 encoder. Could use some cleanups now, tho.
Matti Hamalainen <ccr@tnsp.org>
parents:
2049
diff
changeset
|
2694 mode = DMODE_RLE; |
416af5a842ec
Fixes to the ByteRun1 encoder. Could use some cleanups now, tho.
Matti Hamalainen <ccr@tnsp.org>
parents:
2049
diff
changeset
|
2695 } |
1896
f80b2dc77c30
Work begins on IFF ILBM/PBM image writer. It is pretty broken, some things
Matti Hamalainen <ccr@tnsp.org>
parents:
1895
diff
changeset
|
2696 } |
f80b2dc77c30
Work begins on IFF ILBM/PBM image writer. It is pretty broken, some things
Matti Hamalainen <ccr@tnsp.org>
parents:
1895
diff
changeset
|
2697 else |
f80b2dc77c30
Work begins on IFF ILBM/PBM image writer. It is pretty broken, some things
Matti Hamalainen <ccr@tnsp.org>
parents:
1895
diff
changeset
|
2698 { |
2050
416af5a842ec
Fixes to the ByteRun1 encoder. Could use some cleanups now, tho.
Matti Hamalainen <ccr@tnsp.org>
parents:
2049
diff
changeset
|
2699 if (mode != DMODE_LIT) |
416af5a842ec
Fixes to the ByteRun1 encoder. Could use some cleanups now, tho.
Matti Hamalainen <ccr@tnsp.org>
parents:
2049
diff
changeset
|
2700 { |
416af5a842ec
Fixes to the ByteRun1 encoder. Could use some cleanups now, tho.
Matti Hamalainen <ccr@tnsp.org>
parents:
2049
diff
changeset
|
2701 ret = dmIFFEncodeByteRun1RLE(fp, buf, r_offs, offs - r_offs); |
416af5a842ec
Fixes to the ByteRun1 encoder. Could use some cleanups now, tho.
Matti Hamalainen <ccr@tnsp.org>
parents:
2049
diff
changeset
|
2702 mode = DMODE_LIT; |
416af5a842ec
Fixes to the ByteRun1 encoder. Could use some cleanups now, tho.
Matti Hamalainen <ccr@tnsp.org>
parents:
2049
diff
changeset
|
2703 l_offs = offs; |
416af5a842ec
Fixes to the ByteRun1 encoder. Could use some cleanups now, tho.
Matti Hamalainen <ccr@tnsp.org>
parents:
2049
diff
changeset
|
2704 } |
416af5a842ec
Fixes to the ByteRun1 encoder. Could use some cleanups now, tho.
Matti Hamalainen <ccr@tnsp.org>
parents:
2049
diff
changeset
|
2705 r_offs = offs; |
1896
f80b2dc77c30
Work begins on IFF ILBM/PBM image writer. It is pretty broken, some things
Matti Hamalainen <ccr@tnsp.org>
parents:
1895
diff
changeset
|
2706 } |
f80b2dc77c30
Work begins on IFF ILBM/PBM image writer. It is pretty broken, some things
Matti Hamalainen <ccr@tnsp.org>
parents:
1895
diff
changeset
|
2707 |
2050
416af5a842ec
Fixes to the ByteRun1 encoder. Could use some cleanups now, tho.
Matti Hamalainen <ccr@tnsp.org>
parents:
2049
diff
changeset
|
2708 if (!ret) |
416af5a842ec
Fixes to the ByteRun1 encoder. Could use some cleanups now, tho.
Matti Hamalainen <ccr@tnsp.org>
parents:
2049
diff
changeset
|
2709 goto out; |
416af5a842ec
Fixes to the ByteRun1 encoder. Could use some cleanups now, tho.
Matti Hamalainen <ccr@tnsp.org>
parents:
2049
diff
changeset
|
2710 |
416af5a842ec
Fixes to the ByteRun1 encoder. Could use some cleanups now, tho.
Matti Hamalainen <ccr@tnsp.org>
parents:
2049
diff
changeset
|
2711 // NOTE! RLE and LIT max are both 128, checked against DP2e |
416af5a842ec
Fixes to the ByteRun1 encoder. Could use some cleanups now, tho.
Matti Hamalainen <ccr@tnsp.org>
parents:
2049
diff
changeset
|
2712 flush = |
416af5a842ec
Fixes to the ByteRun1 encoder. Could use some cleanups now, tho.
Matti Hamalainen <ccr@tnsp.org>
parents:
2049
diff
changeset
|
2713 (pmode == DMODE_RLE && offs - r_offs >= 128) || |
416af5a842ec
Fixes to the ByteRun1 encoder. Could use some cleanups now, tho.
Matti Hamalainen <ccr@tnsp.org>
parents:
2049
diff
changeset
|
2714 (pmode == DMODE_LIT && offs - l_offs >= 128); |
416af5a842ec
Fixes to the ByteRun1 encoder. Could use some cleanups now, tho.
Matti Hamalainen <ccr@tnsp.org>
parents:
2049
diff
changeset
|
2715 |
416af5a842ec
Fixes to the ByteRun1 encoder. Could use some cleanups now, tho.
Matti Hamalainen <ccr@tnsp.org>
parents:
2049
diff
changeset
|
2716 // Check for last byte of input |
416af5a842ec
Fixes to the ByteRun1 encoder. Could use some cleanups now, tho.
Matti Hamalainen <ccr@tnsp.org>
parents:
2049
diff
changeset
|
2717 if (offs == bufLen - 1) |
416af5a842ec
Fixes to the ByteRun1 encoder. Could use some cleanups now, tho.
Matti Hamalainen <ccr@tnsp.org>
parents:
2049
diff
changeset
|
2718 { |
416af5a842ec
Fixes to the ByteRun1 encoder. Could use some cleanups now, tho.
Matti Hamalainen <ccr@tnsp.org>
parents:
2049
diff
changeset
|
2719 offs++; |
416af5a842ec
Fixes to the ByteRun1 encoder. Could use some cleanups now, tho.
Matti Hamalainen <ccr@tnsp.org>
parents:
2049
diff
changeset
|
2720 flush = TRUE; |
416af5a842ec
Fixes to the ByteRun1 encoder. Could use some cleanups now, tho.
Matti Hamalainen <ccr@tnsp.org>
parents:
2049
diff
changeset
|
2721 pmode = mode; |
416af5a842ec
Fixes to the ByteRun1 encoder. Could use some cleanups now, tho.
Matti Hamalainen <ccr@tnsp.org>
parents:
2049
diff
changeset
|
2722 } |
416af5a842ec
Fixes to the ByteRun1 encoder. Could use some cleanups now, tho.
Matti Hamalainen <ccr@tnsp.org>
parents:
2049
diff
changeset
|
2723 |
416af5a842ec
Fixes to the ByteRun1 encoder. Could use some cleanups now, tho.
Matti Hamalainen <ccr@tnsp.org>
parents:
2049
diff
changeset
|
2724 if (flush) |
416af5a842ec
Fixes to the ByteRun1 encoder. Could use some cleanups now, tho.
Matti Hamalainen <ccr@tnsp.org>
parents:
2049
diff
changeset
|
2725 { |
416af5a842ec
Fixes to the ByteRun1 encoder. Could use some cleanups now, tho.
Matti Hamalainen <ccr@tnsp.org>
parents:
2049
diff
changeset
|
2726 if (pmode == DMODE_RLE) |
416af5a842ec
Fixes to the ByteRun1 encoder. Could use some cleanups now, tho.
Matti Hamalainen <ccr@tnsp.org>
parents:
2049
diff
changeset
|
2727 ret = dmIFFEncodeByteRun1RLE(fp, buf, r_offs, offs - r_offs); |
416af5a842ec
Fixes to the ByteRun1 encoder. Could use some cleanups now, tho.
Matti Hamalainen <ccr@tnsp.org>
parents:
2049
diff
changeset
|
2728 else |
416af5a842ec
Fixes to the ByteRun1 encoder. Could use some cleanups now, tho.
Matti Hamalainen <ccr@tnsp.org>
parents:
2049
diff
changeset
|
2729 ret = dmIFFEncodeByteRun1LIT(fp, buf, l_offs, offs - l_offs); |
416af5a842ec
Fixes to the ByteRun1 encoder. Could use some cleanups now, tho.
Matti Hamalainen <ccr@tnsp.org>
parents:
2049
diff
changeset
|
2730 |
416af5a842ec
Fixes to the ByteRun1 encoder. Could use some cleanups now, tho.
Matti Hamalainen <ccr@tnsp.org>
parents:
2049
diff
changeset
|
2731 r_offs = l_offs = offs; |
416af5a842ec
Fixes to the ByteRun1 encoder. Could use some cleanups now, tho.
Matti Hamalainen <ccr@tnsp.org>
parents:
2049
diff
changeset
|
2732 mode = DMODE_LIT; |
416af5a842ec
Fixes to the ByteRun1 encoder. Could use some cleanups now, tho.
Matti Hamalainen <ccr@tnsp.org>
parents:
2049
diff
changeset
|
2733 |
416af5a842ec
Fixes to the ByteRun1 encoder. Could use some cleanups now, tho.
Matti Hamalainen <ccr@tnsp.org>
parents:
2049
diff
changeset
|
2734 if (!ret) |
416af5a842ec
Fixes to the ByteRun1 encoder. Could use some cleanups now, tho.
Matti Hamalainen <ccr@tnsp.org>
parents:
2049
diff
changeset
|
2735 goto out; |
416af5a842ec
Fixes to the ByteRun1 encoder. Could use some cleanups now, tho.
Matti Hamalainen <ccr@tnsp.org>
parents:
2049
diff
changeset
|
2736 } |
416af5a842ec
Fixes to the ByteRun1 encoder. Could use some cleanups now, tho.
Matti Hamalainen <ccr@tnsp.org>
parents:
2049
diff
changeset
|
2737 |
1896
f80b2dc77c30
Work begins on IFF ILBM/PBM image writer. It is pretty broken, some things
Matti Hamalainen <ccr@tnsp.org>
parents:
1895
diff
changeset
|
2738 prev = data; |
f80b2dc77c30
Work begins on IFF ILBM/PBM image writer. It is pretty broken, some things
Matti Hamalainen <ccr@tnsp.org>
parents:
1895
diff
changeset
|
2739 } |
f80b2dc77c30
Work begins on IFF ILBM/PBM image writer. It is pretty broken, some things
Matti Hamalainen <ccr@tnsp.org>
parents:
1895
diff
changeset
|
2740 |
2050
416af5a842ec
Fixes to the ByteRun1 encoder. Could use some cleanups now, tho.
Matti Hamalainen <ccr@tnsp.org>
parents:
2049
diff
changeset
|
2741 out: |
416af5a842ec
Fixes to the ByteRun1 encoder. Could use some cleanups now, tho.
Matti Hamalainen <ccr@tnsp.org>
parents:
2049
diff
changeset
|
2742 return ret; |
1896
f80b2dc77c30
Work begins on IFF ILBM/PBM image writer. It is pretty broken, some things
Matti Hamalainen <ccr@tnsp.org>
parents:
1895
diff
changeset
|
2743 } |
f80b2dc77c30
Work begins on IFF ILBM/PBM image writer. It is pretty broken, some things
Matti Hamalainen <ccr@tnsp.org>
parents:
1895
diff
changeset
|
2744 |
f80b2dc77c30
Work begins on IFF ILBM/PBM image writer. It is pretty broken, some things
Matti Hamalainen <ccr@tnsp.org>
parents:
1895
diff
changeset
|
2745 |
f80b2dc77c30
Work begins on IFF ILBM/PBM image writer. It is pretty broken, some things
Matti Hamalainen <ccr@tnsp.org>
parents:
1895
diff
changeset
|
2746 static BOOL dmIFFWriteOneRow(DMResource *fp, DMIFF *iff, const Uint8 *buf, const size_t bufLen) |
f80b2dc77c30
Work begins on IFF ILBM/PBM image writer. It is pretty broken, some things
Matti Hamalainen <ccr@tnsp.org>
parents:
1895
diff
changeset
|
2747 { |
f80b2dc77c30
Work begins on IFF ILBM/PBM image writer. It is pretty broken, some things
Matti Hamalainen <ccr@tnsp.org>
parents:
1895
diff
changeset
|
2748 if (iff->bmhd.compression == IFF_COMP_BYTERUN1) |
f80b2dc77c30
Work begins on IFF ILBM/PBM image writer. It is pretty broken, some things
Matti Hamalainen <ccr@tnsp.org>
parents:
1895
diff
changeset
|
2749 return dmIFFEncodeByteRun1Row(fp, buf, bufLen); |
f80b2dc77c30
Work begins on IFF ILBM/PBM image writer. It is pretty broken, some things
Matti Hamalainen <ccr@tnsp.org>
parents:
1895
diff
changeset
|
2750 else |
f80b2dc77c30
Work begins on IFF ILBM/PBM image writer. It is pretty broken, some things
Matti Hamalainen <ccr@tnsp.org>
parents:
1895
diff
changeset
|
2751 return dmf_write_str(fp, buf, bufLen); |
f80b2dc77c30
Work begins on IFF ILBM/PBM image writer. It is pretty broken, some things
Matti Hamalainen <ccr@tnsp.org>
parents:
1895
diff
changeset
|
2752 } |
f80b2dc77c30
Work begins on IFF ILBM/PBM image writer. It is pretty broken, some things
Matti Hamalainen <ccr@tnsp.org>
parents:
1895
diff
changeset
|
2753 |
f80b2dc77c30
Work begins on IFF ILBM/PBM image writer. It is pretty broken, some things
Matti Hamalainen <ccr@tnsp.org>
parents:
1895
diff
changeset
|
2754 |
2156
e6ec7fad9ce2
Rename DMImageConvSpec to DMImageWriteSpec to better reflec the struct's purpose.
Matti Hamalainen <ccr@tnsp.org>
parents:
2154
diff
changeset
|
2755 int dmWriteIFFImage(DMResource *fp, const DMImage *img, const DMImageWriteSpec *spec) |
1896
f80b2dc77c30
Work begins on IFF ILBM/PBM image writer. It is pretty broken, some things
Matti Hamalainen <ccr@tnsp.org>
parents:
1895
diff
changeset
|
2756 { |
f80b2dc77c30
Work begins on IFF ILBM/PBM image writer. It is pretty broken, some things
Matti Hamalainen <ccr@tnsp.org>
parents:
1895
diff
changeset
|
2757 DMIFF iff; |
1904 | 2758 Uint8 *buf = NULL; |
2759 size_t bufLen; | |
1896
f80b2dc77c30
Work begins on IFF ILBM/PBM image writer. It is pretty broken, some things
Matti Hamalainen <ccr@tnsp.org>
parents:
1895
diff
changeset
|
2760 int res = DMERR_OK; |
2064
3617ef01c1de
Separate ILBM and PBM subformats of IFF images.
Matti Hamalainen <ccr@tnsp.org>
parents:
2063
diff
changeset
|
2761 |
3617ef01c1de
Separate ILBM and PBM subformats of IFF images.
Matti Hamalainen <ccr@tnsp.org>
parents:
2063
diff
changeset
|
2762 // XXX: Non-paletted IFF not supported! |
2157
9a9493809b3a
Rename DM_COLFMT_* constants to DM_PIXFMT_* and the 'format' field of DMImage
Matti Hamalainen <ccr@tnsp.org>
parents:
2156
diff
changeset
|
2763 if ((img->pixfmt != DM_PIXFMT_PALETTE && img->pixfmt != DM_PIXFMT_GRAYSCALE) || |
9a9493809b3a
Rename DM_COLFMT_* constants to DM_PIXFMT_* and the 'format' field of DMImage
Matti Hamalainen <ccr@tnsp.org>
parents:
2156
diff
changeset
|
2764 (spec->pixfmt != DM_PIXFMT_PALETTE && spec->pixfmt != DM_PIXFMT_GRAYSCALE)) |
1896
f80b2dc77c30
Work begins on IFF ILBM/PBM image writer. It is pretty broken, some things
Matti Hamalainen <ccr@tnsp.org>
parents:
1895
diff
changeset
|
2765 { |
f80b2dc77c30
Work begins on IFF ILBM/PBM image writer. It is pretty broken, some things
Matti Hamalainen <ccr@tnsp.org>
parents:
1895
diff
changeset
|
2766 return dmError(DMERR_NOT_SUPPORTED, |
f80b2dc77c30
Work begins on IFF ILBM/PBM image writer. It is pretty broken, some things
Matti Hamalainen <ccr@tnsp.org>
parents:
1895
diff
changeset
|
2767 "Non-paletted IFF is not supported.\n"); |
f80b2dc77c30
Work begins on IFF ILBM/PBM image writer. It is pretty broken, some things
Matti Hamalainen <ccr@tnsp.org>
parents:
1895
diff
changeset
|
2768 } |
f80b2dc77c30
Work begins on IFF ILBM/PBM image writer. It is pretty broken, some things
Matti Hamalainen <ccr@tnsp.org>
parents:
1895
diff
changeset
|
2769 |
2065
451980580189
Refactor how paletted/indexed formats are handled in libgfx.
Matti Hamalainen <ccr@tnsp.org>
parents:
2064
diff
changeset
|
2770 switch (spec->fmtid) |
2064
3617ef01c1de
Separate ILBM and PBM subformats of IFF images.
Matti Hamalainen <ccr@tnsp.org>
parents:
2063
diff
changeset
|
2771 { |
3617ef01c1de
Separate ILBM and PBM subformats of IFF images.
Matti Hamalainen <ccr@tnsp.org>
parents:
2063
diff
changeset
|
2772 case DM_IMGFMT_IFF_ILBM: iff.idsig = IFF_ID_ILBM; iff.idstr = "ILBM"; break; |
3617ef01c1de
Separate ILBM and PBM subformats of IFF images.
Matti Hamalainen <ccr@tnsp.org>
parents:
2063
diff
changeset
|
2773 case DM_IMGFMT_IFF_PBM : iff.idsig = IFF_ID_PBM; iff.idstr = "PBM"; break; |
3617ef01c1de
Separate ILBM and PBM subformats of IFF images.
Matti Hamalainen <ccr@tnsp.org>
parents:
2063
diff
changeset
|
2774 case DM_IMGFMT_IFF_ACBM: iff.idsig = IFF_ID_ACBM; iff.idstr = "ACBM"; break; |
2065
451980580189
Refactor how paletted/indexed formats are handled in libgfx.
Matti Hamalainen <ccr@tnsp.org>
parents:
2064
diff
changeset
|
2775 default: |
451980580189
Refactor how paletted/indexed formats are handled in libgfx.
Matti Hamalainen <ccr@tnsp.org>
parents:
2064
diff
changeset
|
2776 return dmError(DMERR_NOT_SUPPORTED, |
451980580189
Refactor how paletted/indexed formats are handled in libgfx.
Matti Hamalainen <ccr@tnsp.org>
parents:
2064
diff
changeset
|
2777 "Invalid IFF format.\n"); |
2064
3617ef01c1de
Separate ILBM and PBM subformats of IFF images.
Matti Hamalainen <ccr@tnsp.org>
parents:
2063
diff
changeset
|
2778 } |
2026
b137d324e13f
Force 8 bitplanes for IFF PBM images.
Matti Hamalainen <ccr@tnsp.org>
parents:
2025
diff
changeset
|
2779 |
1896
f80b2dc77c30
Work begins on IFF ILBM/PBM image writer. It is pretty broken, some things
Matti Hamalainen <ccr@tnsp.org>
parents:
1895
diff
changeset
|
2780 // Setup headers |
f80b2dc77c30
Work begins on IFF ILBM/PBM image writer. It is pretty broken, some things
Matti Hamalainen <ccr@tnsp.org>
parents:
1895
diff
changeset
|
2781 iff.bmhd.x = 0; |
f80b2dc77c30
Work begins on IFF ILBM/PBM image writer. It is pretty broken, some things
Matti Hamalainen <ccr@tnsp.org>
parents:
1895
diff
changeset
|
2782 iff.bmhd.y = 0; |
1904 | 2783 iff.bmhd.w = img->width * spec->scaleX; |
2784 iff.bmhd.h = img->height * spec->scaleY; | |
2785 iff.bmhd.pagew = img->width * spec->scaleX; | |
2786 iff.bmhd.pageh = img->height * spec->scaleY; | |
1896
f80b2dc77c30
Work begins on IFF ILBM/PBM image writer. It is pretty broken, some things
Matti Hamalainen <ccr@tnsp.org>
parents:
1895
diff
changeset
|
2787 iff.bmhd.pad1 = 0; |
f80b2dc77c30
Work begins on IFF ILBM/PBM image writer. It is pretty broken, some things
Matti Hamalainen <ccr@tnsp.org>
parents:
1895
diff
changeset
|
2788 iff.bmhd.xasp = 1; // XXX TODO: compute the xasp/yasp from the img->aspect |
f80b2dc77c30
Work begins on IFF ILBM/PBM image writer. It is pretty broken, some things
Matti Hamalainen <ccr@tnsp.org>
parents:
1895
diff
changeset
|
2789 iff.bmhd.yasp = 1; |
f80b2dc77c30
Work begins on IFF ILBM/PBM image writer. It is pretty broken, some things
Matti Hamalainen <ccr@tnsp.org>
parents:
1895
diff
changeset
|
2790 |
f80b2dc77c30
Work begins on IFF ILBM/PBM image writer. It is pretty broken, some things
Matti Hamalainen <ccr@tnsp.org>
parents:
1895
diff
changeset
|
2791 iff.camg = 0; // XXX TODO: when/if HAM support |
2094
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
2792 iff.bmhd.masking = (img->pal && img->pal->ctransp < 0) ? IFF_MASK_NONE : spec->mask; |
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
2793 iff.bmhd.transp = (img->pal && img->pal->ctransp >= 0 && spec->mask == IFF_MASK_TRANSP) ? img->pal->ctransp : 0xffff; |
2064
3617ef01c1de
Separate ILBM and PBM subformats of IFF images.
Matti Hamalainen <ccr@tnsp.org>
parents:
2063
diff
changeset
|
2794 iff.bmhd.nplanes = (iff.idsig == IFF_ID_PBM && spec->nplanes < 8) ? 8 : spec->nplanes; |
1896
f80b2dc77c30
Work begins on IFF ILBM/PBM image writer. It is pretty broken, some things
Matti Hamalainen <ccr@tnsp.org>
parents:
1895
diff
changeset
|
2795 |
2069 | 2796 // Apparently ACBM can't/should not use compression .. even though |
2797 // some files in the wild have bmhd.compression != 0 (but are not | |
2798 // actually compressed.) To be more compliant with the spec, | |
2799 iff.bmhd.compression = (spec->compression && iff.idsig != IFF_ID_ACBM) ? IFF_COMP_BYTERUN1 : IFF_COMP_NONE; | |
2800 | |
1896
f80b2dc77c30
Work begins on IFF ILBM/PBM image writer. It is pretty broken, some things
Matti Hamalainen <ccr@tnsp.org>
parents:
1895
diff
changeset
|
2801 dmMsg(2, "IFF: nplanes=%d, comp=%d, mask=%d\n", |
f80b2dc77c30
Work begins on IFF ILBM/PBM image writer. It is pretty broken, some things
Matti Hamalainen <ccr@tnsp.org>
parents:
1895
diff
changeset
|
2802 iff.bmhd.nplanes, iff.bmhd.compression, iff.bmhd.masking); |
f80b2dc77c30
Work begins on IFF ILBM/PBM image writer. It is pretty broken, some things
Matti Hamalainen <ccr@tnsp.org>
parents:
1895
diff
changeset
|
2803 |
f80b2dc77c30
Work begins on IFF ILBM/PBM image writer. It is pretty broken, some things
Matti Hamalainen <ccr@tnsp.org>
parents:
1895
diff
changeset
|
2804 // Write IFF FORM header |
f80b2dc77c30
Work begins on IFF ILBM/PBM image writer. It is pretty broken, some things
Matti Hamalainen <ccr@tnsp.org>
parents:
1895
diff
changeset
|
2805 if ((res = dmWriteIFFChunkHdr(fp, &iff.chFORM, IFF_ID_FORM)) != DMERR_OK) |
f80b2dc77c30
Work begins on IFF ILBM/PBM image writer. It is pretty broken, some things
Matti Hamalainen <ccr@tnsp.org>
parents:
1895
diff
changeset
|
2806 goto out; |
f80b2dc77c30
Work begins on IFF ILBM/PBM image writer. It is pretty broken, some things
Matti Hamalainen <ccr@tnsp.org>
parents:
1895
diff
changeset
|
2807 |
f80b2dc77c30
Work begins on IFF ILBM/PBM image writer. It is pretty broken, some things
Matti Hamalainen <ccr@tnsp.org>
parents:
1895
diff
changeset
|
2808 // Write IFF ILBM/PBM signature |
2053
6dfbe976d740
Implement basic initial support for IFF ACBM format images.
Matti Hamalainen <ccr@tnsp.org>
parents:
2050
diff
changeset
|
2809 if (!dmf_write_be32(fp, iff.idsig)) |
1896
f80b2dc77c30
Work begins on IFF ILBM/PBM image writer. It is pretty broken, some things
Matti Hamalainen <ccr@tnsp.org>
parents:
1895
diff
changeset
|
2810 { |
f80b2dc77c30
Work begins on IFF ILBM/PBM image writer. It is pretty broken, some things
Matti Hamalainen <ccr@tnsp.org>
parents:
1895
diff
changeset
|
2811 res = dmError(DMERR_FWRITE, |
f80b2dc77c30
Work begins on IFF ILBM/PBM image writer. It is pretty broken, some things
Matti Hamalainen <ccr@tnsp.org>
parents:
1895
diff
changeset
|
2812 "IFF: Error writing %s signature.\n", |
2064
3617ef01c1de
Separate ILBM and PBM subformats of IFF images.
Matti Hamalainen <ccr@tnsp.org>
parents:
2063
diff
changeset
|
2813 iff.idstr); |
1896
f80b2dc77c30
Work begins on IFF ILBM/PBM image writer. It is pretty broken, some things
Matti Hamalainen <ccr@tnsp.org>
parents:
1895
diff
changeset
|
2814 goto out; |
f80b2dc77c30
Work begins on IFF ILBM/PBM image writer. It is pretty broken, some things
Matti Hamalainen <ccr@tnsp.org>
parents:
1895
diff
changeset
|
2815 } |
f80b2dc77c30
Work begins on IFF ILBM/PBM image writer. It is pretty broken, some things
Matti Hamalainen <ccr@tnsp.org>
parents:
1895
diff
changeset
|
2816 |
f80b2dc77c30
Work begins on IFF ILBM/PBM image writer. It is pretty broken, some things
Matti Hamalainen <ccr@tnsp.org>
parents:
1895
diff
changeset
|
2817 // Write BMHD chunk and data |
f80b2dc77c30
Work begins on IFF ILBM/PBM image writer. It is pretty broken, some things
Matti Hamalainen <ccr@tnsp.org>
parents:
1895
diff
changeset
|
2818 if ((res = dmWriteIFFChunkHdr(fp, &iff.chBMHD, IFF_ID_BMHD)) != DMERR_OK || |
f80b2dc77c30
Work begins on IFF ILBM/PBM image writer. It is pretty broken, some things
Matti Hamalainen <ccr@tnsp.org>
parents:
1895
diff
changeset
|
2819 !dmf_write_be16(fp, iff.bmhd.w) || |
f80b2dc77c30
Work begins on IFF ILBM/PBM image writer. It is pretty broken, some things
Matti Hamalainen <ccr@tnsp.org>
parents:
1895
diff
changeset
|
2820 !dmf_write_be16(fp, iff.bmhd.h) || |
f80b2dc77c30
Work begins on IFF ILBM/PBM image writer. It is pretty broken, some things
Matti Hamalainen <ccr@tnsp.org>
parents:
1895
diff
changeset
|
2821 !dmf_write_be16(fp, iff.bmhd.x) || |
f80b2dc77c30
Work begins on IFF ILBM/PBM image writer. It is pretty broken, some things
Matti Hamalainen <ccr@tnsp.org>
parents:
1895
diff
changeset
|
2822 !dmf_write_be16(fp, iff.bmhd.y) || |
f80b2dc77c30
Work begins on IFF ILBM/PBM image writer. It is pretty broken, some things
Matti Hamalainen <ccr@tnsp.org>
parents:
1895
diff
changeset
|
2823 !dmf_write_byte(fp, iff.bmhd.nplanes) || |
f80b2dc77c30
Work begins on IFF ILBM/PBM image writer. It is pretty broken, some things
Matti Hamalainen <ccr@tnsp.org>
parents:
1895
diff
changeset
|
2824 !dmf_write_byte(fp, iff.bmhd.masking) || |
f80b2dc77c30
Work begins on IFF ILBM/PBM image writer. It is pretty broken, some things
Matti Hamalainen <ccr@tnsp.org>
parents:
1895
diff
changeset
|
2825 !dmf_write_byte(fp, iff.bmhd.compression) || |
f80b2dc77c30
Work begins on IFF ILBM/PBM image writer. It is pretty broken, some things
Matti Hamalainen <ccr@tnsp.org>
parents:
1895
diff
changeset
|
2826 !dmf_write_byte(fp, iff.bmhd.pad1) || |
f80b2dc77c30
Work begins on IFF ILBM/PBM image writer. It is pretty broken, some things
Matti Hamalainen <ccr@tnsp.org>
parents:
1895
diff
changeset
|
2827 !dmf_write_be16(fp, iff.bmhd.transp) || |
f80b2dc77c30
Work begins on IFF ILBM/PBM image writer. It is pretty broken, some things
Matti Hamalainen <ccr@tnsp.org>
parents:
1895
diff
changeset
|
2828 !dmf_write_byte(fp, iff.bmhd.xasp) || |
f80b2dc77c30
Work begins on IFF ILBM/PBM image writer. It is pretty broken, some things
Matti Hamalainen <ccr@tnsp.org>
parents:
1895
diff
changeset
|
2829 !dmf_write_byte(fp, iff.bmhd.yasp) || |
f80b2dc77c30
Work begins on IFF ILBM/PBM image writer. It is pretty broken, some things
Matti Hamalainen <ccr@tnsp.org>
parents:
1895
diff
changeset
|
2830 !dmf_write_be16(fp, iff.bmhd.pagew) || |
f80b2dc77c30
Work begins on IFF ILBM/PBM image writer. It is pretty broken, some things
Matti Hamalainen <ccr@tnsp.org>
parents:
1895
diff
changeset
|
2831 !dmf_write_be16(fp, iff.bmhd.pageh)) |
f80b2dc77c30
Work begins on IFF ILBM/PBM image writer. It is pretty broken, some things
Matti Hamalainen <ccr@tnsp.org>
parents:
1895
diff
changeset
|
2832 { |
f80b2dc77c30
Work begins on IFF ILBM/PBM image writer. It is pretty broken, some things
Matti Hamalainen <ccr@tnsp.org>
parents:
1895
diff
changeset
|
2833 res = dmError(DMERR_FWRITE, |
f80b2dc77c30
Work begins on IFF ILBM/PBM image writer. It is pretty broken, some things
Matti Hamalainen <ccr@tnsp.org>
parents:
1895
diff
changeset
|
2834 "IFF: Error writing BMHD chunk.\n"); |
f80b2dc77c30
Work begins on IFF ILBM/PBM image writer. It is pretty broken, some things
Matti Hamalainen <ccr@tnsp.org>
parents:
1895
diff
changeset
|
2835 goto out; |
f80b2dc77c30
Work begins on IFF ILBM/PBM image writer. It is pretty broken, some things
Matti Hamalainen <ccr@tnsp.org>
parents:
1895
diff
changeset
|
2836 } |
f80b2dc77c30
Work begins on IFF ILBM/PBM image writer. It is pretty broken, some things
Matti Hamalainen <ccr@tnsp.org>
parents:
1895
diff
changeset
|
2837 |
f80b2dc77c30
Work begins on IFF ILBM/PBM image writer. It is pretty broken, some things
Matti Hamalainen <ccr@tnsp.org>
parents:
1895
diff
changeset
|
2838 if ((res = dmWriteIFFChunkFinish(fp, &iff.chBMHD)) != DMERR_OK) |
f80b2dc77c30
Work begins on IFF ILBM/PBM image writer. It is pretty broken, some things
Matti Hamalainen <ccr@tnsp.org>
parents:
1895
diff
changeset
|
2839 goto out; |
f80b2dc77c30
Work begins on IFF ILBM/PBM image writer. It is pretty broken, some things
Matti Hamalainen <ccr@tnsp.org>
parents:
1895
diff
changeset
|
2840 |
f80b2dc77c30
Work begins on IFF ILBM/PBM image writer. It is pretty broken, some things
Matti Hamalainen <ccr@tnsp.org>
parents:
1895
diff
changeset
|
2841 // |
f80b2dc77c30
Work begins on IFF ILBM/PBM image writer. It is pretty broken, some things
Matti Hamalainen <ccr@tnsp.org>
parents:
1895
diff
changeset
|
2842 // CMAP |
f80b2dc77c30
Work begins on IFF ILBM/PBM image writer. It is pretty broken, some things
Matti Hamalainen <ccr@tnsp.org>
parents:
1895
diff
changeset
|
2843 // |
2157
9a9493809b3a
Rename DM_COLFMT_* constants to DM_PIXFMT_* and the 'format' field of DMImage
Matti Hamalainen <ccr@tnsp.org>
parents:
2156
diff
changeset
|
2844 if (spec->pixfmt == DM_PIXFMT_PALETTE && |
2153
7652b3fe8f30
Fix IFF and PCX checks for non-indexed images.
Matti Hamalainen <ccr@tnsp.org>
parents:
2145
diff
changeset
|
2845 img->pal != NULL && |
7652b3fe8f30
Fix IFF and PCX checks for non-indexed images.
Matti Hamalainen <ccr@tnsp.org>
parents:
2145
diff
changeset
|
2846 img->pal->ncolors > 0) |
1896
f80b2dc77c30
Work begins on IFF ILBM/PBM image writer. It is pretty broken, some things
Matti Hamalainen <ccr@tnsp.org>
parents:
1895
diff
changeset
|
2847 { |
f80b2dc77c30
Work begins on IFF ILBM/PBM image writer. It is pretty broken, some things
Matti Hamalainen <ccr@tnsp.org>
parents:
1895
diff
changeset
|
2848 if ((res = dmWriteIFFChunkHdr(fp, &iff.chCMAP, IFF_ID_CMAP)) != DMERR_OK) |
f80b2dc77c30
Work begins on IFF ILBM/PBM image writer. It is pretty broken, some things
Matti Hamalainen <ccr@tnsp.org>
parents:
1895
diff
changeset
|
2849 goto out; |
f80b2dc77c30
Work begins on IFF ILBM/PBM image writer. It is pretty broken, some things
Matti Hamalainen <ccr@tnsp.org>
parents:
1895
diff
changeset
|
2850 |
2094
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
2851 if ((res = dmPaletteWriteData(fp, img->pal, img->pal->ncolors, -1)) != DMERR_OK) |
1896
f80b2dc77c30
Work begins on IFF ILBM/PBM image writer. It is pretty broken, some things
Matti Hamalainen <ccr@tnsp.org>
parents:
1895
diff
changeset
|
2852 { |
2094
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
2853 res = dmError(DMERR_FWRITE, |
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
2854 "IFF: Could not write CMAP palette.\n"); |
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
2855 goto out; |
1896
f80b2dc77c30
Work begins on IFF ILBM/PBM image writer. It is pretty broken, some things
Matti Hamalainen <ccr@tnsp.org>
parents:
1895
diff
changeset
|
2856 } |
f80b2dc77c30
Work begins on IFF ILBM/PBM image writer. It is pretty broken, some things
Matti Hamalainen <ccr@tnsp.org>
parents:
1895
diff
changeset
|
2857 |
f80b2dc77c30
Work begins on IFF ILBM/PBM image writer. It is pretty broken, some things
Matti Hamalainen <ccr@tnsp.org>
parents:
1895
diff
changeset
|
2858 if ((res = dmWriteIFFChunkFinish(fp, &iff.chCMAP)) != DMERR_OK) |
f80b2dc77c30
Work begins on IFF ILBM/PBM image writer. It is pretty broken, some things
Matti Hamalainen <ccr@tnsp.org>
parents:
1895
diff
changeset
|
2859 goto out; |
f80b2dc77c30
Work begins on IFF ILBM/PBM image writer. It is pretty broken, some things
Matti Hamalainen <ccr@tnsp.org>
parents:
1895
diff
changeset
|
2860 |
f80b2dc77c30
Work begins on IFF ILBM/PBM image writer. It is pretty broken, some things
Matti Hamalainen <ccr@tnsp.org>
parents:
1895
diff
changeset
|
2861 dmMsg(2, "IFF: CMAP %d entries (%d bytes)\n", |
2094
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
2862 img->pal->ncolors, iff.chCMAP.size); |
1896
f80b2dc77c30
Work begins on IFF ILBM/PBM image writer. It is pretty broken, some things
Matti Hamalainen <ccr@tnsp.org>
parents:
1895
diff
changeset
|
2863 } |
f80b2dc77c30
Work begins on IFF ILBM/PBM image writer. It is pretty broken, some things
Matti Hamalainen <ccr@tnsp.org>
parents:
1895
diff
changeset
|
2864 |
f80b2dc77c30
Work begins on IFF ILBM/PBM image writer. It is pretty broken, some things
Matti Hamalainen <ccr@tnsp.org>
parents:
1895
diff
changeset
|
2865 // |
f80b2dc77c30
Work begins on IFF ILBM/PBM image writer. It is pretty broken, some things
Matti Hamalainen <ccr@tnsp.org>
parents:
1895
diff
changeset
|
2866 // CAMG |
f80b2dc77c30
Work begins on IFF ILBM/PBM image writer. It is pretty broken, some things
Matti Hamalainen <ccr@tnsp.org>
parents:
1895
diff
changeset
|
2867 // |
f80b2dc77c30
Work begins on IFF ILBM/PBM image writer. It is pretty broken, some things
Matti Hamalainen <ccr@tnsp.org>
parents:
1895
diff
changeset
|
2868 if ((res = dmWriteIFFChunkHdr(fp, &iff.chCMAP, IFF_ID_CAMG)) != DMERR_OK) |
f80b2dc77c30
Work begins on IFF ILBM/PBM image writer. It is pretty broken, some things
Matti Hamalainen <ccr@tnsp.org>
parents:
1895
diff
changeset
|
2869 goto out; |
f80b2dc77c30
Work begins on IFF ILBM/PBM image writer. It is pretty broken, some things
Matti Hamalainen <ccr@tnsp.org>
parents:
1895
diff
changeset
|
2870 |
f80b2dc77c30
Work begins on IFF ILBM/PBM image writer. It is pretty broken, some things
Matti Hamalainen <ccr@tnsp.org>
parents:
1895
diff
changeset
|
2871 if (!dmf_write_be32(fp, iff.camg)) |
f80b2dc77c30
Work begins on IFF ILBM/PBM image writer. It is pretty broken, some things
Matti Hamalainen <ccr@tnsp.org>
parents:
1895
diff
changeset
|
2872 { |
f80b2dc77c30
Work begins on IFF ILBM/PBM image writer. It is pretty broken, some things
Matti Hamalainen <ccr@tnsp.org>
parents:
1895
diff
changeset
|
2873 return dmError(DMERR_FREAD, |
f80b2dc77c30
Work begins on IFF ILBM/PBM image writer. It is pretty broken, some things
Matti Hamalainen <ccr@tnsp.org>
parents:
1895
diff
changeset
|
2874 "IFF: Error writing CAMG chunk.\n"); |
f80b2dc77c30
Work begins on IFF ILBM/PBM image writer. It is pretty broken, some things
Matti Hamalainen <ccr@tnsp.org>
parents:
1895
diff
changeset
|
2875 } |
f80b2dc77c30
Work begins on IFF ILBM/PBM image writer. It is pretty broken, some things
Matti Hamalainen <ccr@tnsp.org>
parents:
1895
diff
changeset
|
2876 |
f80b2dc77c30
Work begins on IFF ILBM/PBM image writer. It is pretty broken, some things
Matti Hamalainen <ccr@tnsp.org>
parents:
1895
diff
changeset
|
2877 if ((res = dmWriteIFFChunkFinish(fp, &iff.chCMAP)) != DMERR_OK) |
f80b2dc77c30
Work begins on IFF ILBM/PBM image writer. It is pretty broken, some things
Matti Hamalainen <ccr@tnsp.org>
parents:
1895
diff
changeset
|
2878 goto out; |
f80b2dc77c30
Work begins on IFF ILBM/PBM image writer. It is pretty broken, some things
Matti Hamalainen <ccr@tnsp.org>
parents:
1895
diff
changeset
|
2879 |
2050
416af5a842ec
Fixes to the ByteRun1 encoder. Could use some cleanups now, tho.
Matti Hamalainen <ccr@tnsp.org>
parents:
2049
diff
changeset
|
2880 |
1896
f80b2dc77c30
Work begins on IFF ILBM/PBM image writer. It is pretty broken, some things
Matti Hamalainen <ccr@tnsp.org>
parents:
1895
diff
changeset
|
2881 // |
f80b2dc77c30
Work begins on IFF ILBM/PBM image writer. It is pretty broken, some things
Matti Hamalainen <ccr@tnsp.org>
parents:
1895
diff
changeset
|
2882 // Encode the body |
f80b2dc77c30
Work begins on IFF ILBM/PBM image writer. It is pretty broken, some things
Matti Hamalainen <ccr@tnsp.org>
parents:
1895
diff
changeset
|
2883 // |
2069 | 2884 if ((res = dmWriteIFFChunkHdr(fp, &iff.chBODY, |
2885 (iff.idsig == IFF_ID_ACBM) ? IFF_ID_ABIT : IFF_ID_BODY)) != DMERR_OK) | |
1896
f80b2dc77c30
Work begins on IFF ILBM/PBM image writer. It is pretty broken, some things
Matti Hamalainen <ccr@tnsp.org>
parents:
1895
diff
changeset
|
2886 goto out; |
f80b2dc77c30
Work begins on IFF ILBM/PBM image writer. It is pretty broken, some things
Matti Hamalainen <ccr@tnsp.org>
parents:
1895
diff
changeset
|
2887 |
1904 | 2888 // Allocate encoding buffer |
2064
3617ef01c1de
Separate ILBM and PBM subformats of IFF images.
Matti Hamalainen <ccr@tnsp.org>
parents:
2063
diff
changeset
|
2889 if (iff.idsig == IFF_ID_ILBM) |
2082
a0a6f5a3fbbf
Fix plane buffer size calculation for IFF ACBM to round up to nearest byte (minimum of 1).
Matti Hamalainen <ccr@tnsp.org>
parents:
2081
diff
changeset
|
2890 bufLen = ((img->width * spec->scaleX + 15) / 16) * 2; |
1904 | 2891 else |
2069 | 2892 if (iff.idsig == IFF_ID_ACBM) |
2082
a0a6f5a3fbbf
Fix plane buffer size calculation for IFF ACBM to round up to nearest byte (minimum of 1).
Matti Hamalainen <ccr@tnsp.org>
parents:
2081
diff
changeset
|
2893 bufLen = (img->width * spec->scaleX * img->height * spec->scaleY + 7) / 8; |
2069 | 2894 else |
1904 | 2895 bufLen = img->width * spec->scaleX; |
2896 | |
2384
36edd316184a
Fix some format strings to use proper PRI*_SIZE_T where necessary.
Matti Hamalainen <ccr@tnsp.org>
parents:
2371
diff
changeset
|
2897 dmMsg(2, "IFF: Line/plane row size %" DM_PRIu_SIZE_T " bytes.\n", |
36edd316184a
Fix some format strings to use proper PRI*_SIZE_T where necessary.
Matti Hamalainen <ccr@tnsp.org>
parents:
2371
diff
changeset
|
2898 bufLen); |
1904 | 2899 |
2900 if ((buf = dmMalloc(bufLen)) == NULL) | |
2901 return DMERR_MALLOC; | |
2902 | |
2903 // Encode the body | |
2069 | 2904 if (iff.idsig == IFF_ID_ACBM) |
2905 { | |
2906 for (int plane = 0; plane < iff.bmhd.nplanes; plane++) | |
2907 { | |
2908 // Encode bitplane | |
2414
69a5af2eb1ea
Remove useless dmMemset().
Matti Hamalainen <ccr@tnsp.org>
parents:
2393
diff
changeset
|
2909 memset(buf, 0, bufLen); |
2069 | 2910 |
2911 for (int yc = 0; yc < img->height * spec->scaleY; yc++) | |
2912 { | |
2913 Uint8 *sp = img->data + (yc * img->pitch); | |
2914 Uint8 *dp = buf + (yc * img->width * spec->scaleX) / 8; | |
2915 for (int xc = 0; xc < img->width * spec->scaleX; xc++) | |
2916 dp[xc / 8] |= ((sp[xc / spec->scaleX] >> plane) & 1) << (7 - (xc & 7)); | |
2917 } | |
2918 | |
2919 if (!dmIFFWriteOneRow(fp, &iff, buf, bufLen)) | |
2920 { | |
2921 res = dmError(DMERR_FWRITE, | |
2922 "IFF: Error writing ACBM image plane %d.\n", | |
2923 plane); | |
2924 goto out; | |
2925 } | |
2926 } | |
2927 } | |
2928 else | |
1896
f80b2dc77c30
Work begins on IFF ILBM/PBM image writer. It is pretty broken, some things
Matti Hamalainen <ccr@tnsp.org>
parents:
1895
diff
changeset
|
2929 { |
2064
3617ef01c1de
Separate ILBM and PBM subformats of IFF images.
Matti Hamalainen <ccr@tnsp.org>
parents:
2063
diff
changeset
|
2930 for (int yc = 0; yc < img->height; yc++) |
3617ef01c1de
Separate ILBM and PBM subformats of IFF images.
Matti Hamalainen <ccr@tnsp.org>
parents:
2063
diff
changeset
|
2931 for (int yscale = 0; yscale < spec->scaleY; yscale++) |
1904 | 2932 { |
2064
3617ef01c1de
Separate ILBM and PBM subformats of IFF images.
Matti Hamalainen <ccr@tnsp.org>
parents:
2063
diff
changeset
|
2933 const Uint8 *sp = img->data + (yc * img->pitch); |
3617ef01c1de
Separate ILBM and PBM subformats of IFF images.
Matti Hamalainen <ccr@tnsp.org>
parents:
2063
diff
changeset
|
2934 |
3617ef01c1de
Separate ILBM and PBM subformats of IFF images.
Matti Hamalainen <ccr@tnsp.org>
parents:
2063
diff
changeset
|
2935 if (iff.idsig == IFF_ID_ILBM) |
1904 | 2936 { |
2064
3617ef01c1de
Separate ILBM and PBM subformats of IFF images.
Matti Hamalainen <ccr@tnsp.org>
parents:
2063
diff
changeset
|
2937 for (int plane = 0; plane < spec->nplanes; plane++) |
1904 | 2938 { |
2064
3617ef01c1de
Separate ILBM and PBM subformats of IFF images.
Matti Hamalainen <ccr@tnsp.org>
parents:
2063
diff
changeset
|
2939 // Encode bitplane |
2414
69a5af2eb1ea
Remove useless dmMemset().
Matti Hamalainen <ccr@tnsp.org>
parents:
2393
diff
changeset
|
2940 memset(buf, 0, bufLen); |
2064
3617ef01c1de
Separate ILBM and PBM subformats of IFF images.
Matti Hamalainen <ccr@tnsp.org>
parents:
2063
diff
changeset
|
2941 |
3617ef01c1de
Separate ILBM and PBM subformats of IFF images.
Matti Hamalainen <ccr@tnsp.org>
parents:
2063
diff
changeset
|
2942 for (int xc = 0; xc < img->width * spec->scaleX; xc++) |
3617ef01c1de
Separate ILBM and PBM subformats of IFF images.
Matti Hamalainen <ccr@tnsp.org>
parents:
2063
diff
changeset
|
2943 buf[xc / 8] |= ((sp[xc / spec->scaleX] >> plane) & 1) << (7 - (xc & 7)); |
3617ef01c1de
Separate ILBM and PBM subformats of IFF images.
Matti Hamalainen <ccr@tnsp.org>
parents:
2063
diff
changeset
|
2944 |
3617ef01c1de
Separate ILBM and PBM subformats of IFF images.
Matti Hamalainen <ccr@tnsp.org>
parents:
2063
diff
changeset
|
2945 // Compress / write data |
3617ef01c1de
Separate ILBM and PBM subformats of IFF images.
Matti Hamalainen <ccr@tnsp.org>
parents:
2063
diff
changeset
|
2946 if (!dmIFFWriteOneRow(fp, &iff, buf, bufLen)) |
3617ef01c1de
Separate ILBM and PBM subformats of IFF images.
Matti Hamalainen <ccr@tnsp.org>
parents:
2063
diff
changeset
|
2947 { |
3617ef01c1de
Separate ILBM and PBM subformats of IFF images.
Matti Hamalainen <ccr@tnsp.org>
parents:
2063
diff
changeset
|
2948 res = dmError(DMERR_FWRITE, |
3617ef01c1de
Separate ILBM and PBM subformats of IFF images.
Matti Hamalainen <ccr@tnsp.org>
parents:
2063
diff
changeset
|
2949 "IFF: Error writing ILBM image plane #%d @ row %d.\n", |
3617ef01c1de
Separate ILBM and PBM subformats of IFF images.
Matti Hamalainen <ccr@tnsp.org>
parents:
2063
diff
changeset
|
2950 plane, yc); |
3617ef01c1de
Separate ILBM and PBM subformats of IFF images.
Matti Hamalainen <ccr@tnsp.org>
parents:
2063
diff
changeset
|
2951 goto out; |
3617ef01c1de
Separate ILBM and PBM subformats of IFF images.
Matti Hamalainen <ccr@tnsp.org>
parents:
2063
diff
changeset
|
2952 } |
3617ef01c1de
Separate ILBM and PBM subformats of IFF images.
Matti Hamalainen <ccr@tnsp.org>
parents:
2063
diff
changeset
|
2953 } |
3617ef01c1de
Separate ILBM and PBM subformats of IFF images.
Matti Hamalainen <ccr@tnsp.org>
parents:
2063
diff
changeset
|
2954 |
3617ef01c1de
Separate ILBM and PBM subformats of IFF images.
Matti Hamalainen <ccr@tnsp.org>
parents:
2063
diff
changeset
|
2955 // Write mask data, if any |
3617ef01c1de
Separate ILBM and PBM subformats of IFF images.
Matti Hamalainen <ccr@tnsp.org>
parents:
2063
diff
changeset
|
2956 if (iff.bmhd.masking == IFF_MASK_HAS_MASK) |
3617ef01c1de
Separate ILBM and PBM subformats of IFF images.
Matti Hamalainen <ccr@tnsp.org>
parents:
2063
diff
changeset
|
2957 { |
2414
69a5af2eb1ea
Remove useless dmMemset().
Matti Hamalainen <ccr@tnsp.org>
parents:
2393
diff
changeset
|
2958 memset(buf, 0, bufLen); |
2064
3617ef01c1de
Separate ILBM and PBM subformats of IFF images.
Matti Hamalainen <ccr@tnsp.org>
parents:
2063
diff
changeset
|
2959 |
3617ef01c1de
Separate ILBM and PBM subformats of IFF images.
Matti Hamalainen <ccr@tnsp.org>
parents:
2063
diff
changeset
|
2960 for (int xc = 0; xc < img->width * spec->scaleX; xc++) |
2094
4276b8c0fef0
Revamp how the DMImage palette system and color formats work, as preparation
Matti Hamalainen <ccr@tnsp.org>
parents:
2093
diff
changeset
|
2961 buf[xc / 8] |= (sp[xc / spec->scaleX] == img->pal->ctransp) << (7 - (xc & 7)); |
2064
3617ef01c1de
Separate ILBM and PBM subformats of IFF images.
Matti Hamalainen <ccr@tnsp.org>
parents:
2063
diff
changeset
|
2962 |
3617ef01c1de
Separate ILBM and PBM subformats of IFF images.
Matti Hamalainen <ccr@tnsp.org>
parents:
2063
diff
changeset
|
2963 if (!dmIFFWriteOneRow(fp, &iff, buf, bufLen)) |
3617ef01c1de
Separate ILBM and PBM subformats of IFF images.
Matti Hamalainen <ccr@tnsp.org>
parents:
2063
diff
changeset
|
2964 { |
3617ef01c1de
Separate ILBM and PBM subformats of IFF images.
Matti Hamalainen <ccr@tnsp.org>
parents:
2063
diff
changeset
|
2965 res = dmError(DMERR_FWRITE, |
3617ef01c1de
Separate ILBM and PBM subformats of IFF images.
Matti Hamalainen <ccr@tnsp.org>
parents:
2063
diff
changeset
|
2966 "IFF: Error writing ILBM mask plane %d.\n", yc); |
3617ef01c1de
Separate ILBM and PBM subformats of IFF images.
Matti Hamalainen <ccr@tnsp.org>
parents:
2063
diff
changeset
|
2967 goto out; |
3617ef01c1de
Separate ILBM and PBM subformats of IFF images.
Matti Hamalainen <ccr@tnsp.org>
parents:
2063
diff
changeset
|
2968 } |
1904 | 2969 } |
2970 } | |
2064
3617ef01c1de
Separate ILBM and PBM subformats of IFF images.
Matti Hamalainen <ccr@tnsp.org>
parents:
2063
diff
changeset
|
2971 else |
1904 | 2972 { |
2973 for (int xc = 0; xc < img->width * spec->scaleX; xc++) | |
2064
3617ef01c1de
Separate ILBM and PBM subformats of IFF images.
Matti Hamalainen <ccr@tnsp.org>
parents:
2063
diff
changeset
|
2974 buf[xc] = sp[xc / spec->scaleX]; |
1904 | 2975 |
2976 if (!dmIFFWriteOneRow(fp, &iff, buf, bufLen)) | |
2977 { | |
2978 res = dmError(DMERR_FWRITE, | |
2064
3617ef01c1de
Separate ILBM and PBM subformats of IFF images.
Matti Hamalainen <ccr@tnsp.org>
parents:
2063
diff
changeset
|
2979 "IFF: Error writing PBM image row #%d.\n", yc); |
1904 | 2980 goto out; |
2981 } | |
2982 } | |
2983 } | |
1896
f80b2dc77c30
Work begins on IFF ILBM/PBM image writer. It is pretty broken, some things
Matti Hamalainen <ccr@tnsp.org>
parents:
1895
diff
changeset
|
2984 } |
f80b2dc77c30
Work begins on IFF ILBM/PBM image writer. It is pretty broken, some things
Matti Hamalainen <ccr@tnsp.org>
parents:
1895
diff
changeset
|
2985 |
f80b2dc77c30
Work begins on IFF ILBM/PBM image writer. It is pretty broken, some things
Matti Hamalainen <ccr@tnsp.org>
parents:
1895
diff
changeset
|
2986 if ((res = dmWriteIFFChunkFinish(fp, &iff.chBODY)) != DMERR_OK) |
f80b2dc77c30
Work begins on IFF ILBM/PBM image writer. It is pretty broken, some things
Matti Hamalainen <ccr@tnsp.org>
parents:
1895
diff
changeset
|
2987 goto out; |
f80b2dc77c30
Work begins on IFF ILBM/PBM image writer. It is pretty broken, some things
Matti Hamalainen <ccr@tnsp.org>
parents:
1895
diff
changeset
|
2988 |
f80b2dc77c30
Work begins on IFF ILBM/PBM image writer. It is pretty broken, some things
Matti Hamalainen <ccr@tnsp.org>
parents:
1895
diff
changeset
|
2989 // Finish the FORM chunk |
f80b2dc77c30
Work begins on IFF ILBM/PBM image writer. It is pretty broken, some things
Matti Hamalainen <ccr@tnsp.org>
parents:
1895
diff
changeset
|
2990 if ((res = dmWriteIFFChunkFinish(fp, &iff.chFORM)) != DMERR_OK) |
f80b2dc77c30
Work begins on IFF ILBM/PBM image writer. It is pretty broken, some things
Matti Hamalainen <ccr@tnsp.org>
parents:
1895
diff
changeset
|
2991 goto out; |
f80b2dc77c30
Work begins on IFF ILBM/PBM image writer. It is pretty broken, some things
Matti Hamalainen <ccr@tnsp.org>
parents:
1895
diff
changeset
|
2992 |
f80b2dc77c30
Work begins on IFF ILBM/PBM image writer. It is pretty broken, some things
Matti Hamalainen <ccr@tnsp.org>
parents:
1895
diff
changeset
|
2993 out: |
1904 | 2994 dmFree(buf); |
1896
f80b2dc77c30
Work begins on IFF ILBM/PBM image writer. It is pretty broken, some things
Matti Hamalainen <ccr@tnsp.org>
parents:
1895
diff
changeset
|
2995 return res; |
f80b2dc77c30
Work begins on IFF ILBM/PBM image writer. It is pretty broken, some things
Matti Hamalainen <ccr@tnsp.org>
parents:
1895
diff
changeset
|
2996 } |
f80b2dc77c30
Work begins on IFF ILBM/PBM image writer. It is pretty broken, some things
Matti Hamalainen <ccr@tnsp.org>
parents:
1895
diff
changeset
|
2997 |
f80b2dc77c30
Work begins on IFF ILBM/PBM image writer. It is pretty broken, some things
Matti Hamalainen <ccr@tnsp.org>
parents:
1895
diff
changeset
|
2998 |
1613
70b04c16aa40
Move format probe functions near to their other functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
1609
diff
changeset
|
2999 // |
70b04c16aa40
Move format probe functions near to their other functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
1609
diff
changeset
|
3000 // List of formats |
70b04c16aa40
Move format probe functions near to their other functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
1609
diff
changeset
|
3001 // |
1616
36d073c45327
Refactor the format handling a bit.
Matti Hamalainen <ccr@tnsp.org>
parents:
1615
diff
changeset
|
3002 const DMImageFormat dmImageFormatList[] = |
435 | 3003 { |
1616
36d073c45327
Refactor the format handling a bit.
Matti Hamalainen <ccr@tnsp.org>
parents:
1615
diff
changeset
|
3004 #ifdef DM_USE_LIBPNG |
435 | 3005 { |
1616
36d073c45327
Refactor the format handling a bit.
Matti Hamalainen <ccr@tnsp.org>
parents:
1615
diff
changeset
|
3006 "png", "Portable Network Graphics", |
2157
9a9493809b3a
Rename DM_COLFMT_* constants to DM_PIXFMT_* and the 'format' field of DMImage
Matti Hamalainen <ccr@tnsp.org>
parents:
2156
diff
changeset
|
3007 DM_IMGFMT_PNG, DM_FMT_RDWR | DM_PIXFMT_ANY, |
1886
1af79412f249
Remove the stdio FILE support from libgfx API, now only DMResource is supported.
Matti Hamalainen <ccr@tnsp.org>
parents:
1881
diff
changeset
|
3008 fmtProbePNG, dmReadPNGImage, dmWritePNGImage, |
1616
36d073c45327
Refactor the format handling a bit.
Matti Hamalainen <ccr@tnsp.org>
parents:
1615
diff
changeset
|
3009 }, |
435 | 3010 #endif |
3011 { | |
1616
36d073c45327
Refactor the format handling a bit.
Matti Hamalainen <ccr@tnsp.org>
parents:
1615
diff
changeset
|
3012 "ppm", "Portable PixMap", |
2157
9a9493809b3a
Rename DM_COLFMT_* constants to DM_PIXFMT_* and the 'format' field of DMImage
Matti Hamalainen <ccr@tnsp.org>
parents:
2156
diff
changeset
|
3013 DM_IMGFMT_PPM, DM_FMT_RDWR | DM_PIXFMT_GRAYSCALE | DM_PIXFMT_RGB, |
2092
614b161c0aa5
Initial support for reading PPM/PGM.
Matti Hamalainen <ccr@tnsp.org>
parents:
2091
diff
changeset
|
3014 fmtProbePPM, dmReadPPMImage, dmWritePPMImage, |
435 | 3015 }, |
3016 { | |
1616
36d073c45327
Refactor the format handling a bit.
Matti Hamalainen <ccr@tnsp.org>
parents:
1615
diff
changeset
|
3017 "pcx", "Z-Soft Paintbrush", |
2157
9a9493809b3a
Rename DM_COLFMT_* constants to DM_PIXFMT_* and the 'format' field of DMImage
Matti Hamalainen <ccr@tnsp.org>
parents:
2156
diff
changeset
|
3018 DM_IMGFMT_PCX, DM_FMT_RDWR | DM_PIXFMT_PALETTE | DM_PIXFMT_RGB, |
1886
1af79412f249
Remove the stdio FILE support from libgfx API, now only DMResource is supported.
Matti Hamalainen <ccr@tnsp.org>
parents:
1881
diff
changeset
|
3019 fmtProbePCX, dmReadPCXImage, dmWritePCXImage, |
435 | 3020 }, |
3021 { | |
2071 | 3022 "ilbm", "IFF ILBM (interleaved/old DP2)", |
2157
9a9493809b3a
Rename DM_COLFMT_* constants to DM_PIXFMT_* and the 'format' field of DMImage
Matti Hamalainen <ccr@tnsp.org>
parents:
2156
diff
changeset
|
3023 DM_IMGFMT_IFF_ILBM, DM_FMT_RDWR | DM_PIXFMT_PALETTE, |
2068 | 3024 fmtProbeIFF_ILBM, dmReadIFFImage, dmWriteIFFImage, |
2064
3617ef01c1de
Separate ILBM and PBM subformats of IFF images.
Matti Hamalainen <ccr@tnsp.org>
parents:
2063
diff
changeset
|
3025 }, |
3617ef01c1de
Separate ILBM and PBM subformats of IFF images.
Matti Hamalainen <ccr@tnsp.org>
parents:
2063
diff
changeset
|
3026 { |
3617ef01c1de
Separate ILBM and PBM subformats of IFF images.
Matti Hamalainen <ccr@tnsp.org>
parents:
2063
diff
changeset
|
3027 "pbm", "IFF PBM (DP2e)", |
2157
9a9493809b3a
Rename DM_COLFMT_* constants to DM_PIXFMT_* and the 'format' field of DMImage
Matti Hamalainen <ccr@tnsp.org>
parents:
2156
diff
changeset
|
3028 DM_IMGFMT_IFF_PBM, DM_FMT_RDWR | DM_PIXFMT_PALETTE, |
2068 | 3029 fmtProbeIFF_PBM, dmReadIFFImage, dmWriteIFFImage, |
3030 }, | |
3031 { | |
3032 "acbm", "IFF ACBM (Amiga Basic)", | |
2157
9a9493809b3a
Rename DM_COLFMT_* constants to DM_PIXFMT_* and the 'format' field of DMImage
Matti Hamalainen <ccr@tnsp.org>
parents:
2156
diff
changeset
|
3033 DM_IMGFMT_IFF_ACBM, DM_FMT_RDWR | DM_PIXFMT_PALETTE, |
2068 | 3034 fmtProbeIFF_ACBM, dmReadIFFImage, dmWriteIFFImage, |
443
f7c9d1619c74
Beginnings of IFF ILBM reader. Not functional, only chunk parsing,
Matti Hamalainen <ccr@tnsp.org>
parents:
442
diff
changeset
|
3035 }, |
f7c9d1619c74
Beginnings of IFF ILBM reader. Not functional, only chunk parsing,
Matti Hamalainen <ccr@tnsp.org>
parents:
442
diff
changeset
|
3036 { |
1616
36d073c45327
Refactor the format handling a bit.
Matti Hamalainen <ccr@tnsp.org>
parents:
1615
diff
changeset
|
3037 "raw", "Plain bitplaned (planar or non-planar) RAW", |
2157
9a9493809b3a
Rename DM_COLFMT_* constants to DM_PIXFMT_* and the 'format' field of DMImage
Matti Hamalainen <ccr@tnsp.org>
parents:
2156
diff
changeset
|
3038 DM_IMGFMT_RAW, DM_FMT_WR | DM_PIXFMT_PALETTE, |
1886
1af79412f249
Remove the stdio FILE support from libgfx API, now only DMResource is supported.
Matti Hamalainen <ccr@tnsp.org>
parents:
1881
diff
changeset
|
3039 NULL, NULL, dmWriteRAWImage, |
566
d400e32b62d9
Add a slightly different raw output format.
Matti Hamalainen <ccr@tnsp.org>
parents:
487
diff
changeset
|
3040 }, |
d400e32b62d9
Add a slightly different raw output format.
Matti Hamalainen <ccr@tnsp.org>
parents:
487
diff
changeset
|
3041 { |
1616
36d073c45327
Refactor the format handling a bit.
Matti Hamalainen <ccr@tnsp.org>
parents:
1615
diff
changeset
|
3042 "araw", "IFFMaster Amiga RAW", |
2157
9a9493809b3a
Rename DM_COLFMT_* constants to DM_PIXFMT_* and the 'format' field of DMImage
Matti Hamalainen <ccr@tnsp.org>
parents:
2156
diff
changeset
|
3043 DM_IMGFMT_ARAW, DM_FMT_WR | DM_PIXFMT_PALETTE, |
1886
1af79412f249
Remove the stdio FILE support from libgfx API, now only DMResource is supported.
Matti Hamalainen <ccr@tnsp.org>
parents:
1881
diff
changeset
|
3044 NULL, NULL, dmWriteRAWImage, |
2047
3829c292df02
Add 'cdump' image output format, mainly for debugging purposes.
Matti Hamalainen <ccr@tnsp.org>
parents:
2026
diff
changeset
|
3045 }, |
3829c292df02
Add 'cdump' image output format, mainly for debugging purposes.
Matti Hamalainen <ccr@tnsp.org>
parents:
2026
diff
changeset
|
3046 { |
2057
02fa60b27af5
Correct description of 'cdump' format.
Matti Hamalainen <ccr@tnsp.org>
parents:
2055
diff
changeset
|
3047 "cdump", "'C' dump (image data only)", |
2157
9a9493809b3a
Rename DM_COLFMT_* constants to DM_PIXFMT_* and the 'format' field of DMImage
Matti Hamalainen <ccr@tnsp.org>
parents:
2156
diff
changeset
|
3048 DM_IMGFMT_CDUMP, DM_FMT_WR | DM_PIXFMT_ANY, |
2047
3829c292df02
Add 'cdump' image output format, mainly for debugging purposes.
Matti Hamalainen <ccr@tnsp.org>
parents:
2026
diff
changeset
|
3049 NULL, NULL, dmWriteCDumpImage, |
435 | 3050 } |
3051 }; | |
3052 | |
1616
36d073c45327
Refactor the format handling a bit.
Matti Hamalainen <ccr@tnsp.org>
parents:
1615
diff
changeset
|
3053 const int ndmImageFormatList = sizeof(dmImageFormatList) / sizeof(dmImageFormatList[0]); |
435 | 3054 |
1616
36d073c45327
Refactor the format handling a bit.
Matti Hamalainen <ccr@tnsp.org>
parents:
1615
diff
changeset
|
3055 |
36d073c45327
Refactor the format handling a bit.
Matti Hamalainen <ccr@tnsp.org>
parents:
1615
diff
changeset
|
3056 int dmImageProbeGeneric(const Uint8 *buf, const size_t len, const DMImageFormat **pfmt, int *index) |
435 | 3057 { |
1616
36d073c45327
Refactor the format handling a bit.
Matti Hamalainen <ccr@tnsp.org>
parents:
1615
diff
changeset
|
3058 int scoreMax = DM_PROBE_SCORE_FALSE, scoreIndex = -1; |
435 | 3059 |
1616
36d073c45327
Refactor the format handling a bit.
Matti Hamalainen <ccr@tnsp.org>
parents:
1615
diff
changeset
|
3060 for (int i = 0; i < ndmImageFormatList; i++) |
435 | 3061 { |
1616
36d073c45327
Refactor the format handling a bit.
Matti Hamalainen <ccr@tnsp.org>
parents:
1615
diff
changeset
|
3062 const DMImageFormat *fmt = &dmImageFormatList[i]; |
442
a67600e186d0
Fix probing to handle NULL probe functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
440
diff
changeset
|
3063 if (fmt->probe != NULL) |
435 | 3064 { |
442
a67600e186d0
Fix probing to handle NULL probe functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
440
diff
changeset
|
3065 int score = fmt->probe(buf, len); |
a67600e186d0
Fix probing to handle NULL probe functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
440
diff
changeset
|
3066 if (score > scoreMax) |
a67600e186d0
Fix probing to handle NULL probe functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
440
diff
changeset
|
3067 { |
a67600e186d0
Fix probing to handle NULL probe functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
440
diff
changeset
|
3068 scoreMax = score; |
a67600e186d0
Fix probing to handle NULL probe functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
440
diff
changeset
|
3069 scoreIndex = i; |
a67600e186d0
Fix probing to handle NULL probe functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
440
diff
changeset
|
3070 } |
435 | 3071 } |
3072 } | |
3073 | |
3074 if (scoreIndex >= 0) | |
3075 { | |
3076 *pfmt = &dmImageFormatList[scoreIndex]; | |
3077 *index = scoreIndex; | |
3078 return scoreMax; | |
3079 } | |
3080 else | |
3081 return DM_PROBE_SCORE_FALSE; | |
3082 } | |
2207
1ea48084055e
Add functionality for separate palette file handling, reading, writing and
Matti Hamalainen <ccr@tnsp.org>
parents:
2202
diff
changeset
|
3083 |
1ea48084055e
Add functionality for separate palette file handling, reading, writing and
Matti Hamalainen <ccr@tnsp.org>
parents:
2202
diff
changeset
|
3084 |
1ea48084055e
Add functionality for separate palette file handling, reading, writing and
Matti Hamalainen <ccr@tnsp.org>
parents:
2202
diff
changeset
|
3085 // |
1ea48084055e
Add functionality for separate palette file handling, reading, writing and
Matti Hamalainen <ccr@tnsp.org>
parents:
2202
diff
changeset
|
3086 // List of formats |
1ea48084055e
Add functionality for separate palette file handling, reading, writing and
Matti Hamalainen <ccr@tnsp.org>
parents:
2202
diff
changeset
|
3087 // |
1ea48084055e
Add functionality for separate palette file handling, reading, writing and
Matti Hamalainen <ccr@tnsp.org>
parents:
2202
diff
changeset
|
3088 const DMPaletteFormat dmPaletteFormatList[] = |
1ea48084055e
Add functionality for separate palette file handling, reading, writing and
Matti Hamalainen <ccr@tnsp.org>
parents:
2202
diff
changeset
|
3089 { |
1ea48084055e
Add functionality for separate palette file handling, reading, writing and
Matti Hamalainen <ccr@tnsp.org>
parents:
2202
diff
changeset
|
3090 { |
2209
7a0af15fbe97
Add support for 'raw' 768 byte palette files.
Matti Hamalainen <ccr@tnsp.org>
parents:
2208
diff
changeset
|
3091 "act", "Adobe Color Table palette", |
2207
1ea48084055e
Add functionality for separate palette file handling, reading, writing and
Matti Hamalainen <ccr@tnsp.org>
parents:
2202
diff
changeset
|
3092 DM_PALFMT_ACT, DM_FMT_RDWR, |
2209
7a0af15fbe97
Add support for 'raw' 768 byte palette files.
Matti Hamalainen <ccr@tnsp.org>
parents:
2208
diff
changeset
|
3093 fmtProbeACTPalette, dmReadACTPalette, dmWriteACTPalette, |
7a0af15fbe97
Add support for 'raw' 768 byte palette files.
Matti Hamalainen <ccr@tnsp.org>
parents:
2208
diff
changeset
|
3094 }, |
7a0af15fbe97
Add support for 'raw' 768 byte palette files.
Matti Hamalainen <ccr@tnsp.org>
parents:
2208
diff
changeset
|
3095 { |
7a0af15fbe97
Add support for 'raw' 768 byte palette files.
Matti Hamalainen <ccr@tnsp.org>
parents:
2208
diff
changeset
|
3096 "rpl", "RAW binary palette (RGB, 768 bytes)", |
7a0af15fbe97
Add support for 'raw' 768 byte palette files.
Matti Hamalainen <ccr@tnsp.org>
parents:
2208
diff
changeset
|
3097 DM_PALFMT_RAW, DM_FMT_RDWR, |
7a0af15fbe97
Add support for 'raw' 768 byte palette files.
Matti Hamalainen <ccr@tnsp.org>
parents:
2208
diff
changeset
|
3098 fmtProbeRAWPalette, dmReadRAWPalette, dmWriteRAWPalette, |
2207
1ea48084055e
Add functionality for separate palette file handling, reading, writing and
Matti Hamalainen <ccr@tnsp.org>
parents:
2202
diff
changeset
|
3099 }, |
1ea48084055e
Add functionality for separate palette file handling, reading, writing and
Matti Hamalainen <ccr@tnsp.org>
parents:
2202
diff
changeset
|
3100 }; |
1ea48084055e
Add functionality for separate palette file handling, reading, writing and
Matti Hamalainen <ccr@tnsp.org>
parents:
2202
diff
changeset
|
3101 |
1ea48084055e
Add functionality for separate palette file handling, reading, writing and
Matti Hamalainen <ccr@tnsp.org>
parents:
2202
diff
changeset
|
3102 const int ndmPaletteFormatList = sizeof(dmPaletteFormatList) / sizeof(dmPaletteFormatList[0]); |
1ea48084055e
Add functionality for separate palette file handling, reading, writing and
Matti Hamalainen <ccr@tnsp.org>
parents:
2202
diff
changeset
|
3103 |
1ea48084055e
Add functionality for separate palette file handling, reading, writing and
Matti Hamalainen <ccr@tnsp.org>
parents:
2202
diff
changeset
|
3104 |
1ea48084055e
Add functionality for separate palette file handling, reading, writing and
Matti Hamalainen <ccr@tnsp.org>
parents:
2202
diff
changeset
|
3105 int dmPaletteProbeGeneric(const Uint8 *buf, const size_t len, const DMPaletteFormat **pfmt, int *index) |
1ea48084055e
Add functionality for separate palette file handling, reading, writing and
Matti Hamalainen <ccr@tnsp.org>
parents:
2202
diff
changeset
|
3106 { |
1ea48084055e
Add functionality for separate palette file handling, reading, writing and
Matti Hamalainen <ccr@tnsp.org>
parents:
2202
diff
changeset
|
3107 int scoreMax = DM_PROBE_SCORE_FALSE, scoreIndex = -1; |
1ea48084055e
Add functionality for separate palette file handling, reading, writing and
Matti Hamalainen <ccr@tnsp.org>
parents:
2202
diff
changeset
|
3108 |
1ea48084055e
Add functionality for separate palette file handling, reading, writing and
Matti Hamalainen <ccr@tnsp.org>
parents:
2202
diff
changeset
|
3109 for (int i = 0; i < ndmPaletteFormatList; i++) |
1ea48084055e
Add functionality for separate palette file handling, reading, writing and
Matti Hamalainen <ccr@tnsp.org>
parents:
2202
diff
changeset
|
3110 { |
1ea48084055e
Add functionality for separate palette file handling, reading, writing and
Matti Hamalainen <ccr@tnsp.org>
parents:
2202
diff
changeset
|
3111 const DMPaletteFormat *fmt = &dmPaletteFormatList[i]; |
1ea48084055e
Add functionality for separate palette file handling, reading, writing and
Matti Hamalainen <ccr@tnsp.org>
parents:
2202
diff
changeset
|
3112 if (fmt->probe != NULL) |
1ea48084055e
Add functionality for separate palette file handling, reading, writing and
Matti Hamalainen <ccr@tnsp.org>
parents:
2202
diff
changeset
|
3113 { |
1ea48084055e
Add functionality for separate palette file handling, reading, writing and
Matti Hamalainen <ccr@tnsp.org>
parents:
2202
diff
changeset
|
3114 int score = fmt->probe(buf, len); |
1ea48084055e
Add functionality for separate palette file handling, reading, writing and
Matti Hamalainen <ccr@tnsp.org>
parents:
2202
diff
changeset
|
3115 if (score > scoreMax) |
1ea48084055e
Add functionality for separate palette file handling, reading, writing and
Matti Hamalainen <ccr@tnsp.org>
parents:
2202
diff
changeset
|
3116 { |
1ea48084055e
Add functionality for separate palette file handling, reading, writing and
Matti Hamalainen <ccr@tnsp.org>
parents:
2202
diff
changeset
|
3117 scoreMax = score; |
1ea48084055e
Add functionality for separate palette file handling, reading, writing and
Matti Hamalainen <ccr@tnsp.org>
parents:
2202
diff
changeset
|
3118 scoreIndex = i; |
1ea48084055e
Add functionality for separate palette file handling, reading, writing and
Matti Hamalainen <ccr@tnsp.org>
parents:
2202
diff
changeset
|
3119 } |
1ea48084055e
Add functionality for separate palette file handling, reading, writing and
Matti Hamalainen <ccr@tnsp.org>
parents:
2202
diff
changeset
|
3120 } |
1ea48084055e
Add functionality for separate palette file handling, reading, writing and
Matti Hamalainen <ccr@tnsp.org>
parents:
2202
diff
changeset
|
3121 } |
1ea48084055e
Add functionality for separate palette file handling, reading, writing and
Matti Hamalainen <ccr@tnsp.org>
parents:
2202
diff
changeset
|
3122 |
1ea48084055e
Add functionality for separate palette file handling, reading, writing and
Matti Hamalainen <ccr@tnsp.org>
parents:
2202
diff
changeset
|
3123 if (scoreIndex >= 0) |
1ea48084055e
Add functionality for separate palette file handling, reading, writing and
Matti Hamalainen <ccr@tnsp.org>
parents:
2202
diff
changeset
|
3124 { |
1ea48084055e
Add functionality for separate palette file handling, reading, writing and
Matti Hamalainen <ccr@tnsp.org>
parents:
2202
diff
changeset
|
3125 *pfmt = &dmPaletteFormatList[scoreIndex]; |
1ea48084055e
Add functionality for separate palette file handling, reading, writing and
Matti Hamalainen <ccr@tnsp.org>
parents:
2202
diff
changeset
|
3126 *index = scoreIndex; |
1ea48084055e
Add functionality for separate palette file handling, reading, writing and
Matti Hamalainen <ccr@tnsp.org>
parents:
2202
diff
changeset
|
3127 return scoreMax; |
1ea48084055e
Add functionality for separate palette file handling, reading, writing and
Matti Hamalainen <ccr@tnsp.org>
parents:
2202
diff
changeset
|
3128 } |
1ea48084055e
Add functionality for separate palette file handling, reading, writing and
Matti Hamalainen <ccr@tnsp.org>
parents:
2202
diff
changeset
|
3129 else |
1ea48084055e
Add functionality for separate palette file handling, reading, writing and
Matti Hamalainen <ccr@tnsp.org>
parents:
2202
diff
changeset
|
3130 return DM_PROBE_SCORE_FALSE; |
1ea48084055e
Add functionality for separate palette file handling, reading, writing and
Matti Hamalainen <ccr@tnsp.org>
parents:
2202
diff
changeset
|
3131 } |