annotate tools/libgfx.c @ 2634:f3c7115cbf85 default tip

Fix verbose build echos.
author Matti Hamalainen <ccr@tnsp.org>
date Thu, 29 Feb 2024 21:47:31 +0200
parents c3c1d3c75f53
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
435
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
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
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
3 * Programmed and designed by Matti 'ccr' Hamalainen
2539
c6ee41fd98dd Bump copyright years.
Matti Hamalainen <ccr@tnsp.org>
parents: 2467
diff changeset
4 * (C) Copyright 2012-2021 Tecnic Software productions (TNSP)
435
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
5 *
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
6 * Please read file 'COPYING' for information on license and distribution.
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
7 */
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
8 #include "libgfx.h"
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
9
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
10 #ifdef DM_USE_LIBPNG
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
11 #include <png.h>
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
12 #endif
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
13
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
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
b812fad6f33e Work on libgfx.
Matti Hamalainen <ccr@tnsp.org>
parents: 1285
diff changeset
111 int dmImageGetBytesPerPixel(const int format)
b812fad6f33e Work on libgfx.
Matti Hamalainen <ccr@tnsp.org>
parents: 1285
diff changeset
112 {
b812fad6f33e Work on libgfx.
Matti Hamalainen <ccr@tnsp.org>
parents: 1285
diff changeset
113 switch (format)
b812fad6f33e Work on libgfx.
Matti Hamalainen <ccr@tnsp.org>
parents: 1285
diff changeset
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
0562dd55a1f6 s/DM_IFMT_/DM_COLFMT_/g
Matti Hamalainen <ccr@tnsp.org>
parents: 1800
diff changeset
119 default : return -1;
1286
b812fad6f33e Work on libgfx.
Matti Hamalainen <ccr@tnsp.org>
parents: 1285
diff changeset
120 }
b812fad6f33e Work on libgfx.
Matti Hamalainen <ccr@tnsp.org>
parents: 1285
diff changeset
121 }
b812fad6f33e Work on libgfx.
Matti Hamalainen <ccr@tnsp.org>
parents: 1285
diff changeset
122
b812fad6f33e Work on libgfx.
Matti Hamalainen <ccr@tnsp.org>
parents: 1285
diff changeset
123
2091
3b3acb6b4ba0 Cleanups.
Matti Hamalainen <ccr@tnsp.org>
parents: 2086
diff changeset
124 int dmImageGetBitsPerPixel(const int format)
3b3acb6b4ba0 Cleanups.
Matti Hamalainen <ccr@tnsp.org>
parents: 2086
diff changeset
125 {
3b3acb6b4ba0 Cleanups.
Matti Hamalainen <ccr@tnsp.org>
parents: 2086
diff changeset
126 return dmImageGetBytesPerPixel(format) * 8;
3b3acb6b4ba0 Cleanups.
Matti Hamalainen <ccr@tnsp.org>
parents: 2086
diff changeset
127 }
3b3acb6b4ba0 Cleanups.
Matti Hamalainen <ccr@tnsp.org>
parents: 2086
diff changeset
128
3b3acb6b4ba0 Cleanups.
Matti Hamalainen <ccr@tnsp.org>
parents: 2086
diff changeset
129
1286
b812fad6f33e Work on libgfx.
Matti Hamalainen <ccr@tnsp.org>
parents: 1285
diff changeset
130 DMImage * dmImageAlloc(const int width, const int height, const int format, const int bpp)
435
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
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
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
133 if (img == NULL)
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
134 return NULL;
1102
e06abfde6c39 Cosmetics pass: Remove excess whitespace.
Matti Hamalainen <ccr@tnsp.org>
parents: 958
diff changeset
135
1286
b812fad6f33e Work on libgfx.
Matti Hamalainen <ccr@tnsp.org>
parents: 1285
diff changeset
136 img->width = width;
b812fad6f33e Work on libgfx.
Matti Hamalainen <ccr@tnsp.org>
parents: 1285
diff changeset
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
efbad8817b79 Some cleanups.
Matti Hamalainen <ccr@tnsp.org>
parents: 929
diff changeset
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
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
145 {
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
146 dmFree(img);
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
147 return NULL;
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
148 }
1102
e06abfde6c39 Cosmetics pass: Remove excess whitespace.
Matti Hamalainen <ccr@tnsp.org>
parents: 958
diff changeset
149
435
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
150 return img;
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
151 }
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
152
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
153
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
154 void dmImageFree(DMImage *img)
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
155 {
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
156 if (img != NULL)
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
157 {
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
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
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
161 dmFree(img->data);
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
162 dmFree(img);
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
163 }
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
164 }
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
165
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
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
455a3849b8ac Comments and cosmetics.
Matti Hamalainen <ccr@tnsp.org>
parents: 2157
diff changeset
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
455a3849b8ac Comments and cosmetics.
Matti Hamalainen <ccr@tnsp.org>
parents: 2157
diff changeset
291 static int dmPaletteWriteData(DMResource *fp, const DMPalette *pal,
455a3849b8ac Comments and cosmetics.
Matti Hamalainen <ccr@tnsp.org>
parents: 2157
diff changeset
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
2599
c3c1d3c75f53 s/DM_PROBE_SCORE_false/DM_PROBE_SCORE_FALSE/g
Matti Hamalainen <ccr@tnsp.org>
parents: 2586
diff changeset
329 return DM_PROBE_SCORE_FALSE;
2207
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
16426e9dc238 Add few comments.
Matti Hamalainen <ccr@tnsp.org>
parents: 2414
diff changeset
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
16426e9dc238 Add few comments.
Matti Hamalainen <ccr@tnsp.org>
parents: 2414
diff changeset
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
16426e9dc238 Add few comments.
Matti Hamalainen <ccr@tnsp.org>
parents: 2414
diff changeset
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
16426e9dc238 Add few comments.
Matti Hamalainen <ccr@tnsp.org>
parents: 2414
diff changeset
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
16426e9dc238 Add few comments.
Matti Hamalainen <ccr@tnsp.org>
parents: 2414
diff changeset
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
2599
c3c1d3c75f53 s/DM_PROBE_SCORE_false/DM_PROBE_SCORE_FALSE/g
Matti Hamalainen <ccr@tnsp.org>
parents: 2586
diff changeset
398 return DM_PROBE_SCORE_FALSE;
2209
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
3b3acb6b4ba0 Cleanups.
Matti Hamalainen <ccr@tnsp.org>
parents: 2086
diff changeset
432 int dmWriteImageData(const DMImage *img, void *cbdata,
3b3acb6b4ba0 Cleanups.
Matti Hamalainen <ccr@tnsp.org>
parents: 2086
diff changeset
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
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
435 {
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
436 int x, y, yscale, xscale, res = 0, rowSize, rowWidth;
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
437 Uint8 *row = NULL;
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
438
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
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
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
442
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
443 if ((row = dmMalloc(rowSize + 16)) == NULL)
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
444 {
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
445 res = DMERR_MALLOC;
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
446 goto done;
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
447 }
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
448
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
449 // Generate the image
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
450 for (y = 0; y < img->height; y++)
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
451 {
436
86f956e4580f Cosmetics, rename a variable.
Matti Hamalainen <ccr@tnsp.org>
parents: 435
diff changeset
452 Uint8 *ptr1 = row,
435
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
453 *ptr2 = ptr1 + rowWidth,
1291
2c4acbc3e7bf More work on libgfx etc.
Matti Hamalainen <ccr@tnsp.org>
parents: 1290
diff changeset
454 *ptr3 = ptr2 + rowWidth,
2c4acbc3e7bf More work on libgfx etc.
Matti Hamalainen <ccr@tnsp.org>
parents: 1290
diff changeset
455 *ptr4 = ptr3 + rowWidth;
435
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
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
e38705223ce4 Support grayscale output.
Matti Hamalainen <ccr@tnsp.org>
parents: 2096
diff changeset
458 {
e38705223ce4 Support grayscale output.
Matti Hamalainen <ccr@tnsp.org>
parents: 2096
diff changeset
459 for (x = 0; x < img->width; x++)
e38705223ce4 Support grayscale output.
Matti Hamalainen <ccr@tnsp.org>
parents: 2096
diff changeset
460 {
e38705223ce4 Support grayscale output.
Matti Hamalainen <ccr@tnsp.org>
parents: 2096
diff changeset
461 Uint8 c = img->data[(y * img->pitch) + (x * img->bpp) / 8];
e38705223ce4 Support grayscale output.
Matti Hamalainen <ccr@tnsp.org>
parents: 2096
diff changeset
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
e38705223ce4 Support grayscale output.
Matti Hamalainen <ccr@tnsp.org>
parents: 2096
diff changeset
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
e38705223ce4 Support grayscale output.
Matti Hamalainen <ccr@tnsp.org>
parents: 2096
diff changeset
467 for (xscale = 0; xscale < spec->scaleX; xscale++)
e38705223ce4 Support grayscale output.
Matti Hamalainen <ccr@tnsp.org>
parents: 2096
diff changeset
468 *ptr1++ = c;
e38705223ce4 Support grayscale output.
Matti Hamalainen <ccr@tnsp.org>
parents: 2096
diff changeset
469 break;
e38705223ce4 Support grayscale output.
Matti Hamalainen <ccr@tnsp.org>
parents: 2096
diff changeset
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
e38705223ce4 Support grayscale output.
Matti Hamalainen <ccr@tnsp.org>
parents: 2096
diff changeset
472 if (spec->planar)
e38705223ce4 Support grayscale output.
Matti Hamalainen <ccr@tnsp.org>
parents: 2096
diff changeset
473 {
e38705223ce4 Support grayscale output.
Matti Hamalainen <ccr@tnsp.org>
parents: 2096
diff changeset
474 for (xscale = 0; xscale < spec->scaleX; xscale++)
e38705223ce4 Support grayscale output.
Matti Hamalainen <ccr@tnsp.org>
parents: 2096
diff changeset
475 {
e38705223ce4 Support grayscale output.
Matti Hamalainen <ccr@tnsp.org>
parents: 2096
diff changeset
476 *ptr1++ = c;
e38705223ce4 Support grayscale output.
Matti Hamalainen <ccr@tnsp.org>
parents: 2096
diff changeset
477 *ptr2++ = c;
e38705223ce4 Support grayscale output.
Matti Hamalainen <ccr@tnsp.org>
parents: 2096
diff changeset
478 *ptr3++ = c;
e38705223ce4 Support grayscale output.
Matti Hamalainen <ccr@tnsp.org>
parents: 2096
diff changeset
479 *ptr4++ = 0xff;
e38705223ce4 Support grayscale output.
Matti Hamalainen <ccr@tnsp.org>
parents: 2096
diff changeset
480 }
e38705223ce4 Support grayscale output.
Matti Hamalainen <ccr@tnsp.org>
parents: 2096
diff changeset
481 }
e38705223ce4 Support grayscale output.
Matti Hamalainen <ccr@tnsp.org>
parents: 2096
diff changeset
482 else
e38705223ce4 Support grayscale output.
Matti Hamalainen <ccr@tnsp.org>
parents: 2096
diff changeset
483 {
e38705223ce4 Support grayscale output.
Matti Hamalainen <ccr@tnsp.org>
parents: 2096
diff changeset
484 for (xscale = 0; xscale < spec->scaleX; xscale++)
e38705223ce4 Support grayscale output.
Matti Hamalainen <ccr@tnsp.org>
parents: 2096
diff changeset
485 {
e38705223ce4 Support grayscale output.
Matti Hamalainen <ccr@tnsp.org>
parents: 2096
diff changeset
486 *ptr1++ = c;
e38705223ce4 Support grayscale output.
Matti Hamalainen <ccr@tnsp.org>
parents: 2096
diff changeset
487 *ptr1++ = c;
e38705223ce4 Support grayscale output.
Matti Hamalainen <ccr@tnsp.org>
parents: 2096
diff changeset
488 *ptr1++ = c;
e38705223ce4 Support grayscale output.
Matti Hamalainen <ccr@tnsp.org>
parents: 2096
diff changeset
489 *ptr1++ = 0xff;
e38705223ce4 Support grayscale output.
Matti Hamalainen <ccr@tnsp.org>
parents: 2096
diff changeset
490 }
e38705223ce4 Support grayscale output.
Matti Hamalainen <ccr@tnsp.org>
parents: 2096
diff changeset
491 }
e38705223ce4 Support grayscale output.
Matti Hamalainen <ccr@tnsp.org>
parents: 2096
diff changeset
492 break;
e38705223ce4 Support grayscale output.
Matti Hamalainen <ccr@tnsp.org>
parents: 2096
diff changeset
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
e38705223ce4 Support grayscale output.
Matti Hamalainen <ccr@tnsp.org>
parents: 2096
diff changeset
495 if (spec->planar)
e38705223ce4 Support grayscale output.
Matti Hamalainen <ccr@tnsp.org>
parents: 2096
diff changeset
496 {
e38705223ce4 Support grayscale output.
Matti Hamalainen <ccr@tnsp.org>
parents: 2096
diff changeset
497 for (xscale = 0; xscale < spec->scaleX; xscale++)
e38705223ce4 Support grayscale output.
Matti Hamalainen <ccr@tnsp.org>
parents: 2096
diff changeset
498 {
e38705223ce4 Support grayscale output.
Matti Hamalainen <ccr@tnsp.org>
parents: 2096
diff changeset
499 *ptr1++ = c;
e38705223ce4 Support grayscale output.
Matti Hamalainen <ccr@tnsp.org>
parents: 2096
diff changeset
500 *ptr2++ = c;
e38705223ce4 Support grayscale output.
Matti Hamalainen <ccr@tnsp.org>
parents: 2096
diff changeset
501 *ptr3++ = c;
e38705223ce4 Support grayscale output.
Matti Hamalainen <ccr@tnsp.org>
parents: 2096
diff changeset
502 }
e38705223ce4 Support grayscale output.
Matti Hamalainen <ccr@tnsp.org>
parents: 2096
diff changeset
503 }
e38705223ce4 Support grayscale output.
Matti Hamalainen <ccr@tnsp.org>
parents: 2096
diff changeset
504 else
e38705223ce4 Support grayscale output.
Matti Hamalainen <ccr@tnsp.org>
parents: 2096
diff changeset
505 {
e38705223ce4 Support grayscale output.
Matti Hamalainen <ccr@tnsp.org>
parents: 2096
diff changeset
506 for (xscale = 0; xscale < spec->scaleX; xscale++)
e38705223ce4 Support grayscale output.
Matti Hamalainen <ccr@tnsp.org>
parents: 2096
diff changeset
507 {
e38705223ce4 Support grayscale output.
Matti Hamalainen <ccr@tnsp.org>
parents: 2096
diff changeset
508 *ptr1++ = c;
e38705223ce4 Support grayscale output.
Matti Hamalainen <ccr@tnsp.org>
parents: 2096
diff changeset
509 *ptr1++ = c;
e38705223ce4 Support grayscale output.
Matti Hamalainen <ccr@tnsp.org>
parents: 2096
diff changeset
510 *ptr1++ = c;
e38705223ce4 Support grayscale output.
Matti Hamalainen <ccr@tnsp.org>
parents: 2096
diff changeset
511 }
e38705223ce4 Support grayscale output.
Matti Hamalainen <ccr@tnsp.org>
parents: 2096
diff changeset
512 }
e38705223ce4 Support grayscale output.
Matti Hamalainen <ccr@tnsp.org>
parents: 2096
diff changeset
513 break;
e38705223ce4 Support grayscale output.
Matti Hamalainen <ccr@tnsp.org>
parents: 2096
diff changeset
514
e38705223ce4 Support grayscale output.
Matti Hamalainen <ccr@tnsp.org>
parents: 2096
diff changeset
515 default:
e38705223ce4 Support grayscale output.
Matti Hamalainen <ccr@tnsp.org>
parents: 2096
diff changeset
516 res = DMERR_NOT_SUPPORTED;
e38705223ce4 Support grayscale output.
Matti Hamalainen <ccr@tnsp.org>
parents: 2096
diff changeset
517 goto done;
e38705223ce4 Support grayscale output.
Matti Hamalainen <ccr@tnsp.org>
parents: 2096
diff changeset
518 }
e38705223ce4 Support grayscale output.
Matti Hamalainen <ccr@tnsp.org>
parents: 2096
diff changeset
519 }
e38705223ce4 Support grayscale output.
Matti Hamalainen <ccr@tnsp.org>
parents: 2096
diff changeset
520 }
e38705223ce4 Support grayscale output.
Matti Hamalainen <ccr@tnsp.org>
parents: 2096
diff changeset
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
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
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
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
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
2c4acbc3e7bf More work on libgfx etc.
Matti Hamalainen <ccr@tnsp.org>
parents: 1290
diff changeset
612 if (spec->planar)
435
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
613 {
1291
2c4acbc3e7bf More work on libgfx etc.
Matti Hamalainen <ccr@tnsp.org>
parents: 1290
diff changeset
614 for (xscale = 0; xscale < spec->scaleX; xscale++)
2c4acbc3e7bf More work on libgfx etc.
Matti Hamalainen <ccr@tnsp.org>
parents: 1290
diff changeset
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
2c4acbc3e7bf More work on libgfx etc.
Matti Hamalainen <ccr@tnsp.org>
parents: 1290
diff changeset
620 }
2c4acbc3e7bf More work on libgfx etc.
Matti Hamalainen <ccr@tnsp.org>
parents: 1290
diff changeset
621 }
2c4acbc3e7bf More work on libgfx etc.
Matti Hamalainen <ccr@tnsp.org>
parents: 1290
diff changeset
622 else
2c4acbc3e7bf More work on libgfx etc.
Matti Hamalainen <ccr@tnsp.org>
parents: 1290
diff changeset
623 {
2c4acbc3e7bf More work on libgfx etc.
Matti Hamalainen <ccr@tnsp.org>
parents: 1290
diff changeset
624 for (xscale = 0; xscale < spec->scaleX; xscale++)
2c4acbc3e7bf More work on libgfx etc.
Matti Hamalainen <ccr@tnsp.org>
parents: 1290
diff changeset
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
2c4acbc3e7bf More work on libgfx etc.
Matti Hamalainen <ccr@tnsp.org>
parents: 1290
diff changeset
630 }
435
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
631 }
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
632 break;
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
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
2c4acbc3e7bf More work on libgfx etc.
Matti Hamalainen <ccr@tnsp.org>
parents: 1290
diff changeset
635 if (spec->planar)
435
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
636 {
1291
2c4acbc3e7bf More work on libgfx etc.
Matti Hamalainen <ccr@tnsp.org>
parents: 1290
diff changeset
637 for (xscale = 0; xscale < spec->scaleX; xscale++)
2c4acbc3e7bf More work on libgfx etc.
Matti Hamalainen <ccr@tnsp.org>
parents: 1290
diff changeset
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
2c4acbc3e7bf More work on libgfx etc.
Matti Hamalainen <ccr@tnsp.org>
parents: 1290
diff changeset
642 }
435
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
643 }
1291
2c4acbc3e7bf More work on libgfx etc.
Matti Hamalainen <ccr@tnsp.org>
parents: 1290
diff changeset
644 else
435
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
645 {
1291
2c4acbc3e7bf More work on libgfx etc.
Matti Hamalainen <ccr@tnsp.org>
parents: 1290
diff changeset
646 for (xscale = 0; xscale < spec->scaleX; xscale++)
2c4acbc3e7bf More work on libgfx etc.
Matti Hamalainen <ccr@tnsp.org>
parents: 1290
diff changeset
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
2c4acbc3e7bf More work on libgfx etc.
Matti Hamalainen <ccr@tnsp.org>
parents: 1290
diff changeset
651 }
435
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
652 }
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
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
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
658 }
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
659 }
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
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
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
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
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
664 goto done;
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
665 }
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
666 }
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
667
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
668 done:
1102
e06abfde6c39 Cosmetics pass: Remove excess whitespace.
Matti Hamalainen <ccr@tnsp.org>
parents: 958
diff changeset
669 dmFree(row);
435
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
670 return res;
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
671 }
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
672
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
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
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
755 {
1622
009a3e3c54bf Cleanups.
Matti Hamalainen <ccr@tnsp.org>
parents: 1621
diff changeset
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
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
762
1291
2c4acbc3e7bf More work on libgfx etc.
Matti Hamalainen <ccr@tnsp.org>
parents: 1290
diff changeset
763 if (spec->planar)
435
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
764 {
1339
65f8fd1bf76e Cleanups.
Matti Hamalainen <ccr@tnsp.org>
parents: 1309
diff changeset
765 // Output bitplanes in planar format
65f8fd1bf76e Cleanups.
Matti Hamalainen <ccr@tnsp.org>
parents: 1309
diff changeset
766 // (each plane of line sequentially)
1622
009a3e3c54bf Cleanups.
Matti Hamalainen <ccr@tnsp.org>
parents: 1621
diff changeset
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
009a3e3c54bf Cleanups.
Matti Hamalainen <ccr@tnsp.org>
parents: 1621
diff changeset
769 for (int plane = 0; plane < spec->nplanes; plane++)
435
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
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
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
773 }
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
774 }
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
775 else
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
776 {
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
777 // Output each bitplane in sequence
1622
009a3e3c54bf Cleanups.
Matti Hamalainen <ccr@tnsp.org>
parents: 1621
diff changeset
778 for (int plane = 0; plane < spec->nplanes; plane++)
009a3e3c54bf Cleanups.
Matti Hamalainen <ccr@tnsp.org>
parents: 1621
diff changeset
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
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
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
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
784 }
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
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
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
788 }
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
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
e03f20d0f785 Constify.
Matti Hamalainen <ccr@tnsp.org>
parents: 1300
diff changeset
860 static int dmWritePPMRow(void *cbdata, const Uint8 *row, const size_t len)
435
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
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
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
866 }
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
867
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
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
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
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));
2586
9807ae37ad69 Require stdbool.h, we require C11 now.
Matti Hamalainen <ccr@tnsp.org>
parents: 2572
diff changeset
884 tmpSpec.planar = false;
2212
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
6c8b19d1d196 More work on libgfx.
Matti Hamalainen <ccr@tnsp.org>
parents: 1287
diff changeset
903
435
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
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
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
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
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
917 // Write image data
1288
6c8b19d1d196 More work on libgfx.
Matti Hamalainen <ccr@tnsp.org>
parents: 1287
diff changeset
918 return dmWriteImageData(img, (void *) fp, dmWritePPMRow, &tmpSpec);
435
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
919 }
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
920
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
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
2586
9807ae37ad69 Require stdbool.h, we require C11 now.
Matti Hamalainen <ccr@tnsp.org>
parents: 2572
diff changeset
923 static bool dmReadPPMHeader(DMResource *fp, char *buf, const size_t bufLen)
2101
da886b8cbb09 Improve PPM/PGM/PNM probing and header parsing.
Matti Hamalainen <ccr@tnsp.org>
parents: 2100
diff changeset
924 {
2586
9807ae37ad69 Require stdbool.h, we require C11 now.
Matti Hamalainen <ccr@tnsp.org>
parents: 2572
diff changeset
925 bool end = false, comment = false;
2101
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)
2586
9807ae37ad69 Require stdbool.h, we require C11 now.
Matti Hamalainen <ccr@tnsp.org>
parents: 2572
diff changeset
932 return false;
2101
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 == '#')
2586
9807ae37ad69 Require stdbool.h, we require C11 now.
Matti Hamalainen <ccr@tnsp.org>
parents: 2572
diff changeset
935 comment = true;
2101
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)
2586
9807ae37ad69 Require stdbool.h, we require C11 now.
Matti Hamalainen <ccr@tnsp.org>
parents: 2572
diff changeset
940 end = true;
2101
da886b8cbb09 Improve PPM/PGM/PNM probing and header parsing.
Matti Hamalainen <ccr@tnsp.org>
parents: 2100
diff changeset
941 else
2586
9807ae37ad69 Require stdbool.h, we require C11 now.
Matti Hamalainen <ccr@tnsp.org>
parents: 2572
diff changeset
942 comment = false;
2101
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;
2586
9807ae37ad69 Require stdbool.h, we require C11 now.
Matti Hamalainen <ccr@tnsp.org>
parents: 2572
diff changeset
953 return true;
2101
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
2599
c3c1d3c75f53 s/DM_PROBE_SCORE_false/DM_PROBE_SCORE_FALSE/g
Matti Hamalainen <ccr@tnsp.org>
parents: 2586
diff changeset
1036 return DM_PROBE_SCORE_FALSE;
2092
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
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
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
2599
c3c1d3c75f53 s/DM_PROBE_SCORE_false/DM_PROBE_SCORE_FALSE/g
Matti Hamalainen <ccr@tnsp.org>
parents: 2586
diff changeset
1054 return DM_PROBE_SCORE_FALSE;
1613
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
e03f20d0f785 Constify.
Matti Hamalainen <ccr@tnsp.org>
parents: 1300
diff changeset
1058 static int dmWritePNGRow(void *cbdata, const Uint8 *row, const size_t len)
435
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1059 {
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1060 png_structp png_ptr = cbdata;
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1061 (void) len;
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1062
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
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
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1065
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1066 png_write_row(png_ptr, row);
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
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
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1069 }
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1070
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
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
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1088 {
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1089 png_structp png_ptr = NULL;
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
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
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
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
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1101 // Create PNG structures
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1102 png_ptr = png_create_write_struct(
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1103 PNG_LIBPNG_VER_STRING,
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1104 NULL, NULL, NULL);
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1105
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1106 if (png_ptr == NULL)
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
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
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1110 goto error;
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1111 }
1102
e06abfde6c39 Cosmetics pass: Remove excess whitespace.
Matti Hamalainen <ccr@tnsp.org>
parents: 958
diff changeset
1112
435
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1113 info_ptr = png_create_info_struct(png_ptr);
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1114 if (info_ptr == NULL)
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
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",
2572
92b93a12c014 Make some casts explicit instead of implicit, fixes some -pedantic warnings.
Matti Hamalainen <ccr@tnsp.org>
parents: 2539
diff changeset
1118 (void *) png_ptr);
435
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1119 goto error;
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1120 }
1102
e06abfde6c39 Cosmetics pass: Remove excess whitespace.
Matti Hamalainen <ccr@tnsp.org>
parents: 958
diff changeset
1121
435
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1122 if (setjmp(png_jmpbuf(png_ptr)))
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
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
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1126 goto error;
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1127 }
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
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
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1131
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
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
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
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
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
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
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1143 goto error;
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
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
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
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
3b3acb6b4ba0 Cleanups.
Matti Hamalainen <ccr@tnsp.org>
parents: 2086
diff changeset
1151 8, // bits per component: TODO: FIXME: calculate and use
435
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1152 fmt,
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1153 PNG_INTERLACE_NONE,
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1154 PNG_COMPRESSION_TYPE_DEFAULT,
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1155 PNG_FILTER_TYPE_DEFAULT);
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
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
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
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
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
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
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1166
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1167 if (palette == NULL)
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
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
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1171 goto error;
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
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
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
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
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
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
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1181 }
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
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
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1185 }
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1186
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1187 // png_set_gAMA(png_ptr, info_ptr, 2.2);
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1188
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1189 png_write_info(png_ptr, info_ptr);
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1190
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1191
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1192 // Write compressed image data
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1193 dmWriteImageData(img, (void *) png_ptr, dmWritePNGRow, spec);
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1194
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1195 // Write footer
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1196 png_write_end(png_ptr, NULL);
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1197
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1198 error:
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1199 if (png_ptr && info_ptr)
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1200 png_destroy_write_struct(&png_ptr, &info_ptr);
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1201
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1202 return res;
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1203 }
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1204
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
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",
2572
92b93a12c014 Make some casts explicit instead of implicit, fixes some -pedantic warnings.
Matti Hamalainen <ccr@tnsp.org>
parents: 2539
diff changeset
1243 (void *) 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
2c4acbc3e7bf More work on libgfx etc.
Matti Hamalainen <ccr@tnsp.org>
parents: 1290
diff changeset
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
659c5f3d2e12 Fix setjmp() warning.
Matti Hamalainen <ccr@tnsp.org>
parents: 2310
diff changeset
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
3b3acb6b4ba0 Cleanups.
Matti Hamalainen <ccr@tnsp.org>
parents: 2086
diff changeset
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
bc00373e5a90 Cleanup.
Matti Hamalainen <ccr@tnsp.org>
parents: 1938
diff changeset
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
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1382 #endif
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1383
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
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
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1390 typedef struct
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1391 {
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1392 Uint8 r,g,b;
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1393 } DMPCXColor;
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1394
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1395
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1396 typedef struct
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1397 {
2091
3b3acb6b4ba0 Cleanups.
Matti Hamalainen <ccr@tnsp.org>
parents: 2086
diff changeset
1398 Uint8
3b3acb6b4ba0 Cleanups.
Matti Hamalainen <ccr@tnsp.org>
parents: 2086
diff changeset
1399 manufacturer, // always 0x0a
3b3acb6b4ba0 Cleanups.
Matti Hamalainen <ccr@tnsp.org>
parents: 2086
diff changeset
1400 version, // Z-Soft PC Paintbrush version:
1288
6c8b19d1d196 More work on libgfx.
Matti Hamalainen <ccr@tnsp.org>
parents: 1287
diff changeset
1401 // 0 = v2.5
6c8b19d1d196 More work on libgfx.
Matti Hamalainen <ccr@tnsp.org>
parents: 1287
diff changeset
1402 // 2 = v2.8 with palette,
6c8b19d1d196 More work on libgfx.
Matti Hamalainen <ccr@tnsp.org>
parents: 1287
diff changeset
1403 // 3 = v2.8 without palette
6c8b19d1d196 More work on libgfx.
Matti Hamalainen <ccr@tnsp.org>
parents: 1287
diff changeset
1404 // 4 = PC Paintbrush for Windows
6c8b19d1d196 More work on libgfx.
Matti Hamalainen <ccr@tnsp.org>
parents: 1287
diff changeset
1405 // 5 = v3.0 or better
2091
3b3acb6b4ba0 Cleanups.
Matti Hamalainen <ccr@tnsp.org>
parents: 2086
diff changeset
1406 encoding, // usually 0x01 = RLE, 0x00 = uncompressed
3b3acb6b4ba0 Cleanups.
Matti Hamalainen <ccr@tnsp.org>
parents: 2086
diff changeset
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
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
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
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1418 } DMPCXHeader;
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1419
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1420
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1421 typedef struct
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1422 {
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1423 DMPCXHeader *header;
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1424 Uint8 *buf;
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
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
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1427 } DMPCXData;
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1428
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
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
2599
c3c1d3c75f53 s/DM_PROBE_SCORE_false/DM_PROBE_SCORE_FALSE/g
Matti Hamalainen <ccr@tnsp.org>
parents: 2586
diff changeset
1439 return DM_PROBE_SCORE_FALSE;
1613
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
f0d6aac3adc4 Some cleanups.
Matti Hamalainen <ccr@tnsp.org>
parents: 1297
diff changeset
1443 // Returns one byte from row buffer (of length len) at offset soffs,
f0d6aac3adc4 Some cleanups.
Matti Hamalainen <ccr@tnsp.org>
parents: 1297
diff changeset
1444 // OR zero if the offset is outside buffer.
1301
e03f20d0f785 Constify.
Matti Hamalainen <ccr@tnsp.org>
parents: 1300
diff changeset
1445 static inline Uint8 dmPCXGetByte(const Uint8 *row, const size_t len, const size_t soffs)
435
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1446 {
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1447 return (soffs < len) ? row[soffs] : 0;
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1448 }
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1449
2586
9807ae37ad69 Require stdbool.h, we require C11 now.
Matti Hamalainen <ccr@tnsp.org>
parents: 2572
diff changeset
1450 static bool dmPCXFlush(DMPCXData *pcx)
435
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1451 {
2586
9807ae37ad69 Require stdbool.h, we require C11 now.
Matti Hamalainen <ccr@tnsp.org>
parents: 2572
diff changeset
1452 bool ret = true;
435
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
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
5bd64397453b More work on PCX writer.
Matti Hamalainen <ccr@tnsp.org>
parents: 1296
diff changeset
1455
435
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1456 pcx->bufOffs = 0;
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1457 return ret;
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1458 }
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1459
2586
9807ae37ad69 Require stdbool.h, we require C11 now.
Matti Hamalainen <ccr@tnsp.org>
parents: 2572
diff changeset
1460 static inline bool dmPCXPutByte(DMPCXData *pcx, const Uint8 val)
435
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1461 {
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1462 if (pcx->bufOffs < pcx->bufLen)
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1463 {
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1464 pcx->buf[pcx->bufOffs++] = val;
2586
9807ae37ad69 Require stdbool.h, we require C11 now.
Matti Hamalainen <ccr@tnsp.org>
parents: 2572
diff changeset
1465 return true;
435
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1466 }
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1467 else
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1468 return dmPCXFlush(pcx);
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1469 }
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1470
1297
5bd64397453b More work on PCX writer.
Matti Hamalainen <ccr@tnsp.org>
parents: 1296
diff changeset
1471
5bd64397453b More work on PCX writer.
Matti Hamalainen <ccr@tnsp.org>
parents: 1296
diff changeset
1472 static int dmPCXPutData(DMPCXData *pcx, const Uint8 data, const int count)
5bd64397453b More work on PCX writer.
Matti Hamalainen <ccr@tnsp.org>
parents: 1296
diff changeset
1473 {
5bd64397453b More work on PCX writer.
Matti Hamalainen <ccr@tnsp.org>
parents: 1296
diff changeset
1474 if (count == 1 && (data & 0xC0) != 0xC0)
5bd64397453b More work on PCX writer.
Matti Hamalainen <ccr@tnsp.org>
parents: 1296
diff changeset
1475 {
5bd64397453b More work on PCX writer.
Matti Hamalainen <ccr@tnsp.org>
parents: 1296
diff changeset
1476 if (!dmPCXPutByte(pcx, data))
5bd64397453b More work on PCX writer.
Matti Hamalainen <ccr@tnsp.org>
parents: 1296
diff changeset
1477 return DMERR_FWRITE;
5bd64397453b More work on PCX writer.
Matti Hamalainen <ccr@tnsp.org>
parents: 1296
diff changeset
1478 }
5bd64397453b More work on PCX writer.
Matti Hamalainen <ccr@tnsp.org>
parents: 1296
diff changeset
1479 else
5bd64397453b More work on PCX writer.
Matti Hamalainen <ccr@tnsp.org>
parents: 1296
diff changeset
1480 {
5bd64397453b More work on PCX writer.
Matti Hamalainen <ccr@tnsp.org>
parents: 1296
diff changeset
1481 if (!dmPCXPutByte(pcx, 0xC0 | count) ||
5bd64397453b More work on PCX writer.
Matti Hamalainen <ccr@tnsp.org>
parents: 1296
diff changeset
1482 !dmPCXPutByte(pcx, data))
5bd64397453b More work on PCX writer.
Matti Hamalainen <ccr@tnsp.org>
parents: 1296
diff changeset
1483 return DMERR_FWRITE;
5bd64397453b More work on PCX writer.
Matti Hamalainen <ccr@tnsp.org>
parents: 1296
diff changeset
1484 }
5bd64397453b More work on PCX writer.
Matti Hamalainen <ccr@tnsp.org>
parents: 1296
diff changeset
1485 return DMERR_OK;
5bd64397453b More work on PCX writer.
Matti Hamalainen <ccr@tnsp.org>
parents: 1296
diff changeset
1486 }
5bd64397453b More work on PCX writer.
Matti Hamalainen <ccr@tnsp.org>
parents: 1296
diff changeset
1487
5bd64397453b More work on PCX writer.
Matti Hamalainen <ccr@tnsp.org>
parents: 1296
diff changeset
1488
1301
e03f20d0f785 Constify.
Matti Hamalainen <ccr@tnsp.org>
parents: 1300
diff changeset
1489 static int dmWritePCXRow(void *cbdata, const Uint8 *row, const size_t len)
435
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1490 {
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1491 DMPCXData *pcx = (DMPCXData *) cbdata;
1297
5bd64397453b More work on PCX writer.
Matti Hamalainen <ccr@tnsp.org>
parents: 1296
diff changeset
1492 int err;
435
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1493 size_t soffs = 0;
1102
e06abfde6c39 Cosmetics pass: Remove excess whitespace.
Matti Hamalainen <ccr@tnsp.org>
parents: 958
diff changeset
1494
435
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1495 pcx->bufOffs = 0;
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
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
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1498 {
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1499 Uint8 data = dmPCXGetByte(row, len, soffs++),
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1500 count = 1;
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1501
1297
5bd64397453b More work on PCX writer.
Matti Hamalainen <ccr@tnsp.org>
parents: 1296
diff changeset
1502 size_t blen = pcx->header->bpl * pcx->header->nplanes;
435
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1503 while (soffs < blen)
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1504 {
1297
5bd64397453b More work on PCX writer.
Matti Hamalainen <ccr@tnsp.org>
parents: 1296
diff changeset
1505 if (data == dmPCXGetByte(row, len, soffs) && count < 0x3F)
435
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1506 {
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1507 count++;
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1508 soffs++;
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1509 }
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1510 else
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1511 {
1297
5bd64397453b More work on PCX writer.
Matti Hamalainen <ccr@tnsp.org>
parents: 1296
diff changeset
1512 if ((err = dmPCXPutData(pcx, data, count)) != DMERR_OK)
5bd64397453b More work on PCX writer.
Matti Hamalainen <ccr@tnsp.org>
parents: 1296
diff changeset
1513 return err;
435
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1514
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1515 data = dmPCXGetByte(row, len, soffs++);
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1516 count = 1;
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1517 }
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1518 }
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1519
1297
5bd64397453b More work on PCX writer.
Matti Hamalainen <ccr@tnsp.org>
parents: 1296
diff changeset
1520 if ((err = dmPCXPutData(pcx, data, count)) != DMERR_OK)
5bd64397453b More work on PCX writer.
Matti Hamalainen <ccr@tnsp.org>
parents: 1296
diff changeset
1521 return err;
435
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1522
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
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
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1525 }
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
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
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1528 }
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1529
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
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
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1532 {
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1533 DMPCXData pcx;
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
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
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1536 int res;
1302
38614c07c2e2 Now with "almost" working 24bit PCX output. Almost.
Matti Hamalainen <ccr@tnsp.org>
parents: 1301
diff changeset
1537
1303
be30466fbc47 Cleanups.
Matti Hamalainen <ccr@tnsp.org>
parents: 1302
diff changeset
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));
2586
9807ae37ad69 Require stdbool.h, we require C11 now.
Matti Hamalainen <ccr@tnsp.org>
parents: 2572
diff changeset
1540 spec.planar = true;
435
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
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
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1556 // Create output file
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1557 pcx.buf = NULL;
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1558 pcx.header = &hdr;
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1559 pcx.fp = fp;
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1560
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
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
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
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
7114ea4c3c42 Cleanup.
Matti Hamalainen <ccr@tnsp.org>
parents: 1948
diff changeset
1567 for (int i = 0; i < ncolors; i++)
435
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
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
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1572 }
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1573 }
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1574 hdr.manufacturer = 10;
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1575 hdr.version = 5;
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
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
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
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
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
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
2c4acbc3e7bf More work on libgfx etc.
Matti Hamalainen <ccr@tnsp.org>
parents: 1290
diff changeset
1591 // TODO XXX .. maybe actually compute these asdf
2c4acbc3e7bf More work on libgfx etc.
Matti Hamalainen <ccr@tnsp.org>
parents: 1290
diff changeset
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
2c4acbc3e7bf More work on libgfx etc.
Matti Hamalainen <ccr@tnsp.org>
parents: 1290
diff changeset
1594
2219
8cd2a821e8a0 Cleanups.
Matti Hamalainen <ccr@tnsp.org>
parents: 2212
diff changeset
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
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1597 hdr.bpl = res / 2;
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1598 if (res % 2) hdr.bpl++;
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1599 hdr.bpl *= 2;
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1600
1297
5bd64397453b More work on PCX writer.
Matti Hamalainen <ccr@tnsp.org>
parents: 1296
diff changeset
1601 dmMsg(2,
5bd64397453b More work on PCX writer.
Matti Hamalainen <ccr@tnsp.org>
parents: 1296
diff changeset
1602 "PCX: xmin=%d, ymin=%d, xmax=%d, ymax=%d, res=%dx%d, scr=%dx%d\n",
5bd64397453b More work on PCX writer.
Matti Hamalainen <ccr@tnsp.org>
parents: 1296
diff changeset
1603 hdr.xmin, hdr.ymin, hdr.xmax, hdr.ymax,
5bd64397453b More work on PCX writer.
Matti Hamalainen <ccr@tnsp.org>
parents: 1296
diff changeset
1604 hdr.hres, hdr.vres,
5bd64397453b More work on PCX writer.
Matti Hamalainen <ccr@tnsp.org>
parents: 1296
diff changeset
1605 hdr.hScreenSize, hdr.vScreenSize);
5bd64397453b More work on PCX writer.
Matti Hamalainen <ccr@tnsp.org>
parents: 1296
diff changeset
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
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1612
1291
2c4acbc3e7bf More work on libgfx etc.
Matti Hamalainen <ccr@tnsp.org>
parents: 1290
diff changeset
1613 // TODO XXX this is also bogus
2219
8cd2a821e8a0 Cleanups.
Matti Hamalainen <ccr@tnsp.org>
parents: 2212
diff changeset
1614 pcx.bufLen = hdr.bpl * 4;
435
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1615 if ((pcx.buf = dmMalloc(pcx.bufLen)) == NULL)
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
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
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1620 pcx.bufLen);
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1621 goto error;
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1622 }
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1623
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
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
8cd2a821e8a0 Cleanups.
Matti Hamalainen <ccr@tnsp.org>
parents: 2212
diff changeset
1628 !dmf_write_byte(pcx.fp, hdr.bitsPerPlane) ||
8cd2a821e8a0 Cleanups.
Matti Hamalainen <ccr@tnsp.org>
parents: 2212
diff changeset
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
8cd2a821e8a0 Cleanups.
Matti Hamalainen <ccr@tnsp.org>
parents: 2212
diff changeset
1634 !dmf_write_le16(pcx.fp, hdr.vres) ||
8cd2a821e8a0 Cleanups.
Matti Hamalainen <ccr@tnsp.org>
parents: 2212
diff changeset
1635 !dmf_write_str(pcx.fp, (Uint8 *) &hdr.colorMap, sizeof(hdr.colorMap)) ||
8cd2a821e8a0 Cleanups.
Matti Hamalainen <ccr@tnsp.org>
parents: 2212
diff changeset
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
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
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
8cd2a821e8a0 Cleanups.
Matti Hamalainen <ccr@tnsp.org>
parents: 2212
diff changeset
1645 "PCX: Could not write header data.\n");
435
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1646 goto error;
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1647 }
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1648
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
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
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1651
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
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
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
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
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
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
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
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
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1665 }
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1666 }
1102
e06abfde6c39 Cosmetics pass: Remove excess whitespace.
Matti Hamalainen <ccr@tnsp.org>
parents: 958
diff changeset
1667
435
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1668 error:
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1669 dmFree(pcx.buf);
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1670 return res;
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1671 }
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1672
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1673
2586
9807ae37ad69 Require stdbool.h, we require C11 now.
Matti Hamalainen <ccr@tnsp.org>
parents: 2572
diff changeset
1674 static bool dmPCXDecodeRLERow(DMResource *fp, Uint8 *buf, const size_t bufLen)
435
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1675 {
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1676 size_t offs = 0;
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1677 do
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1678 {
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1679 int count;
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1680 Uint8 data;
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
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))
2586
9807ae37ad69 Require stdbool.h, we require C11 now.
Matti Hamalainen <ccr@tnsp.org>
parents: 2572
diff changeset
1683 return false;
1102
e06abfde6c39 Cosmetics pass: Remove excess whitespace.
Matti Hamalainen <ccr@tnsp.org>
parents: 958
diff changeset
1684
435
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1685 if ((data & 0xC0) == 0xC0)
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1686 {
2586
9807ae37ad69 Require stdbool.h, we require C11 now.
Matti Hamalainen <ccr@tnsp.org>
parents: 2572
diff changeset
1687 bool skip = false;
435
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1688 count = data & 0x3F;
1284
28be63226b05 More work on PCX loader.
Matti Hamalainen <ccr@tnsp.org>
parents: 1283
diff changeset
1689 if (count == 0)
28be63226b05 More work on PCX loader.
Matti Hamalainen <ccr@tnsp.org>
parents: 1283
diff changeset
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
28be63226b05 More work on PCX loader.
Matti Hamalainen <ccr@tnsp.org>
parents: 1283
diff changeset
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
28be63226b05 More work on PCX loader.
Matti Hamalainen <ccr@tnsp.org>
parents: 1283
diff changeset
1694 // Use as literal
2586
9807ae37ad69 Require stdbool.h, we require C11 now.
Matti Hamalainen <ccr@tnsp.org>
parents: 2572
diff changeset
1695 skip = true;
1284
28be63226b05 More work on PCX loader.
Matti Hamalainen <ccr@tnsp.org>
parents: 1283
diff changeset
1696 count = 1;
28be63226b05 More work on PCX loader.
Matti Hamalainen <ccr@tnsp.org>
parents: 1283
diff changeset
1697 break;
28be63226b05 More work on PCX loader.
Matti Hamalainen <ccr@tnsp.org>
parents: 1283
diff changeset
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
28be63226b05 More work on PCX loader.
Matti Hamalainen <ccr@tnsp.org>
parents: 1283
diff changeset
1700 // Ignore completely
2586
9807ae37ad69 Require stdbool.h, we require C11 now.
Matti Hamalainen <ccr@tnsp.org>
parents: 2572
diff changeset
1701 skip = true;
1284
28be63226b05 More work on PCX loader.
Matti Hamalainen <ccr@tnsp.org>
parents: 1283
diff changeset
1702 break;
28be63226b05 More work on PCX loader.
Matti Hamalainen <ccr@tnsp.org>
parents: 1283
diff changeset
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
28be63226b05 More work on PCX loader.
Matti Hamalainen <ccr@tnsp.org>
parents: 1283
diff changeset
1705 default:
28be63226b05 More work on PCX loader.
Matti Hamalainen <ccr@tnsp.org>
parents: 1283
diff changeset
1706 // Error out on "invalid" data
2586
9807ae37ad69 Require stdbool.h, we require C11 now.
Matti Hamalainen <ccr@tnsp.org>
parents: 2572
diff changeset
1707 return false;
1284
28be63226b05 More work on PCX loader.
Matti Hamalainen <ccr@tnsp.org>
parents: 1283
diff changeset
1708 }
28be63226b05 More work on PCX loader.
Matti Hamalainen <ccr@tnsp.org>
parents: 1283
diff changeset
1709 }
28be63226b05 More work on PCX loader.
Matti Hamalainen <ccr@tnsp.org>
parents: 1283
diff changeset
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))
2586
9807ae37ad69 Require stdbool.h, we require C11 now.
Matti Hamalainen <ccr@tnsp.org>
parents: 2572
diff changeset
1712 return false;
435
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1713 }
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1714 else
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1715 count = 1;
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1716
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1717 while (count-- && offs < bufLen)
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1718 buf[offs++] = data;
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1719
1284
28be63226b05 More work on PCX loader.
Matti Hamalainen <ccr@tnsp.org>
parents: 1283
diff changeset
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)
2586
9807ae37ad69 Require stdbool.h, we require C11 now.
Matti Hamalainen <ccr@tnsp.org>
parents: 2572
diff changeset
1722 return false;
1284
28be63226b05 More work on PCX loader.
Matti Hamalainen <ccr@tnsp.org>
parents: 1283
diff changeset
1723
435
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1724 } while (offs < bufLen);
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1725
2586
9807ae37ad69 Require stdbool.h, we require C11 now.
Matti Hamalainen <ccr@tnsp.org>
parents: 2572
diff changeset
1726 return true;
435
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1727 }
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1728
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
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
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1731 {
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1732 DMImage *img;
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1733 DMPCXData pcx;
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
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;
2586
9807ae37ad69 Require stdbool.h, we require C11 now.
Matti Hamalainen <ccr@tnsp.org>
parents: 2572
diff changeset
1736 bool isPaletted;
435
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1737 pcx.buf = NULL;
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1738
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
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
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
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
f0d6aac3adc4 Some cleanups.
Matti Hamalainen <ccr@tnsp.org>
parents: 1297
diff changeset
1760 "PCX: Could not read image header data.\n");
f0d6aac3adc4 Some cleanups.
Matti Hamalainen <ccr@tnsp.org>
parents: 1297
diff changeset
1761 goto error;
f0d6aac3adc4 Some cleanups.
Matti Hamalainen <ccr@tnsp.org>
parents: 1297
diff changeset
1762 }
f0d6aac3adc4 Some cleanups.
Matti Hamalainen <ccr@tnsp.org>
parents: 1297
diff changeset
1763
f0d6aac3adc4 Some cleanups.
Matti Hamalainen <ccr@tnsp.org>
parents: 1297
diff changeset
1764 if (hdr.manufacturer != 10 ||
f0d6aac3adc4 Some cleanups.
Matti Hamalainen <ccr@tnsp.org>
parents: 1297
diff changeset
1765 hdr.version > 5 ||
f0d6aac3adc4 Some cleanups.
Matti Hamalainen <ccr@tnsp.org>
parents: 1297
diff changeset
1766 hdr.encoding != 1)
f0d6aac3adc4 Some cleanups.
Matti Hamalainen <ccr@tnsp.org>
parents: 1297
diff changeset
1767 {
f0d6aac3adc4 Some cleanups.
Matti Hamalainen <ccr@tnsp.org>
parents: 1297
diff changeset
1768 res = dmError(DMERR_NOT_SUPPORTED,
f0d6aac3adc4 Some cleanups.
Matti Hamalainen <ccr@tnsp.org>
parents: 1297
diff changeset
1769 "PCX: Not a PCX file, or unsupported variant.\n");
435
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1770 goto error;
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
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
2c4acbc3e7bf More work on libgfx etc.
Matti Hamalainen <ccr@tnsp.org>
parents: 1290
diff changeset
1783
2c4acbc3e7bf More work on libgfx etc.
Matti Hamalainen <ccr@tnsp.org>
parents: 1290
diff changeset
1784 dmMsg(2,
2c4acbc3e7bf More work on libgfx etc.
Matti Hamalainen <ccr@tnsp.org>
parents: 1290
diff changeset
1785 "PCX: xmin=%d, ymin=%d, xmax=%d, ymax=%d, res=%dx%d, scr=%dx%d\n",
2c4acbc3e7bf More work on libgfx etc.
Matti Hamalainen <ccr@tnsp.org>
parents: 1290
diff changeset
1786 hdr.xmin, hdr.ymin, hdr.xmax, hdr.ymax,
2c4acbc3e7bf More work on libgfx etc.
Matti Hamalainen <ccr@tnsp.org>
parents: 1290
diff changeset
1787 hdr.hres, hdr.vres,
2c4acbc3e7bf More work on libgfx etc.
Matti Hamalainen <ccr@tnsp.org>
parents: 1290
diff changeset
1788 hdr.hScreenSize, hdr.vScreenSize);
2c4acbc3e7bf More work on libgfx etc.
Matti Hamalainen <ccr@tnsp.org>
parents: 1290
diff changeset
1789
2c4acbc3e7bf More work on libgfx etc.
Matti Hamalainen <ccr@tnsp.org>
parents: 1290
diff changeset
1790 dmMsg(2,
2c4acbc3e7bf More work on libgfx etc.
Matti Hamalainen <ccr@tnsp.org>
parents: 1290
diff changeset
1791 "PCX: nplanes=%d, bpp=%d, bpl=%d, isPaletted=%s\n",
2c4acbc3e7bf More work on libgfx etc.
Matti Hamalainen <ccr@tnsp.org>
parents: 1290
diff changeset
1792 hdr.nplanes, hdr.bitsPerPlane, hdr.bpl, isPaletted ? "yes" : "no");
2c4acbc3e7bf More work on libgfx etc.
Matti Hamalainen <ccr@tnsp.org>
parents: 1290
diff changeset
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
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
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
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1807 goto error;
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1808 }
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1809
1286
b812fad6f33e Work on libgfx.
Matti Hamalainen <ccr@tnsp.org>
parents: 1285
diff changeset
1810 if (!isPaletted)
b812fad6f33e Work on libgfx.
Matti Hamalainen <ccr@tnsp.org>
parents: 1285
diff changeset
1811 {
b812fad6f33e Work on libgfx.
Matti Hamalainen <ccr@tnsp.org>
parents: 1285
diff changeset
1812 res = dmError(DMERR_NOT_SUPPORTED,
b812fad6f33e Work on libgfx.
Matti Hamalainen <ccr@tnsp.org>
parents: 1285
diff changeset
1813 "PCX: Non-indexed (truecolour) PCX images not supported for loading.\n");
b812fad6f33e Work on libgfx.
Matti Hamalainen <ccr@tnsp.org>
parents: 1285
diff changeset
1814 goto error;
b812fad6f33e Work on libgfx.
Matti Hamalainen <ccr@tnsp.org>
parents: 1285
diff changeset
1815 }
b812fad6f33e Work on libgfx.
Matti Hamalainen <ccr@tnsp.org>
parents: 1285
diff changeset
1816
435
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1817 // Allocate image
1286
b812fad6f33e Work on libgfx.
Matti Hamalainen <ccr@tnsp.org>
parents: 1285
diff changeset
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
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
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
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1827 goto error;
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1828 }
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
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
f0d6aac3adc4 Some cleanups.
Matti Hamalainen <ccr@tnsp.org>
parents: 1297
diff changeset
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
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1844 pcx.bufLen = hdr.nplanes * hdr.bpl;
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1845 if ((pcx.buf = dmMalloc(pcx.bufLen)) == NULL)
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
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
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1849 goto error;
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1850 }
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
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
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
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
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1859 {
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
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
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
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
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1865 goto error;
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
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
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
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
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1870 {
1296
228cab109c6a More work on PCX reader.
Matti Hamalainen <ccr@tnsp.org>
parents: 1295
diff changeset
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
b812fad6f33e Work on libgfx.
Matti Hamalainen <ccr@tnsp.org>
parents: 1285
diff changeset
1874 // Actually bytes and bits per plane per pixel ..
b812fad6f33e Work on libgfx.
Matti Hamalainen <ccr@tnsp.org>
parents: 1285
diff changeset
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
b812fad6f33e Work on libgfx.
Matti Hamalainen <ccr@tnsp.org>
parents: 1285
diff changeset
1877 for (int nplane = 0; nplane < hdr.nplanes; nplane++)
b812fad6f33e Work on libgfx.
Matti Hamalainen <ccr@tnsp.org>
parents: 1285
diff changeset
1878 {
b812fad6f33e Work on libgfx.
Matti Hamalainen <ccr@tnsp.org>
parents: 1285
diff changeset
1879 Uint8 *dptr = dp + (nplane * bytesPerPlane),
b812fad6f33e Work on libgfx.
Matti Hamalainen <ccr@tnsp.org>
parents: 1285
diff changeset
1880 *sptr = pcx.buf + (hdr.bpl * nplane);
b812fad6f33e Work on libgfx.
Matti Hamalainen <ccr@tnsp.org>
parents: 1285
diff changeset
1881
b812fad6f33e Work on libgfx.
Matti Hamalainen <ccr@tnsp.org>
parents: 1285
diff changeset
1882 memcpy(dptr, sptr, img->width * bytesPerPlane);
b812fad6f33e Work on libgfx.
Matti Hamalainen <ccr@tnsp.org>
parents: 1285
diff changeset
1883 }
1279
0d3f5f44c0c4 Somewhat improve PCX read support in libgfx.
Matti Hamalainen <ccr@tnsp.org>
parents: 1265
diff changeset
1884 }
435
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
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
228cab109c6a More work on PCX reader.
Matti Hamalainen <ccr@tnsp.org>
parents: 1295
diff changeset
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
228cab109c6a More work on PCX reader.
Matti Hamalainen <ccr@tnsp.org>
parents: 1295
diff changeset
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
228cab109c6a More work on PCX reader.
Matti Hamalainen <ccr@tnsp.org>
parents: 1295
diff changeset
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
228cab109c6a More work on PCX reader.
Matti Hamalainen <ccr@tnsp.org>
parents: 1295
diff changeset
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
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1907 }
1102
e06abfde6c39 Cosmetics pass: Remove excess whitespace.
Matti Hamalainen <ccr@tnsp.org>
parents: 958
diff changeset
1908
435
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1909 dp += img->pitch;
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1910 }
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
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
b812fad6f33e Work on libgfx.
Matti Hamalainen <ccr@tnsp.org>
parents: 1285
diff changeset
1913 if (isPaletted)
435
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1914 {
1279
0d3f5f44c0c4 Somewhat improve PCX read support in libgfx.
Matti Hamalainen <ccr@tnsp.org>
parents: 1265
diff changeset
1915 int ncolors;
435
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1916 Uint8 tmpb;
2586
9807ae37ad69 Require stdbool.h, we require C11 now.
Matti Hamalainen <ccr@tnsp.org>
parents: 2572
diff changeset
1917 bool read;
435
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
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
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1920 {
2586
9807ae37ad69 Require stdbool.h, we require C11 now.
Matti Hamalainen <ccr@tnsp.org>
parents: 2572
diff changeset
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
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1923 }
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1924 else
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1925 {
2586
9807ae37ad69 Require stdbool.h, we require C11 now.
Matti Hamalainen <ccr@tnsp.org>
parents: 2572
diff changeset
1926 read = true;
451
fdc91f2a0d27 Modularize palette reading and handling code.
Matti Hamalainen <ccr@tnsp.org>
parents: 449
diff changeset
1927 ncolors = 256;
435
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1928 }
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
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
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
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
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1934 goto error;
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1935 }
1102
e06abfde6c39 Cosmetics pass: Remove excess whitespace.
Matti Hamalainen <ccr@tnsp.org>
parents: 958
diff changeset
1936
435
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1937 if (read)
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
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
228cab109c6a More work on PCX reader.
Matti Hamalainen <ccr@tnsp.org>
parents: 1295
diff changeset
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
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
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
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1945 }
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1946 }
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1947 else
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
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
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
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
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1960 }
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1961 }
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1962 }
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1963
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1964 error:
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1965 dmFree(pcx.buf);
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1966 return res;
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1967 }
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1968
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
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
358776103ceb Add support for IFF PBMs.
Matti Hamalainen <ccr@tnsp.org>
parents: 462
diff changeset
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
c9197a038e8e Various cleanups.
Matti Hamalainen <ccr@tnsp.org>
parents: 1808
diff changeset
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
c9197a038e8e Various cleanups.
Matti Hamalainen <ccr@tnsp.org>
parents: 1808
diff changeset
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
e4dc8fbaa5ad Improve IFF probing.
Matti Hamalainen <ccr@tnsp.org>
parents: 2067
diff changeset
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
e4dc8fbaa5ad Improve IFF probing.
Matti Hamalainen <ccr@tnsp.org>
parents: 2067
diff changeset
2034 DM_BE32_TO_NATIVE(*(Uint32 *) (buf + 0)) == IFF_ID_FORM &&
e4dc8fbaa5ad Improve IFF probing.
Matti Hamalainen <ccr@tnsp.org>
parents: 2067
diff changeset
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
bd109c0a7b88 Improve IFF probing.
Matti Hamalainen <ccr@tnsp.org>
parents: 2057
diff changeset
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
2599
c3c1d3c75f53 s/DM_PROBE_SCORE_false/DM_PROBE_SCORE_FALSE/g
Matti Hamalainen <ccr@tnsp.org>
parents: 2586
diff changeset
2043 return DM_PROBE_SCORE_FALSE;
1613
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
e4dc8fbaa5ad Improve IFF probing.
Matti Hamalainen <ccr@tnsp.org>
parents: 2067
diff changeset
2047 static int fmtProbeIFF_ILBM(const Uint8 *buf, const size_t len)
e4dc8fbaa5ad Improve IFF probing.
Matti Hamalainen <ccr@tnsp.org>
parents: 2067
diff changeset
2048 {
e4dc8fbaa5ad Improve IFF probing.
Matti Hamalainen <ccr@tnsp.org>
parents: 2067
diff changeset
2049 return fmtProbeIFF(buf, len, IFF_ID_ILBM);
e4dc8fbaa5ad Improve IFF probing.
Matti Hamalainen <ccr@tnsp.org>
parents: 2067
diff changeset
2050 }
e4dc8fbaa5ad Improve IFF probing.
Matti Hamalainen <ccr@tnsp.org>
parents: 2067
diff changeset
2051
e4dc8fbaa5ad Improve IFF probing.
Matti Hamalainen <ccr@tnsp.org>
parents: 2067
diff changeset
2052
e4dc8fbaa5ad Improve IFF probing.
Matti Hamalainen <ccr@tnsp.org>
parents: 2067
diff changeset
2053 static int fmtProbeIFF_PBM(const Uint8 *buf, const size_t len)
e4dc8fbaa5ad Improve IFF probing.
Matti Hamalainen <ccr@tnsp.org>
parents: 2067
diff changeset
2054 {
e4dc8fbaa5ad Improve IFF probing.
Matti Hamalainen <ccr@tnsp.org>
parents: 2067
diff changeset
2055 return fmtProbeIFF(buf, len, IFF_ID_PBM);
e4dc8fbaa5ad Improve IFF probing.
Matti Hamalainen <ccr@tnsp.org>
parents: 2067
diff changeset
2056 }
e4dc8fbaa5ad Improve IFF probing.
Matti Hamalainen <ccr@tnsp.org>
parents: 2067
diff changeset
2057
e4dc8fbaa5ad Improve IFF probing.
Matti Hamalainen <ccr@tnsp.org>
parents: 2067
diff changeset
2058
e4dc8fbaa5ad Improve IFF probing.
Matti Hamalainen <ccr@tnsp.org>
parents: 2067
diff changeset
2059 static int fmtProbeIFF_ACBM(const Uint8 *buf, const size_t len)
e4dc8fbaa5ad Improve IFF probing.
Matti Hamalainen <ccr@tnsp.org>
parents: 2067
diff changeset
2060 {
e4dc8fbaa5ad Improve IFF probing.
Matti Hamalainen <ccr@tnsp.org>
parents: 2067
diff changeset
2061 return fmtProbeIFF(buf, len, IFF_ID_ACBM);
e4dc8fbaa5ad Improve IFF probing.
Matti Hamalainen <ccr@tnsp.org>
parents: 2067
diff changeset
2062 }
e4dc8fbaa5ad Improve IFF probing.
Matti Hamalainen <ccr@tnsp.org>
parents: 2067
diff changeset
2063
e4dc8fbaa5ad Improve IFF probing.
Matti Hamalainen <ccr@tnsp.org>
parents: 2067
diff changeset
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
8ad98bc7402c Cleanups.
Matti Hamalainen <ccr@tnsp.org>
parents: 1902
diff changeset
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,
2586
9807ae37ad69 Require stdbool.h, we require C11 now.
Matti Hamalainen <ccr@tnsp.org>
parents: 2572
diff changeset
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
2586
9807ae37ad69 Require stdbool.h, we require C11 now.
Matti Hamalainen <ccr@tnsp.org>
parents: 2572
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))
2586
9807ae37ad69 Require stdbool.h, we require C11 now.
Matti Hamalainen <ccr@tnsp.org>
parents: 2572
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))
2586
9807ae37ad69 Require stdbool.h, we require C11 now.
Matti Hamalainen <ccr@tnsp.org>
parents: 2572
diff changeset
2159 return false;
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
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))
2586
9807ae37ad69 Require stdbool.h, we require C11 now.
Matti Hamalainen <ccr@tnsp.org>
parents: 2572
diff changeset
2166 return false;
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
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))
2586
9807ae37ad69 Require stdbool.h, we require C11 now.
Matti Hamalainen <ccr@tnsp.org>
parents: 2572
diff changeset
2177 return false;
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
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
2586
9807ae37ad69 Require stdbool.h, we require C11 now.
Matti Hamalainen <ccr@tnsp.org>
parents: 2572
diff changeset
2184 return true;
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
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
2586
9807ae37ad69 Require stdbool.h, we require C11 now.
Matti Hamalainen <ccr@tnsp.org>
parents: 2572
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
009a3e3c54bf Cleanups.
Matti Hamalainen <ccr@tnsp.org>
parents: 1621
diff changeset
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
8ad98bc7402c Cleanups.
Matti Hamalainen <ccr@tnsp.org>
parents: 1902
diff changeset
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
8ad98bc7402c Cleanups.
Matti Hamalainen <ccr@tnsp.org>
parents: 1902
diff changeset
2205 Uint8 *buf = NULL;
8ad98bc7402c Cleanups.
Matti Hamalainen <ccr@tnsp.org>
parents: 1902
diff changeset
2206 size_t bufLen = 0;
1618
4c96181c9c09 Cleanup.
Matti Hamalainen <ccr@tnsp.org>
parents: 1616
diff changeset
2207 int res = DMERR_OK;
1659
99b8ab61dc1b Micro-optimization.
Matti Hamalainen <ccr@tnsp.org>
parents: 1658
diff changeset
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
8ad98bc7402c Cleanups.
Matti Hamalainen <ccr@tnsp.org>
parents: 1902
diff changeset
2211 {
8ad98bc7402c Cleanups.
Matti Hamalainen <ccr@tnsp.org>
parents: 1902
diff changeset
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
8ad98bc7402c Cleanups.
Matti Hamalainen <ccr@tnsp.org>
parents: 1902
diff changeset
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
83a3d05b5c1d Fixes to ACBM support.
Matti Hamalainen <ccr@tnsp.org>
parents: 2068
diff changeset
2236 // Decompress or read data
83a3d05b5c1d Fixes to ACBM support.
Matti Hamalainen <ccr@tnsp.org>
parents: 2068
diff changeset
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
83a3d05b5c1d Fixes to ACBM support.
Matti Hamalainen <ccr@tnsp.org>
parents: 2068
diff changeset
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
4c96181c9c09 Cleanup.
Matti Hamalainen <ccr@tnsp.org>
parents: 1616
diff changeset
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
8ad98bc7402c Cleanups.
Matti Hamalainen <ccr@tnsp.org>
parents: 1902
diff changeset
2265
8ad98bc7402c Cleanups.
Matti Hamalainen <ccr@tnsp.org>
parents: 1902
diff changeset
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
8ad98bc7402c Cleanups.
Matti Hamalainen <ccr@tnsp.org>
parents: 1902
diff changeset
2268 // Decompress or read data
8ad98bc7402c Cleanups.
Matti Hamalainen <ccr@tnsp.org>
parents: 1902
diff changeset
2269 if (!dmIFFReadOneRow(fp, iff, buf, bufLen))
8ad98bc7402c Cleanups.
Matti Hamalainen <ccr@tnsp.org>
parents: 1902
diff changeset
2270 {
8ad98bc7402c Cleanups.
Matti Hamalainen <ccr@tnsp.org>
parents: 1902
diff changeset
2271 res = dmError(DMERR_FREAD,
2069
83a3d05b5c1d Fixes to ACBM support.
Matti Hamalainen <ccr@tnsp.org>
parents: 2068
diff changeset
2272 "IFF: Error in reading ILBM image plane #%d @ %d.\n",
1903
8ad98bc7402c Cleanups.
Matti Hamalainen <ccr@tnsp.org>
parents: 1902
diff changeset
2273 plane, yc);
8ad98bc7402c Cleanups.
Matti Hamalainen <ccr@tnsp.org>
parents: 1902
diff changeset
2274 goto out;
8ad98bc7402c Cleanups.
Matti Hamalainen <ccr@tnsp.org>
parents: 1902
diff changeset
2275 }
8ad98bc7402c Cleanups.
Matti Hamalainen <ccr@tnsp.org>
parents: 1902
diff changeset
2276
8ad98bc7402c Cleanups.
Matti Hamalainen <ccr@tnsp.org>
parents: 1902
diff changeset
2277 // Decode bitplane
8ad98bc7402c Cleanups.
Matti Hamalainen <ccr@tnsp.org>
parents: 1902
diff changeset
2278 for (int xc = 0; xc < img->width; xc++)
8ad98bc7402c Cleanups.
Matti Hamalainen <ccr@tnsp.org>
parents: 1902
diff changeset
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
8ad98bc7402c Cleanups.
Matti Hamalainen <ccr@tnsp.org>
parents: 1902
diff changeset
2282 // Read mask data
8ad98bc7402c Cleanups.
Matti Hamalainen <ccr@tnsp.org>
parents: 1902
diff changeset
2283 if (iff->bmhd.masking == IFF_MASK_HAS_MASK)
8ad98bc7402c Cleanups.
Matti Hamalainen <ccr@tnsp.org>
parents: 1902
diff changeset
2284 {
8ad98bc7402c Cleanups.
Matti Hamalainen <ccr@tnsp.org>
parents: 1902
diff changeset
2285 // Decompress or read data
8ad98bc7402c Cleanups.
Matti Hamalainen <ccr@tnsp.org>
parents: 1902
diff changeset
2286 if (!dmIFFReadOneRow(fp, iff, buf, bufLen))
8ad98bc7402c Cleanups.
Matti Hamalainen <ccr@tnsp.org>
parents: 1902
diff changeset
2287 {
8ad98bc7402c Cleanups.
Matti Hamalainen <ccr@tnsp.org>
parents: 1902
diff changeset
2288 res = dmError(DMERR_FREAD,
2069
83a3d05b5c1d Fixes to ACBM support.
Matti Hamalainen <ccr@tnsp.org>
parents: 2068
diff changeset
2289 "IFF: Error in reading ILBM mask plane.\n");
1903
8ad98bc7402c Cleanups.
Matti Hamalainen <ccr@tnsp.org>
parents: 1902
diff changeset
2290 goto out;
8ad98bc7402c Cleanups.
Matti Hamalainen <ccr@tnsp.org>
parents: 1902
diff changeset
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
8ad98bc7402c Cleanups.
Matti Hamalainen <ccr@tnsp.org>
parents: 1902
diff changeset
2293 // Decode mask
8ad98bc7402c Cleanups.
Matti Hamalainen <ccr@tnsp.org>
parents: 1902
diff changeset
2294 for (int xc = 0; xc < img->width; xc++)
8ad98bc7402c Cleanups.
Matti Hamalainen <ccr@tnsp.org>
parents: 1902
diff changeset
2295 {
8ad98bc7402c Cleanups.
Matti Hamalainen <ccr@tnsp.org>
parents: 1902
diff changeset
2296 const Uint8 data = dmDecodeBit(buf, xc);
8ad98bc7402c Cleanups.
Matti Hamalainen <ccr@tnsp.org>
parents: 1902
diff changeset
2297
8ad98bc7402c Cleanups.
Matti Hamalainen <ccr@tnsp.org>
parents: 1902
diff changeset
2298 // Black out any pixels with mask bit 0
8ad98bc7402c Cleanups.
Matti Hamalainen <ccr@tnsp.org>
parents: 1902
diff changeset
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
8ad98bc7402c Cleanups.
Matti Hamalainen <ccr@tnsp.org>
parents: 1902
diff changeset
2301 }
8ad98bc7402c Cleanups.
Matti Hamalainen <ccr@tnsp.org>
parents: 1902
diff changeset
2302 }
8ad98bc7402c Cleanups.
Matti Hamalainen <ccr@tnsp.org>
parents: 1902
diff changeset
2303 }
8ad98bc7402c Cleanups.
Matti Hamalainen <ccr@tnsp.org>
parents: 1902
diff changeset
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
8ad98bc7402c Cleanups.
Matti Hamalainen <ccr@tnsp.org>
parents: 1902
diff changeset
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
8ad98bc7402c Cleanups.
Matti Hamalainen <ccr@tnsp.org>
parents: 1902
diff changeset
2310 "IFF: Error reading PBM image row #%d.\n", yc);
8ad98bc7402c Cleanups.
Matti Hamalainen <ccr@tnsp.org>
parents: 1902
diff changeset
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
8ad98bc7402c Cleanups.
Matti Hamalainen <ccr@tnsp.org>
parents: 1902
diff changeset
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;
2586
9807ae37ad69 Require stdbool.h, we require C11 now.
Matti Hamalainen <ccr@tnsp.org>
parents: 2572
diff changeset
2326 bool parsed = false;
1627
d0e626e039bf Cleanup.
Matti Hamalainen <ccr@tnsp.org>
parents: 1626
diff changeset
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
2586
9807ae37ad69 Require stdbool.h, we require C11 now.
Matti Hamalainen <ccr@tnsp.org>
parents: 2572
diff changeset
2367 if ((res = dmCheckIFFChunk(&iff.chBMHD, &chunk, false, sizeof(iff.bmhd))) != DMERR_OK)
958
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
a05e3fcc60ec Cleanups.
Matti Hamalainen <ccr@tnsp.org>
parents: 1654
diff changeset
2391 iff.bmhd.nplanes, iff.bmhd.compression, iff.bmhd.masking,
a05e3fcc60ec Cleanups.
Matti Hamalainen <ccr@tnsp.org>
parents: 1654
diff changeset
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
83a3d05b5c1d Fixes to ACBM support.
Matti Hamalainen <ccr@tnsp.org>
parents: 2068
diff changeset
2405
83a3d05b5c1d Fixes to ACBM support.
Matti Hamalainen <ccr@tnsp.org>
parents: 2068
diff changeset
2406 if (iff.idsig == IFF_ID_ACBM &&
83a3d05b5c1d Fixes to ACBM support.
Matti Hamalainen <ccr@tnsp.org>
parents: 2068
diff changeset
2407 iff.bmhd.compression != IFF_COMP_NONE)
83a3d05b5c1d Fixes to ACBM support.
Matti Hamalainen <ccr@tnsp.org>
parents: 2068
diff changeset
2408 {
83a3d05b5c1d Fixes to ACBM support.
Matti Hamalainen <ccr@tnsp.org>
parents: 2068
diff changeset
2409 dmMsg(1, "IFF: ACBM image with compression != none (%d). Ignoring.\n",
83a3d05b5c1d Fixes to ACBM support.
Matti Hamalainen <ccr@tnsp.org>
parents: 2068
diff changeset
2410 iff.bmhd.compression);
83a3d05b5c1d Fixes to ACBM support.
Matti Hamalainen <ccr@tnsp.org>
parents: 2068
diff changeset
2411
83a3d05b5c1d Fixes to ACBM support.
Matti Hamalainen <ccr@tnsp.org>
parents: 2068
diff changeset
2412 iff.bmhd.compression = IFF_COMP_NONE;
83a3d05b5c1d Fixes to ACBM support.
Matti Hamalainen <ccr@tnsp.org>
parents: 2068
diff changeset
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
2586
9807ae37ad69 Require stdbool.h, we require C11 now.
Matti Hamalainen <ccr@tnsp.org>
parents: 2572
diff changeset
2419 if ((res = dmCheckIFFChunk(&iff.chCMAP, &chunk, false, 3)) != DMERR_OK)
958
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)
2586
9807ae37ad69 Require stdbool.h, we require C11 now.
Matti Hamalainen <ccr@tnsp.org>
parents: 2572
diff changeset
2454 parsed = true;
443
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
9aaa8ee24626 Fix a comment.
Matti Hamalainen <ccr@tnsp.org>
parents: 1620
diff changeset
2459 // Check for multiple occurences of BODY
2586
9807ae37ad69 Require stdbool.h, we require C11 now.
Matti Hamalainen <ccr@tnsp.org>
parents: 2572
diff changeset
2460 if ((res = dmCheckIFFChunk(&iff.chBODY, &chunk, false, 1)) != DMERR_OK)
958
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
8ad98bc7402c Cleanups.
Matti Hamalainen <ccr@tnsp.org>
parents: 1902
diff changeset
2493 if ((res = dmDecodeIFFBody(fp, &iff, *pimg)) != DMERR_OK)
8ad98bc7402c Cleanups.
Matti Hamalainen <ccr@tnsp.org>
parents: 1902
diff changeset
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)
2586
9807ae37ad69 Require stdbool.h, we require C11 now.
Matti Hamalainen <ccr@tnsp.org>
parents: 2572
diff changeset
2500 parsed = true;
443
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
9623b9b548d4 Reallocation fixes.
Matti Hamalainen <ccr@tnsp.org>
parents: 812
diff changeset
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
9623b9b548d4 Reallocation fixes.
Matti Hamalainen <ccr@tnsp.org>
parents: 812
diff changeset
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
9623b9b548d4 Reallocation fixes.
Matti Hamalainen <ccr@tnsp.org>
parents: 812
diff changeset
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
8c6040d5b930 Fix IFF chunk padding.
Matti Hamalainen <ccr@tnsp.org>
parents: 1899
diff changeset
2608 if (chunk->size & 1)
8c6040d5b930 Fix IFF chunk padding.
Matti Hamalainen <ccr@tnsp.org>
parents: 1899
diff changeset
2609 {
2020
57a2527ff63d Fix IFF chunk padding.
Matti Hamalainen <ccr@tnsp.org>
parents: 2019
diff changeset
2610 dmMsg(3, "Padding chunk ID '%s', size %d ++\n",
57a2527ff63d Fix IFF chunk padding.
Matti Hamalainen <ccr@tnsp.org>
parents: 2019
diff changeset
2611 chunk->idStr, chunk->size);
57a2527ff63d Fix IFF chunk padding.
Matti Hamalainen <ccr@tnsp.org>
parents: 2019
diff changeset
2612
1900
8c6040d5b930 Fix IFF chunk padding.
Matti Hamalainen <ccr@tnsp.org>
parents: 1899
diff changeset
2613 if (!dmf_write_byte(fp, 0))
8c6040d5b930 Fix IFF chunk padding.
Matti Hamalainen <ccr@tnsp.org>
parents: 1899
diff changeset
2614 return dmferror(fp);
8c6040d5b930 Fix IFF chunk padding.
Matti Hamalainen <ccr@tnsp.org>
parents: 1899
diff changeset
2615
2020
57a2527ff63d Fix IFF chunk padding.
Matti Hamalainen <ccr@tnsp.org>
parents: 2019
diff changeset
2616 curr++;
1900
8c6040d5b930 Fix IFF chunk padding.
Matti Hamalainen <ccr@tnsp.org>
parents: 1899
diff changeset
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
2586
9807ae37ad69 Require stdbool.h, we require C11 now.
Matti Hamalainen <ccr@tnsp.org>
parents: 2572
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)
2586
9807ae37ad69 Require stdbool.h, we require C11 now.
Matti Hamalainen <ccr@tnsp.org>
parents: 2572
diff changeset
2649 return true;
2050
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
2586
9807ae37ad69 Require stdbool.h, we require C11 now.
Matti Hamalainen <ccr@tnsp.org>
parents: 2572
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)
2586
9807ae37ad69 Require stdbool.h, we require C11 now.
Matti Hamalainen <ccr@tnsp.org>
parents: 2572
diff changeset
2664 return true;
2050
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
2586
9807ae37ad69 Require stdbool.h, we require C11 now.
Matti Hamalainen <ccr@tnsp.org>
parents: 2572
diff changeset
2676 bool dmIFFEncodeByteRun1Row(DMResource *fp, const Uint8 *buf, const 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
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;
2586
9807ae37ad69 Require stdbool.h, we require C11 now.
Matti Hamalainen <ccr@tnsp.org>
parents: 2572
diff changeset
2680 bool ret = true;
2050
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];
2586
9807ae37ad69 Require stdbool.h, we require C11 now.
Matti Hamalainen <ccr@tnsp.org>
parents: 2572
diff changeset
2685 bool flush = false;
2050
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++;
2586
9807ae37ad69 Require stdbool.h, we require C11 now.
Matti Hamalainen <ccr@tnsp.org>
parents: 2572
diff changeset
2720 flush = true;
2050
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
2586
9807ae37ad69 Require stdbool.h, we require C11 now.
Matti Hamalainen <ccr@tnsp.org>
parents: 2572
diff changeset
2746 static bool dmIFFWriteOneRow(DMResource *fp, DMIFF *iff, const Uint8 *buf, const 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
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
5930ff7879b5 Cleanup IFF writer a bit.
Matti Hamalainen <ccr@tnsp.org>
parents: 1903
diff changeset
2758 Uint8 *buf = NULL;
5930ff7879b5 Cleanup IFF writer a bit.
Matti Hamalainen <ccr@tnsp.org>
parents: 1903
diff changeset
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
5930ff7879b5 Cleanup IFF writer a bit.
Matti Hamalainen <ccr@tnsp.org>
parents: 1903
diff changeset
2783 iff.bmhd.w = img->width * spec->scaleX;
5930ff7879b5 Cleanup IFF writer a bit.
Matti Hamalainen <ccr@tnsp.org>
parents: 1903
diff changeset
2784 iff.bmhd.h = img->height * spec->scaleY;
5930ff7879b5 Cleanup IFF writer a bit.
Matti Hamalainen <ccr@tnsp.org>
parents: 1903
diff changeset
2785 iff.bmhd.pagew = img->width * spec->scaleX;
5930ff7879b5 Cleanup IFF writer a bit.
Matti Hamalainen <ccr@tnsp.org>
parents: 1903
diff changeset
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
83a3d05b5c1d Fixes to ACBM support.
Matti Hamalainen <ccr@tnsp.org>
parents: 2068
diff changeset
2796 // Apparently ACBM can't/should not use compression .. even though
83a3d05b5c1d Fixes to ACBM support.
Matti Hamalainen <ccr@tnsp.org>
parents: 2068
diff changeset
2797 // some files in the wild have bmhd.compression != 0 (but are not
83a3d05b5c1d Fixes to ACBM support.
Matti Hamalainen <ccr@tnsp.org>
parents: 2068
diff changeset
2798 // actually compressed.) To be more compliant with the spec,
83a3d05b5c1d Fixes to ACBM support.
Matti Hamalainen <ccr@tnsp.org>
parents: 2068
diff changeset
2799 iff.bmhd.compression = (spec->compression && iff.idsig != IFF_ID_ACBM) ? IFF_COMP_BYTERUN1 : IFF_COMP_NONE;
83a3d05b5c1d Fixes to ACBM support.
Matti Hamalainen <ccr@tnsp.org>
parents: 2068
diff changeset
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
83a3d05b5c1d Fixes to ACBM support.
Matti Hamalainen <ccr@tnsp.org>
parents: 2068
diff changeset
2884 if ((res = dmWriteIFFChunkHdr(fp, &iff.chBODY,
83a3d05b5c1d Fixes to ACBM support.
Matti Hamalainen <ccr@tnsp.org>
parents: 2068
diff changeset
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
5930ff7879b5 Cleanup IFF writer a bit.
Matti Hamalainen <ccr@tnsp.org>
parents: 1903
diff changeset
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
5930ff7879b5 Cleanup IFF writer a bit.
Matti Hamalainen <ccr@tnsp.org>
parents: 1903
diff changeset
2891 else
2069
83a3d05b5c1d Fixes to ACBM support.
Matti Hamalainen <ccr@tnsp.org>
parents: 2068
diff changeset
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
83a3d05b5c1d Fixes to ACBM support.
Matti Hamalainen <ccr@tnsp.org>
parents: 2068
diff changeset
2894 else
1904
5930ff7879b5 Cleanup IFF writer a bit.
Matti Hamalainen <ccr@tnsp.org>
parents: 1903
diff changeset
2895 bufLen = img->width * spec->scaleX;
5930ff7879b5 Cleanup IFF writer a bit.
Matti Hamalainen <ccr@tnsp.org>
parents: 1903
diff changeset
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
5930ff7879b5 Cleanup IFF writer a bit.
Matti Hamalainen <ccr@tnsp.org>
parents: 1903
diff changeset
2899
5930ff7879b5 Cleanup IFF writer a bit.
Matti Hamalainen <ccr@tnsp.org>
parents: 1903
diff changeset
2900 if ((buf = dmMalloc(bufLen)) == NULL)
5930ff7879b5 Cleanup IFF writer a bit.
Matti Hamalainen <ccr@tnsp.org>
parents: 1903
diff changeset
2901 return DMERR_MALLOC;
5930ff7879b5 Cleanup IFF writer a bit.
Matti Hamalainen <ccr@tnsp.org>
parents: 1903
diff changeset
2902
5930ff7879b5 Cleanup IFF writer a bit.
Matti Hamalainen <ccr@tnsp.org>
parents: 1903
diff changeset
2903 // Encode the body
2069
83a3d05b5c1d Fixes to ACBM support.
Matti Hamalainen <ccr@tnsp.org>
parents: 2068
diff changeset
2904 if (iff.idsig == IFF_ID_ACBM)
83a3d05b5c1d Fixes to ACBM support.
Matti Hamalainen <ccr@tnsp.org>
parents: 2068
diff changeset
2905 {
83a3d05b5c1d Fixes to ACBM support.
Matti Hamalainen <ccr@tnsp.org>
parents: 2068
diff changeset
2906 for (int plane = 0; plane < iff.bmhd.nplanes; plane++)
83a3d05b5c1d Fixes to ACBM support.
Matti Hamalainen <ccr@tnsp.org>
parents: 2068
diff changeset
2907 {
83a3d05b5c1d Fixes to ACBM support.
Matti Hamalainen <ccr@tnsp.org>
parents: 2068
diff changeset
2908 // Encode bitplane
2414
69a5af2eb1ea Remove useless dmMemset().
Matti Hamalainen <ccr@tnsp.org>
parents: 2393
diff changeset
2909 memset(buf, 0, bufLen);
2069
83a3d05b5c1d Fixes to ACBM support.
Matti Hamalainen <ccr@tnsp.org>
parents: 2068
diff changeset
2910
83a3d05b5c1d Fixes to ACBM support.
Matti Hamalainen <ccr@tnsp.org>
parents: 2068
diff changeset
2911 for (int yc = 0; yc < img->height * spec->scaleY; yc++)
83a3d05b5c1d Fixes to ACBM support.
Matti Hamalainen <ccr@tnsp.org>
parents: 2068
diff changeset
2912 {
83a3d05b5c1d Fixes to ACBM support.
Matti Hamalainen <ccr@tnsp.org>
parents: 2068
diff changeset
2913 Uint8 *sp = img->data + (yc * img->pitch);
83a3d05b5c1d Fixes to ACBM support.
Matti Hamalainen <ccr@tnsp.org>
parents: 2068
diff changeset
2914 Uint8 *dp = buf + (yc * img->width * spec->scaleX) / 8;
83a3d05b5c1d Fixes to ACBM support.
Matti Hamalainen <ccr@tnsp.org>
parents: 2068
diff changeset
2915 for (int xc = 0; xc < img->width * spec->scaleX; xc++)
83a3d05b5c1d Fixes to ACBM support.
Matti Hamalainen <ccr@tnsp.org>
parents: 2068
diff changeset
2916 dp[xc / 8] |= ((sp[xc / spec->scaleX] >> plane) & 1) << (7 - (xc & 7));
83a3d05b5c1d Fixes to ACBM support.
Matti Hamalainen <ccr@tnsp.org>
parents: 2068
diff changeset
2917 }
83a3d05b5c1d Fixes to ACBM support.
Matti Hamalainen <ccr@tnsp.org>
parents: 2068
diff changeset
2918
83a3d05b5c1d Fixes to ACBM support.
Matti Hamalainen <ccr@tnsp.org>
parents: 2068
diff changeset
2919 if (!dmIFFWriteOneRow(fp, &iff, buf, bufLen))
83a3d05b5c1d Fixes to ACBM support.
Matti Hamalainen <ccr@tnsp.org>
parents: 2068
diff changeset
2920 {
83a3d05b5c1d Fixes to ACBM support.
Matti Hamalainen <ccr@tnsp.org>
parents: 2068
diff changeset
2921 res = dmError(DMERR_FWRITE,
83a3d05b5c1d Fixes to ACBM support.
Matti Hamalainen <ccr@tnsp.org>
parents: 2068
diff changeset
2922 "IFF: Error writing ACBM image plane %d.\n",
83a3d05b5c1d Fixes to ACBM support.
Matti Hamalainen <ccr@tnsp.org>
parents: 2068
diff changeset
2923 plane);
83a3d05b5c1d Fixes to ACBM support.
Matti Hamalainen <ccr@tnsp.org>
parents: 2068
diff changeset
2924 goto out;
83a3d05b5c1d Fixes to ACBM support.
Matti Hamalainen <ccr@tnsp.org>
parents: 2068
diff changeset
2925 }
83a3d05b5c1d Fixes to ACBM support.
Matti Hamalainen <ccr@tnsp.org>
parents: 2068
diff changeset
2926 }
83a3d05b5c1d Fixes to ACBM support.
Matti Hamalainen <ccr@tnsp.org>
parents: 2068
diff changeset
2927 }
83a3d05b5c1d Fixes to ACBM support.
Matti Hamalainen <ccr@tnsp.org>
parents: 2068
diff changeset
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
5930ff7879b5 Cleanup IFF writer a bit.
Matti Hamalainen <ccr@tnsp.org>
parents: 1903
diff changeset
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
5930ff7879b5 Cleanup IFF writer a bit.
Matti Hamalainen <ccr@tnsp.org>
parents: 1903
diff changeset
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
5930ff7879b5 Cleanup IFF writer a bit.
Matti Hamalainen <ccr@tnsp.org>
parents: 1903
diff changeset
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
5930ff7879b5 Cleanup IFF writer a bit.
Matti Hamalainen <ccr@tnsp.org>
parents: 1903
diff changeset
2969 }
5930ff7879b5 Cleanup IFF writer a bit.
Matti Hamalainen <ccr@tnsp.org>
parents: 1903
diff changeset
2970 }
2064
3617ef01c1de Separate ILBM and PBM subformats of IFF images.
Matti Hamalainen <ccr@tnsp.org>
parents: 2063
diff changeset
2971 else
1904
5930ff7879b5 Cleanup IFF writer a bit.
Matti Hamalainen <ccr@tnsp.org>
parents: 1903
diff changeset
2972 {
5930ff7879b5 Cleanup IFF writer a bit.
Matti Hamalainen <ccr@tnsp.org>
parents: 1903
diff changeset
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
5930ff7879b5 Cleanup IFF writer a bit.
Matti Hamalainen <ccr@tnsp.org>
parents: 1903
diff changeset
2975
5930ff7879b5 Cleanup IFF writer a bit.
Matti Hamalainen <ccr@tnsp.org>
parents: 1903
diff changeset
2976 if (!dmIFFWriteOneRow(fp, &iff, buf, bufLen))
5930ff7879b5 Cleanup IFF writer a bit.
Matti Hamalainen <ccr@tnsp.org>
parents: 1903
diff changeset
2977 {
5930ff7879b5 Cleanup IFF writer a bit.
Matti Hamalainen <ccr@tnsp.org>
parents: 1903
diff changeset
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
5930ff7879b5 Cleanup IFF writer a bit.
Matti Hamalainen <ccr@tnsp.org>
parents: 1903
diff changeset
2980 goto out;
5930ff7879b5 Cleanup IFF writer a bit.
Matti Hamalainen <ccr@tnsp.org>
parents: 1903
diff changeset
2981 }
5930ff7879b5 Cleanup IFF writer a bit.
Matti Hamalainen <ccr@tnsp.org>
parents: 1903
diff changeset
2982 }
5930ff7879b5 Cleanup IFF writer a bit.
Matti Hamalainen <ccr@tnsp.org>
parents: 1903
diff changeset
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
5930ff7879b5 Cleanup IFF writer a bit.
Matti Hamalainen <ccr@tnsp.org>
parents: 1903
diff changeset
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
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
3003 {
1616
36d073c45327 Refactor the format handling a bit.
Matti Hamalainen <ccr@tnsp.org>
parents: 1615
diff changeset
3004 #ifdef DM_USE_LIBPNG
435
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
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
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
3010 #endif
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
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
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
3015 },
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
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
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
3020 },
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
3021 {
2071
3dac7a781317 s/"lbm"/"ilbm"/
Matti Hamalainen <ccr@tnsp.org>
parents: 2069
diff changeset
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
e4dc8fbaa5ad Improve IFF probing.
Matti Hamalainen <ccr@tnsp.org>
parents: 2067
diff changeset
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
e4dc8fbaa5ad Improve IFF probing.
Matti Hamalainen <ccr@tnsp.org>
parents: 2067
diff changeset
3029 fmtProbeIFF_PBM, dmReadIFFImage, dmWriteIFFImage,
e4dc8fbaa5ad Improve IFF probing.
Matti Hamalainen <ccr@tnsp.org>
parents: 2067
diff changeset
3030 },
e4dc8fbaa5ad Improve IFF probing.
Matti Hamalainen <ccr@tnsp.org>
parents: 2067
diff changeset
3031 {
e4dc8fbaa5ad Improve IFF probing.
Matti Hamalainen <ccr@tnsp.org>
parents: 2067
diff changeset
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
e4dc8fbaa5ad Improve IFF probing.
Matti Hamalainen <ccr@tnsp.org>
parents: 2067
diff changeset
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
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
3050 }
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
3051 };
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
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
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
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
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
3057 {
2599
c3c1d3c75f53 s/DM_PROBE_SCORE_false/DM_PROBE_SCORE_FALSE/g
Matti Hamalainen <ccr@tnsp.org>
parents: 2586
diff changeset
3058 int scoreMax = DM_PROBE_SCORE_FALSE, scoreIndex = -1;
435
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
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
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
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
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
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
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
3071 }
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
3072 }
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
3073
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
3074 if (scoreIndex >= 0)
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
3075 {
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
3076 *pfmt = &dmImageFormatList[scoreIndex];
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
3077 *index = scoreIndex;
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
3078 return scoreMax;
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
3079 }
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
3080 else
2599
c3c1d3c75f53 s/DM_PROBE_SCORE_false/DM_PROBE_SCORE_FALSE/g
Matti Hamalainen <ccr@tnsp.org>
parents: 2586
diff changeset
3081 return DM_PROBE_SCORE_FALSE;
435
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
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 {
2599
c3c1d3c75f53 s/DM_PROBE_SCORE_false/DM_PROBE_SCORE_FALSE/g
Matti Hamalainen <ccr@tnsp.org>
parents: 2586
diff changeset
3107 int scoreMax = DM_PROBE_SCORE_FALSE, scoreIndex = -1;
2207
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
2599
c3c1d3c75f53 s/DM_PROBE_SCORE_false/DM_PROBE_SCORE_FALSE/g
Matti Hamalainen <ccr@tnsp.org>
parents: 2586
diff changeset
3130 return DM_PROBE_SCORE_FALSE;
2207
1ea48084055e Add functionality for separate palette file handling, reading, writing and
Matti Hamalainen <ccr@tnsp.org>
parents: 2202
diff changeset
3131 }