annotate tools/lib64gfx.c @ 1730:881a3fc421d8

Use the default C64 palette whenever we need it, but make it possible to override it.
author Matti Hamalainen <ccr@tnsp.org>
date Fri, 08 Jun 2018 22:03:19 +0300
parents 80adcda72210
children 474055f25ab0
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
407
59244a7ae37f Move c64 utilities to the engine lib, as we benefit from a common framework.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1 /*
59244a7ae37f Move c64 utilities to the engine lib, as we benefit from a common framework.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
2 * Functions for reading and converting various restricted
59244a7ae37f Move c64 utilities to the engine lib, as we benefit from a common framework.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
3 * C64/etc and/or indexed/paletted graphics formats.
59244a7ae37f Move c64 utilities to the engine lib, as we benefit from a common framework.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
4 * Programmed and designed by Matti 'ccr' Hamalainen
1456
42fb39da7dde Bump copyrights.
Matti Hamalainen <ccr@tnsp.org>
parents: 1448
diff changeset
5 * (C) Copyright 2012-2018 Tecnic Software productions (TNSP)
407
59244a7ae37f Move c64 utilities to the engine lib, as we benefit from a common framework.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
6 *
59244a7ae37f Move c64 utilities to the engine lib, as we benefit from a common framework.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
7 * Please read file 'COPYING' for information on license and distribution.
59244a7ae37f Move c64 utilities to the engine lib, as we benefit from a common framework.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
8 */
59244a7ae37f Move c64 utilities to the engine lib, as we benefit from a common framework.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
9 #include "lib64gfx.h"
435
e4a3f183e463 Modularize some more.
Matti Hamalainen <ccr@tnsp.org>
parents: 433
diff changeset
10
514
c9b9f912acfb Cleanups.
Matti Hamalainen <ccr@tnsp.org>
parents: 513
diff changeset
11 #define BUF_SIZE_INITIAL (16*1024)
c9b9f912acfb Cleanups.
Matti Hamalainen <ccr@tnsp.org>
parents: 513
diff changeset
12 #define BUF_SIZE_GROW (4*1024)
c9b9f912acfb Cleanups.
Matti Hamalainen <ccr@tnsp.org>
parents: 513
diff changeset
13
407
59244a7ae37f Move c64 utilities to the engine lib, as we benefit from a common framework.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
14
1644
9d9a0e852b3d Reorder some functions.
Matti Hamalainen <ccr@tnsp.org>
parents: 1632
diff changeset
15 char * dmC64GetImageTypeString(char *buf, const size_t len, const int type, const BOOL lng)
9d9a0e852b3d Reorder some functions.
Matti Hamalainen <ccr@tnsp.org>
parents: 1632
diff changeset
16 {
9d9a0e852b3d Reorder some functions.
Matti Hamalainen <ccr@tnsp.org>
parents: 1632
diff changeset
17 snprintf(buf, len,
9d9a0e852b3d Reorder some functions.
Matti Hamalainen <ccr@tnsp.org>
parents: 1632
diff changeset
18 "%s%s%s%s",
9d9a0e852b3d Reorder some functions.
Matti Hamalainen <ccr@tnsp.org>
parents: 1632
diff changeset
19 (type & D64_FMT_MC) ? (lng ? "MultiColor " : "MC ") : "HiRes ",
9d9a0e852b3d Reorder some functions.
Matti Hamalainen <ccr@tnsp.org>
parents: 1632
diff changeset
20 (type & D64_FMT_ILACE) ? (lng ? "Interlaced " : "ILace ") : "",
9d9a0e852b3d Reorder some functions.
Matti Hamalainen <ccr@tnsp.org>
parents: 1632
diff changeset
21 (type & D64_FMT_FLI) ? "FLI " : "",
9d9a0e852b3d Reorder some functions.
Matti Hamalainen <ccr@tnsp.org>
parents: 1632
diff changeset
22 (type & D64_FMT_CHAR) ? "CHAR" : ""
9d9a0e852b3d Reorder some functions.
Matti Hamalainen <ccr@tnsp.org>
parents: 1632
diff changeset
23 );
9d9a0e852b3d Reorder some functions.
Matti Hamalainen <ccr@tnsp.org>
parents: 1632
diff changeset
24
9d9a0e852b3d Reorder some functions.
Matti Hamalainen <ccr@tnsp.org>
parents: 1632
diff changeset
25 return buf;
9d9a0e852b3d Reorder some functions.
Matti Hamalainen <ccr@tnsp.org>
parents: 1632
diff changeset
26 }
9d9a0e852b3d Reorder some functions.
Matti Hamalainen <ccr@tnsp.org>
parents: 1632
diff changeset
27
9d9a0e852b3d Reorder some functions.
Matti Hamalainen <ccr@tnsp.org>
parents: 1632
diff changeset
28
1488
c71b6c5204af Factor the C64 bitmap image format info dump function to lib64gfx and use it from 64vw.
Matti Hamalainen <ccr@tnsp.org>
parents: 1487
diff changeset
29 void dmC64ImageDump(FILE *fh, const DMC64Image *img, const DMC64ImageFormat *fmt)
c71b6c5204af Factor the C64 bitmap image format info dump function to lib64gfx and use it from 64vw.
Matti Hamalainen <ccr@tnsp.org>
parents: 1487
diff changeset
30 {
1728
80adcda72210 Allow image pointer argument to be NULL for dmC64ImageDump().
Matti Hamalainen <ccr@tnsp.org>
parents: 1727
diff changeset
31 char typeStr[64], typeStr2[64];
1488
c71b6c5204af Factor the C64 bitmap image format info dump function to lib64gfx and use it from 64vw.
Matti Hamalainen <ccr@tnsp.org>
parents: 1487
diff changeset
32
1728
80adcda72210 Allow image pointer argument to be NULL for dmC64ImageDump().
Matti Hamalainen <ccr@tnsp.org>
parents: 1727
diff changeset
33 dmC64GetImageTypeString(typeStr, sizeof(typeStr), fmt->type, TRUE);
1488
c71b6c5204af Factor the C64 bitmap image format info dump function to lib64gfx and use it from 64vw.
Matti Hamalainen <ccr@tnsp.org>
parents: 1487
diff changeset
34
c71b6c5204af Factor the C64 bitmap image format info dump function to lib64gfx and use it from 64vw.
Matti Hamalainen <ccr@tnsp.org>
parents: 1487
diff changeset
35 if (fmt != NULL)
c71b6c5204af Factor the C64 bitmap image format info dump function to lib64gfx and use it from 64vw.
Matti Hamalainen <ccr@tnsp.org>
parents: 1487
diff changeset
36 {
c71b6c5204af Factor the C64 bitmap image format info dump function to lib64gfx and use it from 64vw.
Matti Hamalainen <ccr@tnsp.org>
parents: 1487
diff changeset
37 fprintf(fh,
c71b6c5204af Factor the C64 bitmap image format info dump function to lib64gfx and use it from 64vw.
Matti Hamalainen <ccr@tnsp.org>
parents: 1487
diff changeset
38 "Format : %s [%s]\n",
c71b6c5204af Factor the C64 bitmap image format info dump function to lib64gfx and use it from 64vw.
Matti Hamalainen <ccr@tnsp.org>
parents: 1487
diff changeset
39 fmt->name, fmt->fext);
c71b6c5204af Factor the C64 bitmap image format info dump function to lib64gfx and use it from 64vw.
Matti Hamalainen <ccr@tnsp.org>
parents: 1487
diff changeset
40 }
c71b6c5204af Factor the C64 bitmap image format info dump function to lib64gfx and use it from 64vw.
Matti Hamalainen <ccr@tnsp.org>
parents: 1487
diff changeset
41
1728
80adcda72210 Allow image pointer argument to be NULL for dmC64ImageDump().
Matti Hamalainen <ccr@tnsp.org>
parents: 1727
diff changeset
42 if (img != NULL)
80adcda72210 Allow image pointer argument to be NULL for dmC64ImageDump().
Matti Hamalainen <ccr@tnsp.org>
parents: 1727
diff changeset
43 {
80adcda72210 Allow image pointer argument to be NULL for dmC64ImageDump().
Matti Hamalainen <ccr@tnsp.org>
parents: 1727
diff changeset
44 dmC64GetImageTypeString(typeStr2, sizeof(typeStr2), img->type, TRUE);
1488
c71b6c5204af Factor the C64 bitmap image format info dump function to lib64gfx and use it from 64vw.
Matti Hamalainen <ccr@tnsp.org>
parents: 1487
diff changeset
45
1728
80adcda72210 Allow image pointer argument to be NULL for dmC64ImageDump().
Matti Hamalainen <ccr@tnsp.org>
parents: 1727
diff changeset
46 fprintf(fh,
80adcda72210 Allow image pointer argument to be NULL for dmC64ImageDump().
Matti Hamalainen <ccr@tnsp.org>
parents: 1727
diff changeset
47 "Type : %s [%s]\n"
80adcda72210 Allow image pointer argument to be NULL for dmC64ImageDump().
Matti Hamalainen <ccr@tnsp.org>
parents: 1727
diff changeset
48 "Banks : %d\n",
80adcda72210 Allow image pointer argument to be NULL for dmC64ImageDump().
Matti Hamalainen <ccr@tnsp.org>
parents: 1727
diff changeset
49 typeStr, typeStr2,
80adcda72210 Allow image pointer argument to be NULL for dmC64ImageDump().
Matti Hamalainen <ccr@tnsp.org>
parents: 1727
diff changeset
50 img->nbanks);
80adcda72210 Allow image pointer argument to be NULL for dmC64ImageDump().
Matti Hamalainen <ccr@tnsp.org>
parents: 1727
diff changeset
51
80adcda72210 Allow image pointer argument to be NULL for dmC64ImageDump().
Matti Hamalainen <ccr@tnsp.org>
parents: 1727
diff changeset
52 if (img->type & D64_FMT_ILACE)
1488
c71b6c5204af Factor the C64 bitmap image format info dump function to lib64gfx and use it from 64vw.
Matti Hamalainen <ccr@tnsp.org>
parents: 1487
diff changeset
53 {
1728
80adcda72210 Allow image pointer argument to be NULL for dmC64ImageDump().
Matti Hamalainen <ccr@tnsp.org>
parents: 1727
diff changeset
54 char *tmps;
80adcda72210 Allow image pointer argument to be NULL for dmC64ImageDump().
Matti Hamalainen <ccr@tnsp.org>
parents: 1727
diff changeset
55 switch (img->laceType)
80adcda72210 Allow image pointer argument to be NULL for dmC64ImageDump().
Matti Hamalainen <ccr@tnsp.org>
parents: 1727
diff changeset
56 {
80adcda72210 Allow image pointer argument to be NULL for dmC64ImageDump().
Matti Hamalainen <ccr@tnsp.org>
parents: 1727
diff changeset
57 case D64_ILACE_COLOR: tmps = "color"; break;
80adcda72210 Allow image pointer argument to be NULL for dmC64ImageDump().
Matti Hamalainen <ccr@tnsp.org>
parents: 1727
diff changeset
58 case D64_ILACE_RES: tmps = "resolution"; break;
80adcda72210 Allow image pointer argument to be NULL for dmC64ImageDump().
Matti Hamalainen <ccr@tnsp.org>
parents: 1727
diff changeset
59 default: tmps = "ERROR"; break;
80adcda72210 Allow image pointer argument to be NULL for dmC64ImageDump().
Matti Hamalainen <ccr@tnsp.org>
parents: 1727
diff changeset
60 }
80adcda72210 Allow image pointer argument to be NULL for dmC64ImageDump().
Matti Hamalainen <ccr@tnsp.org>
parents: 1727
diff changeset
61 fprintf(fh,
80adcda72210 Allow image pointer argument to be NULL for dmC64ImageDump().
Matti Hamalainen <ccr@tnsp.org>
parents: 1727
diff changeset
62 "Interlace type : %s\n",
80adcda72210 Allow image pointer argument to be NULL for dmC64ImageDump().
Matti Hamalainen <ccr@tnsp.org>
parents: 1727
diff changeset
63 tmps);
1488
c71b6c5204af Factor the C64 bitmap image format info dump function to lib64gfx and use it from 64vw.
Matti Hamalainen <ccr@tnsp.org>
parents: 1487
diff changeset
64 }
1728
80adcda72210 Allow image pointer argument to be NULL for dmC64ImageDump().
Matti Hamalainen <ccr@tnsp.org>
parents: 1727
diff changeset
65
1488
c71b6c5204af Factor the C64 bitmap image format info dump function to lib64gfx and use it from 64vw.
Matti Hamalainen <ccr@tnsp.org>
parents: 1487
diff changeset
66 fprintf(fh,
1728
80adcda72210 Allow image pointer argument to be NULL for dmC64ImageDump().
Matti Hamalainen <ccr@tnsp.org>
parents: 1727
diff changeset
67 "Width x Height : %d x %d [%d x %d]\n"
80adcda72210 Allow image pointer argument to be NULL for dmC64ImageDump().
Matti Hamalainen <ccr@tnsp.org>
parents: 1727
diff changeset
68 "CHwidth x CHheight : %d x %d [%d x %d]\n",
80adcda72210 Allow image pointer argument to be NULL for dmC64ImageDump().
Matti Hamalainen <ccr@tnsp.org>
parents: 1727
diff changeset
69 img->width, img->height,
80adcda72210 Allow image pointer argument to be NULL for dmC64ImageDump().
Matti Hamalainen <ccr@tnsp.org>
parents: 1727
diff changeset
70 fmt->width, fmt->height,
80adcda72210 Allow image pointer argument to be NULL for dmC64ImageDump().
Matti Hamalainen <ccr@tnsp.org>
parents: 1727
diff changeset
71 img->chWidth, img->chHeight,
80adcda72210 Allow image pointer argument to be NULL for dmC64ImageDump().
Matti Hamalainen <ccr@tnsp.org>
parents: 1727
diff changeset
72 fmt->chWidth, fmt->chHeight);
1488
c71b6c5204af Factor the C64 bitmap image format info dump function to lib64gfx and use it from 64vw.
Matti Hamalainen <ccr@tnsp.org>
parents: 1487
diff changeset
73 }
1728
80adcda72210 Allow image pointer argument to be NULL for dmC64ImageDump().
Matti Hamalainen <ccr@tnsp.org>
parents: 1727
diff changeset
74 else
80adcda72210 Allow image pointer argument to be NULL for dmC64ImageDump().
Matti Hamalainen <ccr@tnsp.org>
parents: 1727
diff changeset
75 {
80adcda72210 Allow image pointer argument to be NULL for dmC64ImageDump().
Matti Hamalainen <ccr@tnsp.org>
parents: 1727
diff changeset
76 fprintf(fh,
80adcda72210 Allow image pointer argument to be NULL for dmC64ImageDump().
Matti Hamalainen <ccr@tnsp.org>
parents: 1727
diff changeset
77 "Type : %s\n"
80adcda72210 Allow image pointer argument to be NULL for dmC64ImageDump().
Matti Hamalainen <ccr@tnsp.org>
parents: 1727
diff changeset
78 "Width x Height : %d x %d\n"
80adcda72210 Allow image pointer argument to be NULL for dmC64ImageDump().
Matti Hamalainen <ccr@tnsp.org>
parents: 1727
diff changeset
79 "CHwidth x CHheight : %d x %d\n",
80adcda72210 Allow image pointer argument to be NULL for dmC64ImageDump().
Matti Hamalainen <ccr@tnsp.org>
parents: 1727
diff changeset
80 typeStr,
80adcda72210 Allow image pointer argument to be NULL for dmC64ImageDump().
Matti Hamalainen <ccr@tnsp.org>
parents: 1727
diff changeset
81 fmt->width, fmt->height,
80adcda72210 Allow image pointer argument to be NULL for dmC64ImageDump().
Matti Hamalainen <ccr@tnsp.org>
parents: 1727
diff changeset
82 fmt->chWidth, fmt->chHeight);
80adcda72210 Allow image pointer argument to be NULL for dmC64ImageDump().
Matti Hamalainen <ccr@tnsp.org>
parents: 1727
diff changeset
83 }
1488
c71b6c5204af Factor the C64 bitmap image format info dump function to lib64gfx and use it from 64vw.
Matti Hamalainen <ccr@tnsp.org>
parents: 1487
diff changeset
84 }
c71b6c5204af Factor the C64 bitmap image format info dump function to lib64gfx and use it from 64vw.
Matti Hamalainen <ccr@tnsp.org>
parents: 1487
diff changeset
85
c71b6c5204af Factor the C64 bitmap image format info dump function to lib64gfx and use it from 64vw.
Matti Hamalainen <ccr@tnsp.org>
parents: 1487
diff changeset
86
1457
dcff9ac95d3f Add function to set DMImage's palette to default C64 palette and use it.
Matti Hamalainen <ccr@tnsp.org>
parents: 1456
diff changeset
87 void dmSetDefaultC64Palette(DMImage *img)
dcff9ac95d3f Add function to set DMImage's palette to default C64 palette and use it.
Matti Hamalainen <ccr@tnsp.org>
parents: 1456
diff changeset
88 {
dcff9ac95d3f Add function to set DMImage's palette to default C64 palette and use it.
Matti Hamalainen <ccr@tnsp.org>
parents: 1456
diff changeset
89 img->constpal = TRUE;
dcff9ac95d3f Add function to set DMImage's palette to default C64 palette and use it.
Matti Hamalainen <ccr@tnsp.org>
parents: 1456
diff changeset
90 img->pal = dmDefaultC64Palette;
dcff9ac95d3f Add function to set DMImage's palette to default C64 palette and use it.
Matti Hamalainen <ccr@tnsp.org>
parents: 1456
diff changeset
91 img->ncolors = C64_NCOLORS;
dcff9ac95d3f Add function to set DMImage's palette to default C64 palette and use it.
Matti Hamalainen <ccr@tnsp.org>
parents: 1456
diff changeset
92 img->ctransp = 255;
dcff9ac95d3f Add function to set DMImage's palette to default C64 palette and use it.
Matti Hamalainen <ccr@tnsp.org>
parents: 1456
diff changeset
93 }
dcff9ac95d3f Add function to set DMImage's palette to default C64 palette and use it.
Matti Hamalainen <ccr@tnsp.org>
parents: 1456
diff changeset
94
dcff9ac95d3f Add function to set DMImage's palette to default C64 palette and use it.
Matti Hamalainen <ccr@tnsp.org>
parents: 1456
diff changeset
95
1503
c7b9ef56319b Factor all the c64 file format specific things into lib64fmt.c
Matti Hamalainen <ccr@tnsp.org>
parents: 1501
diff changeset
96 BOOL dmCompareAddr16(const Uint8 *buf, const size_t offs, const Uint16 addr)
1381
b6782b785457 Move things around a bit.
Matti Hamalainen <ccr@tnsp.org>
parents: 1380
diff changeset
97 {
b6782b785457 Move things around a bit.
Matti Hamalainen <ccr@tnsp.org>
parents: 1380
diff changeset
98 return buf[offs ] == DM_GET_ADDR_LO(addr) &&
b6782b785457 Move things around a bit.
Matti Hamalainen <ccr@tnsp.org>
parents: 1380
diff changeset
99 buf[offs + 1] == DM_GET_ADDR_HI(addr);
b6782b785457 Move things around a bit.
Matti Hamalainen <ccr@tnsp.org>
parents: 1380
diff changeset
100 }
b6782b785457 Move things around a bit.
Matti Hamalainen <ccr@tnsp.org>
parents: 1380
diff changeset
101
b6782b785457 Move things around a bit.
Matti Hamalainen <ccr@tnsp.org>
parents: 1380
diff changeset
102
1378
c465860e44ed Make c64 image bank allocation dynamic.
Matti Hamalainen <ccr@tnsp.org>
parents: 1377
diff changeset
103 int dmC64ImageGetNumBanks(const DMC64ImageFormat *fmt)
c465860e44ed Make c64 image bank allocation dynamic.
Matti Hamalainen <ccr@tnsp.org>
parents: 1377
diff changeset
104 {
c465860e44ed Make c64 image bank allocation dynamic.
Matti Hamalainen <ccr@tnsp.org>
parents: 1377
diff changeset
105 int nbanks = 0;
c465860e44ed Make c64 image bank allocation dynamic.
Matti Hamalainen <ccr@tnsp.org>
parents: 1377
diff changeset
106 for (int i = 0; i < D64_MAX_ENCDEC_OPS; i++)
c465860e44ed Make c64 image bank allocation dynamic.
Matti Hamalainen <ccr@tnsp.org>
parents: 1377
diff changeset
107 {
1591
3cc7b2aadda3 Add inline helper function fmtGetEncDecOp() and use it.
Matti Hamalainen <ccr@tnsp.org>
parents: 1588
diff changeset
108 const DMC64EncDecOp *op = fmtGetEncDecOp(fmt, i);
1668
1741717b1ae5 Big overhaul to the enc/dec operator system to be more flexible.
Matti Hamalainen <ccr@tnsp.org>
parents: 1660
diff changeset
109 if (op->type == DO_LAST)
1378
c465860e44ed Make c64 image bank allocation dynamic.
Matti Hamalainen <ccr@tnsp.org>
parents: 1377
diff changeset
110 break;
c465860e44ed Make c64 image bank allocation dynamic.
Matti Hamalainen <ccr@tnsp.org>
parents: 1377
diff changeset
111
c465860e44ed Make c64 image bank allocation dynamic.
Matti Hamalainen <ccr@tnsp.org>
parents: 1377
diff changeset
112 if (op->bank > nbanks)
c465860e44ed Make c64 image bank allocation dynamic.
Matti Hamalainen <ccr@tnsp.org>
parents: 1377
diff changeset
113 nbanks = op->bank;
c465860e44ed Make c64 image bank allocation dynamic.
Matti Hamalainen <ccr@tnsp.org>
parents: 1377
diff changeset
114 }
c465860e44ed Make c64 image bank allocation dynamic.
Matti Hamalainen <ccr@tnsp.org>
parents: 1377
diff changeset
115
c465860e44ed Make c64 image bank allocation dynamic.
Matti Hamalainen <ccr@tnsp.org>
parents: 1377
diff changeset
116 return nbanks + 1;
c465860e44ed Make c64 image bank allocation dynamic.
Matti Hamalainen <ccr@tnsp.org>
parents: 1377
diff changeset
117 }
c465860e44ed Make c64 image bank allocation dynamic.
Matti Hamalainen <ccr@tnsp.org>
parents: 1377
diff changeset
118
c465860e44ed Make c64 image bank allocation dynamic.
Matti Hamalainen <ccr@tnsp.org>
parents: 1377
diff changeset
119
1588
ca087c0cc9c4 Refactor the c64 format memory handling a bit for more flexibility.
Matti Hamalainen <ccr@tnsp.org>
parents: 1586
diff changeset
120 int dmC64MemBlockAlloc(DMC64MemBlock *blk, const size_t size)
ca087c0cc9c4 Refactor the c64 format memory handling a bit for more flexibility.
Matti Hamalainen <ccr@tnsp.org>
parents: 1586
diff changeset
121 {
ca087c0cc9c4 Refactor the c64 format memory handling a bit for more flexibility.
Matti Hamalainen <ccr@tnsp.org>
parents: 1586
diff changeset
122 if ((blk->data = dmMalloc0(size)) == NULL)
ca087c0cc9c4 Refactor the c64 format memory handling a bit for more flexibility.
Matti Hamalainen <ccr@tnsp.org>
parents: 1586
diff changeset
123 return DMERR_MALLOC;
ca087c0cc9c4 Refactor the c64 format memory handling a bit for more flexibility.
Matti Hamalainen <ccr@tnsp.org>
parents: 1586
diff changeset
124
ca087c0cc9c4 Refactor the c64 format memory handling a bit for more flexibility.
Matti Hamalainen <ccr@tnsp.org>
parents: 1586
diff changeset
125 blk->size = size;
ca087c0cc9c4 Refactor the c64 format memory handling a bit for more flexibility.
Matti Hamalainen <ccr@tnsp.org>
parents: 1586
diff changeset
126 return DMERR_OK;
ca087c0cc9c4 Refactor the c64 format memory handling a bit for more flexibility.
Matti Hamalainen <ccr@tnsp.org>
parents: 1586
diff changeset
127 }
ca087c0cc9c4 Refactor the c64 format memory handling a bit for more flexibility.
Matti Hamalainen <ccr@tnsp.org>
parents: 1586
diff changeset
128
ca087c0cc9c4 Refactor the c64 format memory handling a bit for more flexibility.
Matti Hamalainen <ccr@tnsp.org>
parents: 1586
diff changeset
129
ca087c0cc9c4 Refactor the c64 format memory handling a bit for more flexibility.
Matti Hamalainen <ccr@tnsp.org>
parents: 1586
diff changeset
130 int dmC64MemBlockCopy(DMC64MemBlock *dst, const DMC64MemBlock *src)
ca087c0cc9c4 Refactor the c64 format memory handling a bit for more flexibility.
Matti Hamalainen <ccr@tnsp.org>
parents: 1586
diff changeset
131 {
ca087c0cc9c4 Refactor the c64 format memory handling a bit for more flexibility.
Matti Hamalainen <ccr@tnsp.org>
parents: 1586
diff changeset
132 if (src->data != NULL && src->size > 0)
ca087c0cc9c4 Refactor the c64 format memory handling a bit for more flexibility.
Matti Hamalainen <ccr@tnsp.org>
parents: 1586
diff changeset
133 {
ca087c0cc9c4 Refactor the c64 format memory handling a bit for more flexibility.
Matti Hamalainen <ccr@tnsp.org>
parents: 1586
diff changeset
134 dst->size = src->size;
ca087c0cc9c4 Refactor the c64 format memory handling a bit for more flexibility.
Matti Hamalainen <ccr@tnsp.org>
parents: 1586
diff changeset
135 if ((dst->data = dmMalloc(src->size)) == NULL)
ca087c0cc9c4 Refactor the c64 format memory handling a bit for more flexibility.
Matti Hamalainen <ccr@tnsp.org>
parents: 1586
diff changeset
136 return DMERR_MALLOC;
ca087c0cc9c4 Refactor the c64 format memory handling a bit for more flexibility.
Matti Hamalainen <ccr@tnsp.org>
parents: 1586
diff changeset
137
ca087c0cc9c4 Refactor the c64 format memory handling a bit for more flexibility.
Matti Hamalainen <ccr@tnsp.org>
parents: 1586
diff changeset
138 memcpy(dst->data, src->data, src->size);
ca087c0cc9c4 Refactor the c64 format memory handling a bit for more flexibility.
Matti Hamalainen <ccr@tnsp.org>
parents: 1586
diff changeset
139 }
ca087c0cc9c4 Refactor the c64 format memory handling a bit for more flexibility.
Matti Hamalainen <ccr@tnsp.org>
parents: 1586
diff changeset
140
ca087c0cc9c4 Refactor the c64 format memory handling a bit for more flexibility.
Matti Hamalainen <ccr@tnsp.org>
parents: 1586
diff changeset
141 return DMERR_OK;
ca087c0cc9c4 Refactor the c64 format memory handling a bit for more flexibility.
Matti Hamalainen <ccr@tnsp.org>
parents: 1586
diff changeset
142 }
ca087c0cc9c4 Refactor the c64 format memory handling a bit for more flexibility.
Matti Hamalainen <ccr@tnsp.org>
parents: 1586
diff changeset
143
ca087c0cc9c4 Refactor the c64 format memory handling a bit for more flexibility.
Matti Hamalainen <ccr@tnsp.org>
parents: 1586
diff changeset
144
ca087c0cc9c4 Refactor the c64 format memory handling a bit for more flexibility.
Matti Hamalainen <ccr@tnsp.org>
parents: 1586
diff changeset
145 void dmC64MemBlockFree(DMC64MemBlock *blk)
ca087c0cc9c4 Refactor the c64 format memory handling a bit for more flexibility.
Matti Hamalainen <ccr@tnsp.org>
parents: 1586
diff changeset
146 {
ca087c0cc9c4 Refactor the c64 format memory handling a bit for more flexibility.
Matti Hamalainen <ccr@tnsp.org>
parents: 1586
diff changeset
147 if (blk != NULL)
ca087c0cc9c4 Refactor the c64 format memory handling a bit for more flexibility.
Matti Hamalainen <ccr@tnsp.org>
parents: 1586
diff changeset
148 {
ca087c0cc9c4 Refactor the c64 format memory handling a bit for more flexibility.
Matti Hamalainen <ccr@tnsp.org>
parents: 1586
diff changeset
149 dmFreeR(&blk->data);
ca087c0cc9c4 Refactor the c64 format memory handling a bit for more flexibility.
Matti Hamalainen <ccr@tnsp.org>
parents: 1586
diff changeset
150 blk->size = 0;
ca087c0cc9c4 Refactor the c64 format memory handling a bit for more flexibility.
Matti Hamalainen <ccr@tnsp.org>
parents: 1586
diff changeset
151 }
ca087c0cc9c4 Refactor the c64 format memory handling a bit for more flexibility.
Matti Hamalainen <ccr@tnsp.org>
parents: 1586
diff changeset
152 }
ca087c0cc9c4 Refactor the c64 format memory handling a bit for more flexibility.
Matti Hamalainen <ccr@tnsp.org>
parents: 1586
diff changeset
153
ca087c0cc9c4 Refactor the c64 format memory handling a bit for more flexibility.
Matti Hamalainen <ccr@tnsp.org>
parents: 1586
diff changeset
154
1378
c465860e44ed Make c64 image bank allocation dynamic.
Matti Hamalainen <ccr@tnsp.org>
parents: 1377
diff changeset
155 DMC64Image *dmC64ImageAlloc(const DMC64ImageFormat *fmt)
931
2270d7f3af77 Refactor the DMC64Image handling to be more dynamic, and start
Matti Hamalainen <ccr@tnsp.org>
parents: 927
diff changeset
156 {
2270d7f3af77 Refactor the DMC64Image handling to be more dynamic, and start
Matti Hamalainen <ccr@tnsp.org>
parents: 927
diff changeset
157 DMC64Image *img = dmMalloc0(sizeof(DMC64Image));
2270d7f3af77 Refactor the DMC64Image handling to be more dynamic, and start
Matti Hamalainen <ccr@tnsp.org>
parents: 927
diff changeset
158
2270d7f3af77 Refactor the DMC64Image handling to be more dynamic, and start
Matti Hamalainen <ccr@tnsp.org>
parents: 927
diff changeset
159 if (img == NULL)
2270d7f3af77 Refactor the DMC64Image handling to be more dynamic, and start
Matti Hamalainen <ccr@tnsp.org>
parents: 927
diff changeset
160 return NULL;
2270d7f3af77 Refactor the DMC64Image handling to be more dynamic, and start
Matti Hamalainen <ccr@tnsp.org>
parents: 927
diff changeset
161
1378
c465860e44ed Make c64 image bank allocation dynamic.
Matti Hamalainen <ccr@tnsp.org>
parents: 1377
diff changeset
162 // Initialize image information
1492
5f9080d24f3c Set DMC64Image::type in dmC64ImageAlloc() from format type.
Matti Hamalainen <ccr@tnsp.org>
parents: 1491
diff changeset
163 img->type = fmt->type;
1491
b329fea6f013 Reindent polishing.
Matti Hamalainen <ccr@tnsp.org>
parents: 1489
diff changeset
164 img->width = fmt->width;
b329fea6f013 Reindent polishing.
Matti Hamalainen <ccr@tnsp.org>
parents: 1489
diff changeset
165 img->height = fmt->height;
b329fea6f013 Reindent polishing.
Matti Hamalainen <ccr@tnsp.org>
parents: 1489
diff changeset
166 img->chWidth = fmt->chWidth;
b329fea6f013 Reindent polishing.
Matti Hamalainen <ccr@tnsp.org>
parents: 1489
diff changeset
167 img->chHeight = fmt->chHeight;
b329fea6f013 Reindent polishing.
Matti Hamalainen <ccr@tnsp.org>
parents: 1489
diff changeset
168 img->nbanks = dmC64ImageGetNumBanks(fmt);
931
2270d7f3af77 Refactor the DMC64Image handling to be more dynamic, and start
Matti Hamalainen <ccr@tnsp.org>
parents: 927
diff changeset
169
1378
c465860e44ed Make c64 image bank allocation dynamic.
Matti Hamalainen <ccr@tnsp.org>
parents: 1377
diff changeset
170 // Allocate banks
1588
ca087c0cc9c4 Refactor the c64 format memory handling a bit for more flexibility.
Matti Hamalainen <ccr@tnsp.org>
parents: 1586
diff changeset
171 if ((img->color = dmCalloc(img->nbanks, sizeof(DMC64MemBlock))) == NULL ||
ca087c0cc9c4 Refactor the c64 format memory handling a bit for more flexibility.
Matti Hamalainen <ccr@tnsp.org>
parents: 1586
diff changeset
172 (img->bitmap = dmCalloc(img->nbanks, sizeof(DMC64MemBlock))) == NULL ||
ca087c0cc9c4 Refactor the c64 format memory handling a bit for more flexibility.
Matti Hamalainen <ccr@tnsp.org>
parents: 1586
diff changeset
173 (img->screen = dmCalloc(img->nbanks, sizeof(DMC64MemBlock))) == NULL ||
ca087c0cc9c4 Refactor the c64 format memory handling a bit for more flexibility.
Matti Hamalainen <ccr@tnsp.org>
parents: 1586
diff changeset
174 (img->charData = dmCalloc(img->nbanks, sizeof(DMC64MemBlock))) == NULL)
1378
c465860e44ed Make c64 image bank allocation dynamic.
Matti Hamalainen <ccr@tnsp.org>
parents: 1377
diff changeset
175 goto err;
c465860e44ed Make c64 image bank allocation dynamic.
Matti Hamalainen <ccr@tnsp.org>
parents: 1377
diff changeset
176
931
2270d7f3af77 Refactor the DMC64Image handling to be more dynamic, and start
Matti Hamalainen <ccr@tnsp.org>
parents: 927
diff changeset
177 return img;
2270d7f3af77 Refactor the DMC64Image handling to be more dynamic, and start
Matti Hamalainen <ccr@tnsp.org>
parents: 927
diff changeset
178
2270d7f3af77 Refactor the DMC64Image handling to be more dynamic, and start
Matti Hamalainen <ccr@tnsp.org>
parents: 927
diff changeset
179 err:
2270d7f3af77 Refactor the DMC64Image handling to be more dynamic, and start
Matti Hamalainen <ccr@tnsp.org>
parents: 927
diff changeset
180 dmC64ImageFree(img);
2270d7f3af77 Refactor the DMC64Image handling to be more dynamic, and start
Matti Hamalainen <ccr@tnsp.org>
parents: 927
diff changeset
181 return NULL;
2270d7f3af77 Refactor the DMC64Image handling to be more dynamic, and start
Matti Hamalainen <ccr@tnsp.org>
parents: 927
diff changeset
182 }
2270d7f3af77 Refactor the DMC64Image handling to be more dynamic, and start
Matti Hamalainen <ccr@tnsp.org>
parents: 927
diff changeset
183
2270d7f3af77 Refactor the DMC64Image handling to be more dynamic, and start
Matti Hamalainen <ccr@tnsp.org>
parents: 927
diff changeset
184
2270d7f3af77 Refactor the DMC64Image handling to be more dynamic, and start
Matti Hamalainen <ccr@tnsp.org>
parents: 927
diff changeset
185 void dmC64ImageFree(DMC64Image *img)
2270d7f3af77 Refactor the DMC64Image handling to be more dynamic, and start
Matti Hamalainen <ccr@tnsp.org>
parents: 927
diff changeset
186 {
2270d7f3af77 Refactor the DMC64Image handling to be more dynamic, and start
Matti Hamalainen <ccr@tnsp.org>
parents: 927
diff changeset
187 if (img != NULL)
2270d7f3af77 Refactor the DMC64Image handling to be more dynamic, and start
Matti Hamalainen <ccr@tnsp.org>
parents: 927
diff changeset
188 {
1462
9cb6dd1046bf Fix memory leaks by freeing more things in dmC64ImageFree().
Matti Hamalainen <ccr@tnsp.org>
parents: 1461
diff changeset
189 // Free the allocated areas
1378
c465860e44ed Make c64 image bank allocation dynamic.
Matti Hamalainen <ccr@tnsp.org>
parents: 1377
diff changeset
190 for (int i = 0; i < img->nbanks; i++)
931
2270d7f3af77 Refactor the DMC64Image handling to be more dynamic, and start
Matti Hamalainen <ccr@tnsp.org>
parents: 927
diff changeset
191 {
1588
ca087c0cc9c4 Refactor the c64 format memory handling a bit for more flexibility.
Matti Hamalainen <ccr@tnsp.org>
parents: 1586
diff changeset
192 dmC64MemBlockFree(&img->color[i]);
ca087c0cc9c4 Refactor the c64 format memory handling a bit for more flexibility.
Matti Hamalainen <ccr@tnsp.org>
parents: 1586
diff changeset
193 dmC64MemBlockFree(&img->bitmap[i]);
ca087c0cc9c4 Refactor the c64 format memory handling a bit for more flexibility.
Matti Hamalainen <ccr@tnsp.org>
parents: 1586
diff changeset
194 dmC64MemBlockFree(&img->screen[i]);
ca087c0cc9c4 Refactor the c64 format memory handling a bit for more flexibility.
Matti Hamalainen <ccr@tnsp.org>
parents: 1586
diff changeset
195 dmC64MemBlockFree(&img->charData[i]);
931
2270d7f3af77 Refactor the DMC64Image handling to be more dynamic, and start
Matti Hamalainen <ccr@tnsp.org>
parents: 927
diff changeset
196 }
1373
fc5ee5b4b0e9 Improve handling of extra data.
Matti Hamalainen <ccr@tnsp.org>
parents: 1372
diff changeset
197
1462
9cb6dd1046bf Fix memory leaks by freeing more things in dmC64ImageFree().
Matti Hamalainen <ccr@tnsp.org>
parents: 1461
diff changeset
198 // Free the pointers to the areas
9cb6dd1046bf Fix memory leaks by freeing more things in dmC64ImageFree().
Matti Hamalainen <ccr@tnsp.org>
parents: 1461
diff changeset
199 dmFree(img->color);
9cb6dd1046bf Fix memory leaks by freeing more things in dmC64ImageFree().
Matti Hamalainen <ccr@tnsp.org>
parents: 1461
diff changeset
200 dmFree(img->bitmap);
9cb6dd1046bf Fix memory leaks by freeing more things in dmC64ImageFree().
Matti Hamalainen <ccr@tnsp.org>
parents: 1461
diff changeset
201 dmFree(img->screen);
1588
ca087c0cc9c4 Refactor the c64 format memory handling a bit for more flexibility.
Matti Hamalainen <ccr@tnsp.org>
parents: 1586
diff changeset
202 dmFree(img->charData);
1462
9cb6dd1046bf Fix memory leaks by freeing more things in dmC64ImageFree().
Matti Hamalainen <ccr@tnsp.org>
parents: 1461
diff changeset
203
9cb6dd1046bf Fix memory leaks by freeing more things in dmC64ImageFree().
Matti Hamalainen <ccr@tnsp.org>
parents: 1461
diff changeset
204 // Extra data ..
1373
fc5ee5b4b0e9 Improve handling of extra data.
Matti Hamalainen <ccr@tnsp.org>
parents: 1372
diff changeset
205 for (int i = 0; i < C64_MAX_EXTRA_DATA; i++)
1588
ca087c0cc9c4 Refactor the c64 format memory handling a bit for more flexibility.
Matti Hamalainen <ccr@tnsp.org>
parents: 1586
diff changeset
206 dmC64MemBlockFree(&img->extraData[i]);
1373
fc5ee5b4b0e9 Improve handling of extra data.
Matti Hamalainen <ccr@tnsp.org>
parents: 1372
diff changeset
207
1167
848a88ce7a57 Use dmMemset().
Matti Hamalainen <ccr@tnsp.org>
parents: 1134
diff changeset
208 dmMemset(img, 0, sizeof(DMC64Image));
931
2270d7f3af77 Refactor the DMC64Image handling to be more dynamic, and start
Matti Hamalainen <ccr@tnsp.org>
parents: 927
diff changeset
209 dmFree(img);
2270d7f3af77 Refactor the DMC64Image handling to be more dynamic, and start
Matti Hamalainen <ccr@tnsp.org>
parents: 927
diff changeset
210 }
2270d7f3af77 Refactor the DMC64Image handling to be more dynamic, and start
Matti Hamalainen <ccr@tnsp.org>
parents: 927
diff changeset
211 }
2270d7f3af77 Refactor the DMC64Image handling to be more dynamic, and start
Matti Hamalainen <ccr@tnsp.org>
parents: 927
diff changeset
212
2270d7f3af77 Refactor the DMC64Image handling to be more dynamic, and start
Matti Hamalainen <ccr@tnsp.org>
parents: 927
diff changeset
213
827
c8beac5313c3 Rename a function.
Matti Hamalainen <ccr@tnsp.org>
parents: 812
diff changeset
214 int dmC64ConvertCSDataToImage(DMImage *img,
410
e4b2f689aff6 Stdint -> SDL types conversion.
Matti Hamalainen <ccr@tnsp.org>
parents: 407
diff changeset
215 int xoffs, int yoffs, const Uint8 *buf,
915
ba6b210c9bf4 Cosmetic.
Matti Hamalainen <ccr@tnsp.org>
parents: 912
diff changeset
216 int width, int height, BOOL multicolor,
ba6b210c9bf4 Cosmetic.
Matti Hamalainen <ccr@tnsp.org>
parents: 912
diff changeset
217 int *colors)
407
59244a7ae37f Move c64 utilities to the engine lib, as we benefit from a common framework.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
218 {
59244a7ae37f Move c64 utilities to the engine lib, as we benefit from a common framework.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
219 int yc, widthpx = width * 8;
410
e4b2f689aff6 Stdint -> SDL types conversion.
Matti Hamalainen <ccr@tnsp.org>
parents: 407
diff changeset
220 Uint8 *dp;
407
59244a7ae37f Move c64 utilities to the engine lib, as we benefit from a common framework.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
221
59244a7ae37f Move c64 utilities to the engine lib, as we benefit from a common framework.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
222 if (img == NULL)
517
e2a76bb59888 Return better error values, using DMERR_* enums.
Matti Hamalainen <ccr@tnsp.org>
parents: 516
diff changeset
223 return DMERR_NULLPTR;
e2a76bb59888 Return better error values, using DMERR_* enums.
Matti Hamalainen <ccr@tnsp.org>
parents: 516
diff changeset
224
e2a76bb59888 Return better error values, using DMERR_* enums.
Matti Hamalainen <ccr@tnsp.org>
parents: 516
diff changeset
225 if (xoffs < 0 || yoffs < 0 ||
e2a76bb59888 Return better error values, using DMERR_* enums.
Matti Hamalainen <ccr@tnsp.org>
parents: 516
diff changeset
226 xoffs > img->width - widthpx ||
407
59244a7ae37f Move c64 utilities to the engine lib, as we benefit from a common framework.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
227 yoffs > img->height - height)
517
e2a76bb59888 Return better error values, using DMERR_* enums.
Matti Hamalainen <ccr@tnsp.org>
parents: 516
diff changeset
228 return DMERR_INVALID_ARGS;
407
59244a7ae37f Move c64 utilities to the engine lib, as we benefit from a common framework.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
229
59244a7ae37f Move c64 utilities to the engine lib, as we benefit from a common framework.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
230 dp = img->data + (yoffs * img->pitch) + xoffs;
59244a7ae37f Move c64 utilities to the engine lib, as we benefit from a common framework.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
231
59244a7ae37f Move c64 utilities to the engine lib, as we benefit from a common framework.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
232 if (multicolor)
59244a7ae37f Move c64 utilities to the engine lib, as we benefit from a common framework.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
233 {
59244a7ae37f Move c64 utilities to the engine lib, as we benefit from a common framework.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
234 for (yc = 0; yc < height; yc++)
59244a7ae37f Move c64 utilities to the engine lib, as we benefit from a common framework.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
235 {
59244a7ae37f Move c64 utilities to the engine lib, as we benefit from a common framework.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
236 const int offs = yc * width;
59244a7ae37f Move c64 utilities to the engine lib, as we benefit from a common framework.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
237 int xc;
410
e4b2f689aff6 Stdint -> SDL types conversion.
Matti Hamalainen <ccr@tnsp.org>
parents: 407
diff changeset
238 Uint8 *d = dp;
407
59244a7ae37f Move c64 utilities to the engine lib, as we benefit from a common framework.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
239
59244a7ae37f Move c64 utilities to the engine lib, as we benefit from a common framework.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
240 for (xc = 0; xc < widthpx / 2; xc++)
59244a7ae37f Move c64 utilities to the engine lib, as we benefit from a common framework.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
241 {
59244a7ae37f Move c64 utilities to the engine lib, as we benefit from a common framework.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
242 const int b = buf[offs + (xc / 4)];
59244a7ae37f Move c64 utilities to the engine lib, as we benefit from a common framework.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
243 const int v = 6 - ((xc * 2) & 6);
410
e4b2f689aff6 Stdint -> SDL types conversion.
Matti Hamalainen <ccr@tnsp.org>
parents: 407
diff changeset
244 const Uint8 c = colors[(b >> v) & 3];
925
23b14d62bf67 Cosmetics.
Matti Hamalainen <ccr@tnsp.org>
parents: 924
diff changeset
245
407
59244a7ae37f Move c64 utilities to the engine lib, as we benefit from a common framework.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
246 *d++ = c;
59244a7ae37f Move c64 utilities to the engine lib, as we benefit from a common framework.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
247 *d++ = c;
59244a7ae37f Move c64 utilities to the engine lib, as we benefit from a common framework.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
248 }
59244a7ae37f Move c64 utilities to the engine lib, as we benefit from a common framework.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
249
59244a7ae37f Move c64 utilities to the engine lib, as we benefit from a common framework.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
250 dp += img->pitch;
59244a7ae37f Move c64 utilities to the engine lib, as we benefit from a common framework.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
251 }
59244a7ae37f Move c64 utilities to the engine lib, as we benefit from a common framework.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
252 }
59244a7ae37f Move c64 utilities to the engine lib, as we benefit from a common framework.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
253 else
59244a7ae37f Move c64 utilities to the engine lib, as we benefit from a common framework.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
254 {
59244a7ae37f Move c64 utilities to the engine lib, as we benefit from a common framework.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
255 for (yc = 0; yc < height; yc++)
59244a7ae37f Move c64 utilities to the engine lib, as we benefit from a common framework.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
256 {
59244a7ae37f Move c64 utilities to the engine lib, as we benefit from a common framework.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
257 const int offs = yc * width;
59244a7ae37f Move c64 utilities to the engine lib, as we benefit from a common framework.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
258 int xc;
410
e4b2f689aff6 Stdint -> SDL types conversion.
Matti Hamalainen <ccr@tnsp.org>
parents: 407
diff changeset
259 Uint8 *d = dp;
407
59244a7ae37f Move c64 utilities to the engine lib, as we benefit from a common framework.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
260
59244a7ae37f Move c64 utilities to the engine lib, as we benefit from a common framework.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
261 for (xc = 0; xc < widthpx; xc++)
59244a7ae37f Move c64 utilities to the engine lib, as we benefit from a common framework.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
262 {
59244a7ae37f Move c64 utilities to the engine lib, as we benefit from a common framework.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
263 const int b = buf[offs + (xc / 8)];
59244a7ae37f Move c64 utilities to the engine lib, as we benefit from a common framework.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
264 const int v = 7 - (xc & 7);
410
e4b2f689aff6 Stdint -> SDL types conversion.
Matti Hamalainen <ccr@tnsp.org>
parents: 407
diff changeset
265 const Uint8 c = colors[(b >> v) & 1];
925
23b14d62bf67 Cosmetics.
Matti Hamalainen <ccr@tnsp.org>
parents: 924
diff changeset
266
407
59244a7ae37f Move c64 utilities to the engine lib, as we benefit from a common framework.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
267 *d++ = c;
59244a7ae37f Move c64 utilities to the engine lib, as we benefit from a common framework.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
268 }
59244a7ae37f Move c64 utilities to the engine lib, as we benefit from a common framework.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
269
59244a7ae37f Move c64 utilities to the engine lib, as we benefit from a common framework.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
270 dp += img->pitch;
59244a7ae37f Move c64 utilities to the engine lib, as we benefit from a common framework.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
271 }
59244a7ae37f Move c64 utilities to the engine lib, as we benefit from a common framework.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
272 }
925
23b14d62bf67 Cosmetics.
Matti Hamalainen <ccr@tnsp.org>
parents: 924
diff changeset
273
517
e2a76bb59888 Return better error values, using DMERR_* enums.
Matti Hamalainen <ccr@tnsp.org>
parents: 516
diff changeset
274 return DMERR_OK;
407
59244a7ae37f Move c64 utilities to the engine lib, as we benefit from a common framework.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
275 }
59244a7ae37f Move c64 utilities to the engine lib, as we benefit from a common framework.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
276
59244a7ae37f Move c64 utilities to the engine lib, as we benefit from a common framework.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
277
1707
a0986cfd6f9d More consistently use DMGrowBuf in the lib64gfx APIs, and implement
Matti Hamalainen <ccr@tnsp.org>
parents: 1697
diff changeset
278 void dmGenericRLEAnalyze(const DMGrowBuf *buf, DMCompParams *cfg)
1503
c7b9ef56319b Factor all the c64 file format specific things into lib64fmt.c
Matti Hamalainen <ccr@tnsp.org>
parents: 1501
diff changeset
279 {
1542
69fa95707e65 Implement dmGenericRLEAnalyze() and use it where appropriate.
Matti Hamalainen <ccr@tnsp.org>
parents: 1537
diff changeset
280 #define DM_STAT_MAX 256
69fa95707e65 Implement dmGenericRLEAnalyze() and use it where appropriate.
Matti Hamalainen <ccr@tnsp.org>
parents: 1537
diff changeset
281 size_t *stats;
1503
c7b9ef56319b Factor all the c64 file format specific things into lib64fmt.c
Matti Hamalainen <ccr@tnsp.org>
parents: 1501
diff changeset
282
1542
69fa95707e65 Implement dmGenericRLEAnalyze() and use it where appropriate.
Matti Hamalainen <ccr@tnsp.org>
parents: 1537
diff changeset
283 // Allocate statistics counts buffer
69fa95707e65 Implement dmGenericRLEAnalyze() and use it where appropriate.
Matti Hamalainen <ccr@tnsp.org>
parents: 1537
diff changeset
284 if ((stats = dmMalloc0(DM_STAT_MAX * sizeof(size_t))) == NULL)
69fa95707e65 Implement dmGenericRLEAnalyze() and use it where appropriate.
Matti Hamalainen <ccr@tnsp.org>
parents: 1537
diff changeset
285 return;
69fa95707e65 Implement dmGenericRLEAnalyze() and use it where appropriate.
Matti Hamalainen <ccr@tnsp.org>
parents: 1537
diff changeset
286
69fa95707e65 Implement dmGenericRLEAnalyze() and use it where appropriate.
Matti Hamalainen <ccr@tnsp.org>
parents: 1537
diff changeset
287 // Get statistics on the data
1707
a0986cfd6f9d More consistently use DMGrowBuf in the lib64gfx APIs, and implement
Matti Hamalainen <ccr@tnsp.org>
parents: 1697
diff changeset
288 for (size_t offs = 0; offs < buf->len; offs++)
a0986cfd6f9d More consistently use DMGrowBuf in the lib64gfx APIs, and implement
Matti Hamalainen <ccr@tnsp.org>
parents: 1697
diff changeset
289 stats[buf->data[offs]]++;
1542
69fa95707e65 Implement dmGenericRLEAnalyze() and use it where appropriate.
Matti Hamalainen <ccr@tnsp.org>
parents: 1537
diff changeset
290
69fa95707e65 Implement dmGenericRLEAnalyze() and use it where appropriate.
Matti Hamalainen <ccr@tnsp.org>
parents: 1537
diff changeset
291 // According to compression type ..
1650
9233da9de92c Refactor RLE encoding a bit, and add support for 16bit run counts and make things more configurable.
Matti Hamalainen <ccr@tnsp.org>
parents: 1647
diff changeset
292 switch (cfg->type)
1542
69fa95707e65 Implement dmGenericRLEAnalyze() and use it where appropriate.
Matti Hamalainen <ccr@tnsp.org>
parents: 1537
diff changeset
293 {
1650
9233da9de92c Refactor RLE encoding a bit, and add support for 16bit run counts and make things more configurable.
Matti Hamalainen <ccr@tnsp.org>
parents: 1647
diff changeset
294 case DM_COMP_RLE_MARKER:
1542
69fa95707e65 Implement dmGenericRLEAnalyze() and use it where appropriate.
Matti Hamalainen <ccr@tnsp.org>
parents: 1537
diff changeset
295 {
1650
9233da9de92c Refactor RLE encoding a bit, and add support for 16bit run counts and make things more configurable.
Matti Hamalainen <ccr@tnsp.org>
parents: 1647
diff changeset
296 size_t selected = 0,
1707
a0986cfd6f9d More consistently use DMGrowBuf in the lib64gfx APIs, and implement
Matti Hamalainen <ccr@tnsp.org>
parents: 1697
diff changeset
297 smallest = buf->len;
1542
69fa95707e65 Implement dmGenericRLEAnalyze() and use it where appropriate.
Matti Hamalainen <ccr@tnsp.org>
parents: 1537
diff changeset
298
1650
9233da9de92c Refactor RLE encoding a bit, and add support for 16bit run counts and make things more configurable.
Matti Hamalainen <ccr@tnsp.org>
parents: 1647
diff changeset
299 // Find least used byte value
9233da9de92c Refactor RLE encoding a bit, and add support for 16bit run counts and make things more configurable.
Matti Hamalainen <ccr@tnsp.org>
parents: 1647
diff changeset
300 for (size_t n = 0; n < DM_STAT_MAX; n++)
9233da9de92c Refactor RLE encoding a bit, and add support for 16bit run counts and make things more configurable.
Matti Hamalainen <ccr@tnsp.org>
parents: 1647
diff changeset
301 {
9233da9de92c Refactor RLE encoding a bit, and add support for 16bit run counts and make things more configurable.
Matti Hamalainen <ccr@tnsp.org>
parents: 1647
diff changeset
302 if (stats[n] < smallest)
9233da9de92c Refactor RLE encoding a bit, and add support for 16bit run counts and make things more configurable.
Matti Hamalainen <ccr@tnsp.org>
parents: 1647
diff changeset
303 {
1660
7555c8803529 More work on improving the generic RLE decoder/encoder.
Matti Hamalainen <ccr@tnsp.org>
parents: 1650
diff changeset
304 cfg->rleMarkerW = selected;
7555c8803529 More work on improving the generic RLE decoder/encoder.
Matti Hamalainen <ccr@tnsp.org>
parents: 1650
diff changeset
305 cfg->rleMarkerB = selected = n;
1650
9233da9de92c Refactor RLE encoding a bit, and add support for 16bit run counts and make things more configurable.
Matti Hamalainen <ccr@tnsp.org>
parents: 1647
diff changeset
306 smallest = stats[n];
9233da9de92c Refactor RLE encoding a bit, and add support for 16bit run counts and make things more configurable.
Matti Hamalainen <ccr@tnsp.org>
parents: 1647
diff changeset
307 }
9233da9de92c Refactor RLE encoding a bit, and add support for 16bit run counts and make things more configurable.
Matti Hamalainen <ccr@tnsp.org>
parents: 1647
diff changeset
308 }
9233da9de92c Refactor RLE encoding a bit, and add support for 16bit run counts and make things more configurable.
Matti Hamalainen <ccr@tnsp.org>
parents: 1647
diff changeset
309 }
9233da9de92c Refactor RLE encoding a bit, and add support for 16bit run counts and make things more configurable.
Matti Hamalainen <ccr@tnsp.org>
parents: 1647
diff changeset
310 break;
9233da9de92c Refactor RLE encoding a bit, and add support for 16bit run counts and make things more configurable.
Matti Hamalainen <ccr@tnsp.org>
parents: 1647
diff changeset
311
9233da9de92c Refactor RLE encoding a bit, and add support for 16bit run counts and make things more configurable.
Matti Hamalainen <ccr@tnsp.org>
parents: 1647
diff changeset
312 case DM_COMP_RLE_MASK:
1660
7555c8803529 More work on improving the generic RLE decoder/encoder.
Matti Hamalainen <ccr@tnsp.org>
parents: 1650
diff changeset
313 cfg->rleMarkerMask = 0xC0;
7555c8803529 More work on improving the generic RLE decoder/encoder.
Matti Hamalainen <ccr@tnsp.org>
parents: 1650
diff changeset
314 cfg->rleMarkerBits = 0xC0;
7555c8803529 More work on improving the generic RLE decoder/encoder.
Matti Hamalainen <ccr@tnsp.org>
parents: 1650
diff changeset
315 cfg->rleCountMask = 0x3f;
1650
9233da9de92c Refactor RLE encoding a bit, and add support for 16bit run counts and make things more configurable.
Matti Hamalainen <ccr@tnsp.org>
parents: 1647
diff changeset
316 break;
1542
69fa95707e65 Implement dmGenericRLEAnalyze() and use it where appropriate.
Matti Hamalainen <ccr@tnsp.org>
parents: 1537
diff changeset
317 }
69fa95707e65 Implement dmGenericRLEAnalyze() and use it where appropriate.
Matti Hamalainen <ccr@tnsp.org>
parents: 1537
diff changeset
318
69fa95707e65 Implement dmGenericRLEAnalyze() and use it where appropriate.
Matti Hamalainen <ccr@tnsp.org>
parents: 1537
diff changeset
319 dmFree(stats);
1503
c7b9ef56319b Factor all the c64 file format specific things into lib64fmt.c
Matti Hamalainen <ccr@tnsp.org>
parents: 1501
diff changeset
320 }
c7b9ef56319b Factor all the c64 file format specific things into lib64fmt.c
Matti Hamalainen <ccr@tnsp.org>
parents: 1501
diff changeset
321
c7b9ef56319b Factor all the c64 file format specific things into lib64fmt.c
Matti Hamalainen <ccr@tnsp.org>
parents: 1501
diff changeset
322
1713
0a9110b4d036 Add few RLE helper functions.
Matti Hamalainen <ccr@tnsp.org>
parents: 1710
diff changeset
323 void dmSetupRLEBuffers(DMGrowBuf *dst, DMGrowBuf *src, const DMCompParams *cfg)
1707
a0986cfd6f9d More consistently use DMGrowBuf in the lib64gfx APIs, and implement
Matti Hamalainen <ccr@tnsp.org>
parents: 1697
diff changeset
324 {
a0986cfd6f9d More consistently use DMGrowBuf in the lib64gfx APIs, and implement
Matti Hamalainen <ccr@tnsp.org>
parents: 1697
diff changeset
325 if (cfg->flags & DM_RLE_BACKWARDS_INPUT)
a0986cfd6f9d More consistently use DMGrowBuf in the lib64gfx APIs, and implement
Matti Hamalainen <ccr@tnsp.org>
parents: 1697
diff changeset
326 {
a0986cfd6f9d More consistently use DMGrowBuf in the lib64gfx APIs, and implement
Matti Hamalainen <ccr@tnsp.org>
parents: 1697
diff changeset
327 src->offs = src->len - 1;
a0986cfd6f9d More consistently use DMGrowBuf in the lib64gfx APIs, and implement
Matti Hamalainen <ccr@tnsp.org>
parents: 1697
diff changeset
328 src->backwards = TRUE;
a0986cfd6f9d More consistently use DMGrowBuf in the lib64gfx APIs, and implement
Matti Hamalainen <ccr@tnsp.org>
parents: 1697
diff changeset
329 }
a0986cfd6f9d More consistently use DMGrowBuf in the lib64gfx APIs, and implement
Matti Hamalainen <ccr@tnsp.org>
parents: 1697
diff changeset
330
a0986cfd6f9d More consistently use DMGrowBuf in the lib64gfx APIs, and implement
Matti Hamalainen <ccr@tnsp.org>
parents: 1697
diff changeset
331 if (cfg->flags & DM_RLE_BACKWARDS_OUTPUT)
a0986cfd6f9d More consistently use DMGrowBuf in the lib64gfx APIs, and implement
Matti Hamalainen <ccr@tnsp.org>
parents: 1697
diff changeset
332 {
a0986cfd6f9d More consistently use DMGrowBuf in the lib64gfx APIs, and implement
Matti Hamalainen <ccr@tnsp.org>
parents: 1697
diff changeset
333 dst->backwards = TRUE;
a0986cfd6f9d More consistently use DMGrowBuf in the lib64gfx APIs, and implement
Matti Hamalainen <ccr@tnsp.org>
parents: 1697
diff changeset
334 dst->offs = dst->size - 1;
a0986cfd6f9d More consistently use DMGrowBuf in the lib64gfx APIs, and implement
Matti Hamalainen <ccr@tnsp.org>
parents: 1697
diff changeset
335 }
1718
bed88d17f28c Fix a commit blunder here ..
Matti Hamalainen <ccr@tnsp.org>
parents: 1717
diff changeset
336 }
bed88d17f28c Fix a commit blunder here ..
Matti Hamalainen <ccr@tnsp.org>
parents: 1717
diff changeset
337
bed88d17f28c Fix a commit blunder here ..
Matti Hamalainen <ccr@tnsp.org>
parents: 1717
diff changeset
338
1713
0a9110b4d036 Add few RLE helper functions.
Matti Hamalainen <ccr@tnsp.org>
parents: 1710
diff changeset
339 void dmFinishRLEBuffers(DMGrowBuf *dst, DMGrowBuf *src, const DMCompParams *cfg)
0a9110b4d036 Add few RLE helper functions.
Matti Hamalainen <ccr@tnsp.org>
parents: 1710
diff changeset
340 {
0a9110b4d036 Add few RLE helper functions.
Matti Hamalainen <ccr@tnsp.org>
parents: 1710
diff changeset
341 if (cfg->flags & DM_RLE_BACKWARDS_OUTPUT)
0a9110b4d036 Add few RLE helper functions.
Matti Hamalainen <ccr@tnsp.org>
parents: 1710
diff changeset
342 {
0a9110b4d036 Add few RLE helper functions.
Matti Hamalainen <ccr@tnsp.org>
parents: 1710
diff changeset
343 memmove(dst->data, dst->data + dst->offs, dst->len);
0a9110b4d036 Add few RLE helper functions.
Matti Hamalainen <ccr@tnsp.org>
parents: 1710
diff changeset
344 dst->offs = 0;
0a9110b4d036 Add few RLE helper functions.
Matti Hamalainen <ccr@tnsp.org>
parents: 1710
diff changeset
345 }
1720
77a4d8fab5cc Add output buffer cropping to dmFinishRLEBuffers() and the flags and fields to DMGrowBuf.
Matti Hamalainen <ccr@tnsp.org>
parents: 1718
diff changeset
346
77a4d8fab5cc Add output buffer cropping to dmFinishRLEBuffers() and the flags and fields to DMGrowBuf.
Matti Hamalainen <ccr@tnsp.org>
parents: 1718
diff changeset
347 switch (cfg->flags & DM_OUT_CROP_MASK)
77a4d8fab5cc Add output buffer cropping to dmFinishRLEBuffers() and the flags and fields to DMGrowBuf.
Matti Hamalainen <ccr@tnsp.org>
parents: 1718
diff changeset
348 {
77a4d8fab5cc Add output buffer cropping to dmFinishRLEBuffers() and the flags and fields to DMGrowBuf.
Matti Hamalainen <ccr@tnsp.org>
parents: 1718
diff changeset
349 case DM_OUT_CROP_END:
77a4d8fab5cc Add output buffer cropping to dmFinishRLEBuffers() and the flags and fields to DMGrowBuf.
Matti Hamalainen <ccr@tnsp.org>
parents: 1718
diff changeset
350 if (cfg->cropOutLen < dst->len)
77a4d8fab5cc Add output buffer cropping to dmFinishRLEBuffers() and the flags and fields to DMGrowBuf.
Matti Hamalainen <ccr@tnsp.org>
parents: 1718
diff changeset
351 {
77a4d8fab5cc Add output buffer cropping to dmFinishRLEBuffers() and the flags and fields to DMGrowBuf.
Matti Hamalainen <ccr@tnsp.org>
parents: 1718
diff changeset
352 memmove(dst->data, dst->data + dst->len - cfg->cropOutLen + 1, cfg->cropOutLen);
77a4d8fab5cc Add output buffer cropping to dmFinishRLEBuffers() and the flags and fields to DMGrowBuf.
Matti Hamalainen <ccr@tnsp.org>
parents: 1718
diff changeset
353 dst->len = cfg->cropOutLen;
77a4d8fab5cc Add output buffer cropping to dmFinishRLEBuffers() and the flags and fields to DMGrowBuf.
Matti Hamalainen <ccr@tnsp.org>
parents: 1718
diff changeset
354 }
77a4d8fab5cc Add output buffer cropping to dmFinishRLEBuffers() and the flags and fields to DMGrowBuf.
Matti Hamalainen <ccr@tnsp.org>
parents: 1718
diff changeset
355 break;
77a4d8fab5cc Add output buffer cropping to dmFinishRLEBuffers() and the flags and fields to DMGrowBuf.
Matti Hamalainen <ccr@tnsp.org>
parents: 1718
diff changeset
356
77a4d8fab5cc Add output buffer cropping to dmFinishRLEBuffers() and the flags and fields to DMGrowBuf.
Matti Hamalainen <ccr@tnsp.org>
parents: 1718
diff changeset
357 case DM_OUT_CROP_START:
77a4d8fab5cc Add output buffer cropping to dmFinishRLEBuffers() and the flags and fields to DMGrowBuf.
Matti Hamalainen <ccr@tnsp.org>
parents: 1718
diff changeset
358 if (cfg->cropOutLen <= dst->len)
77a4d8fab5cc Add output buffer cropping to dmFinishRLEBuffers() and the flags and fields to DMGrowBuf.
Matti Hamalainen <ccr@tnsp.org>
parents: 1718
diff changeset
359 dst->len = cfg->cropOutLen;
77a4d8fab5cc Add output buffer cropping to dmFinishRLEBuffers() and the flags and fields to DMGrowBuf.
Matti Hamalainen <ccr@tnsp.org>
parents: 1718
diff changeset
360 break;
77a4d8fab5cc Add output buffer cropping to dmFinishRLEBuffers() and the flags and fields to DMGrowBuf.
Matti Hamalainen <ccr@tnsp.org>
parents: 1718
diff changeset
361 }
1713
0a9110b4d036 Add few RLE helper functions.
Matti Hamalainen <ccr@tnsp.org>
parents: 1710
diff changeset
362 }
0a9110b4d036 Add few RLE helper functions.
Matti Hamalainen <ccr@tnsp.org>
parents: 1710
diff changeset
363
0a9110b4d036 Add few RLE helper functions.
Matti Hamalainen <ccr@tnsp.org>
parents: 1710
diff changeset
364
0a9110b4d036 Add few RLE helper functions.
Matti Hamalainen <ccr@tnsp.org>
parents: 1710
diff changeset
365 int dmGenericRLEOutputRun(DMGrowBuf *dst, const DMCompParams *cfg, const Uint8 data, const unsigned int count)
0a9110b4d036 Add few RLE helper functions.
Matti Hamalainen <ccr@tnsp.org>
parents: 1710
diff changeset
366 {
0a9110b4d036 Add few RLE helper functions.
Matti Hamalainen <ccr@tnsp.org>
parents: 1710
diff changeset
367 unsigned int scount;
0a9110b4d036 Add few RLE helper functions.
Matti Hamalainen <ccr@tnsp.org>
parents: 1710
diff changeset
368 for (scount = count; scount; scount--)
0a9110b4d036 Add few RLE helper functions.
Matti Hamalainen <ccr@tnsp.org>
parents: 1710
diff changeset
369 {
0a9110b4d036 Add few RLE helper functions.
Matti Hamalainen <ccr@tnsp.org>
parents: 1710
diff changeset
370 if (!dmGrowBufPutU8(dst, data))
0a9110b4d036 Add few RLE helper functions.
Matti Hamalainen <ccr@tnsp.org>
parents: 1710
diff changeset
371 {
0a9110b4d036 Add few RLE helper functions.
Matti Hamalainen <ccr@tnsp.org>
parents: 1710
diff changeset
372 return dmError(DMERR_MALLOC,
0a9110b4d036 Add few RLE helper functions.
Matti Hamalainen <ccr@tnsp.org>
parents: 1710
diff changeset
373 "%s: RLE: Could not output RLE run %d x 0x%02x @ "
0a9110b4d036 Add few RLE helper functions.
Matti Hamalainen <ccr@tnsp.org>
parents: 1710
diff changeset
374 "offs=0x%" DM_PRIx_SIZE_T ", size=0x%" DM_PRIx_SIZE_T ".\n",
0a9110b4d036 Add few RLE helper functions.
Matti Hamalainen <ccr@tnsp.org>
parents: 1710
diff changeset
375 cfg->func, count, data, dst->offs, dst->size);
0a9110b4d036 Add few RLE helper functions.
Matti Hamalainen <ccr@tnsp.org>
parents: 1710
diff changeset
376 }
0a9110b4d036 Add few RLE helper functions.
Matti Hamalainen <ccr@tnsp.org>
parents: 1710
diff changeset
377 }
0a9110b4d036 Add few RLE helper functions.
Matti Hamalainen <ccr@tnsp.org>
parents: 1710
diff changeset
378 return DMERR_OK;
1707
a0986cfd6f9d More consistently use DMGrowBuf in the lib64gfx APIs, and implement
Matti Hamalainen <ccr@tnsp.org>
parents: 1697
diff changeset
379 }
a0986cfd6f9d More consistently use DMGrowBuf in the lib64gfx APIs, and implement
Matti Hamalainen <ccr@tnsp.org>
parents: 1697
diff changeset
380
a0986cfd6f9d More consistently use DMGrowBuf in the lib64gfx APIs, and implement
Matti Hamalainen <ccr@tnsp.org>
parents: 1697
diff changeset
381
a0986cfd6f9d More consistently use DMGrowBuf in the lib64gfx APIs, and implement
Matti Hamalainen <ccr@tnsp.org>
parents: 1697
diff changeset
382 int dmDecodeGenericRLE(DMGrowBuf *dst, const DMGrowBuf *psrc, const DMCompParams *cfg)
407
59244a7ae37f Move c64 utilities to the engine lib, as we benefit from a common framework.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
383 {
1463
bde6a66bc2f6 Change dmDecodeGenericRLE() to use DMGrowBuf as output. Also add support
Matti Hamalainen <ccr@tnsp.org>
parents: 1462
diff changeset
384 int res;
1707
a0986cfd6f9d More consistently use DMGrowBuf in the lib64gfx APIs, and implement
Matti Hamalainen <ccr@tnsp.org>
parents: 1697
diff changeset
385 Uint8 tmp1, tmp2, tmp3, data;
a0986cfd6f9d More consistently use DMGrowBuf in the lib64gfx APIs, and implement
Matti Hamalainen <ccr@tnsp.org>
parents: 1697
diff changeset
386 DMGrowBuf src;
407
59244a7ae37f Move c64 utilities to the engine lib, as we benefit from a common framework.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
387
1707
a0986cfd6f9d More consistently use DMGrowBuf in the lib64gfx APIs, and implement
Matti Hamalainen <ccr@tnsp.org>
parents: 1697
diff changeset
388 // As we need to modify the offs, etc. but not the data,
a0986cfd6f9d More consistently use DMGrowBuf in the lib64gfx APIs, and implement
Matti Hamalainen <ccr@tnsp.org>
parents: 1697
diff changeset
389 // we will just make a shallow copy of the DMGrowBuf struct
a0986cfd6f9d More consistently use DMGrowBuf in the lib64gfx APIs, and implement
Matti Hamalainen <ccr@tnsp.org>
parents: 1697
diff changeset
390 dmGrowBufConstCopy(&src, psrc);
a0986cfd6f9d More consistently use DMGrowBuf in the lib64gfx APIs, and implement
Matti Hamalainen <ccr@tnsp.org>
parents: 1697
diff changeset
391 dmSetupRLEBuffers(dst, &src, cfg);
a0986cfd6f9d More consistently use DMGrowBuf in the lib64gfx APIs, and implement
Matti Hamalainen <ccr@tnsp.org>
parents: 1697
diff changeset
392
a0986cfd6f9d More consistently use DMGrowBuf in the lib64gfx APIs, and implement
Matti Hamalainen <ccr@tnsp.org>
parents: 1697
diff changeset
393 while (dmGrowBufGetU8(&src, &data))
407
59244a7ae37f Move c64 utilities to the engine lib, as we benefit from a common framework.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
394 {
1707
a0986cfd6f9d More consistently use DMGrowBuf in the lib64gfx APIs, and implement
Matti Hamalainen <ccr@tnsp.org>
parents: 1697
diff changeset
395 unsigned int count = 1;
1463
bde6a66bc2f6 Change dmDecodeGenericRLE() to use DMGrowBuf as output. Also add support
Matti Hamalainen <ccr@tnsp.org>
parents: 1462
diff changeset
396
1650
9233da9de92c Refactor RLE encoding a bit, and add support for 16bit run counts and make things more configurable.
Matti Hamalainen <ccr@tnsp.org>
parents: 1647
diff changeset
397 if (cfg->type == DM_COMP_RLE_MARKER)
407
59244a7ae37f Move c64 utilities to the engine lib, as we benefit from a common framework.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
398 {
1650
9233da9de92c Refactor RLE encoding a bit, and add support for 16bit run counts and make things more configurable.
Matti Hamalainen <ccr@tnsp.org>
parents: 1647
diff changeset
399 // A simple marker byte RLE variant: [Marker] [count] [data]
1660
7555c8803529 More work on improving the generic RLE decoder/encoder.
Matti Hamalainen <ccr@tnsp.org>
parents: 1650
diff changeset
400 if (data == cfg->rleMarkerB && (cfg->flags & DM_RLE_BYTE_RUNS))
1650
9233da9de92c Refactor RLE encoding a bit, and add support for 16bit run counts and make things more configurable.
Matti Hamalainen <ccr@tnsp.org>
parents: 1647
diff changeset
401 {
1707
a0986cfd6f9d More consistently use DMGrowBuf in the lib64gfx APIs, and implement
Matti Hamalainen <ccr@tnsp.org>
parents: 1697
diff changeset
402 if (!dmGrowBufGetU8(&src, &tmp1) ||
a0986cfd6f9d More consistently use DMGrowBuf in the lib64gfx APIs, and implement
Matti Hamalainen <ccr@tnsp.org>
parents: 1697
diff changeset
403 !dmGrowBufGetU8(&src, &tmp2))
1463
bde6a66bc2f6 Change dmDecodeGenericRLE() to use DMGrowBuf as output. Also add support
Matti Hamalainen <ccr@tnsp.org>
parents: 1462
diff changeset
404 {
1727
8eb5ff34864a Improve error messages in the RLE decoder.
Matti Hamalainen <ccr@tnsp.org>
parents: 1726
diff changeset
405 res = dmError(DMERR_INVALID_DATA,
8eb5ff34864a Improve error messages in the RLE decoder.
Matti Hamalainen <ccr@tnsp.org>
parents: 1726
diff changeset
406 "%s: RLE: Invalid data/out of data for byte length run sequence.\n",
8eb5ff34864a Improve error messages in the RLE decoder.
Matti Hamalainen <ccr@tnsp.org>
parents: 1726
diff changeset
407 cfg->func);
1707
a0986cfd6f9d More consistently use DMGrowBuf in the lib64gfx APIs, and implement
Matti Hamalainen <ccr@tnsp.org>
parents: 1697
diff changeset
408 goto out;
1650
9233da9de92c Refactor RLE encoding a bit, and add support for 16bit run counts and make things more configurable.
Matti Hamalainen <ccr@tnsp.org>
parents: 1647
diff changeset
409 }
9233da9de92c Refactor RLE encoding a bit, and add support for 16bit run counts and make things more configurable.
Matti Hamalainen <ccr@tnsp.org>
parents: 1647
diff changeset
410 switch (cfg->flags & DM_RLE_ORDER_MASK)
9233da9de92c Refactor RLE encoding a bit, and add support for 16bit run counts and make things more configurable.
Matti Hamalainen <ccr@tnsp.org>
parents: 1647
diff changeset
411 {
9233da9de92c Refactor RLE encoding a bit, and add support for 16bit run counts and make things more configurable.
Matti Hamalainen <ccr@tnsp.org>
parents: 1647
diff changeset
412 case DM_RLE_ORDER_1:
1707
a0986cfd6f9d More consistently use DMGrowBuf in the lib64gfx APIs, and implement
Matti Hamalainen <ccr@tnsp.org>
parents: 1697
diff changeset
413 count = tmp1;
a0986cfd6f9d More consistently use DMGrowBuf in the lib64gfx APIs, and implement
Matti Hamalainen <ccr@tnsp.org>
parents: 1697
diff changeset
414 data = tmp2;
1650
9233da9de92c Refactor RLE encoding a bit, and add support for 16bit run counts and make things more configurable.
Matti Hamalainen <ccr@tnsp.org>
parents: 1647
diff changeset
415 break;
1573
86373ac0861a Implement another RLE variant, with different ordering of marker, count and data bytes.
Matti Hamalainen <ccr@tnsp.org>
parents: 1548
diff changeset
416
1650
9233da9de92c Refactor RLE encoding a bit, and add support for 16bit run counts and make things more configurable.
Matti Hamalainen <ccr@tnsp.org>
parents: 1647
diff changeset
417 case DM_RLE_ORDER_2:
1707
a0986cfd6f9d More consistently use DMGrowBuf in the lib64gfx APIs, and implement
Matti Hamalainen <ccr@tnsp.org>
parents: 1697
diff changeset
418 data = tmp1;
a0986cfd6f9d More consistently use DMGrowBuf in the lib64gfx APIs, and implement
Matti Hamalainen <ccr@tnsp.org>
parents: 1697
diff changeset
419 count = tmp2;
1650
9233da9de92c Refactor RLE encoding a bit, and add support for 16bit run counts and make things more configurable.
Matti Hamalainen <ccr@tnsp.org>
parents: 1647
diff changeset
420 break;
1463
bde6a66bc2f6 Change dmDecodeGenericRLE() to use DMGrowBuf as output. Also add support
Matti Hamalainen <ccr@tnsp.org>
parents: 1462
diff changeset
421 }
1650
9233da9de92c Refactor RLE encoding a bit, and add support for 16bit run counts and make things more configurable.
Matti Hamalainen <ccr@tnsp.org>
parents: 1647
diff changeset
422 }
9233da9de92c Refactor RLE encoding a bit, and add support for 16bit run counts and make things more configurable.
Matti Hamalainen <ccr@tnsp.org>
parents: 1647
diff changeset
423 else
1660
7555c8803529 More work on improving the generic RLE decoder/encoder.
Matti Hamalainen <ccr@tnsp.org>
parents: 1650
diff changeset
424 if (data == cfg->rleMarkerW && (cfg->flags & DM_RLE_WORD_RUNS))
1650
9233da9de92c Refactor RLE encoding a bit, and add support for 16bit run counts and make things more configurable.
Matti Hamalainen <ccr@tnsp.org>
parents: 1647
diff changeset
425 {
1707
a0986cfd6f9d More consistently use DMGrowBuf in the lib64gfx APIs, and implement
Matti Hamalainen <ccr@tnsp.org>
parents: 1697
diff changeset
426 if (!dmGrowBufGetU8(&src, &tmp1) ||
a0986cfd6f9d More consistently use DMGrowBuf in the lib64gfx APIs, and implement
Matti Hamalainen <ccr@tnsp.org>
parents: 1697
diff changeset
427 !dmGrowBufGetU8(&src, &tmp2) ||
a0986cfd6f9d More consistently use DMGrowBuf in the lib64gfx APIs, and implement
Matti Hamalainen <ccr@tnsp.org>
parents: 1697
diff changeset
428 !dmGrowBufGetU8(&src, &tmp3))
1650
9233da9de92c Refactor RLE encoding a bit, and add support for 16bit run counts and make things more configurable.
Matti Hamalainen <ccr@tnsp.org>
parents: 1647
diff changeset
429 {
1727
8eb5ff34864a Improve error messages in the RLE decoder.
Matti Hamalainen <ccr@tnsp.org>
parents: 1726
diff changeset
430 res = dmError(DMERR_INVALID_DATA,
8eb5ff34864a Improve error messages in the RLE decoder.
Matti Hamalainen <ccr@tnsp.org>
parents: 1726
diff changeset
431 "%s: RLE: Invalid data/out of data for word length run sequence.\n",
8eb5ff34864a Improve error messages in the RLE decoder.
Matti Hamalainen <ccr@tnsp.org>
parents: 1726
diff changeset
432 cfg->func);
1707
a0986cfd6f9d More consistently use DMGrowBuf in the lib64gfx APIs, and implement
Matti Hamalainen <ccr@tnsp.org>
parents: 1697
diff changeset
433 goto out;
1650
9233da9de92c Refactor RLE encoding a bit, and add support for 16bit run counts and make things more configurable.
Matti Hamalainen <ccr@tnsp.org>
parents: 1647
diff changeset
434 }
9233da9de92c Refactor RLE encoding a bit, and add support for 16bit run counts and make things more configurable.
Matti Hamalainen <ccr@tnsp.org>
parents: 1647
diff changeset
435 switch (cfg->flags & DM_RLE_ORDER_MASK)
9233da9de92c Refactor RLE encoding a bit, and add support for 16bit run counts and make things more configurable.
Matti Hamalainen <ccr@tnsp.org>
parents: 1647
diff changeset
436 {
9233da9de92c Refactor RLE encoding a bit, and add support for 16bit run counts and make things more configurable.
Matti Hamalainen <ccr@tnsp.org>
parents: 1647
diff changeset
437 case DM_RLE_ORDER_1:
1707
a0986cfd6f9d More consistently use DMGrowBuf in the lib64gfx APIs, and implement
Matti Hamalainen <ccr@tnsp.org>
parents: 1697
diff changeset
438 count = (tmp2 << 8) | tmp1;
a0986cfd6f9d More consistently use DMGrowBuf in the lib64gfx APIs, and implement
Matti Hamalainen <ccr@tnsp.org>
parents: 1697
diff changeset
439 data = tmp3;
1650
9233da9de92c Refactor RLE encoding a bit, and add support for 16bit run counts and make things more configurable.
Matti Hamalainen <ccr@tnsp.org>
parents: 1647
diff changeset
440 break;
1463
bde6a66bc2f6 Change dmDecodeGenericRLE() to use DMGrowBuf as output. Also add support
Matti Hamalainen <ccr@tnsp.org>
parents: 1462
diff changeset
441
1650
9233da9de92c Refactor RLE encoding a bit, and add support for 16bit run counts and make things more configurable.
Matti Hamalainen <ccr@tnsp.org>
parents: 1647
diff changeset
442 case DM_RLE_ORDER_2:
1707
a0986cfd6f9d More consistently use DMGrowBuf in the lib64gfx APIs, and implement
Matti Hamalainen <ccr@tnsp.org>
parents: 1697
diff changeset
443 data = tmp1;
a0986cfd6f9d More consistently use DMGrowBuf in the lib64gfx APIs, and implement
Matti Hamalainen <ccr@tnsp.org>
parents: 1697
diff changeset
444 count = (tmp3 << 8) | tmp2;
1650
9233da9de92c Refactor RLE encoding a bit, and add support for 16bit run counts and make things more configurable.
Matti Hamalainen <ccr@tnsp.org>
parents: 1647
diff changeset
445 break;
9233da9de92c Refactor RLE encoding a bit, and add support for 16bit run counts and make things more configurable.
Matti Hamalainen <ccr@tnsp.org>
parents: 1647
diff changeset
446 }
9233da9de92c Refactor RLE encoding a bit, and add support for 16bit run counts and make things more configurable.
Matti Hamalainen <ccr@tnsp.org>
parents: 1647
diff changeset
447 }
9233da9de92c Refactor RLE encoding a bit, and add support for 16bit run counts and make things more configurable.
Matti Hamalainen <ccr@tnsp.org>
parents: 1647
diff changeset
448 }
9233da9de92c Refactor RLE encoding a bit, and add support for 16bit run counts and make things more configurable.
Matti Hamalainen <ccr@tnsp.org>
parents: 1647
diff changeset
449 else
9233da9de92c Refactor RLE encoding a bit, and add support for 16bit run counts and make things more configurable.
Matti Hamalainen <ccr@tnsp.org>
parents: 1647
diff changeset
450 if (cfg->type == DM_COMP_RLE_MASK)
9233da9de92c Refactor RLE encoding a bit, and add support for 16bit run counts and make things more configurable.
Matti Hamalainen <ccr@tnsp.org>
parents: 1647
diff changeset
451 {
9233da9de92c Refactor RLE encoding a bit, and add support for 16bit run counts and make things more configurable.
Matti Hamalainen <ccr@tnsp.org>
parents: 1647
diff changeset
452 // Mask marker RLE: usually high bit(s) of byte mark RLE sequence
9233da9de92c Refactor RLE encoding a bit, and add support for 16bit run counts and make things more configurable.
Matti Hamalainen <ccr@tnsp.org>
parents: 1647
diff changeset
453 // and the lower bits contain the count: [Mask + count] [data]
1660
7555c8803529 More work on improving the generic RLE decoder/encoder.
Matti Hamalainen <ccr@tnsp.org>
parents: 1650
diff changeset
454 if ((data & cfg->rleMarkerMask) == cfg->rleMarkerBits)
1650
9233da9de92c Refactor RLE encoding a bit, and add support for 16bit run counts and make things more configurable.
Matti Hamalainen <ccr@tnsp.org>
parents: 1647
diff changeset
455 {
1707
a0986cfd6f9d More consistently use DMGrowBuf in the lib64gfx APIs, and implement
Matti Hamalainen <ccr@tnsp.org>
parents: 1697
diff changeset
456 if (!dmGrowBufGetU8(&src, &tmp1))
1463
bde6a66bc2f6 Change dmDecodeGenericRLE() to use DMGrowBuf as output. Also add support
Matti Hamalainen <ccr@tnsp.org>
parents: 1462
diff changeset
457 {
1727
8eb5ff34864a Improve error messages in the RLE decoder.
Matti Hamalainen <ccr@tnsp.org>
parents: 1726
diff changeset
458 res = dmError(DMERR_INVALID_DATA,
8eb5ff34864a Improve error messages in the RLE decoder.
Matti Hamalainen <ccr@tnsp.org>
parents: 1726
diff changeset
459 "%s: RLE: Invalid data/out of data for byte length mask/run sequence.\n",
8eb5ff34864a Improve error messages in the RLE decoder.
Matti Hamalainen <ccr@tnsp.org>
parents: 1726
diff changeset
460 cfg->func);
1707
a0986cfd6f9d More consistently use DMGrowBuf in the lib64gfx APIs, and implement
Matti Hamalainen <ccr@tnsp.org>
parents: 1697
diff changeset
461 goto out;
1650
9233da9de92c Refactor RLE encoding a bit, and add support for 16bit run counts and make things more configurable.
Matti Hamalainen <ccr@tnsp.org>
parents: 1647
diff changeset
462 }
1466
bc75be0546fc More work on RLE decoder/encoder changes.
Matti Hamalainen <ccr@tnsp.org>
parents: 1465
diff changeset
463
1660
7555c8803529 More work on improving the generic RLE decoder/encoder.
Matti Hamalainen <ccr@tnsp.org>
parents: 1650
diff changeset
464 count = data & cfg->rleCountMask;
1707
a0986cfd6f9d More consistently use DMGrowBuf in the lib64gfx APIs, and implement
Matti Hamalainen <ccr@tnsp.org>
parents: 1697
diff changeset
465 data = tmp1;
1650
9233da9de92c Refactor RLE encoding a bit, and add support for 16bit run counts and make things more configurable.
Matti Hamalainen <ccr@tnsp.org>
parents: 1647
diff changeset
466 }
407
59244a7ae37f Move c64 utilities to the engine lib, as we benefit from a common framework.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
467 }
1463
bde6a66bc2f6 Change dmDecodeGenericRLE() to use DMGrowBuf as output. Also add support
Matti Hamalainen <ccr@tnsp.org>
parents: 1462
diff changeset
468
1715
c0c6fd8b288a Use dmGenericRLEOutputRun().
Matti Hamalainen <ccr@tnsp.org>
parents: 1713
diff changeset
469 if ((res = dmGenericRLEOutputRun(dst, cfg, data, count)) != DMERR_OK)
c0c6fd8b288a Use dmGenericRLEOutputRun().
Matti Hamalainen <ccr@tnsp.org>
parents: 1713
diff changeset
470 goto out;
407
59244a7ae37f Move c64 utilities to the engine lib, as we benefit from a common framework.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
471 }
523
d0c0c6baeb57 Split the RLE decoding from DrazPaint/Lace and Amica paint decoders to a
Matti Hamalainen <ccr@tnsp.org>
parents: 519
diff changeset
472
1717
7de37c01dbd4 Use dmFinishRLEBuffers() in dmDecodeGenericRLE()
Matti Hamalainen <ccr@tnsp.org>
parents: 1716
diff changeset
473 dmFinishRLEBuffers(dst, &src, cfg);
1463
bde6a66bc2f6 Change dmDecodeGenericRLE() to use DMGrowBuf as output. Also add support
Matti Hamalainen <ccr@tnsp.org>
parents: 1462
diff changeset
474 res = DMERR_OK;
523
d0c0c6baeb57 Split the RLE decoding from DrazPaint/Lace and Amica paint decoders to a
Matti Hamalainen <ccr@tnsp.org>
parents: 519
diff changeset
475
1707
a0986cfd6f9d More consistently use DMGrowBuf in the lib64gfx APIs, and implement
Matti Hamalainen <ccr@tnsp.org>
parents: 1697
diff changeset
476 out:
1463
bde6a66bc2f6 Change dmDecodeGenericRLE() to use DMGrowBuf as output. Also add support
Matti Hamalainen <ccr@tnsp.org>
parents: 1462
diff changeset
477 return res;
bde6a66bc2f6 Change dmDecodeGenericRLE() to use DMGrowBuf as output. Also add support
Matti Hamalainen <ccr@tnsp.org>
parents: 1462
diff changeset
478 }
bde6a66bc2f6 Change dmDecodeGenericRLE() to use DMGrowBuf as output. Also add support
Matti Hamalainen <ccr@tnsp.org>
parents: 1462
diff changeset
479
bde6a66bc2f6 Change dmDecodeGenericRLE() to use DMGrowBuf as output. Also add support
Matti Hamalainen <ccr@tnsp.org>
parents: 1462
diff changeset
480
1707
a0986cfd6f9d More consistently use DMGrowBuf in the lib64gfx APIs, and implement
Matti Hamalainen <ccr@tnsp.org>
parents: 1697
diff changeset
481 int dmDecodeGenericRLEAlloc(DMGrowBuf *dst, const DMGrowBuf *src, const DMCompParams *cfg)
1463
bde6a66bc2f6 Change dmDecodeGenericRLE() to use DMGrowBuf as output. Also add support
Matti Hamalainen <ccr@tnsp.org>
parents: 1462
diff changeset
482 {
1478
d883b4c1cf48 More work on RLE encoding/decoding.
Matti Hamalainen <ccr@tnsp.org>
parents: 1476
diff changeset
483 int res;
d883b4c1cf48 More work on RLE encoding/decoding.
Matti Hamalainen <ccr@tnsp.org>
parents: 1476
diff changeset
484 if ((res = dmGrowBufAlloc(dst, BUF_SIZE_INITIAL, BUF_SIZE_GROW)) != DMERR_OK)
d883b4c1cf48 More work on RLE encoding/decoding.
Matti Hamalainen <ccr@tnsp.org>
parents: 1476
diff changeset
485 return res;
d883b4c1cf48 More work on RLE encoding/decoding.
Matti Hamalainen <ccr@tnsp.org>
parents: 1476
diff changeset
486
1707
a0986cfd6f9d More consistently use DMGrowBuf in the lib64gfx APIs, and implement
Matti Hamalainen <ccr@tnsp.org>
parents: 1697
diff changeset
487 return dmDecodeGenericRLE(dst, src, cfg);
1478
d883b4c1cf48 More work on RLE encoding/decoding.
Matti Hamalainen <ccr@tnsp.org>
parents: 1476
diff changeset
488 }
d883b4c1cf48 More work on RLE encoding/decoding.
Matti Hamalainen <ccr@tnsp.org>
parents: 1476
diff changeset
489
d883b4c1cf48 More work on RLE encoding/decoding.
Matti Hamalainen <ccr@tnsp.org>
parents: 1476
diff changeset
490
1716
9731b0bdec64 Improve error handling of dmEncodeGenericRLESequence() and use dmGenericRLEOutputRun() here as well.
Matti Hamalainen <ccr@tnsp.org>
parents: 1715
diff changeset
491 int dmEncodeGenericRLESequence(DMGrowBuf *dst, const Uint8 data, const unsigned int count, const DMCompParams *cfg)
1478
d883b4c1cf48 More work on RLE encoding/decoding.
Matti Hamalainen <ccr@tnsp.org>
parents: 1476
diff changeset
492 {
1496
5c46004dad15 Work on the RLE encoding.
Matti Hamalainen <ccr@tnsp.org>
parents: 1494
diff changeset
493 BOOL copyOnly = FALSE;
1716
9731b0bdec64 Improve error handling of dmEncodeGenericRLESequence() and use dmGenericRLEOutputRun() here as well.
Matti Hamalainen <ccr@tnsp.org>
parents: 1715
diff changeset
494 int res;
1505
3265175b24d2 Change the passing of RLE compression/decompression parameters to be in a dedicated struct.
Matti Hamalainen <ccr@tnsp.org>
parents: 1503
diff changeset
495
3265175b24d2 Change the passing of RLE compression/decompression parameters to be in a dedicated struct.
Matti Hamalainen <ccr@tnsp.org>
parents: 1503
diff changeset
496 switch (cfg->type)
1478
d883b4c1cf48 More work on RLE encoding/decoding.
Matti Hamalainen <ccr@tnsp.org>
parents: 1476
diff changeset
497 {
1650
9233da9de92c Refactor RLE encoding a bit, and add support for 16bit run counts and make things more configurable.
Matti Hamalainen <ccr@tnsp.org>
parents: 1647
diff changeset
498 case DM_COMP_RLE_MARKER:
1660
7555c8803529 More work on improving the generic RLE decoder/encoder.
Matti Hamalainen <ccr@tnsp.org>
parents: 1650
diff changeset
499 if ((cfg->flags & DM_RLE_WORD_RUNS) &&
7555c8803529 More work on improving the generic RLE decoder/encoder.
Matti Hamalainen <ccr@tnsp.org>
parents: 1650
diff changeset
500 (count >= cfg->rleMinCountW || data == cfg->rleMarkerW))
1496
5c46004dad15 Work on the RLE encoding.
Matti Hamalainen <ccr@tnsp.org>
parents: 1494
diff changeset
501 {
5c46004dad15 Work on the RLE encoding.
Matti Hamalainen <ccr@tnsp.org>
parents: 1494
diff changeset
502 // A simple marker byte RLE variant: [Marker] [count] [data]
1660
7555c8803529 More work on improving the generic RLE decoder/encoder.
Matti Hamalainen <ccr@tnsp.org>
parents: 1650
diff changeset
503 if (!dmGrowBufPutU8(dst, cfg->rleMarkerW))
1716
9731b0bdec64 Improve error handling of dmEncodeGenericRLESequence() and use dmGenericRLEOutputRun() here as well.
Matti Hamalainen <ccr@tnsp.org>
parents: 1715
diff changeset
504 goto err;
1660
7555c8803529 More work on improving the generic RLE decoder/encoder.
Matti Hamalainen <ccr@tnsp.org>
parents: 1650
diff changeset
505
7555c8803529 More work on improving the generic RLE decoder/encoder.
Matti Hamalainen <ccr@tnsp.org>
parents: 1650
diff changeset
506 switch (cfg->flags & DM_RLE_ORDER_MASK)
7555c8803529 More work on improving the generic RLE decoder/encoder.
Matti Hamalainen <ccr@tnsp.org>
parents: 1650
diff changeset
507 {
7555c8803529 More work on improving the generic RLE decoder/encoder.
Matti Hamalainen <ccr@tnsp.org>
parents: 1650
diff changeset
508 case DM_RLE_ORDER_1:
7555c8803529 More work on improving the generic RLE decoder/encoder.
Matti Hamalainen <ccr@tnsp.org>
parents: 1650
diff changeset
509 if (!dmGrowBufPutU16LE(dst, count) ||
7555c8803529 More work on improving the generic RLE decoder/encoder.
Matti Hamalainen <ccr@tnsp.org>
parents: 1650
diff changeset
510 !dmGrowBufPutU8(dst, data))
1716
9731b0bdec64 Improve error handling of dmEncodeGenericRLESequence() and use dmGenericRLEOutputRun() here as well.
Matti Hamalainen <ccr@tnsp.org>
parents: 1715
diff changeset
511 goto err;
1660
7555c8803529 More work on improving the generic RLE decoder/encoder.
Matti Hamalainen <ccr@tnsp.org>
parents: 1650
diff changeset
512 break;
7555c8803529 More work on improving the generic RLE decoder/encoder.
Matti Hamalainen <ccr@tnsp.org>
parents: 1650
diff changeset
513
7555c8803529 More work on improving the generic RLE decoder/encoder.
Matti Hamalainen <ccr@tnsp.org>
parents: 1650
diff changeset
514 case DM_RLE_ORDER_2:
7555c8803529 More work on improving the generic RLE decoder/encoder.
Matti Hamalainen <ccr@tnsp.org>
parents: 1650
diff changeset
515 if (!dmGrowBufPutU8(dst, data) ||
7555c8803529 More work on improving the generic RLE decoder/encoder.
Matti Hamalainen <ccr@tnsp.org>
parents: 1650
diff changeset
516 !dmGrowBufPutU16LE(dst, count))
1716
9731b0bdec64 Improve error handling of dmEncodeGenericRLESequence() and use dmGenericRLEOutputRun() here as well.
Matti Hamalainen <ccr@tnsp.org>
parents: 1715
diff changeset
517 goto err;
1660
7555c8803529 More work on improving the generic RLE decoder/encoder.
Matti Hamalainen <ccr@tnsp.org>
parents: 1650
diff changeset
518 break;
7555c8803529 More work on improving the generic RLE decoder/encoder.
Matti Hamalainen <ccr@tnsp.org>
parents: 1650
diff changeset
519 }
7555c8803529 More work on improving the generic RLE decoder/encoder.
Matti Hamalainen <ccr@tnsp.org>
parents: 1650
diff changeset
520 }
7555c8803529 More work on improving the generic RLE decoder/encoder.
Matti Hamalainen <ccr@tnsp.org>
parents: 1650
diff changeset
521 else
7555c8803529 More work on improving the generic RLE decoder/encoder.
Matti Hamalainen <ccr@tnsp.org>
parents: 1650
diff changeset
522 if ((cfg->flags & DM_RLE_BYTE_RUNS) &&
7555c8803529 More work on improving the generic RLE decoder/encoder.
Matti Hamalainen <ccr@tnsp.org>
parents: 1650
diff changeset
523 (count >= cfg->rleMinCountB || data == cfg->rleMarkerB))
7555c8803529 More work on improving the generic RLE decoder/encoder.
Matti Hamalainen <ccr@tnsp.org>
parents: 1650
diff changeset
524 {
7555c8803529 More work on improving the generic RLE decoder/encoder.
Matti Hamalainen <ccr@tnsp.org>
parents: 1650
diff changeset
525 // A simple marker byte RLE variant: [Marker] [count] [data]
7555c8803529 More work on improving the generic RLE decoder/encoder.
Matti Hamalainen <ccr@tnsp.org>
parents: 1650
diff changeset
526 if (!dmGrowBufPutU8(dst, cfg->rleMarkerB))
1716
9731b0bdec64 Improve error handling of dmEncodeGenericRLESequence() and use dmGenericRLEOutputRun() here as well.
Matti Hamalainen <ccr@tnsp.org>
parents: 1715
diff changeset
527 goto err;
1573
86373ac0861a Implement another RLE variant, with different ordering of marker, count and data bytes.
Matti Hamalainen <ccr@tnsp.org>
parents: 1548
diff changeset
528
1650
9233da9de92c Refactor RLE encoding a bit, and add support for 16bit run counts and make things more configurable.
Matti Hamalainen <ccr@tnsp.org>
parents: 1647
diff changeset
529 switch (cfg->flags & DM_RLE_ORDER_MASK)
1573
86373ac0861a Implement another RLE variant, with different ordering of marker, count and data bytes.
Matti Hamalainen <ccr@tnsp.org>
parents: 1548
diff changeset
530 {
1650
9233da9de92c Refactor RLE encoding a bit, and add support for 16bit run counts and make things more configurable.
Matti Hamalainen <ccr@tnsp.org>
parents: 1647
diff changeset
531 case DM_RLE_ORDER_1:
1573
86373ac0861a Implement another RLE variant, with different ordering of marker, count and data bytes.
Matti Hamalainen <ccr@tnsp.org>
parents: 1548
diff changeset
532 if (!dmGrowBufPutU8(dst, count) ||
86373ac0861a Implement another RLE variant, with different ordering of marker, count and data bytes.
Matti Hamalainen <ccr@tnsp.org>
parents: 1548
diff changeset
533 !dmGrowBufPutU8(dst, data))
1716
9731b0bdec64 Improve error handling of dmEncodeGenericRLESequence() and use dmGenericRLEOutputRun() here as well.
Matti Hamalainen <ccr@tnsp.org>
parents: 1715
diff changeset
534 goto err;
1573
86373ac0861a Implement another RLE variant, with different ordering of marker, count and data bytes.
Matti Hamalainen <ccr@tnsp.org>
parents: 1548
diff changeset
535 break;
86373ac0861a Implement another RLE variant, with different ordering of marker, count and data bytes.
Matti Hamalainen <ccr@tnsp.org>
parents: 1548
diff changeset
536
1650
9233da9de92c Refactor RLE encoding a bit, and add support for 16bit run counts and make things more configurable.
Matti Hamalainen <ccr@tnsp.org>
parents: 1647
diff changeset
537 case DM_RLE_ORDER_2:
1573
86373ac0861a Implement another RLE variant, with different ordering of marker, count and data bytes.
Matti Hamalainen <ccr@tnsp.org>
parents: 1548
diff changeset
538 if (!dmGrowBufPutU8(dst, data) ||
86373ac0861a Implement another RLE variant, with different ordering of marker, count and data bytes.
Matti Hamalainen <ccr@tnsp.org>
parents: 1548
diff changeset
539 !dmGrowBufPutU8(dst, count))
1716
9731b0bdec64 Improve error handling of dmEncodeGenericRLESequence() and use dmGenericRLEOutputRun() here as well.
Matti Hamalainen <ccr@tnsp.org>
parents: 1715
diff changeset
540 goto err;
1573
86373ac0861a Implement another RLE variant, with different ordering of marker, count and data bytes.
Matti Hamalainen <ccr@tnsp.org>
parents: 1548
diff changeset
541 break;
86373ac0861a Implement another RLE variant, with different ordering of marker, count and data bytes.
Matti Hamalainen <ccr@tnsp.org>
parents: 1548
diff changeset
542 }
1496
5c46004dad15 Work on the RLE encoding.
Matti Hamalainen <ccr@tnsp.org>
parents: 1494
diff changeset
543 }
5c46004dad15 Work on the RLE encoding.
Matti Hamalainen <ccr@tnsp.org>
parents: 1494
diff changeset
544 else
5c46004dad15 Work on the RLE encoding.
Matti Hamalainen <ccr@tnsp.org>
parents: 1494
diff changeset
545 copyOnly = TRUE;
1478
d883b4c1cf48 More work on RLE encoding/decoding.
Matti Hamalainen <ccr@tnsp.org>
parents: 1476
diff changeset
546 break;
d883b4c1cf48 More work on RLE encoding/decoding.
Matti Hamalainen <ccr@tnsp.org>
parents: 1476
diff changeset
547
1505
3265175b24d2 Change the passing of RLE compression/decompression parameters to be in a dedicated struct.
Matti Hamalainen <ccr@tnsp.org>
parents: 1503
diff changeset
548 case DM_COMP_RLE_MASK:
1660
7555c8803529 More work on improving the generic RLE decoder/encoder.
Matti Hamalainen <ccr@tnsp.org>
parents: 1650
diff changeset
549 if (count >= cfg->rleMinCountB || (data & cfg->rleMarkerMask) == cfg->rleMarkerBits)
1496
5c46004dad15 Work on the RLE encoding.
Matti Hamalainen <ccr@tnsp.org>
parents: 1494
diff changeset
550 {
5c46004dad15 Work on the RLE encoding.
Matti Hamalainen <ccr@tnsp.org>
parents: 1494
diff changeset
551 // Mask marker RLE: usually high bit(s) of byte mark RLE sequence
5c46004dad15 Work on the RLE encoding.
Matti Hamalainen <ccr@tnsp.org>
parents: 1494
diff changeset
552 // and the lower bits contain the count: [Mask + count] [data]
1660
7555c8803529 More work on improving the generic RLE decoder/encoder.
Matti Hamalainen <ccr@tnsp.org>
parents: 1650
diff changeset
553 if (!dmGrowBufPutU8(dst, cfg->rleMarkerBits | count) ||
1496
5c46004dad15 Work on the RLE encoding.
Matti Hamalainen <ccr@tnsp.org>
parents: 1494
diff changeset
554 !dmGrowBufPutU8(dst, data))
1716
9731b0bdec64 Improve error handling of dmEncodeGenericRLESequence() and use dmGenericRLEOutputRun() here as well.
Matti Hamalainen <ccr@tnsp.org>
parents: 1715
diff changeset
555 goto err;
1496
5c46004dad15 Work on the RLE encoding.
Matti Hamalainen <ccr@tnsp.org>
parents: 1494
diff changeset
556 }
5c46004dad15 Work on the RLE encoding.
Matti Hamalainen <ccr@tnsp.org>
parents: 1494
diff changeset
557 else
5c46004dad15 Work on the RLE encoding.
Matti Hamalainen <ccr@tnsp.org>
parents: 1494
diff changeset
558 copyOnly = TRUE;
5c46004dad15 Work on the RLE encoding.
Matti Hamalainen <ccr@tnsp.org>
parents: 1494
diff changeset
559 break;
5c46004dad15 Work on the RLE encoding.
Matti Hamalainen <ccr@tnsp.org>
parents: 1494
diff changeset
560 }
5c46004dad15 Work on the RLE encoding.
Matti Hamalainen <ccr@tnsp.org>
parents: 1494
diff changeset
561
1716
9731b0bdec64 Improve error handling of dmEncodeGenericRLESequence() and use dmGenericRLEOutputRun() here as well.
Matti Hamalainen <ccr@tnsp.org>
parents: 1715
diff changeset
562 if (copyOnly && (res = dmGenericRLEOutputRun(dst, cfg, data, count)) != DMERR_OK)
9731b0bdec64 Improve error handling of dmEncodeGenericRLESequence() and use dmGenericRLEOutputRun() here as well.
Matti Hamalainen <ccr@tnsp.org>
parents: 1715
diff changeset
563 return res;
9731b0bdec64 Improve error handling of dmEncodeGenericRLESequence() and use dmGenericRLEOutputRun() here as well.
Matti Hamalainen <ccr@tnsp.org>
parents: 1715
diff changeset
564
9731b0bdec64 Improve error handling of dmEncodeGenericRLESequence() and use dmGenericRLEOutputRun() here as well.
Matti Hamalainen <ccr@tnsp.org>
parents: 1715
diff changeset
565 return DMERR_OK;
1478
d883b4c1cf48 More work on RLE encoding/decoding.
Matti Hamalainen <ccr@tnsp.org>
parents: 1476
diff changeset
566
1716
9731b0bdec64 Improve error handling of dmEncodeGenericRLESequence() and use dmGenericRLEOutputRun() here as well.
Matti Hamalainen <ccr@tnsp.org>
parents: 1715
diff changeset
567 err:
9731b0bdec64 Improve error handling of dmEncodeGenericRLESequence() and use dmGenericRLEOutputRun() here as well.
Matti Hamalainen <ccr@tnsp.org>
parents: 1715
diff changeset
568 return dmError(DMERR_MALLOC,
9731b0bdec64 Improve error handling of dmEncodeGenericRLESequence() and use dmGenericRLEOutputRun() here as well.
Matti Hamalainen <ccr@tnsp.org>
parents: 1715
diff changeset
569 "%s: RLE: Could not output RLE sequence %d x 0x%02x.\n",
9731b0bdec64 Improve error handling of dmEncodeGenericRLESequence() and use dmGenericRLEOutputRun() here as well.
Matti Hamalainen <ccr@tnsp.org>
parents: 1715
diff changeset
570 cfg->func, count, data);
1478
d883b4c1cf48 More work on RLE encoding/decoding.
Matti Hamalainen <ccr@tnsp.org>
parents: 1476
diff changeset
571 }
d883b4c1cf48 More work on RLE encoding/decoding.
Matti Hamalainen <ccr@tnsp.org>
parents: 1476
diff changeset
572
1466
bc75be0546fc More work on RLE decoder/encoder changes.
Matti Hamalainen <ccr@tnsp.org>
parents: 1465
diff changeset
573
1707
a0986cfd6f9d More consistently use DMGrowBuf in the lib64gfx APIs, and implement
Matti Hamalainen <ccr@tnsp.org>
parents: 1697
diff changeset
574 int dmEncodeGenericRLE(DMGrowBuf *dst, const DMGrowBuf *psrc, const DMCompParams *cfg)
1478
d883b4c1cf48 More work on RLE encoding/decoding.
Matti Hamalainen <ccr@tnsp.org>
parents: 1476
diff changeset
575 {
1707
a0986cfd6f9d More consistently use DMGrowBuf in the lib64gfx APIs, and implement
Matti Hamalainen <ccr@tnsp.org>
parents: 1697
diff changeset
576 DMGrowBuf src;
a0986cfd6f9d More consistently use DMGrowBuf in the lib64gfx APIs, and implement
Matti Hamalainen <ccr@tnsp.org>
parents: 1697
diff changeset
577 unsigned int count = 0;
1716
9731b0bdec64 Improve error handling of dmEncodeGenericRLESequence() and use dmGenericRLEOutputRun() here as well.
Matti Hamalainen <ccr@tnsp.org>
parents: 1715
diff changeset
578 int prev = -1, res = DMERR_OK;
1707
a0986cfd6f9d More consistently use DMGrowBuf in the lib64gfx APIs, and implement
Matti Hamalainen <ccr@tnsp.org>
parents: 1697
diff changeset
579 Uint8 data;
a0986cfd6f9d More consistently use DMGrowBuf in the lib64gfx APIs, and implement
Matti Hamalainen <ccr@tnsp.org>
parents: 1697
diff changeset
580
a0986cfd6f9d More consistently use DMGrowBuf in the lib64gfx APIs, and implement
Matti Hamalainen <ccr@tnsp.org>
parents: 1697
diff changeset
581 // As we need to modify the offs, etc. but not the data,
a0986cfd6f9d More consistently use DMGrowBuf in the lib64gfx APIs, and implement
Matti Hamalainen <ccr@tnsp.org>
parents: 1697
diff changeset
582 // we will just make a shallow copy of the DMGrowBuf struct
a0986cfd6f9d More consistently use DMGrowBuf in the lib64gfx APIs, and implement
Matti Hamalainen <ccr@tnsp.org>
parents: 1697
diff changeset
583 dmGrowBufConstCopy(&src, psrc);
a0986cfd6f9d More consistently use DMGrowBuf in the lib64gfx APIs, and implement
Matti Hamalainen <ccr@tnsp.org>
parents: 1697
diff changeset
584 dmSetupRLEBuffers(dst, &src, cfg);
a0986cfd6f9d More consistently use DMGrowBuf in the lib64gfx APIs, and implement
Matti Hamalainen <ccr@tnsp.org>
parents: 1697
diff changeset
585
a0986cfd6f9d More consistently use DMGrowBuf in the lib64gfx APIs, and implement
Matti Hamalainen <ccr@tnsp.org>
parents: 1697
diff changeset
586 while (dmGrowBufGetU8(&src, &data))
1478
d883b4c1cf48 More work on RLE encoding/decoding.
Matti Hamalainen <ccr@tnsp.org>
parents: 1476
diff changeset
587 {
1660
7555c8803529 More work on improving the generic RLE decoder/encoder.
Matti Hamalainen <ccr@tnsp.org>
parents: 1650
diff changeset
588 // If new data byte is different, or we exceed the rleMaxCount
7555c8803529 More work on improving the generic RLE decoder/encoder.
Matti Hamalainen <ccr@tnsp.org>
parents: 1650
diff changeset
589 // for the active runs mode(s) .. then encode the run.
7555c8803529 More work on improving the generic RLE decoder/encoder.
Matti Hamalainen <ccr@tnsp.org>
parents: 1650
diff changeset
590 if (data != prev ||
7555c8803529 More work on improving the generic RLE decoder/encoder.
Matti Hamalainen <ccr@tnsp.org>
parents: 1650
diff changeset
591 ((cfg->flags & DM_RLE_WORD_RUNS) && count >= cfg->rleMaxCountW) ||
7555c8803529 More work on improving the generic RLE decoder/encoder.
Matti Hamalainen <ccr@tnsp.org>
parents: 1650
diff changeset
592 (((cfg->flags & DM_RLE_RUNS_MASK) == DM_RLE_BYTE_RUNS) && count >= cfg->rleMaxCountB))
1478
d883b4c1cf48 More work on RLE encoding/decoding.
Matti Hamalainen <ccr@tnsp.org>
parents: 1476
diff changeset
593 {
1716
9731b0bdec64 Improve error handling of dmEncodeGenericRLESequence() and use dmGenericRLEOutputRun() here as well.
Matti Hamalainen <ccr@tnsp.org>
parents: 1715
diff changeset
594 if ((res = dmEncodeGenericRLESequence(dst, prev, count, cfg)) != DMERR_OK)
1478
d883b4c1cf48 More work on RLE encoding/decoding.
Matti Hamalainen <ccr@tnsp.org>
parents: 1476
diff changeset
595 goto err;
d883b4c1cf48 More work on RLE encoding/decoding.
Matti Hamalainen <ccr@tnsp.org>
parents: 1476
diff changeset
596
d883b4c1cf48 More work on RLE encoding/decoding.
Matti Hamalainen <ccr@tnsp.org>
parents: 1476
diff changeset
597 count = 1;
d883b4c1cf48 More work on RLE encoding/decoding.
Matti Hamalainen <ccr@tnsp.org>
parents: 1476
diff changeset
598 }
1496
5c46004dad15 Work on the RLE encoding.
Matti Hamalainen <ccr@tnsp.org>
parents: 1494
diff changeset
599 else
5c46004dad15 Work on the RLE encoding.
Matti Hamalainen <ccr@tnsp.org>
parents: 1494
diff changeset
600 count++;
1478
d883b4c1cf48 More work on RLE encoding/decoding.
Matti Hamalainen <ccr@tnsp.org>
parents: 1476
diff changeset
601
d883b4c1cf48 More work on RLE encoding/decoding.
Matti Hamalainen <ccr@tnsp.org>
parents: 1476
diff changeset
602 prev = data;
d883b4c1cf48 More work on RLE encoding/decoding.
Matti Hamalainen <ccr@tnsp.org>
parents: 1476
diff changeset
603 }
d883b4c1cf48 More work on RLE encoding/decoding.
Matti Hamalainen <ccr@tnsp.org>
parents: 1476
diff changeset
604
1716
9731b0bdec64 Improve error handling of dmEncodeGenericRLESequence() and use dmGenericRLEOutputRun() here as well.
Matti Hamalainen <ccr@tnsp.org>
parents: 1715
diff changeset
605 // If there is anything left in the output queue ..
9731b0bdec64 Improve error handling of dmEncodeGenericRLESequence() and use dmGenericRLEOutputRun() here as well.
Matti Hamalainen <ccr@tnsp.org>
parents: 1715
diff changeset
606 if ((res = dmEncodeGenericRLESequence(dst, prev, count, cfg)) != DMERR_OK)
1518
24b8b452925e Improve error handling of RLE encoder.
Matti Hamalainen <ccr@tnsp.org>
parents: 1513
diff changeset
607 goto err;
24b8b452925e Improve error handling of RLE encoder.
Matti Hamalainen <ccr@tnsp.org>
parents: 1513
diff changeset
608
1716
9731b0bdec64 Improve error handling of dmEncodeGenericRLESequence() and use dmGenericRLEOutputRun() here as well.
Matti Hamalainen <ccr@tnsp.org>
parents: 1715
diff changeset
609 dmFinishRLEBuffers(dst, &src, cfg);
1478
d883b4c1cf48 More work on RLE encoding/decoding.
Matti Hamalainen <ccr@tnsp.org>
parents: 1476
diff changeset
610
d883b4c1cf48 More work on RLE encoding/decoding.
Matti Hamalainen <ccr@tnsp.org>
parents: 1476
diff changeset
611 err:
1716
9731b0bdec64 Improve error handling of dmEncodeGenericRLESequence() and use dmGenericRLEOutputRun() here as well.
Matti Hamalainen <ccr@tnsp.org>
parents: 1715
diff changeset
612 return res;
1478
d883b4c1cf48 More work on RLE encoding/decoding.
Matti Hamalainen <ccr@tnsp.org>
parents: 1476
diff changeset
613 }
d883b4c1cf48 More work on RLE encoding/decoding.
Matti Hamalainen <ccr@tnsp.org>
parents: 1476
diff changeset
614
d883b4c1cf48 More work on RLE encoding/decoding.
Matti Hamalainen <ccr@tnsp.org>
parents: 1476
diff changeset
615
1707
a0986cfd6f9d More consistently use DMGrowBuf in the lib64gfx APIs, and implement
Matti Hamalainen <ccr@tnsp.org>
parents: 1697
diff changeset
616 int dmEncodeGenericRLEAlloc(DMGrowBuf *dst, const DMGrowBuf *src, const DMCompParams *cfg)
1478
d883b4c1cf48 More work on RLE encoding/decoding.
Matti Hamalainen <ccr@tnsp.org>
parents: 1476
diff changeset
617 {
d883b4c1cf48 More work on RLE encoding/decoding.
Matti Hamalainen <ccr@tnsp.org>
parents: 1476
diff changeset
618 int res;
d883b4c1cf48 More work on RLE encoding/decoding.
Matti Hamalainen <ccr@tnsp.org>
parents: 1476
diff changeset
619 if ((res = dmGrowBufAlloc(dst, BUF_SIZE_INITIAL, BUF_SIZE_GROW)) != DMERR_OK)
d883b4c1cf48 More work on RLE encoding/decoding.
Matti Hamalainen <ccr@tnsp.org>
parents: 1476
diff changeset
620 return res;
d883b4c1cf48 More work on RLE encoding/decoding.
Matti Hamalainen <ccr@tnsp.org>
parents: 1476
diff changeset
621
1707
a0986cfd6f9d More consistently use DMGrowBuf in the lib64gfx APIs, and implement
Matti Hamalainen <ccr@tnsp.org>
parents: 1697
diff changeset
622 return dmEncodeGenericRLE(dst, src, cfg);
523
d0c0c6baeb57 Split the RLE decoding from DrazPaint/Lace and Amica paint decoders to a
Matti Hamalainen <ccr@tnsp.org>
parents: 519
diff changeset
623 }
d0c0c6baeb57 Split the RLE decoding from DrazPaint/Lace and Amica paint decoders to a
Matti Hamalainen <ccr@tnsp.org>
parents: 519
diff changeset
624
519
feaaf0e2ecbe Cosmetics.
Matti Hamalainen <ccr@tnsp.org>
parents: 518
diff changeset
625
518
63849f85db57 Add some comments.
Matti Hamalainen <ccr@tnsp.org>
parents: 517
diff changeset
626 // Perform probing of the given data buffer, trying to determine
63849f85db57 Add some comments.
Matti Hamalainen <ccr@tnsp.org>
parents: 517
diff changeset
627 // if it contains a supported "C64" image format. Returns the
63849f85db57 Add some comments.
Matti Hamalainen <ccr@tnsp.org>
parents: 517
diff changeset
628 // "probe score", see libgfx.h for list of values. If a match
63849f85db57 Add some comments.
Matti Hamalainen <ccr@tnsp.org>
parents: 517
diff changeset
629 // is found, pointer to format description is set to *pfmt.
537
32d9e67da189 Rename generic probing function to match the style of other lib64gfx functions.
Matti Hamalainen <ccr@tnsp.org>
parents: 536
diff changeset
630 int dmC64ProbeBMP(const Uint8 *buf, const size_t len, const DMC64ImageFormat **pfmt)
407
59244a7ae37f Move c64 utilities to the engine lib, as we benefit from a common framework.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
631 {
1380
959b34402b81 Cosmetics.
Matti Hamalainen <ccr@tnsp.org>
parents: 1378
diff changeset
632 int scoreMax = DM_PROBE_SCORE_FALSE, scoreIndex = -1;
407
59244a7ae37f Move c64 utilities to the engine lib, as we benefit from a common framework.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
633
1380
959b34402b81 Cosmetics.
Matti Hamalainen <ccr@tnsp.org>
parents: 1378
diff changeset
634 for (int i = 0; i < ndmC64ImageFormats; i++)
407
59244a7ae37f Move c64 utilities to the engine lib, as we benefit from a common framework.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
635 {
516
6f141f760c54 Constify.
Matti Hamalainen <ccr@tnsp.org>
parents: 515
diff changeset
636 const DMC64ImageFormat *fmt = &dmC64ImageFormats[i];
511
4cdcaeb68b54 Collapse most of the probing functions into one generic probe, as they only
Matti Hamalainen <ccr@tnsp.org>
parents: 510
diff changeset
637 int score = DM_PROBE_SCORE_FALSE;
4cdcaeb68b54 Collapse most of the probing functions into one generic probe, as they only
Matti Hamalainen <ccr@tnsp.org>
parents: 510
diff changeset
638 if (fmt->probe == NULL && fmt->size > 0 && fmt->addr > 0)
4cdcaeb68b54 Collapse most of the probing functions into one generic probe, as they only
Matti Hamalainen <ccr@tnsp.org>
parents: 510
diff changeset
639 {
4cdcaeb68b54 Collapse most of the probing functions into one generic probe, as they only
Matti Hamalainen <ccr@tnsp.org>
parents: 510
diff changeset
640 // Generic probe just checks matching size and load address
4cdcaeb68b54 Collapse most of the probing functions into one generic probe, as they only
Matti Hamalainen <ccr@tnsp.org>
parents: 510
diff changeset
641 if (len == fmt->size && dmCompareAddr16(buf, 0, fmt->addr))
4cdcaeb68b54 Collapse most of the probing functions into one generic probe, as they only
Matti Hamalainen <ccr@tnsp.org>
parents: 510
diff changeset
642 score = DM_PROBE_SCORE_GOOD;
4cdcaeb68b54 Collapse most of the probing functions into one generic probe, as they only
Matti Hamalainen <ccr@tnsp.org>
parents: 510
diff changeset
643 }
4cdcaeb68b54 Collapse most of the probing functions into one generic probe, as they only
Matti Hamalainen <ccr@tnsp.org>
parents: 510
diff changeset
644 else
1134
d0898867ec4c Various fixes for issues reported by clang static analyzer.
Matti Hamalainen <ccr@tnsp.org>
parents: 958
diff changeset
645 if (fmt->probe != NULL)
511
4cdcaeb68b54 Collapse most of the probing functions into one generic probe, as they only
Matti Hamalainen <ccr@tnsp.org>
parents: 510
diff changeset
646 score = fmt->probe(buf, len, fmt);
4cdcaeb68b54 Collapse most of the probing functions into one generic probe, as they only
Matti Hamalainen <ccr@tnsp.org>
parents: 510
diff changeset
647
407
59244a7ae37f Move c64 utilities to the engine lib, as we benefit from a common framework.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
648 if (score > scoreMax)
59244a7ae37f Move c64 utilities to the engine lib, as we benefit from a common framework.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
649 {
59244a7ae37f Move c64 utilities to the engine lib, as we benefit from a common framework.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
650 scoreMax = score;
59244a7ae37f Move c64 utilities to the engine lib, as we benefit from a common framework.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
651 scoreIndex = i;
59244a7ae37f Move c64 utilities to the engine lib, as we benefit from a common framework.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
652 }
59244a7ae37f Move c64 utilities to the engine lib, as we benefit from a common framework.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
653 }
59244a7ae37f Move c64 utilities to the engine lib, as we benefit from a common framework.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
654
59244a7ae37f Move c64 utilities to the engine lib, as we benefit from a common framework.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
655 if (scoreIndex >= 0)
59244a7ae37f Move c64 utilities to the engine lib, as we benefit from a common framework.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
656 {
59244a7ae37f Move c64 utilities to the engine lib, as we benefit from a common framework.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
657 *pfmt = &dmC64ImageFormats[scoreIndex];
59244a7ae37f Move c64 utilities to the engine lib, as we benefit from a common framework.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
658 return scoreMax;
59244a7ae37f Move c64 utilities to the engine lib, as we benefit from a common framework.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
659 }
59244a7ae37f Move c64 utilities to the engine lib, as we benefit from a common framework.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
660 else
419
936bc27a79d6 Modularize some functions to lib64gfx, fix bitmap -> image conversion,
Matti Hamalainen <ccr@tnsp.org>
parents: 410
diff changeset
661 return DM_PROBE_SCORE_FALSE;
407
59244a7ae37f Move c64 utilities to the engine lib, as we benefit from a common framework.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
662 }
59244a7ae37f Move c64 utilities to the engine lib, as we benefit from a common framework.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
663
59244a7ae37f Move c64 utilities to the engine lib, as we benefit from a common framework.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
664
1537
776aa43b2c57 Tiny improvement in MC->FLI upconversion.
Matti Hamalainen <ccr@tnsp.org>
parents: 1534
diff changeset
665 int dmC64SanityCheckEncDecOp(const int i, const DMC64EncDecOp *op, const DMC64Image *img)
510
43ea59887c69 Start work on making C64 formats encoding possible by changing DMDecodeOps
Matti Hamalainen <ccr@tnsp.org>
parents: 508
diff changeset
666 {
1373
fc5ee5b4b0e9 Improve handling of extra data.
Matti Hamalainen <ccr@tnsp.org>
parents: 1372
diff changeset
667 switch (op->type)
510
43ea59887c69 Start work on making C64 formats encoding possible by changing DMDecodeOps
Matti Hamalainen <ccr@tnsp.org>
parents: 508
diff changeset
668 {
1668
1741717b1ae5 Big overhaul to the enc/dec operator system to be more flexible.
Matti Hamalainen <ccr@tnsp.org>
parents: 1660
diff changeset
669 case DO_COPY:
1741717b1ae5 Big overhaul to the enc/dec operator system to be more flexible.
Matti Hamalainen <ccr@tnsp.org>
parents: 1660
diff changeset
670 case DO_SET_MEM:
1726
f9128665a47e Implement operator types DO_SET_MEM_HI and DO_SET_MEM_LO. Not used yet.
Matti Hamalainen <ccr@tnsp.org>
parents: 1725
diff changeset
671 case DO_SET_MEM_HI:
f9128665a47e Implement operator types DO_SET_MEM_HI and DO_SET_MEM_LO. Not used yet.
Matti Hamalainen <ccr@tnsp.org>
parents: 1725
diff changeset
672 case DO_SET_MEM_LO:
1668
1741717b1ae5 Big overhaul to the enc/dec operator system to be more flexible.
Matti Hamalainen <ccr@tnsp.org>
parents: 1660
diff changeset
673 case DO_SET_OP:
1741717b1ae5 Big overhaul to the enc/dec operator system to be more flexible.
Matti Hamalainen <ccr@tnsp.org>
parents: 1660
diff changeset
674 switch (op->subject)
1373
fc5ee5b4b0e9 Improve handling of extra data.
Matti Hamalainen <ccr@tnsp.org>
parents: 1372
diff changeset
675 {
1668
1741717b1ae5 Big overhaul to the enc/dec operator system to be more flexible.
Matti Hamalainen <ccr@tnsp.org>
parents: 1660
diff changeset
676 case DS_COLOR_RAM:
1741717b1ae5 Big overhaul to the enc/dec operator system to be more flexible.
Matti Hamalainen <ccr@tnsp.org>
parents: 1660
diff changeset
677 case DS_BITMAP_RAM:
1741717b1ae5 Big overhaul to the enc/dec operator system to be more flexible.
Matti Hamalainen <ccr@tnsp.org>
parents: 1660
diff changeset
678 case DS_SCREEN_RAM:
1741717b1ae5 Big overhaul to the enc/dec operator system to be more flexible.
Matti Hamalainen <ccr@tnsp.org>
parents: 1660
diff changeset
679 case DS_CHAR_DATA:
1741717b1ae5 Big overhaul to the enc/dec operator system to be more flexible.
Matti Hamalainen <ccr@tnsp.org>
parents: 1660
diff changeset
680 if (op->bank < 0 || op->bank > img->nbanks)
1741717b1ae5 Big overhaul to the enc/dec operator system to be more flexible.
Matti Hamalainen <ccr@tnsp.org>
parents: 1660
diff changeset
681 {
1741717b1ae5 Big overhaul to the enc/dec operator system to be more flexible.
Matti Hamalainen <ccr@tnsp.org>
parents: 1660
diff changeset
682 return dmError(DMERR_INTERNAL,
1741717b1ae5 Big overhaul to the enc/dec operator system to be more flexible.
Matti Hamalainen <ccr@tnsp.org>
parents: 1660
diff changeset
683 "Invalid bank %d / %d definition in generic encode/decode operator %d @ #%d.\n",
1741717b1ae5 Big overhaul to the enc/dec operator system to be more flexible.
Matti Hamalainen <ccr@tnsp.org>
parents: 1660
diff changeset
684 op->bank, img->nbanks, op->type, i);
1741717b1ae5 Big overhaul to the enc/dec operator system to be more flexible.
Matti Hamalainen <ccr@tnsp.org>
parents: 1660
diff changeset
685 }
1741717b1ae5 Big overhaul to the enc/dec operator system to be more flexible.
Matti Hamalainen <ccr@tnsp.org>
parents: 1660
diff changeset
686 break;
1741717b1ae5 Big overhaul to the enc/dec operator system to be more flexible.
Matti Hamalainen <ccr@tnsp.org>
parents: 1660
diff changeset
687
1741717b1ae5 Big overhaul to the enc/dec operator system to be more flexible.
Matti Hamalainen <ccr@tnsp.org>
parents: 1660
diff changeset
688 case DS_EXTRA_DATA:
1741717b1ae5 Big overhaul to the enc/dec operator system to be more flexible.
Matti Hamalainen <ccr@tnsp.org>
parents: 1660
diff changeset
689 if (op->bank < 0 || op->bank >= C64_MAX_EXTRA_DATA)
1741717b1ae5 Big overhaul to the enc/dec operator system to be more flexible.
Matti Hamalainen <ccr@tnsp.org>
parents: 1660
diff changeset
690 {
1741717b1ae5 Big overhaul to the enc/dec operator system to be more flexible.
Matti Hamalainen <ccr@tnsp.org>
parents: 1660
diff changeset
691 return dmError(DMERR_INTERNAL,
1741717b1ae5 Big overhaul to the enc/dec operator system to be more flexible.
Matti Hamalainen <ccr@tnsp.org>
parents: 1660
diff changeset
692 "Invalid bank %d definition in generic encode/decode operator %d @ #%d.\n",
1741717b1ae5 Big overhaul to the enc/dec operator system to be more flexible.
Matti Hamalainen <ccr@tnsp.org>
parents: 1660
diff changeset
693 op->bank, op->type, i);
1741717b1ae5 Big overhaul to the enc/dec operator system to be more flexible.
Matti Hamalainen <ccr@tnsp.org>
parents: 1660
diff changeset
694 }
1741717b1ae5 Big overhaul to the enc/dec operator system to be more flexible.
Matti Hamalainen <ccr@tnsp.org>
parents: 1660
diff changeset
695 break;
1373
fc5ee5b4b0e9 Improve handling of extra data.
Matti Hamalainen <ccr@tnsp.org>
parents: 1372
diff changeset
696 }
fc5ee5b4b0e9 Improve handling of extra data.
Matti Hamalainen <ccr@tnsp.org>
parents: 1372
diff changeset
697 break;
fc5ee5b4b0e9 Improve handling of extra data.
Matti Hamalainen <ccr@tnsp.org>
parents: 1372
diff changeset
698
1668
1741717b1ae5 Big overhaul to the enc/dec operator system to be more flexible.
Matti Hamalainen <ccr@tnsp.org>
parents: 1660
diff changeset
699 // Just list the allowed ops here
1741717b1ae5 Big overhaul to the enc/dec operator system to be more flexible.
Matti Hamalainen <ccr@tnsp.org>
parents: 1660
diff changeset
700 case DO_DEC_FUNC:
1741717b1ae5 Big overhaul to the enc/dec operator system to be more flexible.
Matti Hamalainen <ccr@tnsp.org>
parents: 1660
diff changeset
701 case DO_ENC_FUNC:
1741717b1ae5 Big overhaul to the enc/dec operator system to be more flexible.
Matti Hamalainen <ccr@tnsp.org>
parents: 1660
diff changeset
702 case DO_CHAR_CFG:
1741717b1ae5 Big overhaul to the enc/dec operator system to be more flexible.
Matti Hamalainen <ccr@tnsp.org>
parents: 1660
diff changeset
703 case DO_LAST:
1373
fc5ee5b4b0e9 Improve handling of extra data.
Matti Hamalainen <ccr@tnsp.org>
parents: 1372
diff changeset
704 break;
510
43ea59887c69 Start work on making C64 formats encoding possible by changing DMDecodeOps
Matti Hamalainen <ccr@tnsp.org>
parents: 508
diff changeset
705
1668
1741717b1ae5 Big overhaul to the enc/dec operator system to be more flexible.
Matti Hamalainen <ccr@tnsp.org>
parents: 1660
diff changeset
706 default:
1741717b1ae5 Big overhaul to the enc/dec operator system to be more flexible.
Matti Hamalainen <ccr@tnsp.org>
parents: 1660
diff changeset
707 return dmError(DMERR_INTERNAL,
1741717b1ae5 Big overhaul to the enc/dec operator system to be more flexible.
Matti Hamalainen <ccr@tnsp.org>
parents: 1660
diff changeset
708 "Invalid op type %d in generic encode/decode operator @ #%d.\n",
1741717b1ae5 Big overhaul to the enc/dec operator system to be more flexible.
Matti Hamalainen <ccr@tnsp.org>
parents: 1660
diff changeset
709 op->type, i);
1741717b1ae5 Big overhaul to the enc/dec operator system to be more flexible.
Matti Hamalainen <ccr@tnsp.org>
parents: 1660
diff changeset
710 break;
510
43ea59887c69 Start work on making C64 formats encoding possible by changing DMDecodeOps
Matti Hamalainen <ccr@tnsp.org>
parents: 508
diff changeset
711 }
43ea59887c69 Start work on making C64 formats encoding possible by changing DMDecodeOps
Matti Hamalainen <ccr@tnsp.org>
parents: 508
diff changeset
712
43ea59887c69 Start work on making C64 formats encoding possible by changing DMDecodeOps
Matti Hamalainen <ccr@tnsp.org>
parents: 508
diff changeset
713 return DMERR_OK;
43ea59887c69 Start work on making C64 formats encoding possible by changing DMDecodeOps
Matti Hamalainen <ccr@tnsp.org>
parents: 508
diff changeset
714 }
43ea59887c69 Start work on making C64 formats encoding possible by changing DMDecodeOps
Matti Hamalainen <ccr@tnsp.org>
parents: 508
diff changeset
715
43ea59887c69 Start work on making C64 formats encoding possible by changing DMDecodeOps
Matti Hamalainen <ccr@tnsp.org>
parents: 508
diff changeset
716
1537
776aa43b2c57 Tiny improvement in MC->FLI upconversion.
Matti Hamalainen <ccr@tnsp.org>
parents: 1534
diff changeset
717 BOOL dmC64GetOpSize(const DMC64EncDecOp *op, const DMC64ImageFormat *fmt, size_t *size)
927
db495f421242 Change dmC64DefaultSizes[] array into a function instead.
Matti Hamalainen <ccr@tnsp.org>
parents: 925
diff changeset
718 {
1725
40a5ba0b3838 Return size of subject in dmC64GetOpSize() despite what the operator type is.
Matti Hamalainen <ccr@tnsp.org>
parents: 1722
diff changeset
719 switch (op->subject)
927
db495f421242 Change dmC64DefaultSizes[] array into a function instead.
Matti Hamalainen <ccr@tnsp.org>
parents: 925
diff changeset
720 {
1725
40a5ba0b3838 Return size of subject in dmC64GetOpSize() despite what the operator type is.
Matti Hamalainen <ccr@tnsp.org>
parents: 1722
diff changeset
721 case DS_SCREEN_RAM:
40a5ba0b3838 Return size of subject in dmC64GetOpSize() despite what the operator type is.
Matti Hamalainen <ccr@tnsp.org>
parents: 1722
diff changeset
722 case DS_COLOR_RAM:
40a5ba0b3838 Return size of subject in dmC64GetOpSize() despite what the operator type is.
Matti Hamalainen <ccr@tnsp.org>
parents: 1722
diff changeset
723 *size = fmt->chHeight * fmt->chWidth;
40a5ba0b3838 Return size of subject in dmC64GetOpSize() despite what the operator type is.
Matti Hamalainen <ccr@tnsp.org>
parents: 1722
diff changeset
724 break;
40a5ba0b3838 Return size of subject in dmC64GetOpSize() despite what the operator type is.
Matti Hamalainen <ccr@tnsp.org>
parents: 1722
diff changeset
725
40a5ba0b3838 Return size of subject in dmC64GetOpSize() despite what the operator type is.
Matti Hamalainen <ccr@tnsp.org>
parents: 1722
diff changeset
726 case DS_BITMAP_RAM:
40a5ba0b3838 Return size of subject in dmC64GetOpSize() despite what the operator type is.
Matti Hamalainen <ccr@tnsp.org>
parents: 1722
diff changeset
727 *size = fmt->chHeight * fmt->chWidth * 8;
40a5ba0b3838 Return size of subject in dmC64GetOpSize() despite what the operator type is.
Matti Hamalainen <ccr@tnsp.org>
parents: 1722
diff changeset
728 break;
927
db495f421242 Change dmC64DefaultSizes[] array into a function instead.
Matti Hamalainen <ccr@tnsp.org>
parents: 925
diff changeset
729
1725
40a5ba0b3838 Return size of subject in dmC64GetOpSize() despite what the operator type is.
Matti Hamalainen <ccr@tnsp.org>
parents: 1722
diff changeset
730 case DS_CHAR_DATA:
40a5ba0b3838 Return size of subject in dmC64GetOpSize() despite what the operator type is.
Matti Hamalainen <ccr@tnsp.org>
parents: 1722
diff changeset
731 *size = C64_MAX_CHARS * C64_CHR_SIZE;
40a5ba0b3838 Return size of subject in dmC64GetOpSize() despite what the operator type is.
Matti Hamalainen <ccr@tnsp.org>
parents: 1722
diff changeset
732 break;
927
db495f421242 Change dmC64DefaultSizes[] array into a function instead.
Matti Hamalainen <ccr@tnsp.org>
parents: 925
diff changeset
733
1725
40a5ba0b3838 Return size of subject in dmC64GetOpSize() despite what the operator type is.
Matti Hamalainen <ccr@tnsp.org>
parents: 1722
diff changeset
734 case DS_D020:
40a5ba0b3838 Return size of subject in dmC64GetOpSize() despite what the operator type is.
Matti Hamalainen <ccr@tnsp.org>
parents: 1722
diff changeset
735 case DS_BGCOL:
40a5ba0b3838 Return size of subject in dmC64GetOpSize() despite what the operator type is.
Matti Hamalainen <ccr@tnsp.org>
parents: 1722
diff changeset
736 case DS_D021:
40a5ba0b3838 Return size of subject in dmC64GetOpSize() despite what the operator type is.
Matti Hamalainen <ccr@tnsp.org>
parents: 1722
diff changeset
737 case DS_D022:
40a5ba0b3838 Return size of subject in dmC64GetOpSize() despite what the operator type is.
Matti Hamalainen <ccr@tnsp.org>
parents: 1722
diff changeset
738 case DS_D023:
40a5ba0b3838 Return size of subject in dmC64GetOpSize() despite what the operator type is.
Matti Hamalainen <ccr@tnsp.org>
parents: 1722
diff changeset
739 case DS_D024:
40a5ba0b3838 Return size of subject in dmC64GetOpSize() despite what the operator type is.
Matti Hamalainen <ccr@tnsp.org>
parents: 1722
diff changeset
740 *size = 1;
40a5ba0b3838 Return size of subject in dmC64GetOpSize() despite what the operator type is.
Matti Hamalainen <ccr@tnsp.org>
parents: 1722
diff changeset
741 break;
40a5ba0b3838 Return size of subject in dmC64GetOpSize() despite what the operator type is.
Matti Hamalainen <ccr@tnsp.org>
parents: 1722
diff changeset
742
40a5ba0b3838 Return size of subject in dmC64GetOpSize() despite what the operator type is.
Matti Hamalainen <ccr@tnsp.org>
parents: 1722
diff changeset
743 default:
40a5ba0b3838 Return size of subject in dmC64GetOpSize() despite what the operator type is.
Matti Hamalainen <ccr@tnsp.org>
parents: 1722
diff changeset
744 // Default to size of 0
40a5ba0b3838 Return size of subject in dmC64GetOpSize() despite what the operator type is.
Matti Hamalainen <ccr@tnsp.org>
parents: 1722
diff changeset
745 *size = 0;
40a5ba0b3838 Return size of subject in dmC64GetOpSize() despite what the operator type is.
Matti Hamalainen <ccr@tnsp.org>
parents: 1722
diff changeset
746 break;
931
2270d7f3af77 Refactor the DMC64Image handling to be more dynamic, and start
Matti Hamalainen <ccr@tnsp.org>
parents: 927
diff changeset
747 }
2270d7f3af77 Refactor the DMC64Image handling to be more dynamic, and start
Matti Hamalainen <ccr@tnsp.org>
parents: 927
diff changeset
748
1632
2a1866fd546e Use C64 encdec operator specified size for the element if it is larger than the default size.
Matti Hamalainen <ccr@tnsp.org>
parents: 1631
diff changeset
749 // If the operator specified size is larger, use it.
2a1866fd546e Use C64 encdec operator specified size for the element if it is larger than the default size.
Matti Hamalainen <ccr@tnsp.org>
parents: 1631
diff changeset
750 if (op->size > *size)
2a1866fd546e Use C64 encdec operator specified size for the element if it is larger than the default size.
Matti Hamalainen <ccr@tnsp.org>
parents: 1631
diff changeset
751 *size = op->size;
2a1866fd546e Use C64 encdec operator specified size for the element if it is larger than the default size.
Matti Hamalainen <ccr@tnsp.org>
parents: 1631
diff changeset
752
931
2270d7f3af77 Refactor the DMC64Image handling to be more dynamic, and start
Matti Hamalainen <ccr@tnsp.org>
parents: 927
diff changeset
753 return TRUE;
927
db495f421242 Change dmC64DefaultSizes[] array into a function instead.
Matti Hamalainen <ccr@tnsp.org>
parents: 925
diff changeset
754 }
db495f421242 Change dmC64DefaultSizes[] array into a function instead.
Matti Hamalainen <ccr@tnsp.org>
parents: 925
diff changeset
755
db495f421242 Change dmC64DefaultSizes[] array into a function instead.
Matti Hamalainen <ccr@tnsp.org>
parents: 925
diff changeset
756
1668
1741717b1ae5 Big overhaul to the enc/dec operator system to be more flexible.
Matti Hamalainen <ccr@tnsp.org>
parents: 1660
diff changeset
757 void dmC64GetOpMemBlockAndName(const DMC64Image *img, const int subject, const int bank, const DMC64MemBlock **blk, char **blkname)
1741717b1ae5 Big overhaul to the enc/dec operator system to be more flexible.
Matti Hamalainen <ccr@tnsp.org>
parents: 1660
diff changeset
758 {
1741717b1ae5 Big overhaul to the enc/dec operator system to be more flexible.
Matti Hamalainen <ccr@tnsp.org>
parents: 1660
diff changeset
759 switch (subject)
1741717b1ae5 Big overhaul to the enc/dec operator system to be more flexible.
Matti Hamalainen <ccr@tnsp.org>
parents: 1660
diff changeset
760 {
1741717b1ae5 Big overhaul to the enc/dec operator system to be more flexible.
Matti Hamalainen <ccr@tnsp.org>
parents: 1660
diff changeset
761 case DS_COLOR_RAM : *blk = &img->color[bank]; *blkname = "Color RAM"; break;
1741717b1ae5 Big overhaul to the enc/dec operator system to be more flexible.
Matti Hamalainen <ccr@tnsp.org>
parents: 1660
diff changeset
762 case DS_SCREEN_RAM : *blk = &img->screen[bank]; *blkname = "Screen RAM"; break;
1741717b1ae5 Big overhaul to the enc/dec operator system to be more flexible.
Matti Hamalainen <ccr@tnsp.org>
parents: 1660
diff changeset
763 case DS_BITMAP_RAM : *blk = &img->bitmap[bank]; *blkname = "Bitmap RAM"; break;
1741717b1ae5 Big overhaul to the enc/dec operator system to be more flexible.
Matti Hamalainen <ccr@tnsp.org>
parents: 1660
diff changeset
764 case DS_CHAR_DATA : *blk = &img->charData[bank]; *blkname = "Character data"; break;
1741717b1ae5 Big overhaul to the enc/dec operator system to be more flexible.
Matti Hamalainen <ccr@tnsp.org>
parents: 1660
diff changeset
765 case DS_EXTRA_DATA : *blk = &img->extraData[bank]; *blkname = "Extra data"; break;
1741717b1ae5 Big overhaul to the enc/dec operator system to be more flexible.
Matti Hamalainen <ccr@tnsp.org>
parents: 1660
diff changeset
766 default: *blk = NULL; *blkname = NULL; break;
1741717b1ae5 Big overhaul to the enc/dec operator system to be more flexible.
Matti Hamalainen <ccr@tnsp.org>
parents: 1660
diff changeset
767 }
1741717b1ae5 Big overhaul to the enc/dec operator system to be more flexible.
Matti Hamalainen <ccr@tnsp.org>
parents: 1660
diff changeset
768 }
1741717b1ae5 Big overhaul to the enc/dec operator system to be more flexible.
Matti Hamalainen <ccr@tnsp.org>
parents: 1660
diff changeset
769
1741717b1ae5 Big overhaul to the enc/dec operator system to be more flexible.
Matti Hamalainen <ccr@tnsp.org>
parents: 1660
diff changeset
770
1707
a0986cfd6f9d More consistently use DMGrowBuf in the lib64gfx APIs, and implement
Matti Hamalainen <ccr@tnsp.org>
parents: 1697
diff changeset
771 int dmC64DecodeGenericBMP(DMC64Image *img, const DMGrowBuf *buf, const DMC64ImageFormat *fmt)
407
59244a7ae37f Move c64 utilities to the engine lib, as we benefit from a common framework.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
772 {
1460
361cad3b8445 Improve error handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 1457
diff changeset
773 int res = DMERR_OK;
361cad3b8445 Improve error handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 1457
diff changeset
774
1707
a0986cfd6f9d More consistently use DMGrowBuf in the lib64gfx APIs, and implement
Matti Hamalainen <ccr@tnsp.org>
parents: 1697
diff changeset
775 if (buf == NULL || buf->data == NULL || img == NULL || fmt == NULL)
513
486067f39bc1 Add sanity checking.
Matti Hamalainen <ccr@tnsp.org>
parents: 511
diff changeset
776 return DMERR_NULLPTR;
486067f39bc1 Add sanity checking.
Matti Hamalainen <ccr@tnsp.org>
parents: 511
diff changeset
777
925
23b14d62bf67 Cosmetics.
Matti Hamalainen <ccr@tnsp.org>
parents: 924
diff changeset
778 // Clear the image structure, set basics
931
2270d7f3af77 Refactor the DMC64Image handling to be more dynamic, and start
Matti Hamalainen <ccr@tnsp.org>
parents: 927
diff changeset
779 img->type = fmt->type;
2270d7f3af77 Refactor the DMC64Image handling to be more dynamic, and start
Matti Hamalainen <ccr@tnsp.org>
parents: 927
diff changeset
780 img->width = fmt->width;
2270d7f3af77 Refactor the DMC64Image handling to be more dynamic, and start
Matti Hamalainen <ccr@tnsp.org>
parents: 927
diff changeset
781 img->height = fmt->height;
1482
df6dacb48970 Rename some struct members, and sanitize handling of DMC64Image allocation more.
Matti Hamalainen <ccr@tnsp.org>
parents: 1478
diff changeset
782 img->chWidth = fmt->chWidth;
df6dacb48970 Rename some struct members, and sanitize handling of DMC64Image allocation more.
Matti Hamalainen <ccr@tnsp.org>
parents: 1478
diff changeset
783 img->chHeight = fmt->chHeight;
1378
c465860e44ed Make c64 image bank allocation dynamic.
Matti Hamalainen <ccr@tnsp.org>
parents: 1377
diff changeset
784 img->nbanks = dmC64ImageGetNumBanks(fmt);
407
59244a7ae37f Move c64 utilities to the engine lib, as we benefit from a common framework.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
785
518
63849f85db57 Add some comments.
Matti Hamalainen <ccr@tnsp.org>
parents: 517
diff changeset
786 // Perform decoding
1365
60d7240e1a63 Remove hardcoded encoding/decoding operator counts from the structures, use
Matti Hamalainen <ccr@tnsp.org>
parents: 1364
diff changeset
787 for (int i = 0; i < D64_MAX_ENCDEC_OPS; i++)
407
59244a7ae37f Move c64 utilities to the engine lib, as we benefit from a common framework.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
788 {
1591
3cc7b2aadda3 Add inline helper function fmtGetEncDecOp() and use it.
Matti Hamalainen <ccr@tnsp.org>
parents: 1588
diff changeset
789 const DMC64EncDecOp *op = fmtGetEncDecOp(fmt, i);
410
e4b2f689aff6 Stdint -> SDL types conversion.
Matti Hamalainen <ccr@tnsp.org>
parents: 407
diff changeset
790 const Uint8 *src;
1600
e28e67358ff6 Fix some uninitialized variable warnings.
Matti Hamalainen <ccr@tnsp.org>
parents: 1597
diff changeset
791 DMC64MemBlock *blk = NULL;
e28e67358ff6 Fix some uninitialized variable warnings.
Matti Hamalainen <ccr@tnsp.org>
parents: 1597
diff changeset
792 char *blkname = NULL;
407
59244a7ae37f Move c64 utilities to the engine lib, as we benefit from a common framework.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
793 size_t size;
1668
1741717b1ae5 Big overhaul to the enc/dec operator system to be more flexible.
Matti Hamalainen <ccr@tnsp.org>
parents: 1660
diff changeset
794 Uint8 value;
1378
c465860e44ed Make c64 image bank allocation dynamic.
Matti Hamalainen <ccr@tnsp.org>
parents: 1377
diff changeset
795
1365
60d7240e1a63 Remove hardcoded encoding/decoding operator counts from the structures, use
Matti Hamalainen <ccr@tnsp.org>
parents: 1364
diff changeset
796 // Check for last operator
1668
1741717b1ae5 Big overhaul to the enc/dec operator system to be more flexible.
Matti Hamalainen <ccr@tnsp.org>
parents: 1660
diff changeset
797 if (op->type == DO_LAST)
1365
60d7240e1a63 Remove hardcoded encoding/decoding operator counts from the structures, use
Matti Hamalainen <ccr@tnsp.org>
parents: 1364
diff changeset
798 break;
407
59244a7ae37f Move c64 utilities to the engine lib, as we benefit from a common framework.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
799
811
aebc2f8b2c2d Add some comments.
Matti Hamalainen <ccr@tnsp.org>
parents: 810
diff changeset
800 // Check operation validity
1378
c465860e44ed Make c64 image bank allocation dynamic.
Matti Hamalainen <ccr@tnsp.org>
parents: 1377
diff changeset
801 if ((res = dmC64SanityCheckEncDecOp(i, op, img)) != DMERR_OK)
510
43ea59887c69 Start work on making C64 formats encoding possible by changing DMDecodeOps
Matti Hamalainen <ccr@tnsp.org>
parents: 508
diff changeset
802 return res;
925
23b14d62bf67 Cosmetics.
Matti Hamalainen <ccr@tnsp.org>
parents: 924
diff changeset
803
811
aebc2f8b2c2d Add some comments.
Matti Hamalainen <ccr@tnsp.org>
parents: 810
diff changeset
804 // Check size
931
2270d7f3af77 Refactor the DMC64Image handling to be more dynamic, and start
Matti Hamalainen <ccr@tnsp.org>
parents: 927
diff changeset
805 if (!dmC64GetOpSize(op, fmt, &size))
2270d7f3af77 Refactor the DMC64Image handling to be more dynamic, and start
Matti Hamalainen <ccr@tnsp.org>
parents: 927
diff changeset
806 {
958
985225a93aeb Add error code parameter to dmError() and dmErrorVA().
Matti Hamalainen <ccr@tnsp.org>
parents: 946
diff changeset
807 return dmError(DMERR_INVALID_DATA,
1668
1741717b1ae5 Big overhaul to the enc/dec operator system to be more flexible.
Matti Hamalainen <ccr@tnsp.org>
parents: 1660
diff changeset
808 "Decode op SIZE out of bounds, op #%d type=%d, subj=%d, offs=%d ($%04x), "
931
2270d7f3af77 Refactor the DMC64Image handling to be more dynamic, and start
Matti Hamalainen <ccr@tnsp.org>
parents: 927
diff changeset
809 "bank=%d, size=%d ($%04x) vs. allocated %d ($%04x)\n",
1668
1741717b1ae5 Big overhaul to the enc/dec operator system to be more flexible.
Matti Hamalainen <ccr@tnsp.org>
parents: 1660
diff changeset
810 i, op->type, op->subject, op->offs, op->offs, op->bank, size, size, op->size, op->size);
931
2270d7f3af77 Refactor the DMC64Image handling to be more dynamic, and start
Matti Hamalainen <ccr@tnsp.org>
parents: 927
diff changeset
811 }
811
aebc2f8b2c2d Add some comments.
Matti Hamalainen <ccr@tnsp.org>
parents: 810
diff changeset
812
1588
ca087c0cc9c4 Refactor the c64 format memory handling a bit for more flexibility.
Matti Hamalainen <ccr@tnsp.org>
parents: 1586
diff changeset
813 // Is the operation inside the bounds?
1707
a0986cfd6f9d More consistently use DMGrowBuf in the lib64gfx APIs, and implement
Matti Hamalainen <ccr@tnsp.org>
parents: 1697
diff changeset
814 if (op->offs + size > buf->len + 1)
407
59244a7ae37f Move c64 utilities to the engine lib, as we benefit from a common framework.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
815 {
958
985225a93aeb Add error code parameter to dmError() and dmErrorVA().
Matti Hamalainen <ccr@tnsp.org>
parents: 946
diff changeset
816 return dmError(DMERR_INVALID_DATA,
1668
1741717b1ae5 Big overhaul to the enc/dec operator system to be more flexible.
Matti Hamalainen <ccr@tnsp.org>
parents: 1660
diff changeset
817 "Decode DATA out of bounds, op #%d type=%d, subj=%d, offs=%d ($%04x), "
510
43ea59887c69 Start work on making C64 formats encoding possible by changing DMDecodeOps
Matti Hamalainen <ccr@tnsp.org>
parents: 508
diff changeset
818 "bank=%d, size=%d ($%04x) @ %d ($%04x)\n",
1707
a0986cfd6f9d More consistently use DMGrowBuf in the lib64gfx APIs, and implement
Matti Hamalainen <ccr@tnsp.org>
parents: 1697
diff changeset
819 i, op->type, op->subject, op->offs, op->offs, op->bank,
a0986cfd6f9d More consistently use DMGrowBuf in the lib64gfx APIs, and implement
Matti Hamalainen <ccr@tnsp.org>
parents: 1697
diff changeset
820 size, size, buf->len, buf->len);
407
59244a7ae37f Move c64 utilities to the engine lib, as we benefit from a common framework.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
821 }
811
aebc2f8b2c2d Add some comments.
Matti Hamalainen <ccr@tnsp.org>
parents: 810
diff changeset
822
1707
a0986cfd6f9d More consistently use DMGrowBuf in the lib64gfx APIs, and implement
Matti Hamalainen <ccr@tnsp.org>
parents: 1697
diff changeset
823 src = buf->data + op->offs;
811
aebc2f8b2c2d Add some comments.
Matti Hamalainen <ccr@tnsp.org>
parents: 810
diff changeset
824
aebc2f8b2c2d Add some comments.
Matti Hamalainen <ccr@tnsp.org>
parents: 810
diff changeset
825 // Perform operation
407
59244a7ae37f Move c64 utilities to the engine lib, as we benefit from a common framework.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
826 switch (op->type)
59244a7ae37f Move c64 utilities to the engine lib, as we benefit from a common framework.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
827 {
1668
1741717b1ae5 Big overhaul to the enc/dec operator system to be more flexible.
Matti Hamalainen <ccr@tnsp.org>
parents: 1660
diff changeset
828 case DO_COPY:
1741717b1ae5 Big overhaul to the enc/dec operator system to be more flexible.
Matti Hamalainen <ccr@tnsp.org>
parents: 1660
diff changeset
829 case DO_SET_MEM:
1726
f9128665a47e Implement operator types DO_SET_MEM_HI and DO_SET_MEM_LO. Not used yet.
Matti Hamalainen <ccr@tnsp.org>
parents: 1725
diff changeset
830 case DO_SET_MEM_HI:
f9128665a47e Implement operator types DO_SET_MEM_HI and DO_SET_MEM_LO. Not used yet.
Matti Hamalainen <ccr@tnsp.org>
parents: 1725
diff changeset
831 case DO_SET_MEM_LO:
1668
1741717b1ae5 Big overhaul to the enc/dec operator system to be more flexible.
Matti Hamalainen <ccr@tnsp.org>
parents: 1660
diff changeset
832 case DO_SET_OP:
1741717b1ae5 Big overhaul to the enc/dec operator system to be more flexible.
Matti Hamalainen <ccr@tnsp.org>
parents: 1660
diff changeset
833 switch (op->subject)
1373
fc5ee5b4b0e9 Improve handling of extra data.
Matti Hamalainen <ccr@tnsp.org>
parents: 1372
diff changeset
834 {
1668
1741717b1ae5 Big overhaul to the enc/dec operator system to be more flexible.
Matti Hamalainen <ccr@tnsp.org>
parents: 1660
diff changeset
835 case DS_COLOR_RAM:
1741717b1ae5 Big overhaul to the enc/dec operator system to be more flexible.
Matti Hamalainen <ccr@tnsp.org>
parents: 1660
diff changeset
836 case DS_SCREEN_RAM:
1741717b1ae5 Big overhaul to the enc/dec operator system to be more flexible.
Matti Hamalainen <ccr@tnsp.org>
parents: 1660
diff changeset
837 case DS_BITMAP_RAM:
1741717b1ae5 Big overhaul to the enc/dec operator system to be more flexible.
Matti Hamalainen <ccr@tnsp.org>
parents: 1660
diff changeset
838 case DS_CHAR_DATA:
1741717b1ae5 Big overhaul to the enc/dec operator system to be more flexible.
Matti Hamalainen <ccr@tnsp.org>
parents: 1660
diff changeset
839 case DS_EXTRA_DATA:
1741717b1ae5 Big overhaul to the enc/dec operator system to be more flexible.
Matti Hamalainen <ccr@tnsp.org>
parents: 1660
diff changeset
840 // XXX BZZZT .. a nasty cast here --v
1741717b1ae5 Big overhaul to the enc/dec operator system to be more flexible.
Matti Hamalainen <ccr@tnsp.org>
parents: 1660
diff changeset
841 dmC64GetOpMemBlockAndName(img, op->subject, op->bank, (const DMC64MemBlock **) &blk, &blkname);
1741717b1ae5 Big overhaul to the enc/dec operator system to be more flexible.
Matti Hamalainen <ccr@tnsp.org>
parents: 1660
diff changeset
842 if ((dmC64MemBlockAlloc(blk, size)) != DMERR_OK)
1741717b1ae5 Big overhaul to the enc/dec operator system to be more flexible.
Matti Hamalainen <ccr@tnsp.org>
parents: 1660
diff changeset
843 {
1741717b1ae5 Big overhaul to the enc/dec operator system to be more flexible.
Matti Hamalainen <ccr@tnsp.org>
parents: 1660
diff changeset
844 return dmError(DMERR_MALLOC,
1741717b1ae5 Big overhaul to the enc/dec operator system to be more flexible.
Matti Hamalainen <ccr@tnsp.org>
parents: 1660
diff changeset
845 "Could not allocate '%s' block! "
1741717b1ae5 Big overhaul to the enc/dec operator system to be more flexible.
Matti Hamalainen <ccr@tnsp.org>
parents: 1660
diff changeset
846 "op #%d, offs=%d ($%04x), bank=%d, size=%d ($%04x) @ %d ($%04x)\n",
1707
a0986cfd6f9d More consistently use DMGrowBuf in the lib64gfx APIs, and implement
Matti Hamalainen <ccr@tnsp.org>
parents: 1697
diff changeset
847 blkname, i, op->offs, op->offs, op->bank, size, size, buf->len, buf->len);
1668
1741717b1ae5 Big overhaul to the enc/dec operator system to be more flexible.
Matti Hamalainen <ccr@tnsp.org>
parents: 1660
diff changeset
848 }
1741717b1ae5 Big overhaul to the enc/dec operator system to be more flexible.
Matti Hamalainen <ccr@tnsp.org>
parents: 1660
diff changeset
849 switch (op->type)
1741717b1ae5 Big overhaul to the enc/dec operator system to be more flexible.
Matti Hamalainen <ccr@tnsp.org>
parents: 1660
diff changeset
850 {
1741717b1ae5 Big overhaul to the enc/dec operator system to be more flexible.
Matti Hamalainen <ccr@tnsp.org>
parents: 1660
diff changeset
851 case DO_COPY:
1741717b1ae5 Big overhaul to the enc/dec operator system to be more flexible.
Matti Hamalainen <ccr@tnsp.org>
parents: 1660
diff changeset
852 memcpy(blk->data, src, size);
1741717b1ae5 Big overhaul to the enc/dec operator system to be more flexible.
Matti Hamalainen <ccr@tnsp.org>
parents: 1660
diff changeset
853 break;
1741717b1ae5 Big overhaul to the enc/dec operator system to be more flexible.
Matti Hamalainen <ccr@tnsp.org>
parents: 1660
diff changeset
854
1741717b1ae5 Big overhaul to the enc/dec operator system to be more flexible.
Matti Hamalainen <ccr@tnsp.org>
parents: 1660
diff changeset
855 case DO_SET_MEM:
1741717b1ae5 Big overhaul to the enc/dec operator system to be more flexible.
Matti Hamalainen <ccr@tnsp.org>
parents: 1660
diff changeset
856 memset(blk->data, *src, size);
1741717b1ae5 Big overhaul to the enc/dec operator system to be more flexible.
Matti Hamalainen <ccr@tnsp.org>
parents: 1660
diff changeset
857 break;
1741717b1ae5 Big overhaul to the enc/dec operator system to be more flexible.
Matti Hamalainen <ccr@tnsp.org>
parents: 1660
diff changeset
858
1741717b1ae5 Big overhaul to the enc/dec operator system to be more flexible.
Matti Hamalainen <ccr@tnsp.org>
parents: 1660
diff changeset
859 case DO_SET_OP:
1741717b1ae5 Big overhaul to the enc/dec operator system to be more flexible.
Matti Hamalainen <ccr@tnsp.org>
parents: 1660
diff changeset
860 memset(blk->data, op->offs, size);
1741717b1ae5 Big overhaul to the enc/dec operator system to be more flexible.
Matti Hamalainen <ccr@tnsp.org>
parents: 1660
diff changeset
861 break;
1727
8eb5ff34864a Improve error messages in the RLE decoder.
Matti Hamalainen <ccr@tnsp.org>
parents: 1726
diff changeset
862
1721
c9a6f1dae756 Add one default case error handler.
Matti Hamalainen <ccr@tnsp.org>
parents: 1720
diff changeset
863 default:
c9a6f1dae756 Add one default case error handler.
Matti Hamalainen <ccr@tnsp.org>
parents: 1720
diff changeset
864 return dmError(DMERR_INTERNAL,
c9a6f1dae756 Add one default case error handler.
Matti Hamalainen <ccr@tnsp.org>
parents: 1720
diff changeset
865 "Unhandled op type %d in "
c9a6f1dae756 Add one default case error handler.
Matti Hamalainen <ccr@tnsp.org>
parents: 1720
diff changeset
866 "op #%d, offs=%d ($%04x), bank=%d, size=%d ($%04x) @ %d ($%04x)\n",
c9a6f1dae756 Add one default case error handler.
Matti Hamalainen <ccr@tnsp.org>
parents: 1720
diff changeset
867 op->type, i, op->offs, op->offs, op->bank, size, size, buf->len, buf->len);
1668
1741717b1ae5 Big overhaul to the enc/dec operator system to be more flexible.
Matti Hamalainen <ccr@tnsp.org>
parents: 1660
diff changeset
868 }
1741717b1ae5 Big overhaul to the enc/dec operator system to be more flexible.
Matti Hamalainen <ccr@tnsp.org>
parents: 1660
diff changeset
869 break;
917
df3a74f230d9 Initial implementation of charmode support in lib64gfx.
Matti Hamalainen <ccr@tnsp.org>
parents: 916
diff changeset
870
1668
1741717b1ae5 Big overhaul to the enc/dec operator system to be more flexible.
Matti Hamalainen <ccr@tnsp.org>
parents: 1660
diff changeset
871 case DS_D020:
1741717b1ae5 Big overhaul to the enc/dec operator system to be more flexible.
Matti Hamalainen <ccr@tnsp.org>
parents: 1660
diff changeset
872 case DS_BGCOL:
1741717b1ae5 Big overhaul to the enc/dec operator system to be more flexible.
Matti Hamalainen <ccr@tnsp.org>
parents: 1660
diff changeset
873 case DS_D021:
1741717b1ae5 Big overhaul to the enc/dec operator system to be more flexible.
Matti Hamalainen <ccr@tnsp.org>
parents: 1660
diff changeset
874 case DS_D022:
1741717b1ae5 Big overhaul to the enc/dec operator system to be more flexible.
Matti Hamalainen <ccr@tnsp.org>
parents: 1660
diff changeset
875 case DS_D023:
1741717b1ae5 Big overhaul to the enc/dec operator system to be more flexible.
Matti Hamalainen <ccr@tnsp.org>
parents: 1660
diff changeset
876 case DS_D024:
1741717b1ae5 Big overhaul to the enc/dec operator system to be more flexible.
Matti Hamalainen <ccr@tnsp.org>
parents: 1660
diff changeset
877 switch (op->type)
1741717b1ae5 Big overhaul to the enc/dec operator system to be more flexible.
Matti Hamalainen <ccr@tnsp.org>
parents: 1660
diff changeset
878 {
1741717b1ae5 Big overhaul to the enc/dec operator system to be more flexible.
Matti Hamalainen <ccr@tnsp.org>
parents: 1660
diff changeset
879 case DO_COPY:
1741717b1ae5 Big overhaul to the enc/dec operator system to be more flexible.
Matti Hamalainen <ccr@tnsp.org>
parents: 1660
diff changeset
880 case DO_SET_MEM:
1741717b1ae5 Big overhaul to the enc/dec operator system to be more flexible.
Matti Hamalainen <ccr@tnsp.org>
parents: 1660
diff changeset
881 value = *src;
1741717b1ae5 Big overhaul to the enc/dec operator system to be more flexible.
Matti Hamalainen <ccr@tnsp.org>
parents: 1660
diff changeset
882 break;
1741717b1ae5 Big overhaul to the enc/dec operator system to be more flexible.
Matti Hamalainen <ccr@tnsp.org>
parents: 1660
diff changeset
883
1741717b1ae5 Big overhaul to the enc/dec operator system to be more flexible.
Matti Hamalainen <ccr@tnsp.org>
parents: 1660
diff changeset
884 case DO_SET_OP:
1741717b1ae5 Big overhaul to the enc/dec operator system to be more flexible.
Matti Hamalainen <ccr@tnsp.org>
parents: 1660
diff changeset
885 value = op->offs;
1741717b1ae5 Big overhaul to the enc/dec operator system to be more flexible.
Matti Hamalainen <ccr@tnsp.org>
parents: 1660
diff changeset
886 break;
1741717b1ae5 Big overhaul to the enc/dec operator system to be more flexible.
Matti Hamalainen <ccr@tnsp.org>
parents: 1660
diff changeset
887
1726
f9128665a47e Implement operator types DO_SET_MEM_HI and DO_SET_MEM_LO. Not used yet.
Matti Hamalainen <ccr@tnsp.org>
parents: 1725
diff changeset
888 case DO_SET_MEM_HI:
f9128665a47e Implement operator types DO_SET_MEM_HI and DO_SET_MEM_LO. Not used yet.
Matti Hamalainen <ccr@tnsp.org>
parents: 1725
diff changeset
889 value = (*src >> 4) & 0x0f;
f9128665a47e Implement operator types DO_SET_MEM_HI and DO_SET_MEM_LO. Not used yet.
Matti Hamalainen <ccr@tnsp.org>
parents: 1725
diff changeset
890 break;
f9128665a47e Implement operator types DO_SET_MEM_HI and DO_SET_MEM_LO. Not used yet.
Matti Hamalainen <ccr@tnsp.org>
parents: 1725
diff changeset
891
f9128665a47e Implement operator types DO_SET_MEM_HI and DO_SET_MEM_LO. Not used yet.
Matti Hamalainen <ccr@tnsp.org>
parents: 1725
diff changeset
892 case DO_SET_MEM_LO:
f9128665a47e Implement operator types DO_SET_MEM_HI and DO_SET_MEM_LO. Not used yet.
Matti Hamalainen <ccr@tnsp.org>
parents: 1725
diff changeset
893 value = *src & 0x0f;
f9128665a47e Implement operator types DO_SET_MEM_HI and DO_SET_MEM_LO. Not used yet.
Matti Hamalainen <ccr@tnsp.org>
parents: 1725
diff changeset
894 break;
1668
1741717b1ae5 Big overhaul to the enc/dec operator system to be more flexible.
Matti Hamalainen <ccr@tnsp.org>
parents: 1660
diff changeset
895 }
1741717b1ae5 Big overhaul to the enc/dec operator system to be more flexible.
Matti Hamalainen <ccr@tnsp.org>
parents: 1660
diff changeset
896 switch (op->subject)
1741717b1ae5 Big overhaul to the enc/dec operator system to be more flexible.
Matti Hamalainen <ccr@tnsp.org>
parents: 1660
diff changeset
897 {
1741717b1ae5 Big overhaul to the enc/dec operator system to be more flexible.
Matti Hamalainen <ccr@tnsp.org>
parents: 1660
diff changeset
898 case DS_D020: img->d020 = value; break;
1741717b1ae5 Big overhaul to the enc/dec operator system to be more flexible.
Matti Hamalainen <ccr@tnsp.org>
parents: 1660
diff changeset
899 case DS_BGCOL:
1741717b1ae5 Big overhaul to the enc/dec operator system to be more flexible.
Matti Hamalainen <ccr@tnsp.org>
parents: 1660
diff changeset
900 case DS_D021: img->bgcolor = value; break;
1741717b1ae5 Big overhaul to the enc/dec operator system to be more flexible.
Matti Hamalainen <ccr@tnsp.org>
parents: 1660
diff changeset
901 case DS_D022: img->d022 = value; break;
1741717b1ae5 Big overhaul to the enc/dec operator system to be more flexible.
Matti Hamalainen <ccr@tnsp.org>
parents: 1660
diff changeset
902 case DS_D023: img->d023 = value; break;
1741717b1ae5 Big overhaul to the enc/dec operator system to be more flexible.
Matti Hamalainen <ccr@tnsp.org>
parents: 1660
diff changeset
903 case DS_D024: img->d024 = value; break;
1741717b1ae5 Big overhaul to the enc/dec operator system to be more flexible.
Matti Hamalainen <ccr@tnsp.org>
parents: 1660
diff changeset
904 }
1741717b1ae5 Big overhaul to the enc/dec operator system to be more flexible.
Matti Hamalainen <ccr@tnsp.org>
parents: 1660
diff changeset
905 break;
1741717b1ae5 Big overhaul to the enc/dec operator system to be more flexible.
Matti Hamalainen <ccr@tnsp.org>
parents: 1660
diff changeset
906
917
df3a74f230d9 Initial implementation of charmode support in lib64gfx.
Matti Hamalainen <ccr@tnsp.org>
parents: 916
diff changeset
907 default:
958
985225a93aeb Add error code parameter to dmError() and dmErrorVA().
Matti Hamalainen <ccr@tnsp.org>
parents: 946
diff changeset
908 return dmError(DMERR_INTERNAL,
1668
1741717b1ae5 Big overhaul to the enc/dec operator system to be more flexible.
Matti Hamalainen <ccr@tnsp.org>
parents: 1660
diff changeset
909 "Unhandled subject %d in "
958
985225a93aeb Add error code parameter to dmError() and dmErrorVA().
Matti Hamalainen <ccr@tnsp.org>
parents: 946
diff changeset
910 "op #%d, offs=%d ($%04x), bank=%d, size=%d ($%04x) @ %d ($%04x)\n",
1707
a0986cfd6f9d More consistently use DMGrowBuf in the lib64gfx APIs, and implement
Matti Hamalainen <ccr@tnsp.org>
parents: 1697
diff changeset
911 op->subject, i, op->offs, op->offs, op->bank, size, size, buf->len, buf->len);
917
df3a74f230d9 Initial implementation of charmode support in lib64gfx.
Matti Hamalainen <ccr@tnsp.org>
parents: 916
diff changeset
912 }
df3a74f230d9 Initial implementation of charmode support in lib64gfx.
Matti Hamalainen <ccr@tnsp.org>
parents: 916
diff changeset
913 break;
df3a74f230d9 Initial implementation of charmode support in lib64gfx.
Matti Hamalainen <ccr@tnsp.org>
parents: 916
diff changeset
914
1668
1741717b1ae5 Big overhaul to the enc/dec operator system to be more flexible.
Matti Hamalainen <ccr@tnsp.org>
parents: 1660
diff changeset
915 case DO_CHAR_CFG:
1741717b1ae5 Big overhaul to the enc/dec operator system to be more flexible.
Matti Hamalainen <ccr@tnsp.org>
parents: 1660
diff changeset
916 switch (op->subject)
917
df3a74f230d9 Initial implementation of charmode support in lib64gfx.
Matti Hamalainen <ccr@tnsp.org>
parents: 916
diff changeset
917 {
df3a74f230d9 Initial implementation of charmode support in lib64gfx.
Matti Hamalainen <ccr@tnsp.org>
parents: 916
diff changeset
918 case D64_CHCFG_SCREEN:
df3a74f230d9 Initial implementation of charmode support in lib64gfx.
Matti Hamalainen <ccr@tnsp.org>
parents: 916
diff changeset
919 break;
df3a74f230d9 Initial implementation of charmode support in lib64gfx.
Matti Hamalainen <ccr@tnsp.org>
parents: 916
diff changeset
920
df3a74f230d9 Initial implementation of charmode support in lib64gfx.
Matti Hamalainen <ccr@tnsp.org>
parents: 916
diff changeset
921 case D64_CHCFG_LINEAR:
1672
09adf5328510 Cleanup.
Matti Hamalainen <ccr@tnsp.org>
parents: 1668
diff changeset
922 for (int bank = 0; bank < img->nbanks; bank++)
917
df3a74f230d9 Initial implementation of charmode support in lib64gfx.
Matti Hamalainen <ccr@tnsp.org>
parents: 916
diff changeset
923 {
1482
df6dacb48970 Rename some struct members, and sanitize handling of DMC64Image allocation more.
Matti Hamalainen <ccr@tnsp.org>
parents: 1478
diff changeset
924 for (int offs = 0; offs < fmt->chHeight * fmt->chWidth; offs++)
1588
ca087c0cc9c4 Refactor the c64 format memory handling a bit for more flexibility.
Matti Hamalainen <ccr@tnsp.org>
parents: 1586
diff changeset
925 img->screen[bank].data[offs] = offs & 0xff;
917
df3a74f230d9 Initial implementation of charmode support in lib64gfx.
Matti Hamalainen <ccr@tnsp.org>
parents: 916
diff changeset
926 }
df3a74f230d9 Initial implementation of charmode support in lib64gfx.
Matti Hamalainen <ccr@tnsp.org>
parents: 916
diff changeset
927 break;
df3a74f230d9 Initial implementation of charmode support in lib64gfx.
Matti Hamalainen <ccr@tnsp.org>
parents: 916
diff changeset
928
df3a74f230d9 Initial implementation of charmode support in lib64gfx.
Matti Hamalainen <ccr@tnsp.org>
parents: 916
diff changeset
929 default:
958
985225a93aeb Add error code parameter to dmError() and dmErrorVA().
Matti Hamalainen <ccr@tnsp.org>
parents: 946
diff changeset
930 return dmError(DMERR_INTERNAL,
1668
1741717b1ae5 Big overhaul to the enc/dec operator system to be more flexible.
Matti Hamalainen <ccr@tnsp.org>
parents: 1660
diff changeset
931 "Unhandled DO_CHAR_CFG mode %d in ",
958
985225a93aeb Add error code parameter to dmError() and dmErrorVA().
Matti Hamalainen <ccr@tnsp.org>
parents: 946
diff changeset
932 "op #%d, bank=%d, size=%d ($%04x) @ %d ($%04x)\n",
1707
a0986cfd6f9d More consistently use DMGrowBuf in the lib64gfx APIs, and implement
Matti Hamalainen <ccr@tnsp.org>
parents: 1697
diff changeset
933 op->subject, i, op->bank, size, size, buf->len, buf->len);
917
df3a74f230d9 Initial implementation of charmode support in lib64gfx.
Matti Hamalainen <ccr@tnsp.org>
parents: 916
diff changeset
934 }
df3a74f230d9 Initial implementation of charmode support in lib64gfx.
Matti Hamalainen <ccr@tnsp.org>
parents: 916
diff changeset
935 break;
df3a74f230d9 Initial implementation of charmode support in lib64gfx.
Matti Hamalainen <ccr@tnsp.org>
parents: 916
diff changeset
936
1668
1741717b1ae5 Big overhaul to the enc/dec operator system to be more flexible.
Matti Hamalainen <ccr@tnsp.org>
parents: 1660
diff changeset
937 case DO_DEC_FUNC:
1482
df6dacb48970 Rename some struct members, and sanitize handling of DMC64Image allocation more.
Matti Hamalainen <ccr@tnsp.org>
parents: 1478
diff changeset
938 if (op->decFunction == NULL)
407
59244a7ae37f Move c64 utilities to the engine lib, as we benefit from a common framework.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
939 {
958
985225a93aeb Add error code parameter to dmError() and dmErrorVA().
Matti Hamalainen <ccr@tnsp.org>
parents: 946
diff changeset
940 return dmError(DMERR_INTERNAL,
985225a93aeb Add error code parameter to dmError() and dmErrorVA().
Matti Hamalainen <ccr@tnsp.org>
parents: 946
diff changeset
941 "Decode op is a function, but function ptr is NULL: "
510
43ea59887c69 Start work on making C64 formats encoding possible by changing DMDecodeOps
Matti Hamalainen <ccr@tnsp.org>
parents: 508
diff changeset
942 "op #%d, offs=%d ($%04x), bank=%d, size=%d ($%04x) @ %d ($%04x)\n",
1707
a0986cfd6f9d More consistently use DMGrowBuf in the lib64gfx APIs, and implement
Matti Hamalainen <ccr@tnsp.org>
parents: 1697
diff changeset
943 i, op->offs, op->offs, op->bank, size, size, buf->len, buf->len);
407
59244a7ae37f Move c64 utilities to the engine lib, as we benefit from a common framework.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
944 }
1707
a0986cfd6f9d More consistently use DMGrowBuf in the lib64gfx APIs, and implement
Matti Hamalainen <ccr@tnsp.org>
parents: 1697
diff changeset
945 if (!op->decFunction(img, op, buf, fmt))
407
59244a7ae37f Move c64 utilities to the engine lib, as we benefit from a common framework.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
946 {
958
985225a93aeb Add error code parameter to dmError() and dmErrorVA().
Matti Hamalainen <ccr@tnsp.org>
parents: 946
diff changeset
947 return dmError(DMERR_INTERNAL,
985225a93aeb Add error code parameter to dmError() and dmErrorVA().
Matti Hamalainen <ccr@tnsp.org>
parents: 946
diff changeset
948 "Decode op custom function failed: op #%d, "
510
43ea59887c69 Start work on making C64 formats encoding possible by changing DMDecodeOps
Matti Hamalainen <ccr@tnsp.org>
parents: 508
diff changeset
949 "offs=%d ($%04x), bank=%d, size=%d ($%04x) @ %d ($%04x)\n",
1707
a0986cfd6f9d More consistently use DMGrowBuf in the lib64gfx APIs, and implement
Matti Hamalainen <ccr@tnsp.org>
parents: 1697
diff changeset
950 i, op->offs, op->offs, op->bank, size, size, buf->len, buf->len);
407
59244a7ae37f Move c64 utilities to the engine lib, as we benefit from a common framework.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
951 }
59244a7ae37f Move c64 utilities to the engine lib, as we benefit from a common framework.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
952 break;
59244a7ae37f Move c64 utilities to the engine lib, as we benefit from a common framework.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
953 }
59244a7ae37f Move c64 utilities to the engine lib, as we benefit from a common framework.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
954 }
916
3985f596ece5 Cosmetics.
Matti Hamalainen <ccr@tnsp.org>
parents: 915
diff changeset
955
1647
948d6fda722d Add sanity check for interlaced formats: check that the interlace type flags are set.
Matti Hamalainen <ccr@tnsp.org>
parents: 1645
diff changeset
956 // Sanity check certain things ..
948d6fda722d Add sanity check for interlaced formats: check that the interlace type flags are set.
Matti Hamalainen <ccr@tnsp.org>
parents: 1645
diff changeset
957 if ((fmt->type & D64_FMT_ILACE) && img->laceType == D64_ILACE_NONE)
948d6fda722d Add sanity check for interlaced formats: check that the interlace type flags are set.
Matti Hamalainen <ccr@tnsp.org>
parents: 1645
diff changeset
958 {
948d6fda722d Add sanity check for interlaced formats: check that the interlace type flags are set.
Matti Hamalainen <ccr@tnsp.org>
parents: 1645
diff changeset
959 return dmError(DMERR_INTERNAL,
948d6fda722d Add sanity check for interlaced formats: check that the interlace type flags are set.
Matti Hamalainen <ccr@tnsp.org>
parents: 1645
diff changeset
960 "Format '%s' (%s) has interlace flag set, but interlace type is not set.\n",
948d6fda722d Add sanity check for interlaced formats: check that the interlace type flags are set.
Matti Hamalainen <ccr@tnsp.org>
parents: 1645
diff changeset
961 fmt->name, fmt->fext);
948d6fda722d Add sanity check for interlaced formats: check that the interlace type flags are set.
Matti Hamalainen <ccr@tnsp.org>
parents: 1645
diff changeset
962 }
948d6fda722d Add sanity check for interlaced formats: check that the interlace type flags are set.
Matti Hamalainen <ccr@tnsp.org>
parents: 1645
diff changeset
963
508
1ed5025c2538 Return DMLIB error values instead of arbitrary 0/negatives.
Matti Hamalainen <ccr@tnsp.org>
parents: 507
diff changeset
964 return DMERR_OK;
407
59244a7ae37f Move c64 utilities to the engine lib, as we benefit from a common framework.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
965 }
59244a7ae37f Move c64 utilities to the engine lib, as we benefit from a common framework.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
966
59244a7ae37f Move c64 utilities to the engine lib, as we benefit from a common framework.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
967
1499
32640e1934d5 Simplify some encoding bits.
Matti Hamalainen <ccr@tnsp.org>
parents: 1498
diff changeset
968 int dmC64EncodeGenericBMP(const BOOL allocate, DMGrowBuf *buf, const DMC64Image *img, const DMC64ImageFormat *fmt)
532
128a50feff07 Implement initial generic bitmap "encoding" function, that constructs
Matti Hamalainen <ccr@tnsp.org>
parents: 531
diff changeset
969 {
1365
60d7240e1a63 Remove hardcoded encoding/decoding operator counts from the structures, use
Matti Hamalainen <ccr@tnsp.org>
parents: 1364
diff changeset
970 int res = DMERR_OK;
532
128a50feff07 Implement initial generic bitmap "encoding" function, that constructs
Matti Hamalainen <ccr@tnsp.org>
parents: 531
diff changeset
971
1469
0046b4e1b35f Various fixes in bmp encoding.
Matti Hamalainen <ccr@tnsp.org>
parents: 1467
diff changeset
972 if (img == NULL || fmt == NULL)
532
128a50feff07 Implement initial generic bitmap "encoding" function, that constructs
Matti Hamalainen <ccr@tnsp.org>
parents: 531
diff changeset
973 return DMERR_NULLPTR;
128a50feff07 Implement initial generic bitmap "encoding" function, that constructs
Matti Hamalainen <ccr@tnsp.org>
parents: 531
diff changeset
974
1499
32640e1934d5 Simplify some encoding bits.
Matti Hamalainen <ccr@tnsp.org>
parents: 1498
diff changeset
975 // Allocate the output buffer if requested
32640e1934d5 Simplify some encoding bits.
Matti Hamalainen <ccr@tnsp.org>
parents: 1498
diff changeset
976 if (allocate && (res = dmGrowBufAlloc(buf, BUF_SIZE_INITIAL, BUF_SIZE_GROW)) != DMERR_OK)
532
128a50feff07 Implement initial generic bitmap "encoding" function, that constructs
Matti Hamalainen <ccr@tnsp.org>
parents: 531
diff changeset
977 {
1472
b9d3577d8290 Improve error handling and checking.
Matti Hamalainen <ccr@tnsp.org>
parents: 1471
diff changeset
978 dmError(res,
958
985225a93aeb Add error code parameter to dmError() and dmErrorVA().
Matti Hamalainen <ccr@tnsp.org>
parents: 946
diff changeset
979 "Could not allocate %d bytes of memory for C64 image encoding buffer.\n",
1465
88845f95e791 Change dmC64EncodeGenericBMP() to use DMGrowBuf, and make the necessary changes in gfxconv as well.
Matti Hamalainen <ccr@tnsp.org>
parents: 1463
diff changeset
980 fmt->size);
1447
de5f7e31a8bf Rename labels.
Matti Hamalainen <ccr@tnsp.org>
parents: 1443
diff changeset
981 goto err;
532
128a50feff07 Implement initial generic bitmap "encoding" function, that constructs
Matti Hamalainen <ccr@tnsp.org>
parents: 531
diff changeset
982 }
128a50feff07 Implement initial generic bitmap "encoding" function, that constructs
Matti Hamalainen <ccr@tnsp.org>
parents: 531
diff changeset
983
1697
1036b0dcccb5 Refactor DMGrowBuf so that there can be buffers that grow "backwards".
Matti Hamalainen <ccr@tnsp.org>
parents: 1672
diff changeset
984 if (buf->backwards)
1036b0dcccb5 Refactor DMGrowBuf so that there can be buffers that grow "backwards".
Matti Hamalainen <ccr@tnsp.org>
parents: 1672
diff changeset
985 {
1036b0dcccb5 Refactor DMGrowBuf so that there can be buffers that grow "backwards".
Matti Hamalainen <ccr@tnsp.org>
parents: 1672
diff changeset
986 dmError(DMERR_INVALID_DATA,
1036b0dcccb5 Refactor DMGrowBuf so that there can be buffers that grow "backwards".
Matti Hamalainen <ccr@tnsp.org>
parents: 1672
diff changeset
987 "Buffer specified for dmC64EncodeGenericBMP() is in backwards mode, which is not supported.\n");
1036b0dcccb5 Refactor DMGrowBuf so that there can be buffers that grow "backwards".
Matti Hamalainen <ccr@tnsp.org>
parents: 1672
diff changeset
988 goto err;
1036b0dcccb5 Refactor DMGrowBuf so that there can be buffers that grow "backwards".
Matti Hamalainen <ccr@tnsp.org>
parents: 1672
diff changeset
989 }
1506
4fd4e7a00db4 Fix handling of predefined DMGrowBuffer in dmC64EncodeGenericBMP().
Matti Hamalainen <ccr@tnsp.org>
parents: 1505
diff changeset
990
532
128a50feff07 Implement initial generic bitmap "encoding" function, that constructs
Matti Hamalainen <ccr@tnsp.org>
parents: 531
diff changeset
991 // Perform encoding
1365
60d7240e1a63 Remove hardcoded encoding/decoding operator counts from the structures, use
Matti Hamalainen <ccr@tnsp.org>
parents: 1364
diff changeset
992 for (int i = 0; i < D64_MAX_ENCDEC_OPS; i++)
532
128a50feff07 Implement initial generic bitmap "encoding" function, that constructs
Matti Hamalainen <ccr@tnsp.org>
parents: 531
diff changeset
993 {
1591
3cc7b2aadda3 Add inline helper function fmtGetEncDecOp() and use it.
Matti Hamalainen <ccr@tnsp.org>
parents: 1588
diff changeset
994 const DMC64EncDecOp *op = fmtGetEncDecOp(fmt, i);
1364
0d61895e1763 Cleanup.
Matti Hamalainen <ccr@tnsp.org>
parents: 1362
diff changeset
995 size_t size, chksize;
1600
e28e67358ff6 Fix some uninitialized variable warnings.
Matti Hamalainen <ccr@tnsp.org>
parents: 1597
diff changeset
996 const DMC64MemBlock *blk = NULL;
e28e67358ff6 Fix some uninitialized variable warnings.
Matti Hamalainen <ccr@tnsp.org>
parents: 1597
diff changeset
997 char *blkname = NULL;
1668
1741717b1ae5 Big overhaul to the enc/dec operator system to be more flexible.
Matti Hamalainen <ccr@tnsp.org>
parents: 1660
diff changeset
998 Uint8 value;
532
128a50feff07 Implement initial generic bitmap "encoding" function, that constructs
Matti Hamalainen <ccr@tnsp.org>
parents: 531
diff changeset
999
1365
60d7240e1a63 Remove hardcoded encoding/decoding operator counts from the structures, use
Matti Hamalainen <ccr@tnsp.org>
parents: 1364
diff changeset
1000 // Check for last operator
1668
1741717b1ae5 Big overhaul to the enc/dec operator system to be more flexible.
Matti Hamalainen <ccr@tnsp.org>
parents: 1660
diff changeset
1001 if (op->type == DO_LAST)
1365
60d7240e1a63 Remove hardcoded encoding/decoding operator counts from the structures, use
Matti Hamalainen <ccr@tnsp.org>
parents: 1364
diff changeset
1002 break;
60d7240e1a63 Remove hardcoded encoding/decoding operator counts from the structures, use
Matti Hamalainen <ccr@tnsp.org>
parents: 1364
diff changeset
1003
811
aebc2f8b2c2d Add some comments.
Matti Hamalainen <ccr@tnsp.org>
parents: 810
diff changeset
1004 // Check operation validity
1378
c465860e44ed Make c64 image bank allocation dynamic.
Matti Hamalainen <ccr@tnsp.org>
parents: 1377
diff changeset
1005 if ((res = dmC64SanityCheckEncDecOp(i, op, img)) != DMERR_OK)
1447
de5f7e31a8bf Rename labels.
Matti Hamalainen <ccr@tnsp.org>
parents: 1443
diff changeset
1006 goto err;
532
128a50feff07 Implement initial generic bitmap "encoding" function, that constructs
Matti Hamalainen <ccr@tnsp.org>
parents: 531
diff changeset
1007
811
aebc2f8b2c2d Add some comments.
Matti Hamalainen <ccr@tnsp.org>
parents: 810
diff changeset
1008 // Check size
931
2270d7f3af77 Refactor the DMC64Image handling to be more dynamic, and start
Matti Hamalainen <ccr@tnsp.org>
parents: 927
diff changeset
1009 if (!dmC64GetOpSize(op, fmt, &size))
2270d7f3af77 Refactor the DMC64Image handling to be more dynamic, and start
Matti Hamalainen <ccr@tnsp.org>
parents: 927
diff changeset
1010 {
958
985225a93aeb Add error code parameter to dmError() and dmErrorVA().
Matti Hamalainen <ccr@tnsp.org>
parents: 946
diff changeset
1011 res = dmError(DMERR_INVALID_DATA,
1511
62ede0de6ab0 Fix an error message, should be "Encode", not "Decode".
Matti Hamalainen <ccr@tnsp.org>
parents: 1510
diff changeset
1012 "Encode op SIZE out of bounds, op #%d type=%d, offs=%d ($%04x), "
931
2270d7f3af77 Refactor the DMC64Image handling to be more dynamic, and start
Matti Hamalainen <ccr@tnsp.org>
parents: 927
diff changeset
1013 "bank=%d, size=%d ($%04x) vs. allocated %d ($%04x)\n",
1707
a0986cfd6f9d More consistently use DMGrowBuf in the lib64gfx APIs, and implement
Matti Hamalainen <ccr@tnsp.org>
parents: 1697
diff changeset
1014 i, op->type, op->offs, op->offs, op->bank, size, size, buf->size, buf->size);
1447
de5f7e31a8bf Rename labels.
Matti Hamalainen <ccr@tnsp.org>
parents: 1443
diff changeset
1015 goto err;
931
2270d7f3af77 Refactor the DMC64Image handling to be more dynamic, and start
Matti Hamalainen <ccr@tnsp.org>
parents: 927
diff changeset
1016 }
532
128a50feff07 Implement initial generic bitmap "encoding" function, that constructs
Matti Hamalainen <ccr@tnsp.org>
parents: 531
diff changeset
1017
811
aebc2f8b2c2d Add some comments.
Matti Hamalainen <ccr@tnsp.org>
parents: 810
diff changeset
1018 // Do we need to reallocate some more space?
1697
1036b0dcccb5 Refactor DMGrowBuf so that there can be buffers that grow "backwards".
Matti Hamalainen <ccr@tnsp.org>
parents: 1672
diff changeset
1019 chksize = buf->offs + op->offs + size;
1465
88845f95e791 Change dmC64EncodeGenericBMP() to use DMGrowBuf, and make the necessary changes in gfxconv as well.
Matti Hamalainen <ccr@tnsp.org>
parents: 1463
diff changeset
1020 if (!dmGrowBufCheckGrow(buf, chksize))
532
128a50feff07 Implement initial generic bitmap "encoding" function, that constructs
Matti Hamalainen <ccr@tnsp.org>
parents: 531
diff changeset
1021 {
1465
88845f95e791 Change dmC64EncodeGenericBMP() to use DMGrowBuf, and make the necessary changes in gfxconv as well.
Matti Hamalainen <ccr@tnsp.org>
parents: 1463
diff changeset
1022 res = dmError(DMERR_MALLOC,
88845f95e791 Change dmC64EncodeGenericBMP() to use DMGrowBuf, and make the necessary changes in gfxconv as well.
Matti Hamalainen <ccr@tnsp.org>
parents: 1463
diff changeset
1023 "Could not re-allocate %d bytes of memory for C64 image encoding buffer.\n",
88845f95e791 Change dmC64EncodeGenericBMP() to use DMGrowBuf, and make the necessary changes in gfxconv as well.
Matti Hamalainen <ccr@tnsp.org>
parents: 1463
diff changeset
1024 chksize);
88845f95e791 Change dmC64EncodeGenericBMP() to use DMGrowBuf, and make the necessary changes in gfxconv as well.
Matti Hamalainen <ccr@tnsp.org>
parents: 1463
diff changeset
1025 goto err;
532
128a50feff07 Implement initial generic bitmap "encoding" function, that constructs
Matti Hamalainen <ccr@tnsp.org>
parents: 531
diff changeset
1026 }
128a50feff07 Implement initial generic bitmap "encoding" function, that constructs
Matti Hamalainen <ccr@tnsp.org>
parents: 531
diff changeset
1027
811
aebc2f8b2c2d Add some comments.
Matti Hamalainen <ccr@tnsp.org>
parents: 810
diff changeset
1028 // Perform operation
1697
1036b0dcccb5 Refactor DMGrowBuf so that there can be buffers that grow "backwards".
Matti Hamalainen <ccr@tnsp.org>
parents: 1672
diff changeset
1029 Uint8 *dst = buf->data + buf->offs + op->offs;
532
128a50feff07 Implement initial generic bitmap "encoding" function, that constructs
Matti Hamalainen <ccr@tnsp.org>
parents: 531
diff changeset
1030 switch (op->type)
128a50feff07 Implement initial generic bitmap "encoding" function, that constructs
Matti Hamalainen <ccr@tnsp.org>
parents: 531
diff changeset
1031 {
1668
1741717b1ae5 Big overhaul to the enc/dec operator system to be more flexible.
Matti Hamalainen <ccr@tnsp.org>
parents: 1660
diff changeset
1032 case DO_COPY:
1741717b1ae5 Big overhaul to the enc/dec operator system to be more flexible.
Matti Hamalainen <ccr@tnsp.org>
parents: 1660
diff changeset
1033 case DO_SET_MEM:
1741717b1ae5 Big overhaul to the enc/dec operator system to be more flexible.
Matti Hamalainen <ccr@tnsp.org>
parents: 1660
diff changeset
1034 case DO_SET_OP:
1741717b1ae5 Big overhaul to the enc/dec operator system to be more flexible.
Matti Hamalainen <ccr@tnsp.org>
parents: 1660
diff changeset
1035 switch (op->subject)
1373
fc5ee5b4b0e9 Improve handling of extra data.
Matti Hamalainen <ccr@tnsp.org>
parents: 1372
diff changeset
1036 {
1668
1741717b1ae5 Big overhaul to the enc/dec operator system to be more flexible.
Matti Hamalainen <ccr@tnsp.org>
parents: 1660
diff changeset
1037 case DS_COLOR_RAM:
1741717b1ae5 Big overhaul to the enc/dec operator system to be more flexible.
Matti Hamalainen <ccr@tnsp.org>
parents: 1660
diff changeset
1038 case DS_SCREEN_RAM:
1741717b1ae5 Big overhaul to the enc/dec operator system to be more flexible.
Matti Hamalainen <ccr@tnsp.org>
parents: 1660
diff changeset
1039 case DS_BITMAP_RAM:
1741717b1ae5 Big overhaul to the enc/dec operator system to be more flexible.
Matti Hamalainen <ccr@tnsp.org>
parents: 1660
diff changeset
1040 case DS_CHAR_DATA:
1741717b1ae5 Big overhaul to the enc/dec operator system to be more flexible.
Matti Hamalainen <ccr@tnsp.org>
parents: 1660
diff changeset
1041 case DS_EXTRA_DATA:
1741717b1ae5 Big overhaul to the enc/dec operator system to be more flexible.
Matti Hamalainen <ccr@tnsp.org>
parents: 1660
diff changeset
1042 dmC64GetOpMemBlockAndName(img, op->subject, op->bank, &blk, &blkname);
1741717b1ae5 Big overhaul to the enc/dec operator system to be more flexible.
Matti Hamalainen <ccr@tnsp.org>
parents: 1660
diff changeset
1043 switch (op->type)
1741717b1ae5 Big overhaul to the enc/dec operator system to be more flexible.
Matti Hamalainen <ccr@tnsp.org>
parents: 1660
diff changeset
1044 {
1741717b1ae5 Big overhaul to the enc/dec operator system to be more flexible.
Matti Hamalainen <ccr@tnsp.org>
parents: 1660
diff changeset
1045 case DO_COPY:
1707
a0986cfd6f9d More consistently use DMGrowBuf in the lib64gfx APIs, and implement
Matti Hamalainen <ccr@tnsp.org>
parents: 1697
diff changeset
1046 if (blk->data == NULL)
a0986cfd6f9d More consistently use DMGrowBuf in the lib64gfx APIs, and implement
Matti Hamalainen <ccr@tnsp.org>
parents: 1697
diff changeset
1047 {
a0986cfd6f9d More consistently use DMGrowBuf in the lib64gfx APIs, and implement
Matti Hamalainen <ccr@tnsp.org>
parents: 1697
diff changeset
1048 res = dmError(DMERR_NULLPTR,
a0986cfd6f9d More consistently use DMGrowBuf in the lib64gfx APIs, and implement
Matti Hamalainen <ccr@tnsp.org>
parents: 1697
diff changeset
1049 "'%s' block is NULL in "
a0986cfd6f9d More consistently use DMGrowBuf in the lib64gfx APIs, and implement
Matti Hamalainen <ccr@tnsp.org>
parents: 1697
diff changeset
1050 "op #%d, offs=%d ($%04x), bank=%d, size=%d ($%04x) @ %d ($%04x)\n",
a0986cfd6f9d More consistently use DMGrowBuf in the lib64gfx APIs, and implement
Matti Hamalainen <ccr@tnsp.org>
parents: 1697
diff changeset
1051 blkname, i, op->offs, op->offs, op->bank, size, size, buf->len, buf->len);
a0986cfd6f9d More consistently use DMGrowBuf in the lib64gfx APIs, and implement
Matti Hamalainen <ccr@tnsp.org>
parents: 1697
diff changeset
1052 goto err;
a0986cfd6f9d More consistently use DMGrowBuf in the lib64gfx APIs, and implement
Matti Hamalainen <ccr@tnsp.org>
parents: 1697
diff changeset
1053 }
a0986cfd6f9d More consistently use DMGrowBuf in the lib64gfx APIs, and implement
Matti Hamalainen <ccr@tnsp.org>
parents: 1697
diff changeset
1054 if (size > blk->size)
a0986cfd6f9d More consistently use DMGrowBuf in the lib64gfx APIs, and implement
Matti Hamalainen <ccr@tnsp.org>
parents: 1697
diff changeset
1055 {
a0986cfd6f9d More consistently use DMGrowBuf in the lib64gfx APIs, and implement
Matti Hamalainen <ccr@tnsp.org>
parents: 1697
diff changeset
1056 res = dmError(DMERR_INTERNAL,
a0986cfd6f9d More consistently use DMGrowBuf in the lib64gfx APIs, and implement
Matti Hamalainen <ccr@tnsp.org>
parents: 1697
diff changeset
1057 "'%s' size mismatch %d <> %d in "
a0986cfd6f9d More consistently use DMGrowBuf in the lib64gfx APIs, and implement
Matti Hamalainen <ccr@tnsp.org>
parents: 1697
diff changeset
1058 "op #%d, offs=%d ($%04x), bank=%d, size=%d ($%04x) @ %d ($%04x)\n",
a0986cfd6f9d More consistently use DMGrowBuf in the lib64gfx APIs, and implement
Matti Hamalainen <ccr@tnsp.org>
parents: 1697
diff changeset
1059 blkname, i, op->offs, op->offs, op->bank, size, size, buf->len, buf->len);
a0986cfd6f9d More consistently use DMGrowBuf in the lib64gfx APIs, and implement
Matti Hamalainen <ccr@tnsp.org>
parents: 1697
diff changeset
1060 goto err;
a0986cfd6f9d More consistently use DMGrowBuf in the lib64gfx APIs, and implement
Matti Hamalainen <ccr@tnsp.org>
parents: 1697
diff changeset
1061 }
1668
1741717b1ae5 Big overhaul to the enc/dec operator system to be more flexible.
Matti Hamalainen <ccr@tnsp.org>
parents: 1660
diff changeset
1062 memcpy(dst, blk->data, size);
1741717b1ae5 Big overhaul to the enc/dec operator system to be more flexible.
Matti Hamalainen <ccr@tnsp.org>
parents: 1660
diff changeset
1063 break;
1741717b1ae5 Big overhaul to the enc/dec operator system to be more flexible.
Matti Hamalainen <ccr@tnsp.org>
parents: 1660
diff changeset
1064
1741717b1ae5 Big overhaul to the enc/dec operator system to be more flexible.
Matti Hamalainen <ccr@tnsp.org>
parents: 1660
diff changeset
1065 case DO_SET_MEM:
1707
a0986cfd6f9d More consistently use DMGrowBuf in the lib64gfx APIs, and implement
Matti Hamalainen <ccr@tnsp.org>
parents: 1697
diff changeset
1066 // This operation makes no sense, so do nothing
a0986cfd6f9d More consistently use DMGrowBuf in the lib64gfx APIs, and implement
Matti Hamalainen <ccr@tnsp.org>
parents: 1697
diff changeset
1067 break;
917
df3a74f230d9 Initial implementation of charmode support in lib64gfx.
Matti Hamalainen <ccr@tnsp.org>
parents: 916
diff changeset
1068
1668
1741717b1ae5 Big overhaul to the enc/dec operator system to be more flexible.
Matti Hamalainen <ccr@tnsp.org>
parents: 1660
diff changeset
1069 case DO_SET_OP:
1741717b1ae5 Big overhaul to the enc/dec operator system to be more flexible.
Matti Hamalainen <ccr@tnsp.org>
parents: 1660
diff changeset
1070 memset(dst, op->offs, size);
1741717b1ae5 Big overhaul to the enc/dec operator system to be more flexible.
Matti Hamalainen <ccr@tnsp.org>
parents: 1660
diff changeset
1071 break;
1741717b1ae5 Big overhaul to the enc/dec operator system to be more flexible.
Matti Hamalainen <ccr@tnsp.org>
parents: 1660
diff changeset
1072 }
1741717b1ae5 Big overhaul to the enc/dec operator system to be more flexible.
Matti Hamalainen <ccr@tnsp.org>
parents: 1660
diff changeset
1073 break;
1741717b1ae5 Big overhaul to the enc/dec operator system to be more flexible.
Matti Hamalainen <ccr@tnsp.org>
parents: 1660
diff changeset
1074
1741717b1ae5 Big overhaul to the enc/dec operator system to be more flexible.
Matti Hamalainen <ccr@tnsp.org>
parents: 1660
diff changeset
1075 case DS_D020:
1741717b1ae5 Big overhaul to the enc/dec operator system to be more flexible.
Matti Hamalainen <ccr@tnsp.org>
parents: 1660
diff changeset
1076 case DS_BGCOL:
1741717b1ae5 Big overhaul to the enc/dec operator system to be more flexible.
Matti Hamalainen <ccr@tnsp.org>
parents: 1660
diff changeset
1077 case DS_D021:
1741717b1ae5 Big overhaul to the enc/dec operator system to be more flexible.
Matti Hamalainen <ccr@tnsp.org>
parents: 1660
diff changeset
1078 case DS_D022:
1741717b1ae5 Big overhaul to the enc/dec operator system to be more flexible.
Matti Hamalainen <ccr@tnsp.org>
parents: 1660
diff changeset
1079 case DS_D023:
1741717b1ae5 Big overhaul to the enc/dec operator system to be more flexible.
Matti Hamalainen <ccr@tnsp.org>
parents: 1660
diff changeset
1080 case DS_D024:
1741717b1ae5 Big overhaul to the enc/dec operator system to be more flexible.
Matti Hamalainen <ccr@tnsp.org>
parents: 1660
diff changeset
1081 switch (op->subject)
1741717b1ae5 Big overhaul to the enc/dec operator system to be more flexible.
Matti Hamalainen <ccr@tnsp.org>
parents: 1660
diff changeset
1082 {
1741717b1ae5 Big overhaul to the enc/dec operator system to be more flexible.
Matti Hamalainen <ccr@tnsp.org>
parents: 1660
diff changeset
1083 case DS_D020: value = img->d020; break;
1741717b1ae5 Big overhaul to the enc/dec operator system to be more flexible.
Matti Hamalainen <ccr@tnsp.org>
parents: 1660
diff changeset
1084 case DS_BGCOL:
1741717b1ae5 Big overhaul to the enc/dec operator system to be more flexible.
Matti Hamalainen <ccr@tnsp.org>
parents: 1660
diff changeset
1085 case DS_D021: value = img->bgcolor; break;
1741717b1ae5 Big overhaul to the enc/dec operator system to be more flexible.
Matti Hamalainen <ccr@tnsp.org>
parents: 1660
diff changeset
1086 case DS_D022: value = img->d022; break;
1741717b1ae5 Big overhaul to the enc/dec operator system to be more flexible.
Matti Hamalainen <ccr@tnsp.org>
parents: 1660
diff changeset
1087 case DS_D023: value = img->d023; break;
1741717b1ae5 Big overhaul to the enc/dec operator system to be more flexible.
Matti Hamalainen <ccr@tnsp.org>
parents: 1660
diff changeset
1088 case DS_D024: value = img->d024; break;
1741717b1ae5 Big overhaul to the enc/dec operator system to be more flexible.
Matti Hamalainen <ccr@tnsp.org>
parents: 1660
diff changeset
1089 }
1741717b1ae5 Big overhaul to the enc/dec operator system to be more flexible.
Matti Hamalainen <ccr@tnsp.org>
parents: 1660
diff changeset
1090 switch (op->type)
1741717b1ae5 Big overhaul to the enc/dec operator system to be more flexible.
Matti Hamalainen <ccr@tnsp.org>
parents: 1660
diff changeset
1091 {
1741717b1ae5 Big overhaul to the enc/dec operator system to be more flexible.
Matti Hamalainen <ccr@tnsp.org>
parents: 1660
diff changeset
1092 case DO_COPY:
1741717b1ae5 Big overhaul to the enc/dec operator system to be more flexible.
Matti Hamalainen <ccr@tnsp.org>
parents: 1660
diff changeset
1093 case DO_SET_MEM:
1741717b1ae5 Big overhaul to the enc/dec operator system to be more flexible.
Matti Hamalainen <ccr@tnsp.org>
parents: 1660
diff changeset
1094 *dst = value;
1741717b1ae5 Big overhaul to the enc/dec operator system to be more flexible.
Matti Hamalainen <ccr@tnsp.org>
parents: 1660
diff changeset
1095 break;
1741717b1ae5 Big overhaul to the enc/dec operator system to be more flexible.
Matti Hamalainen <ccr@tnsp.org>
parents: 1660
diff changeset
1096
1726
f9128665a47e Implement operator types DO_SET_MEM_HI and DO_SET_MEM_LO. Not used yet.
Matti Hamalainen <ccr@tnsp.org>
parents: 1725
diff changeset
1097 case DO_SET_MEM_HI:
f9128665a47e Implement operator types DO_SET_MEM_HI and DO_SET_MEM_LO. Not used yet.
Matti Hamalainen <ccr@tnsp.org>
parents: 1725
diff changeset
1098 *dst |= (value & 0x0f) << 4;
f9128665a47e Implement operator types DO_SET_MEM_HI and DO_SET_MEM_LO. Not used yet.
Matti Hamalainen <ccr@tnsp.org>
parents: 1725
diff changeset
1099 break;
f9128665a47e Implement operator types DO_SET_MEM_HI and DO_SET_MEM_LO. Not used yet.
Matti Hamalainen <ccr@tnsp.org>
parents: 1725
diff changeset
1100
f9128665a47e Implement operator types DO_SET_MEM_HI and DO_SET_MEM_LO. Not used yet.
Matti Hamalainen <ccr@tnsp.org>
parents: 1725
diff changeset
1101 case DO_SET_MEM_LO:
f9128665a47e Implement operator types DO_SET_MEM_HI and DO_SET_MEM_LO. Not used yet.
Matti Hamalainen <ccr@tnsp.org>
parents: 1725
diff changeset
1102 *dst |= value & 0x0f;
f9128665a47e Implement operator types DO_SET_MEM_HI and DO_SET_MEM_LO. Not used yet.
Matti Hamalainen <ccr@tnsp.org>
parents: 1725
diff changeset
1103 break;
f9128665a47e Implement operator types DO_SET_MEM_HI and DO_SET_MEM_LO. Not used yet.
Matti Hamalainen <ccr@tnsp.org>
parents: 1725
diff changeset
1104
1668
1741717b1ae5 Big overhaul to the enc/dec operator system to be more flexible.
Matti Hamalainen <ccr@tnsp.org>
parents: 1660
diff changeset
1105 case DO_SET_OP:
1707
a0986cfd6f9d More consistently use DMGrowBuf in the lib64gfx APIs, and implement
Matti Hamalainen <ccr@tnsp.org>
parents: 1697
diff changeset
1106 // Do nothing in this case
a0986cfd6f9d More consistently use DMGrowBuf in the lib64gfx APIs, and implement
Matti Hamalainen <ccr@tnsp.org>
parents: 1697
diff changeset
1107 break;
1668
1741717b1ae5 Big overhaul to the enc/dec operator system to be more flexible.
Matti Hamalainen <ccr@tnsp.org>
parents: 1660
diff changeset
1108 }
1741717b1ae5 Big overhaul to the enc/dec operator system to be more flexible.
Matti Hamalainen <ccr@tnsp.org>
parents: 1660
diff changeset
1109 break;
1741717b1ae5 Big overhaul to the enc/dec operator system to be more flexible.
Matti Hamalainen <ccr@tnsp.org>
parents: 1660
diff changeset
1110
917
df3a74f230d9 Initial implementation of charmode support in lib64gfx.
Matti Hamalainen <ccr@tnsp.org>
parents: 916
diff changeset
1111 default:
1668
1741717b1ae5 Big overhaul to the enc/dec operator system to be more flexible.
Matti Hamalainen <ccr@tnsp.org>
parents: 1660
diff changeset
1112 return dmError(DMERR_INTERNAL,
1741717b1ae5 Big overhaul to the enc/dec operator system to be more flexible.
Matti Hamalainen <ccr@tnsp.org>
parents: 1660
diff changeset
1113 "Unhandled subject %d in "
958
985225a93aeb Add error code parameter to dmError() and dmErrorVA().
Matti Hamalainen <ccr@tnsp.org>
parents: 946
diff changeset
1114 "op #%d, offs=%d ($%04x), bank=%d, size=%d ($%04x) @ %d ($%04x)\n",
1668
1741717b1ae5 Big overhaul to the enc/dec operator system to be more flexible.
Matti Hamalainen <ccr@tnsp.org>
parents: 1660
diff changeset
1115 op->subject, i, op->offs, op->offs, op->bank, size, size, buf->len, buf->len);
917
df3a74f230d9 Initial implementation of charmode support in lib64gfx.
Matti Hamalainen <ccr@tnsp.org>
parents: 916
diff changeset
1116 }
df3a74f230d9 Initial implementation of charmode support in lib64gfx.
Matti Hamalainen <ccr@tnsp.org>
parents: 916
diff changeset
1117 break;
df3a74f230d9 Initial implementation of charmode support in lib64gfx.
Matti Hamalainen <ccr@tnsp.org>
parents: 916
diff changeset
1118
1668
1741717b1ae5 Big overhaul to the enc/dec operator system to be more flexible.
Matti Hamalainen <ccr@tnsp.org>
parents: 1660
diff changeset
1119 case DO_ENC_FUNC:
1482
df6dacb48970 Rename some struct members, and sanitize handling of DMC64Image allocation more.
Matti Hamalainen <ccr@tnsp.org>
parents: 1478
diff changeset
1120 if (op->encFunction == NULL)
904
d3cd9f2a8ef1 Some dummy code for encfunctions.
Matti Hamalainen <ccr@tnsp.org>
parents: 903
diff changeset
1121 {
958
985225a93aeb Add error code parameter to dmError() and dmErrorVA().
Matti Hamalainen <ccr@tnsp.org>
parents: 946
diff changeset
1122 res = dmError(DMERR_INTERNAL,
985225a93aeb Add error code parameter to dmError() and dmErrorVA().
Matti Hamalainen <ccr@tnsp.org>
parents: 946
diff changeset
1123 "Encode op is a function, but function ptr is NULL: "
904
d3cd9f2a8ef1 Some dummy code for encfunctions.
Matti Hamalainen <ccr@tnsp.org>
parents: 903
diff changeset
1124 "op #%d, offs=%d ($%04x), bank=%d, size=%d ($%04x) @ %d ($%04x)\n",
1465
88845f95e791 Change dmC64EncodeGenericBMP() to use DMGrowBuf, and make the necessary changes in gfxconv as well.
Matti Hamalainen <ccr@tnsp.org>
parents: 1463
diff changeset
1125 i, op->offs, op->offs, op->bank, size, size, buf->len, buf->len);
1447
de5f7e31a8bf Rename labels.
Matti Hamalainen <ccr@tnsp.org>
parents: 1443
diff changeset
1126 goto err;
904
d3cd9f2a8ef1 Some dummy code for encfunctions.
Matti Hamalainen <ccr@tnsp.org>
parents: 903
diff changeset
1127 }
1486
bc13af8954d7 Add DMC64ImageFormat to C64 bitmap format encoding/decoding ops function parameters.
Matti Hamalainen <ccr@tnsp.org>
parents: 1485
diff changeset
1128 if (!op->encFunction(op, buf, img, fmt))
904
d3cd9f2a8ef1 Some dummy code for encfunctions.
Matti Hamalainen <ccr@tnsp.org>
parents: 903
diff changeset
1129 {
958
985225a93aeb Add error code parameter to dmError() and dmErrorVA().
Matti Hamalainen <ccr@tnsp.org>
parents: 946
diff changeset
1130 res = dmError(DMERR_INTERNAL,
985225a93aeb Add error code parameter to dmError() and dmErrorVA().
Matti Hamalainen <ccr@tnsp.org>
parents: 946
diff changeset
1131 "Encode op custom function failed: op #%d, "
904
d3cd9f2a8ef1 Some dummy code for encfunctions.
Matti Hamalainen <ccr@tnsp.org>
parents: 903
diff changeset
1132 "offs=%d ($%04x), bank=%d, size=%d ($%04x) @ %d ($%04x)\n",
1486
bc13af8954d7 Add DMC64ImageFormat to C64 bitmap format encoding/decoding ops function parameters.
Matti Hamalainen <ccr@tnsp.org>
parents: 1485
diff changeset
1133 i, op->offs, op->offs, op->bank, size, size, buf->len, buf->len);
bc13af8954d7 Add DMC64ImageFormat to C64 bitmap format encoding/decoding ops function parameters.
Matti Hamalainen <ccr@tnsp.org>
parents: 1485
diff changeset
1134 goto err;
904
d3cd9f2a8ef1 Some dummy code for encfunctions.
Matti Hamalainen <ccr@tnsp.org>
parents: 903
diff changeset
1135 }
532
128a50feff07 Implement initial generic bitmap "encoding" function, that constructs
Matti Hamalainen <ccr@tnsp.org>
parents: 531
diff changeset
1136 break;
128a50feff07 Implement initial generic bitmap "encoding" function, that constructs
Matti Hamalainen <ccr@tnsp.org>
parents: 531
diff changeset
1137 }
128a50feff07 Implement initial generic bitmap "encoding" function, that constructs
Matti Hamalainen <ccr@tnsp.org>
parents: 531
diff changeset
1138 }
128a50feff07 Implement initial generic bitmap "encoding" function, that constructs
Matti Hamalainen <ccr@tnsp.org>
parents: 531
diff changeset
1139
1448
50402c225ef4 Do not insert load address to the buffer beginning in dmC64EncodeGenericBMP().
Matti Hamalainen <ccr@tnsp.org>
parents: 1447
diff changeset
1140 res = DMERR_OK;
535
ab8d9696225c Add helper macros and use them to set the loading address while encoding.
Matti Hamalainen <ccr@tnsp.org>
parents: 534
diff changeset
1141
1447
de5f7e31a8bf Rename labels.
Matti Hamalainen <ccr@tnsp.org>
parents: 1443
diff changeset
1142 err:
532
128a50feff07 Implement initial generic bitmap "encoding" function, that constructs
Matti Hamalainen <ccr@tnsp.org>
parents: 531
diff changeset
1143 return res;
128a50feff07 Implement initial generic bitmap "encoding" function, that constructs
Matti Hamalainen <ccr@tnsp.org>
parents: 531
diff changeset
1144 }
128a50feff07 Implement initial generic bitmap "encoding" function, that constructs
Matti Hamalainen <ccr@tnsp.org>
parents: 531
diff changeset
1145
128a50feff07 Implement initial generic bitmap "encoding" function, that constructs
Matti Hamalainen <ccr@tnsp.org>
parents: 531
diff changeset
1146
530
5b37a2e427b7 Greatly simplify and also improve the multicolor/hires/lace bitmap->image
Matti Hamalainen <ccr@tnsp.org>
parents: 529
diff changeset
1147 // Convert a generic "C64" format bitmap in DMC64Image struct to
5b37a2e427b7 Greatly simplify and also improve the multicolor/hires/lace bitmap->image
Matti Hamalainen <ccr@tnsp.org>
parents: 529
diff changeset
1148 // a indexed/paletted bitmap image.
1375
f5368c13a872 Implement more flexible generic format decoding by separating the pixel
Matti Hamalainen <ccr@tnsp.org>
parents: 1373
diff changeset
1149 int dmC64ConvertGenericBMP2Image(DMImage *dst, const DMC64Image *src, const DMC64ImageFormat *fmt)
407
59244a7ae37f Move c64 utilities to the engine lib, as we benefit from a common framework.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1150 {
1375
f5368c13a872 Implement more flexible generic format decoding by separating the pixel
Matti Hamalainen <ccr@tnsp.org>
parents: 1373
diff changeset
1151 DMC64GetPixelFunc getPixel;
530
5b37a2e427b7 Greatly simplify and also improve the multicolor/hires/lace bitmap->image
Matti Hamalainen <ccr@tnsp.org>
parents: 529
diff changeset
1152
556
44d1e0d4acf3 Improve DMC64Image -> DMImage conversion facilities.
Matti Hamalainen <ccr@tnsp.org>
parents: 548
diff changeset
1153 // Sanity check arguments
44d1e0d4acf3 Improve DMC64Image -> DMImage conversion facilities.
Matti Hamalainen <ccr@tnsp.org>
parents: 548
diff changeset
1154 if (dst == NULL || src == NULL)
44d1e0d4acf3 Improve DMC64Image -> DMImage conversion facilities.
Matti Hamalainen <ccr@tnsp.org>
parents: 548
diff changeset
1155 return DMERR_NULLPTR;
44d1e0d4acf3 Improve DMC64Image -> DMImage conversion facilities.
Matti Hamalainen <ccr@tnsp.org>
parents: 548
diff changeset
1156
931
2270d7f3af77 Refactor the DMC64Image handling to be more dynamic, and start
Matti Hamalainen <ccr@tnsp.org>
parents: 927
diff changeset
1157 if (dst->width < src->width || dst->height < src->height)
1460
361cad3b8445 Improve error handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 1457
diff changeset
1158 {
361cad3b8445 Improve error handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 1457
diff changeset
1159 return dmError(DMERR_INVALID_DATA,
361cad3b8445 Improve error handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 1457
diff changeset
1160 "Invalid src vs. dst width/height %d x %d <-> %d x %d\n",
361cad3b8445 Improve error handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 1457
diff changeset
1161 src->width, src->height, dst->width, dst->height);
361cad3b8445 Improve error handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 1457
diff changeset
1162 }
556
44d1e0d4acf3 Improve DMC64Image -> DMImage conversion facilities.
Matti Hamalainen <ccr@tnsp.org>
parents: 548
diff changeset
1163
1167
848a88ce7a57 Use dmMemset().
Matti Hamalainen <ccr@tnsp.org>
parents: 1134
diff changeset
1164 dmMemset(dst->data, 0, dst->size);
931
2270d7f3af77 Refactor the DMC64Image handling to be more dynamic, and start
Matti Hamalainen <ccr@tnsp.org>
parents: 927
diff changeset
1165
1375
f5368c13a872 Implement more flexible generic format decoding by separating the pixel
Matti Hamalainen <ccr@tnsp.org>
parents: 1373
diff changeset
1166 // Check pixel getter function
f5368c13a872 Implement more flexible generic format decoding by separating the pixel
Matti Hamalainen <ccr@tnsp.org>
parents: 1373
diff changeset
1167 if (fmt->getPixel != NULL)
f5368c13a872 Implement more flexible generic format decoding by separating the pixel
Matti Hamalainen <ccr@tnsp.org>
parents: 1373
diff changeset
1168 getPixel = fmt->getPixel;
f5368c13a872 Implement more flexible generic format decoding by separating the pixel
Matti Hamalainen <ccr@tnsp.org>
parents: 1373
diff changeset
1169 else
1376
67ae449cf9e1 More work on making various FLI etc. format decoding more flexible.
Matti Hamalainen <ccr@tnsp.org>
parents: 1375
diff changeset
1170 getPixel = (fmt->type & D64_FMT_MC) ? fmtGetGenericMCPixel : fmtGetGenericSCPixel;
1375
f5368c13a872 Implement more flexible generic format decoding by separating the pixel
Matti Hamalainen <ccr@tnsp.org>
parents: 1373
diff changeset
1171
1362
7bc67ba68904 Better handling of resolution interlaced pictures.
Matti Hamalainen <ccr@tnsp.org>
parents: 1361
diff changeset
1172 // Resolution interlaced pics need to halve the source width
7bc67ba68904 Better handling of resolution interlaced pictures.
Matti Hamalainen <ccr@tnsp.org>
parents: 1361
diff changeset
1173 int rwidth = src->width;
7bc67ba68904 Better handling of resolution interlaced pictures.
Matti Hamalainen <ccr@tnsp.org>
parents: 1361
diff changeset
1174 if ((src->type & D64_FMT_ILACE) && src->laceType == D64_ILACE_RES)
7bc67ba68904 Better handling of resolution interlaced pictures.
Matti Hamalainen <ccr@tnsp.org>
parents: 1361
diff changeset
1175 rwidth /= 2;
7bc67ba68904 Better handling of resolution interlaced pictures.
Matti Hamalainen <ccr@tnsp.org>
parents: 1361
diff changeset
1176
931
2270d7f3af77 Refactor the DMC64Image handling to be more dynamic, and start
Matti Hamalainen <ccr@tnsp.org>
parents: 927
diff changeset
1177 // Perform conversion
1411
a9afb2ad39cb Cleanups.
Matti Hamalainen <ccr@tnsp.org>
parents: 1396
diff changeset
1178 Uint8 *dp = dst->data;
a9afb2ad39cb Cleanups.
Matti Hamalainen <ccr@tnsp.org>
parents: 1396
diff changeset
1179 for (int yc = 0; yc < src->height; yc++)
917
df3a74f230d9 Initial implementation of charmode support in lib64gfx.
Matti Hamalainen <ccr@tnsp.org>
parents: 916
diff changeset
1180 {
df3a74f230d9 Initial implementation of charmode support in lib64gfx.
Matti Hamalainen <ccr@tnsp.org>
parents: 916
diff changeset
1181 Uint8 *d = dp;
df3a74f230d9 Initial implementation of charmode support in lib64gfx.
Matti Hamalainen <ccr@tnsp.org>
parents: 916
diff changeset
1182 const int y = yc / 8, yb = yc & 7;
1482
df6dacb48970 Rename some struct members, and sanitize handling of DMC64Image allocation more.
Matti Hamalainen <ccr@tnsp.org>
parents: 1478
diff changeset
1183 const int scroffsy = y * src->chWidth;
917
df3a74f230d9 Initial implementation of charmode support in lib64gfx.
Matti Hamalainen <ccr@tnsp.org>
parents: 916
diff changeset
1184 int xc;
df3a74f230d9 Initial implementation of charmode support in lib64gfx.
Matti Hamalainen <ccr@tnsp.org>
parents: 916
diff changeset
1185
931
2270d7f3af77 Refactor the DMC64Image handling to be more dynamic, and start
Matti Hamalainen <ccr@tnsp.org>
parents: 927
diff changeset
1186 if (src->type & D64_FMT_CHAR)
917
df3a74f230d9 Initial implementation of charmode support in lib64gfx.
Matti Hamalainen <ccr@tnsp.org>
parents: 916
diff changeset
1187 {
931
2270d7f3af77 Refactor the DMC64Image handling to be more dynamic, and start
Matti Hamalainen <ccr@tnsp.org>
parents: 927
diff changeset
1188 // Charmode conversion
2270d7f3af77 Refactor the DMC64Image handling to be more dynamic, and start
Matti Hamalainen <ccr@tnsp.org>
parents: 927
diff changeset
1189 if ((src->type & D64_FMT_MC) == D64_FMT_HIRES)
917
df3a74f230d9 Initial implementation of charmode support in lib64gfx.
Matti Hamalainen <ccr@tnsp.org>
parents: 916
diff changeset
1190 // Hi-res charmap
1362
7bc67ba68904 Better handling of resolution interlaced pictures.
Matti Hamalainen <ccr@tnsp.org>
parents: 1361
diff changeset
1191 for (xc = 0; xc < rwidth; xc++)
917
df3a74f230d9 Initial implementation of charmode support in lib64gfx.
Matti Hamalainen <ccr@tnsp.org>
parents: 916
diff changeset
1192 {
df3a74f230d9 Initial implementation of charmode support in lib64gfx.
Matti Hamalainen <ccr@tnsp.org>
parents: 916
diff changeset
1193 const int x = xc / 8;
df3a74f230d9 Initial implementation of charmode support in lib64gfx.
Matti Hamalainen <ccr@tnsp.org>
parents: 916
diff changeset
1194 const int scroffs = scroffsy + x;
1588
ca087c0cc9c4 Refactor the c64 format memory handling a bit for more flexibility.
Matti Hamalainen <ccr@tnsp.org>
parents: 1586
diff changeset
1195 const int chr = src->screen[0].data[scroffs];
917
df3a74f230d9 Initial implementation of charmode support in lib64gfx.
Matti Hamalainen <ccr@tnsp.org>
parents: 916
diff changeset
1196 const int v = 7 - (xc & 7);
df3a74f230d9 Initial implementation of charmode support in lib64gfx.
Matti Hamalainen <ccr@tnsp.org>
parents: 916
diff changeset
1197
1588
ca087c0cc9c4 Refactor the c64 format memory handling a bit for more flexibility.
Matti Hamalainen <ccr@tnsp.org>
parents: 1586
diff changeset
1198 if ((src->charData[0].data[chr * C64_CHR_SIZE + yb] >> v) & 1)
ca087c0cc9c4 Refactor the c64 format memory handling a bit for more flexibility.
Matti Hamalainen <ccr@tnsp.org>
parents: 1586
diff changeset
1199 *d++ = src->color[0].data[scroffs];
917
df3a74f230d9 Initial implementation of charmode support in lib64gfx.
Matti Hamalainen <ccr@tnsp.org>
parents: 916
diff changeset
1200 else
df3a74f230d9 Initial implementation of charmode support in lib64gfx.
Matti Hamalainen <ccr@tnsp.org>
parents: 916
diff changeset
1201 *d++ = src->bgcolor;
df3a74f230d9 Initial implementation of charmode support in lib64gfx.
Matti Hamalainen <ccr@tnsp.org>
parents: 916
diff changeset
1202 }
931
2270d7f3af77 Refactor the DMC64Image handling to be more dynamic, and start
Matti Hamalainen <ccr@tnsp.org>
parents: 927
diff changeset
1203 else
917
df3a74f230d9 Initial implementation of charmode support in lib64gfx.
Matti Hamalainen <ccr@tnsp.org>
parents: 916
diff changeset
1204 // Multicolor variants
1362
7bc67ba68904 Better handling of resolution interlaced pictures.
Matti Hamalainen <ccr@tnsp.org>
parents: 1361
diff changeset
1205 for (xc = 0; xc < rwidth; xc++)
917
df3a74f230d9 Initial implementation of charmode support in lib64gfx.
Matti Hamalainen <ccr@tnsp.org>
parents: 916
diff changeset
1206 {
df3a74f230d9 Initial implementation of charmode support in lib64gfx.
Matti Hamalainen <ccr@tnsp.org>
parents: 916
diff changeset
1207 const int x = xc / 4;
df3a74f230d9 Initial implementation of charmode support in lib64gfx.
Matti Hamalainen <ccr@tnsp.org>
parents: 916
diff changeset
1208 const int scroffs = scroffsy + x;
1588
ca087c0cc9c4 Refactor the c64 format memory handling a bit for more flexibility.
Matti Hamalainen <ccr@tnsp.org>
parents: 1586
diff changeset
1209 const int chr = src->screen[0].data[scroffs];
ca087c0cc9c4 Refactor the c64 format memory handling a bit for more flexibility.
Matti Hamalainen <ccr@tnsp.org>
parents: 1586
diff changeset
1210 const int col = src->color[0].data[scroffs] & 15;
925
23b14d62bf67 Cosmetics.
Matti Hamalainen <ccr@tnsp.org>
parents: 924
diff changeset
1211
944
c62bb4028cf0 Implement multicolor / standard switching support based on color ram value's
Matti Hamalainen <ccr@tnsp.org>
parents: 943
diff changeset
1212 if (col & 8)
917
df3a74f230d9 Initial implementation of charmode support in lib64gfx.
Matti Hamalainen <ccr@tnsp.org>
parents: 916
diff changeset
1213 {
944
c62bb4028cf0 Implement multicolor / standard switching support based on color ram value's
Matti Hamalainen <ccr@tnsp.org>
parents: 943
diff changeset
1214 const int v = 6 - ((xc * 2) & 6);
1588
ca087c0cc9c4 Refactor the c64 format memory handling a bit for more flexibility.
Matti Hamalainen <ccr@tnsp.org>
parents: 1586
diff changeset
1215 switch ((src->charData[0].data[chr * C64_CHR_SIZE + yb] >> v) & 3)
944
c62bb4028cf0 Implement multicolor / standard switching support based on color ram value's
Matti Hamalainen <ccr@tnsp.org>
parents: 943
diff changeset
1216 {
c62bb4028cf0 Implement multicolor / standard switching support based on color ram value's
Matti Hamalainen <ccr@tnsp.org>
parents: 943
diff changeset
1217 case 0: *d++ = src->bgcolor; break;
c62bb4028cf0 Implement multicolor / standard switching support based on color ram value's
Matti Hamalainen <ccr@tnsp.org>
parents: 943
diff changeset
1218 case 1: *d++ = src->d022; break;
c62bb4028cf0 Implement multicolor / standard switching support based on color ram value's
Matti Hamalainen <ccr@tnsp.org>
parents: 943
diff changeset
1219 case 2: *d++ = src->d023; break;
c62bb4028cf0 Implement multicolor / standard switching support based on color ram value's
Matti Hamalainen <ccr@tnsp.org>
parents: 943
diff changeset
1220 case 3: *d++ = col;
c62bb4028cf0 Implement multicolor / standard switching support based on color ram value's
Matti Hamalainen <ccr@tnsp.org>
parents: 943
diff changeset
1221 }
917
df3a74f230d9 Initial implementation of charmode support in lib64gfx.
Matti Hamalainen <ccr@tnsp.org>
parents: 916
diff changeset
1222 }
944
c62bb4028cf0 Implement multicolor / standard switching support based on color ram value's
Matti Hamalainen <ccr@tnsp.org>
parents: 943
diff changeset
1223 else
c62bb4028cf0 Implement multicolor / standard switching support based on color ram value's
Matti Hamalainen <ccr@tnsp.org>
parents: 943
diff changeset
1224 {
c62bb4028cf0 Implement multicolor / standard switching support based on color ram value's
Matti Hamalainen <ccr@tnsp.org>
parents: 943
diff changeset
1225 const int v = 7 - (xc & 7);
1588
ca087c0cc9c4 Refactor the c64 format memory handling a bit for more flexibility.
Matti Hamalainen <ccr@tnsp.org>
parents: 1586
diff changeset
1226 if ((src->charData[0].data[chr * C64_CHR_SIZE + yb] >> v) & 1)
ca087c0cc9c4 Refactor the c64 format memory handling a bit for more flexibility.
Matti Hamalainen <ccr@tnsp.org>
parents: 1586
diff changeset
1227 *d++ = src->color[0].data[scroffs];
944
c62bb4028cf0 Implement multicolor / standard switching support based on color ram value's
Matti Hamalainen <ccr@tnsp.org>
parents: 943
diff changeset
1228 else
c62bb4028cf0 Implement multicolor / standard switching support based on color ram value's
Matti Hamalainen <ccr@tnsp.org>
parents: 943
diff changeset
1229 *d++ = src->bgcolor;
c62bb4028cf0 Implement multicolor / standard switching support based on color ram value's
Matti Hamalainen <ccr@tnsp.org>
parents: 943
diff changeset
1230 }
917
df3a74f230d9 Initial implementation of charmode support in lib64gfx.
Matti Hamalainen <ccr@tnsp.org>
parents: 916
diff changeset
1231 }
df3a74f230d9 Initial implementation of charmode support in lib64gfx.
Matti Hamalainen <ccr@tnsp.org>
parents: 916
diff changeset
1232 }
931
2270d7f3af77 Refactor the DMC64Image handling to be more dynamic, and start
Matti Hamalainen <ccr@tnsp.org>
parents: 927
diff changeset
1233 else
2270d7f3af77 Refactor the DMC64Image handling to be more dynamic, and start
Matti Hamalainen <ccr@tnsp.org>
parents: 927
diff changeset
1234 {
2270d7f3af77 Refactor the DMC64Image handling to be more dynamic, and start
Matti Hamalainen <ccr@tnsp.org>
parents: 927
diff changeset
1235 // Perform generic BITMAP conversion
1482
df6dacb48970 Rename some struct members, and sanitize handling of DMC64Image allocation more.
Matti Hamalainen <ccr@tnsp.org>
parents: 1478
diff changeset
1236 const int bmoffsy = y * src->chWidth * 8 + yb;
407
59244a7ae37f Move c64 utilities to the engine lib, as we benefit from a common framework.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1237
931
2270d7f3af77 Refactor the DMC64Image handling to be more dynamic, and start
Matti Hamalainen <ccr@tnsp.org>
parents: 927
diff changeset
1238 if ((src->type & D64_FMT_MC) == D64_FMT_HIRES)
811
aebc2f8b2c2d Add some comments.
Matti Hamalainen <ccr@tnsp.org>
parents: 810
diff changeset
1239 // Hi-res bitmap
1362
7bc67ba68904 Better handling of resolution interlaced pictures.
Matti Hamalainen <ccr@tnsp.org>
parents: 1361
diff changeset
1240 for (xc = 0; xc < rwidth; xc++)
530
5b37a2e427b7 Greatly simplify and also improve the multicolor/hires/lace bitmap->image
Matti Hamalainen <ccr@tnsp.org>
parents: 529
diff changeset
1241 {
5b37a2e427b7 Greatly simplify and also improve the multicolor/hires/lace bitmap->image
Matti Hamalainen <ccr@tnsp.org>
parents: 529
diff changeset
1242 const int x = xc / 8;
5b37a2e427b7 Greatly simplify and also improve the multicolor/hires/lace bitmap->image
Matti Hamalainen <ccr@tnsp.org>
parents: 529
diff changeset
1243 const int scroffs = scroffsy + x;
940
ff18d2511843 Remove the doubleMC madness completely. Should be replaced with x/y aspect
Matti Hamalainen <ccr@tnsp.org>
parents: 939
diff changeset
1244 const int bmoffs = bmoffsy + (x * 8);
1375
f5368c13a872 Implement more flexible generic format decoding by separating the pixel
Matti Hamalainen <ccr@tnsp.org>
parents: 1373
diff changeset
1245 const int vshift = 7 - (xc & 7);
530
5b37a2e427b7 Greatly simplify and also improve the multicolor/hires/lace bitmap->image
Matti Hamalainen <ccr@tnsp.org>
parents: 529
diff changeset
1246
1387
14d79e4d82cf Oops, 100L. Had forgotten to change singlecolor mode handling pixel getter
Matti Hamalainen <ccr@tnsp.org>
parents: 1385
diff changeset
1247 *d++ = getPixel(src, bmoffs, scroffs, vshift, 0, yc);
530
5b37a2e427b7 Greatly simplify and also improve the multicolor/hires/lace bitmap->image
Matti Hamalainen <ccr@tnsp.org>
parents: 529
diff changeset
1248 }
931
2270d7f3af77 Refactor the DMC64Image handling to be more dynamic, and start
Matti Hamalainen <ccr@tnsp.org>
parents: 927
diff changeset
1249 else
2270d7f3af77 Refactor the DMC64Image handling to be more dynamic, and start
Matti Hamalainen <ccr@tnsp.org>
parents: 927
diff changeset
1250 // Multicolor bitmap and variants
1362
7bc67ba68904 Better handling of resolution interlaced pictures.
Matti Hamalainen <ccr@tnsp.org>
parents: 1361
diff changeset
1251 for (xc = 0; xc < rwidth; xc++)
529
1bce06b5026f Combine conversion of interlaced and normal multicolor images to one function.
Matti Hamalainen <ccr@tnsp.org>
parents: 528
diff changeset
1252 {
901
f532262f90b1 Actually fix commit 16aa5955dfb5.
Matti Hamalainen <ccr@tnsp.org>
parents: 857
diff changeset
1253 const int x = xc / 4;
f532262f90b1 Actually fix commit 16aa5955dfb5.
Matti Hamalainen <ccr@tnsp.org>
parents: 857
diff changeset
1254 const int scroffs = scroffsy + x;
940
ff18d2511843 Remove the doubleMC madness completely. Should be replaced with x/y aspect
Matti Hamalainen <ccr@tnsp.org>
parents: 939
diff changeset
1255 const int bmoffs = bmoffsy + (x * 8);
1375
f5368c13a872 Implement more flexible generic format decoding by separating the pixel
Matti Hamalainen <ccr@tnsp.org>
parents: 1373
diff changeset
1256 const int vshift = 6 - ((xc * 2) & 6);
530
5b37a2e427b7 Greatly simplify and also improve the multicolor/hires/lace bitmap->image
Matti Hamalainen <ccr@tnsp.org>
parents: 529
diff changeset
1257
5b37a2e427b7 Greatly simplify and also improve the multicolor/hires/lace bitmap->image
Matti Hamalainen <ccr@tnsp.org>
parents: 529
diff changeset
1258 if (src->type & D64_FMT_ILACE)
5b37a2e427b7 Greatly simplify and also improve the multicolor/hires/lace bitmap->image
Matti Hamalainen <ccr@tnsp.org>
parents: 529
diff changeset
1259 {
1362
7bc67ba68904 Better handling of resolution interlaced pictures.
Matti Hamalainen <ccr@tnsp.org>
parents: 1361
diff changeset
1260 switch (src->laceType)
7bc67ba68904 Better handling of resolution interlaced pictures.
Matti Hamalainen <ccr@tnsp.org>
parents: 1361
diff changeset
1261 {
7bc67ba68904 Better handling of resolution interlaced pictures.
Matti Hamalainen <ccr@tnsp.org>
parents: 1361
diff changeset
1262 case D64_ILACE_RES:
1376
67ae449cf9e1 More work on making various FLI etc. format decoding more flexible.
Matti Hamalainen <ccr@tnsp.org>
parents: 1375
diff changeset
1263 *d++ = getPixel(src, bmoffs, scroffs, vshift, 0, yc);
67ae449cf9e1 More work on making various FLI etc. format decoding more flexible.
Matti Hamalainen <ccr@tnsp.org>
parents: 1375
diff changeset
1264 *d++ = getPixel(src, bmoffs, scroffs, vshift, 1, yc);
1362
7bc67ba68904 Better handling of resolution interlaced pictures.
Matti Hamalainen <ccr@tnsp.org>
parents: 1361
diff changeset
1265 break;
1366
d4387509a363 Return DMERR_NOT_SUPPORTED for decoding color-interlaced images, for now
Matti Hamalainen <ccr@tnsp.org>
parents: 1365
diff changeset
1266
d4387509a363 Return DMERR_NOT_SUPPORTED for decoding color-interlaced images, for now
Matti Hamalainen <ccr@tnsp.org>
parents: 1365
diff changeset
1267 default:
d4387509a363 Return DMERR_NOT_SUPPORTED for decoding color-interlaced images, for now
Matti Hamalainen <ccr@tnsp.org>
parents: 1365
diff changeset
1268 return DMERR_NOT_SUPPORTED;
1362
7bc67ba68904 Better handling of resolution interlaced pictures.
Matti Hamalainen <ccr@tnsp.org>
parents: 1361
diff changeset
1269 }
530
5b37a2e427b7 Greatly simplify and also improve the multicolor/hires/lace bitmap->image
Matti Hamalainen <ccr@tnsp.org>
parents: 529
diff changeset
1270 }
5b37a2e427b7 Greatly simplify and also improve the multicolor/hires/lace bitmap->image
Matti Hamalainen <ccr@tnsp.org>
parents: 529
diff changeset
1271 else
5b37a2e427b7 Greatly simplify and also improve the multicolor/hires/lace bitmap->image
Matti Hamalainen <ccr@tnsp.org>
parents: 529
diff changeset
1272 {
1376
67ae449cf9e1 More work on making various FLI etc. format decoding more flexible.
Matti Hamalainen <ccr@tnsp.org>
parents: 1375
diff changeset
1273 *d++ = getPixel(src, bmoffs, scroffs, vshift, 0, yc);
530
5b37a2e427b7 Greatly simplify and also improve the multicolor/hires/lace bitmap->image
Matti Hamalainen <ccr@tnsp.org>
parents: 529
diff changeset
1274 }
529
1bce06b5026f Combine conversion of interlaced and normal multicolor images to one function.
Matti Hamalainen <ccr@tnsp.org>
parents: 528
diff changeset
1275 }
407
59244a7ae37f Move c64 utilities to the engine lib, as we benefit from a common framework.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1276 }
530
5b37a2e427b7 Greatly simplify and also improve the multicolor/hires/lace bitmap->image
Matti Hamalainen <ccr@tnsp.org>
parents: 529
diff changeset
1277 dp += dst->pitch;
407
59244a7ae37f Move c64 utilities to the engine lib, as we benefit from a common framework.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1278 }
59244a7ae37f Move c64 utilities to the engine lib, as we benefit from a common framework.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1279
508
1ed5025c2538 Return DMLIB error values instead of arbitrary 0/negatives.
Matti Hamalainen <ccr@tnsp.org>
parents: 507
diff changeset
1280 return DMERR_OK;
407
59244a7ae37f Move c64 utilities to the engine lib, as we benefit from a common framework.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1281 }
59244a7ae37f Move c64 utilities to the engine lib, as we benefit from a common framework.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1282
59244a7ae37f Move c64 utilities to the engine lib, as we benefit from a common framework.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1283
940
ff18d2511843 Remove the doubleMC madness completely. Should be replaced with x/y aspect
Matti Hamalainen <ccr@tnsp.org>
parents: 939
diff changeset
1284 int dmC64ConvertBMP2Image(DMImage **pdst, const DMC64Image *src, const DMC64ImageFormat *fmt)
556
44d1e0d4acf3 Improve DMC64Image -> DMImage conversion facilities.
Matti Hamalainen <ccr@tnsp.org>
parents: 548
diff changeset
1285 {
940
ff18d2511843 Remove the doubleMC madness completely. Should be replaced with x/y aspect
Matti Hamalainen <ccr@tnsp.org>
parents: 939
diff changeset
1286 int res;
556
44d1e0d4acf3 Improve DMC64Image -> DMImage conversion facilities.
Matti Hamalainen <ccr@tnsp.org>
parents: 548
diff changeset
1287 DMImage *dst;
44d1e0d4acf3 Improve DMC64Image -> DMImage conversion facilities.
Matti Hamalainen <ccr@tnsp.org>
parents: 548
diff changeset
1288
44d1e0d4acf3 Improve DMC64Image -> DMImage conversion facilities.
Matti Hamalainen <ccr@tnsp.org>
parents: 548
diff changeset
1289 if (pdst == NULL || src == NULL)
44d1e0d4acf3 Improve DMC64Image -> DMImage conversion facilities.
Matti Hamalainen <ccr@tnsp.org>
parents: 548
diff changeset
1290 return DMERR_NULLPTR;
44d1e0d4acf3 Improve DMC64Image -> DMImage conversion facilities.
Matti Hamalainen <ccr@tnsp.org>
parents: 548
diff changeset
1291
44d1e0d4acf3 Improve DMC64Image -> DMImage conversion facilities.
Matti Hamalainen <ccr@tnsp.org>
parents: 548
diff changeset
1292 // Allocate image structure
1289
Matti Hamalainen <ccr@tnsp.org>
parents: 1235
diff changeset
1293 if ((*pdst = dst = dmImageAlloc(src->width, src->height, DM_IFMT_PALETTE, -1)) == NULL)
556
44d1e0d4acf3 Improve DMC64Image -> DMImage conversion facilities.
Matti Hamalainen <ccr@tnsp.org>
parents: 548
diff changeset
1294 return DMERR_MALLOC;
44d1e0d4acf3 Improve DMC64Image -> DMImage conversion facilities.
Matti Hamalainen <ccr@tnsp.org>
parents: 548
diff changeset
1295
1426
4c7b456d7f0b Rename global dmC64Palette to dmDefaultC64Palette.
Matti Hamalainen <ccr@tnsp.org>
parents: 1425
diff changeset
1296 // Set partial palette information
556
44d1e0d4acf3 Improve DMC64Image -> DMImage conversion facilities.
Matti Hamalainen <ccr@tnsp.org>
parents: 548
diff changeset
1297 dst->ncolors = C64_NCOLORS;
44d1e0d4acf3 Improve DMC64Image -> DMImage conversion facilities.
Matti Hamalainen <ccr@tnsp.org>
parents: 548
diff changeset
1298 dst->constpal = TRUE;
1730
881a3fc421d8 Use the default C64 palette whenever we need it, but make it possible to override it.
Matti Hamalainen <ccr@tnsp.org>
parents: 1728
diff changeset
1299 dst->pal = dmDefaultC64Palette;
556
44d1e0d4acf3 Improve DMC64Image -> DMImage conversion facilities.
Matti Hamalainen <ccr@tnsp.org>
parents: 548
diff changeset
1300
44d1e0d4acf3 Improve DMC64Image -> DMImage conversion facilities.
Matti Hamalainen <ccr@tnsp.org>
parents: 548
diff changeset
1301 // Convert
44d1e0d4acf3 Improve DMC64Image -> DMImage conversion facilities.
Matti Hamalainen <ccr@tnsp.org>
parents: 548
diff changeset
1302 if (fmt->convertFrom != NULL)
1375
f5368c13a872 Implement more flexible generic format decoding by separating the pixel
Matti Hamalainen <ccr@tnsp.org>
parents: 1373
diff changeset
1303 res = fmt->convertFrom(dst, src, fmt);
556
44d1e0d4acf3 Improve DMC64Image -> DMImage conversion facilities.
Matti Hamalainen <ccr@tnsp.org>
parents: 548
diff changeset
1304 else
1375
f5368c13a872 Implement more flexible generic format decoding by separating the pixel
Matti Hamalainen <ccr@tnsp.org>
parents: 1373
diff changeset
1305 res = dmC64ConvertGenericBMP2Image(dst, src, fmt);
556
44d1e0d4acf3 Improve DMC64Image -> DMImage conversion facilities.
Matti Hamalainen <ccr@tnsp.org>
parents: 548
diff changeset
1306
44d1e0d4acf3 Improve DMC64Image -> DMImage conversion facilities.
Matti Hamalainen <ccr@tnsp.org>
parents: 548
diff changeset
1307 return res;
44d1e0d4acf3 Improve DMC64Image -> DMImage conversion facilities.
Matti Hamalainen <ccr@tnsp.org>
parents: 548
diff changeset
1308 }
44d1e0d4acf3 Improve DMC64Image -> DMImage conversion facilities.
Matti Hamalainen <ccr@tnsp.org>
parents: 548
diff changeset
1309
407
59244a7ae37f Move c64 utilities to the engine lib, as we benefit from a common framework.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1310
1707
a0986cfd6f9d More consistently use DMGrowBuf in the lib64gfx APIs, and implement
Matti Hamalainen <ccr@tnsp.org>
parents: 1697
diff changeset
1311 int dmC64DecodeBMP(DMC64Image **img, const DMGrowBuf *buf,
419
936bc27a79d6 Modularize some functions to lib64gfx, fix bitmap -> image conversion,
Matti Hamalainen <ccr@tnsp.org>
parents: 410
diff changeset
1312 const size_t probeOffs, const size_t loadOffs,
516
6f141f760c54 Constify.
Matti Hamalainen <ccr@tnsp.org>
parents: 515
diff changeset
1313 const DMC64ImageFormat **fmt, const DMC64ImageFormat *forced)
419
936bc27a79d6 Modularize some functions to lib64gfx, fix bitmap -> image conversion,
Matti Hamalainen <ccr@tnsp.org>
parents: 410
diff changeset
1314 {
1707
a0986cfd6f9d More consistently use DMGrowBuf in the lib64gfx APIs, and implement
Matti Hamalainen <ccr@tnsp.org>
parents: 1697
diff changeset
1315 DMGrowBuf tmp;
a0986cfd6f9d More consistently use DMGrowBuf in the lib64gfx APIs, and implement
Matti Hamalainen <ccr@tnsp.org>
parents: 1697
diff changeset
1316
a0986cfd6f9d More consistently use DMGrowBuf in the lib64gfx APIs, and implement
Matti Hamalainen <ccr@tnsp.org>
parents: 1697
diff changeset
1317 if (img == NULL || buf == NULL)
931
2270d7f3af77 Refactor the DMC64Image handling to be more dynamic, and start
Matti Hamalainen <ccr@tnsp.org>
parents: 927
diff changeset
1318 return DMERR_NULLPTR;
2270d7f3af77 Refactor the DMC64Image handling to be more dynamic, and start
Matti Hamalainen <ccr@tnsp.org>
parents: 927
diff changeset
1319
419
936bc27a79d6 Modularize some functions to lib64gfx, fix bitmap -> image conversion,
Matti Hamalainen <ccr@tnsp.org>
parents: 410
diff changeset
1320 // Check for forced format
936bc27a79d6 Modularize some functions to lib64gfx, fix bitmap -> image conversion,
Matti Hamalainen <ccr@tnsp.org>
parents: 410
diff changeset
1321 if (forced != NULL)
936bc27a79d6 Modularize some functions to lib64gfx, fix bitmap -> image conversion,
Matti Hamalainen <ccr@tnsp.org>
parents: 410
diff changeset
1322 *fmt = forced;
936bc27a79d6 Modularize some functions to lib64gfx, fix bitmap -> image conversion,
Matti Hamalainen <ccr@tnsp.org>
parents: 410
diff changeset
1323 else
936bc27a79d6 Modularize some functions to lib64gfx, fix bitmap -> image conversion,
Matti Hamalainen <ccr@tnsp.org>
parents: 410
diff changeset
1324 {
936bc27a79d6 Modularize some functions to lib64gfx, fix bitmap -> image conversion,
Matti Hamalainen <ccr@tnsp.org>
parents: 410
diff changeset
1325 // Nope, perform a generic probe
1707
a0986cfd6f9d More consistently use DMGrowBuf in the lib64gfx APIs, and implement
Matti Hamalainen <ccr@tnsp.org>
parents: 1697
diff changeset
1326 if (probeOffs >= buf->len)
1460
361cad3b8445 Improve error handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 1457
diff changeset
1327 return DMERR_OUT_OF_DATA;
419
936bc27a79d6 Modularize some functions to lib64gfx, fix bitmap -> image conversion,
Matti Hamalainen <ccr@tnsp.org>
parents: 410
diff changeset
1328
1707
a0986cfd6f9d More consistently use DMGrowBuf in the lib64gfx APIs, and implement
Matti Hamalainen <ccr@tnsp.org>
parents: 1697
diff changeset
1329 dmGrowBufCreateFromOffs(&tmp, buf, probeOffs);
a0986cfd6f9d More consistently use DMGrowBuf in the lib64gfx APIs, and implement
Matti Hamalainen <ccr@tnsp.org>
parents: 1697
diff changeset
1330 if (dmC64ProbeBMP(tmp.data, tmp.len, fmt) == DM_PROBE_SCORE_FALSE)
1460
361cad3b8445 Improve error handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 1457
diff changeset
1331 return DMERR_NOT_SUPPORTED;
419
936bc27a79d6 Modularize some functions to lib64gfx, fix bitmap -> image conversion,
Matti Hamalainen <ccr@tnsp.org>
parents: 410
diff changeset
1332 }
936bc27a79d6 Modularize some functions to lib64gfx, fix bitmap -> image conversion,
Matti Hamalainen <ccr@tnsp.org>
parents: 410
diff changeset
1333
1710
1f0fac3af8e3 Use buf->len instead of tmp.len, as it might not be initialized.
Matti Hamalainen <ccr@tnsp.org>
parents: 1707
diff changeset
1334 if (loadOffs >= buf->len)
931
2270d7f3af77 Refactor the DMC64Image handling to be more dynamic, and start
Matti Hamalainen <ccr@tnsp.org>
parents: 927
diff changeset
1335 return DMERR_INVALID_ARGS;
2270d7f3af77 Refactor the DMC64Image handling to be more dynamic, and start
Matti Hamalainen <ccr@tnsp.org>
parents: 927
diff changeset
1336
2270d7f3af77 Refactor the DMC64Image handling to be more dynamic, and start
Matti Hamalainen <ccr@tnsp.org>
parents: 927
diff changeset
1337 if (*fmt == NULL)
1548
20cd589366d7 Check C64 bitmap format flags in encode/decode functions.
Matti Hamalainen <ccr@tnsp.org>
parents: 1542
diff changeset
1338 return DMERR_NOT_SUPPORTED;
20cd589366d7 Check C64 bitmap format flags in encode/decode functions.
Matti Hamalainen <ccr@tnsp.org>
parents: 1542
diff changeset
1339
1707
a0986cfd6f9d More consistently use DMGrowBuf in the lib64gfx APIs, and implement
Matti Hamalainen <ccr@tnsp.org>
parents: 1697
diff changeset
1340 // Format supports only reading?
1548
20cd589366d7 Check C64 bitmap format flags in encode/decode functions.
Matti Hamalainen <ccr@tnsp.org>
parents: 1542
diff changeset
1341 if (((*fmt)->flags & DM_FMT_RD) == 0)
20cd589366d7 Check C64 bitmap format flags in encode/decode functions.
Matti Hamalainen <ccr@tnsp.org>
parents: 1542
diff changeset
1342 return DMERR_NOT_SUPPORTED;
931
2270d7f3af77 Refactor the DMC64Image handling to be more dynamic, and start
Matti Hamalainen <ccr@tnsp.org>
parents: 927
diff changeset
1343
2270d7f3af77 Refactor the DMC64Image handling to be more dynamic, and start
Matti Hamalainen <ccr@tnsp.org>
parents: 927
diff changeset
1344 // Allocate memory
1378
c465860e44ed Make c64 image bank allocation dynamic.
Matti Hamalainen <ccr@tnsp.org>
parents: 1377
diff changeset
1345 if ((*img = dmC64ImageAlloc(*fmt)) == NULL)
931
2270d7f3af77 Refactor the DMC64Image handling to be more dynamic, and start
Matti Hamalainen <ccr@tnsp.org>
parents: 927
diff changeset
1346 return DMERR_MALLOC;
419
936bc27a79d6 Modularize some functions to lib64gfx, fix bitmap -> image conversion,
Matti Hamalainen <ccr@tnsp.org>
parents: 410
diff changeset
1347
1707
a0986cfd6f9d More consistently use DMGrowBuf in the lib64gfx APIs, and implement
Matti Hamalainen <ccr@tnsp.org>
parents: 1697
diff changeset
1348 dmGrowBufCreateFromOffs(&tmp, buf, loadOffs);
a0986cfd6f9d More consistently use DMGrowBuf in the lib64gfx APIs, and implement
Matti Hamalainen <ccr@tnsp.org>
parents: 1697
diff changeset
1349
419
936bc27a79d6 Modularize some functions to lib64gfx, fix bitmap -> image conversion,
Matti Hamalainen <ccr@tnsp.org>
parents: 410
diff changeset
1350 // Decode the bitmap to memory layout
936bc27a79d6 Modularize some functions to lib64gfx, fix bitmap -> image conversion,
Matti Hamalainen <ccr@tnsp.org>
parents: 410
diff changeset
1351 if ((*fmt)->decode != NULL)
1707
a0986cfd6f9d More consistently use DMGrowBuf in the lib64gfx APIs, and implement
Matti Hamalainen <ccr@tnsp.org>
parents: 1697
diff changeset
1352 return (*fmt)->decode(*img, &tmp, *fmt);
419
936bc27a79d6 Modularize some functions to lib64gfx, fix bitmap -> image conversion,
Matti Hamalainen <ccr@tnsp.org>
parents: 410
diff changeset
1353 else
1707
a0986cfd6f9d More consistently use DMGrowBuf in the lib64gfx APIs, and implement
Matti Hamalainen <ccr@tnsp.org>
parents: 1697
diff changeset
1354 return dmC64DecodeGenericBMP(*img, &tmp, *fmt);
419
936bc27a79d6 Modularize some functions to lib64gfx, fix bitmap -> image conversion,
Matti Hamalainen <ccr@tnsp.org>
parents: 410
diff changeset
1355 }
1467
32203356c652 Add some new functions that are mostly just stubs and not working tho.
Matti Hamalainen <ccr@tnsp.org>
parents: 1466
diff changeset
1356
32203356c652 Add some new functions that are mostly just stubs and not working tho.
Matti Hamalainen <ccr@tnsp.org>
parents: 1466
diff changeset
1357
32203356c652 Add some new functions that are mostly just stubs and not working tho.
Matti Hamalainen <ccr@tnsp.org>
parents: 1466
diff changeset
1358 // Convert a generic bitmap image to DMC64Image
32203356c652 Add some new functions that are mostly just stubs and not working tho.
Matti Hamalainen <ccr@tnsp.org>
parents: 1466
diff changeset
1359 int dmC64ConvertGenericImage2BMP(DMC64Image *dst, const DMImage *src, const DMC64ImageFormat *fmt)
32203356c652 Add some new functions that are mostly just stubs and not working tho.
Matti Hamalainen <ccr@tnsp.org>
parents: 1466
diff changeset
1360 {
32203356c652 Add some new functions that are mostly just stubs and not working tho.
Matti Hamalainen <ccr@tnsp.org>
parents: 1466
diff changeset
1361 if (dst == NULL || src == NULL || fmt == NULL)
32203356c652 Add some new functions that are mostly just stubs and not working tho.
Matti Hamalainen <ccr@tnsp.org>
parents: 1466
diff changeset
1362 return DMERR_NULLPTR;
32203356c652 Add some new functions that are mostly just stubs and not working tho.
Matti Hamalainen <ccr@tnsp.org>
parents: 1466
diff changeset
1363
32203356c652 Add some new functions that are mostly just stubs and not working tho.
Matti Hamalainen <ccr@tnsp.org>
parents: 1466
diff changeset
1364 return DMERR_OK;
32203356c652 Add some new functions that are mostly just stubs and not working tho.
Matti Hamalainen <ccr@tnsp.org>
parents: 1466
diff changeset
1365 }
32203356c652 Add some new functions that are mostly just stubs and not working tho.
Matti Hamalainen <ccr@tnsp.org>
parents: 1466
diff changeset
1366
32203356c652 Add some new functions that are mostly just stubs and not working tho.
Matti Hamalainen <ccr@tnsp.org>
parents: 1466
diff changeset
1367
32203356c652 Add some new functions that are mostly just stubs and not working tho.
Matti Hamalainen <ccr@tnsp.org>
parents: 1466
diff changeset
1368 int dmC64ConvertImage2BMP(DMC64Image **pdst, const DMImage *src, const DMC64ImageFormat *fmt)
32203356c652 Add some new functions that are mostly just stubs and not working tho.
Matti Hamalainen <ccr@tnsp.org>
parents: 1466
diff changeset
1369 {
32203356c652 Add some new functions that are mostly just stubs and not working tho.
Matti Hamalainen <ccr@tnsp.org>
parents: 1466
diff changeset
1370 int res;
32203356c652 Add some new functions that are mostly just stubs and not working tho.
Matti Hamalainen <ccr@tnsp.org>
parents: 1466
diff changeset
1371 DMC64Image *dst;
32203356c652 Add some new functions that are mostly just stubs and not working tho.
Matti Hamalainen <ccr@tnsp.org>
parents: 1466
diff changeset
1372
32203356c652 Add some new functions that are mostly just stubs and not working tho.
Matti Hamalainen <ccr@tnsp.org>
parents: 1466
diff changeset
1373 if (pdst == NULL || src == NULL)
32203356c652 Add some new functions that are mostly just stubs and not working tho.
Matti Hamalainen <ccr@tnsp.org>
parents: 1466
diff changeset
1374 return DMERR_NULLPTR;
32203356c652 Add some new functions that are mostly just stubs and not working tho.
Matti Hamalainen <ccr@tnsp.org>
parents: 1466
diff changeset
1375
32203356c652 Add some new functions that are mostly just stubs and not working tho.
Matti Hamalainen <ccr@tnsp.org>
parents: 1466
diff changeset
1376 // Allocate the basic C64 bitmap image structure
32203356c652 Add some new functions that are mostly just stubs and not working tho.
Matti Hamalainen <ccr@tnsp.org>
parents: 1466
diff changeset
1377 if ((*pdst = dst = dmC64ImageAlloc(fmt)) == NULL)
32203356c652 Add some new functions that are mostly just stubs and not working tho.
Matti Hamalainen <ccr@tnsp.org>
parents: 1466
diff changeset
1378 return DMERR_MALLOC;
32203356c652 Add some new functions that are mostly just stubs and not working tho.
Matti Hamalainen <ccr@tnsp.org>
parents: 1466
diff changeset
1379
32203356c652 Add some new functions that are mostly just stubs and not working tho.
Matti Hamalainen <ccr@tnsp.org>
parents: 1466
diff changeset
1380 // Convert
32203356c652 Add some new functions that are mostly just stubs and not working tho.
Matti Hamalainen <ccr@tnsp.org>
parents: 1466
diff changeset
1381 if (fmt->convertTo != NULL)
32203356c652 Add some new functions that are mostly just stubs and not working tho.
Matti Hamalainen <ccr@tnsp.org>
parents: 1466
diff changeset
1382 res = fmt->convertTo(dst, src, fmt);
32203356c652 Add some new functions that are mostly just stubs and not working tho.
Matti Hamalainen <ccr@tnsp.org>
parents: 1466
diff changeset
1383 else
32203356c652 Add some new functions that are mostly just stubs and not working tho.
Matti Hamalainen <ccr@tnsp.org>
parents: 1466
diff changeset
1384 res = dmC64ConvertGenericImage2BMP(dst, src, fmt);
32203356c652 Add some new functions that are mostly just stubs and not working tho.
Matti Hamalainen <ccr@tnsp.org>
parents: 1466
diff changeset
1385
32203356c652 Add some new functions that are mostly just stubs and not working tho.
Matti Hamalainen <ccr@tnsp.org>
parents: 1466
diff changeset
1386 return res;
32203356c652 Add some new functions that are mostly just stubs and not working tho.
Matti Hamalainen <ccr@tnsp.org>
parents: 1466
diff changeset
1387 }
32203356c652 Add some new functions that are mostly just stubs and not working tho.
Matti Hamalainen <ccr@tnsp.org>
parents: 1466
diff changeset
1388
32203356c652 Add some new functions that are mostly just stubs and not working tho.
Matti Hamalainen <ccr@tnsp.org>
parents: 1466
diff changeset
1389
32203356c652 Add some new functions that are mostly just stubs and not working tho.
Matti Hamalainen <ccr@tnsp.org>
parents: 1466
diff changeset
1390 int dmC64EncodeBMP(DMGrowBuf *buf, const DMC64Image *img, const DMC64ImageFormat *fmt)
32203356c652 Add some new functions that are mostly just stubs and not working tho.
Matti Hamalainen <ccr@tnsp.org>
parents: 1466
diff changeset
1391 {
32203356c652 Add some new functions that are mostly just stubs and not working tho.
Matti Hamalainen <ccr@tnsp.org>
parents: 1466
diff changeset
1392 int res;
32203356c652 Add some new functions that are mostly just stubs and not working tho.
Matti Hamalainen <ccr@tnsp.org>
parents: 1466
diff changeset
1393
1580
72f809e6eb3c Add NULL check for growbuf pointer.
Matti Hamalainen <ccr@tnsp.org>
parents: 1573
diff changeset
1394 if (buf == NULL || img == NULL || fmt == NULL)
1467
32203356c652 Add some new functions that are mostly just stubs and not working tho.
Matti Hamalainen <ccr@tnsp.org>
parents: 1466
diff changeset
1395 return DMERR_NULLPTR;
32203356c652 Add some new functions that are mostly just stubs and not working tho.
Matti Hamalainen <ccr@tnsp.org>
parents: 1466
diff changeset
1396
1548
20cd589366d7 Check C64 bitmap format flags in encode/decode functions.
Matti Hamalainen <ccr@tnsp.org>
parents: 1542
diff changeset
1397 if ((fmt->flags & DM_FMT_WR) == 0)
20cd589366d7 Check C64 bitmap format flags in encode/decode functions.
Matti Hamalainen <ccr@tnsp.org>
parents: 1542
diff changeset
1398 return DMERR_NOT_SUPPORTED;
20cd589366d7 Check C64 bitmap format flags in encode/decode functions.
Matti Hamalainen <ccr@tnsp.org>
parents: 1542
diff changeset
1399
1499
32640e1934d5 Simplify some encoding bits.
Matti Hamalainen <ccr@tnsp.org>
parents: 1498
diff changeset
1400 // Allocate a buffer
32640e1934d5 Simplify some encoding bits.
Matti Hamalainen <ccr@tnsp.org>
parents: 1498
diff changeset
1401 if ((res = dmGrowBufAlloc(buf, BUF_SIZE_INITIAL, BUF_SIZE_GROW)) != DMERR_OK)
32640e1934d5 Simplify some encoding bits.
Matti Hamalainen <ccr@tnsp.org>
parents: 1498
diff changeset
1402 goto err;
32640e1934d5 Simplify some encoding bits.
Matti Hamalainen <ccr@tnsp.org>
parents: 1498
diff changeset
1403
32640e1934d5 Simplify some encoding bits.
Matti Hamalainen <ccr@tnsp.org>
parents: 1498
diff changeset
1404 // Add the loading address
32640e1934d5 Simplify some encoding bits.
Matti Hamalainen <ccr@tnsp.org>
parents: 1498
diff changeset
1405 if (!dmGrowBufPutU8(buf, DM_GET_ADDR_LO(fmt->addr)) ||
32640e1934d5 Simplify some encoding bits.
Matti Hamalainen <ccr@tnsp.org>
parents: 1498
diff changeset
1406 !dmGrowBufPutU8(buf, DM_GET_ADDR_HI(fmt->addr)))
32640e1934d5 Simplify some encoding bits.
Matti Hamalainen <ccr@tnsp.org>
parents: 1498
diff changeset
1407 goto err;
32640e1934d5 Simplify some encoding bits.
Matti Hamalainen <ccr@tnsp.org>
parents: 1498
diff changeset
1408
1467
32203356c652 Add some new functions that are mostly just stubs and not working tho.
Matti Hamalainen <ccr@tnsp.org>
parents: 1466
diff changeset
1409 // Attempt to encode the image to a buffer
32203356c652 Add some new functions that are mostly just stubs and not working tho.
Matti Hamalainen <ccr@tnsp.org>
parents: 1466
diff changeset
1410 if (fmt->encode != NULL)
32203356c652 Add some new functions that are mostly just stubs and not working tho.
Matti Hamalainen <ccr@tnsp.org>
parents: 1466
diff changeset
1411 res = fmt->encode(buf, img, fmt);
32203356c652 Add some new functions that are mostly just stubs and not working tho.
Matti Hamalainen <ccr@tnsp.org>
parents: 1466
diff changeset
1412 else
1499
32640e1934d5 Simplify some encoding bits.
Matti Hamalainen <ccr@tnsp.org>
parents: 1498
diff changeset
1413 res = dmC64EncodeGenericBMP(FALSE, buf, img, fmt);
1467
32203356c652 Add some new functions that are mostly just stubs and not working tho.
Matti Hamalainen <ccr@tnsp.org>
parents: 1466
diff changeset
1414
32203356c652 Add some new functions that are mostly just stubs and not working tho.
Matti Hamalainen <ccr@tnsp.org>
parents: 1466
diff changeset
1415 if (res != DMERR_OK)
32203356c652 Add some new functions that are mostly just stubs and not working tho.
Matti Hamalainen <ccr@tnsp.org>
parents: 1466
diff changeset
1416 goto err;
32203356c652 Add some new functions that are mostly just stubs and not working tho.
Matti Hamalainen <ccr@tnsp.org>
parents: 1466
diff changeset
1417
1469
0046b4e1b35f Various fixes in bmp encoding.
Matti Hamalainen <ccr@tnsp.org>
parents: 1467
diff changeset
1418 return DMERR_OK;
1467
32203356c652 Add some new functions that are mostly just stubs and not working tho.
Matti Hamalainen <ccr@tnsp.org>
parents: 1466
diff changeset
1419
32203356c652 Add some new functions that are mostly just stubs and not working tho.
Matti Hamalainen <ccr@tnsp.org>
parents: 1466
diff changeset
1420 err:
32203356c652 Add some new functions that are mostly just stubs and not working tho.
Matti Hamalainen <ccr@tnsp.org>
parents: 1466
diff changeset
1421 dmGrowBufFree(buf);
32203356c652 Add some new functions that are mostly just stubs and not working tho.
Matti Hamalainen <ccr@tnsp.org>
parents: 1466
diff changeset
1422 return res;
32203356c652 Add some new functions that are mostly just stubs and not working tho.
Matti Hamalainen <ccr@tnsp.org>
parents: 1466
diff changeset
1423 }