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