changeset 1592:91d1bb571fca

Implement common encdec ops lists for sharing oplists between formats that use the exact same ops.
author Matti Hamalainen <ccr@tnsp.org>
date Mon, 14 May 2018 06:36:18 +0300
parents 3cc7b2aadda3
children a77876a07425
files tools/lib64fmts.c tools/lib64gfx.h
diffstat 2 files changed, 118 insertions(+), 123 deletions(-) [+]
line wrap: on
line diff
--- a/tools/lib64fmts.c	Mon May 14 05:53:22 2018 +0300
+++ b/tools/lib64fmts.c	Mon May 14 06:36:18 2018 +0300
@@ -517,7 +517,8 @@
 
 
 //
-// Array with data for supported formats
+// Helper macros for defining screen ram layouts
+// common for FLI type foramts
 //
 #define DEF_SCREEN_RAM(start, oindex, bindex, osize) { DT_SCREEN_RAM, (start) + ((osize) * (oindex)), (bindex), 0, NULL, NULL }
 #define DEF_SCREEN_RAMS_8(start, sindex, osize) \
@@ -531,6 +532,71 @@
     DEF_SCREEN_RAM((start), 7, (sindex + 7), (osize))
 
 
+
+//
+// Many formats actually share memory layout, and there are packed and
+// unpacked versions of several formats. We'll reuse these here through
+// this common formats ops array, referred from dmC64ImageFormats[]
+//
+const DMC64EncDecOpList dmC64CommonFormatOps[] =
+{
+        { // #0: Koala Paint type memory layout
+            { DT_BITMAP_RAM,   0x0000, 0,  0, NULL, NULL },
+            { DT_SCREEN_RAM,   0x1f40, 0,  0, NULL, NULL },
+            { DT_COLOR_RAM,    0x2328, 0,  0, NULL, NULL },
+            { DT_COLOR_REG,    0x2710, 0,  DC_BGCOL, NULL, NULL },
+            { DT_LAST,         0,      0,  0, NULL, NULL },
+        },
+
+        { // #1: Amica Paint, Run Paint, etc. layout
+            { DT_BITMAP_RAM,   0x0000, 0,  0, NULL, NULL },
+            { DT_SCREEN_RAM,   0x1f40, 0,  0, NULL, NULL },
+            { DT_COLOR_RAM,    0x2328, 0,  0, NULL, NULL },
+            { DT_COLOR_REG,    0x2710, 0,  DC_BGCOL, NULL, NULL },
+            { DT_LAST,         0,      0,  0, NULL, NULL },
+        },
+
+        { // #2: Art Studio etc. Hires
+            { DT_BITMAP_RAM,   0x0000, 0,  0, NULL, NULL },
+            { DT_SCREEN_RAM,   0x1f40, 0,  0, NULL, NULL },
+            { DT_LAST,         0,      0,  0, NULL, NULL },
+        },
+
+        { // #3: FunPaint II
+            DEF_SCREEN_RAMS_8( 0x0000, 0,  0x400),
+            { DT_BITMAP_RAM,   0x2000, 0,  0, NULL, NULL },
+            { DT_EXTRA_DATA,   0x3f40, 0,  100, NULL, NULL },
+            { DT_COLOR_RAM,    0x4000, 0,  0, NULL, NULL },
+            DEF_SCREEN_RAMS_8( 0x43e8, 8,  0x400),
+            { DT_BITMAP_RAM,   0x63e8, 1,  0, NULL, NULL },
+            { DT_EXTRA_DATA,   0x8328, 1,  100, NULL, NULL },
+            { DT_LAST,         0,      0,  0, NULL, NULL },
+        },
+
+        { // #4: DrazPaint 1.x & 2
+            { DT_COLOR_RAM,    0x0000, 0,  0, NULL, NULL },
+            { DT_BITMAP_RAM,   0x0800, 0,  0, NULL, NULL },
+            { DT_SCREEN_RAM,   0x0400, 0,  0, NULL, NULL },
+            { DT_COLOR_REG,    0x2740, 0,  DC_BGCOL, NULL, NULL },
+            { DT_LAST,         0,      0,  0, NULL, NULL },
+        },
+
+        { // #5: DrazLace 1.0
+            { DT_COLOR_RAM,    0x0000, 0,  0, NULL, NULL },
+            { DT_BITMAP_RAM,   0x0800, 0,  0, NULL, NULL },
+            { DT_SCREEN_RAM,   0x0400, 0,  0, NULL, NULL },
+            { DT_COLOR_REG,    0x2740, 0,  DC_BGCOL, NULL, NULL },
+            { DT_BITMAP_RAM,   0x2800, 1,  0, NULL, NULL },
+            { DT_DEC_FUNCTION, 0x2742, 0,  1, fmtDrazLaceGetLaceType, NULL },
+            { DT_ENC_FUNCTION, 0x2742, 0,  1, NULL, fmtDrazLaceSetLaceType },
+            { DT_LAST,         0,      0,  0, NULL, NULL },
+        },
+};
+
+
+//
+// Array with data for supported formats
+//
 const DMC64ImageFormat dmC64ImageFormats[] =
 {
     {
@@ -541,13 +607,7 @@
         fmtDecodeDrazPaintPacked, fmtEncodeDrazPaintPacked,
         NULL, NULL,
         NULL,
-        {
-            { DT_COLOR_RAM,    0x0000, 0,  0, NULL, NULL },
-            { DT_BITMAP_RAM,   0x0800, 0,  0, NULL, NULL },
-            { DT_SCREEN_RAM,   0x0400, 0,  0, NULL, NULL },
-            { DT_COLOR_REG,    0x2740, 0,  DC_BGCOL, NULL, NULL },
-            { DT_LAST,         0,      0,  0, NULL, NULL },
-        }
+        { }, &dmC64CommonFormatOps[4]
     },
 
     {
@@ -558,13 +618,7 @@
         NULL, NULL,
         NULL, NULL,
         NULL,
-        {
-            { DT_COLOR_RAM,    0x0000, 0,  0, NULL, NULL },
-            { DT_BITMAP_RAM,   0x0800, 0,  0, NULL, NULL },
-            { DT_SCREEN_RAM,   0x0400, 0,  0, NULL, NULL },
-            { DT_COLOR_REG,    0x2740, 0,  DC_BGCOL, NULL, NULL },
-            { DT_LAST,         0,      0,  0, NULL, NULL },
-        }
+        { }, &dmC64CommonFormatOps[4]
     },
 
     {
@@ -575,16 +629,7 @@
         fmtDecodeDrazPaintPacked, fmtEncodeDrazPaintPacked,
         NULL, NULL,
         NULL,
-        {
-            { DT_COLOR_RAM,    0x0000, 0,  0, NULL, NULL },
-            { DT_BITMAP_RAM,   0x0800, 0,  0, NULL, NULL },
-            { DT_SCREEN_RAM,   0x0400, 0,  0, NULL, NULL },
-            { DT_COLOR_REG,    0x2740, 0,  DC_BGCOL, NULL, NULL },
-            { DT_BITMAP_RAM,   0x2800, 1,  0, NULL, NULL },
-            { DT_DEC_FUNCTION, 0x2742, 0,  1, fmtDrazLaceGetLaceType, NULL },
-            { DT_ENC_FUNCTION, 0x2742, 0,  1, NULL, fmtDrazLaceSetLaceType },
-            { DT_LAST,         0,      0,  0, NULL, NULL },
-        }
+        { }, &dmC64CommonFormatOps[5]
     },
 
     {
@@ -595,16 +640,7 @@
         NULL, NULL,
         NULL, NULL,
         NULL,
-        {
-            { DT_COLOR_RAM,    0x0000, 0,  0, NULL, NULL },
-            { DT_BITMAP_RAM,   0x0800, 0,  0, NULL, NULL },
-            { DT_SCREEN_RAM,   0x0400, 0,  0, NULL, NULL },
-            { DT_COLOR_REG,    0x2740, 0,  DC_BGCOL, NULL, NULL },
-            { DT_BITMAP_RAM,   0x2800, 1,  0, NULL, NULL },
-            { DT_DEC_FUNCTION, 0x2742, 0,  1, fmtDrazLaceGetLaceType, NULL },
-            { DT_ENC_FUNCTION, 0x2742, 0,  1, NULL, fmtDrazLaceSetLaceType },
-            { DT_LAST,         0,      0,  0, NULL, NULL },
-        }
+        { }, &dmC64CommonFormatOps[5]
     },
 
     {
@@ -621,7 +657,8 @@
             { DT_BITMAP_RAM,   0x0800, 0,  0, NULL, NULL },
             { DT_SCREEN_RAM,   0x0400, 0,  0, NULL, NULL },
             { DT_LAST,         0,      0,  0, NULL, NULL },
-        }
+        },
+        NULL
     },
 
     {
@@ -638,7 +675,8 @@
             { DT_BITMAP_RAM,   0x0800, 0,  0, NULL, NULL },
             { DT_SCREEN_RAM,   0x0400, 0,  0, NULL, NULL },
             { DT_LAST,         0,      0,  0, NULL, NULL },
-        }
+        },
+        NULL
     },
 
     {
@@ -658,7 +696,8 @@
             { DT_COLOR_RAM,    0x4800, 0,  0, NULL, NULL },
             { DT_DEC_FUNCTION, 0x0000, 0,  0, fmtTruePaintGetLaceType, NULL },
             { DT_LAST,         0,      0,  0, NULL, NULL },
-        }
+        },
+        NULL
     },
 
     {
@@ -669,13 +708,7 @@
         NULL, NULL,
         NULL, NULL,
         NULL,
-        {
-            { DT_BITMAP_RAM,   0x0000, 0,  0, NULL, NULL },
-            { DT_SCREEN_RAM,   0x1f40, 0,  0, NULL, NULL },
-            { DT_COLOR_RAM,    0x2328, 0,  0, NULL, NULL },
-            { DT_COLOR_REG,    0x270f, 0,  DC_BGCOL, NULL, NULL },
-            { DT_LAST,         0,      0,  0, NULL, NULL },
-        }
+        { }, &dmC64CommonFormatOps[0]
     },
 
     {
@@ -686,13 +719,7 @@
         fmtDecodeKoalaPaintPacked, fmtEncodeKoalaPaintPacked,
         NULL, NULL,
         NULL,
-        {
-            { DT_BITMAP_RAM,   0x0000, 0,  0, NULL, NULL },
-            { DT_SCREEN_RAM,   0x1f40, 0,  0, NULL, NULL },
-            { DT_COLOR_RAM,    0x2328, 0,  0, NULL, NULL },
-            { DT_COLOR_REG,    0x270f, 0,  DC_BGCOL, NULL, NULL },
-            { DT_LAST,         0,      0,  0, NULL, NULL },
-        }
+        { }, &dmC64CommonFormatOps[0]
     },
 
     {
@@ -720,13 +747,7 @@
         fmtDecodeAmicaPaintPacked, fmtEncodeAmicaPaintPacked,
         NULL, NULL,
         NULL,
-        {
-            { DT_BITMAP_RAM,   0x0000, 0,  0, NULL, NULL },
-            { DT_SCREEN_RAM,   0x1f40, 0,  0, NULL, NULL },
-            { DT_COLOR_RAM,    0x2328, 0,  0, NULL, NULL },
-            { DT_COLOR_REG,    0x2710, 0,  DC_BGCOL, NULL, NULL },
-            { DT_LAST,         0,      0,  0, NULL, NULL },
-        }
+        { }, &dmC64CommonFormatOps[1]
     },
 
     {
@@ -737,13 +758,18 @@
         NULL, NULL,
         NULL, NULL,
         NULL,
-        {
-            { DT_BITMAP_RAM,   0x0000, 0,  0, NULL, NULL },
-            { DT_SCREEN_RAM,   0x1f40, 0,  0, NULL, NULL },
-            { DT_COLOR_RAM,    0x2328, 0,  0, NULL, NULL },
-            { DT_COLOR_REG,    0x2710, 0,  DC_BGCOL, NULL, NULL },
-            { DT_LAST,         0,      0,  0, NULL, NULL },
-        }
+        { }, &dmC64CommonFormatOps[1]
+    },
+
+    {
+        D64_FMT_MC, "ipc", "Interpaint MC (unpacked)", 0x4000, 10003, DM_FMT_RDWR,
+        C64_SCR_WIDTH / 2, C64_SCR_HEIGHT,
+        C64_SCR_CH_WIDTH, C64_SCR_CH_HEIGHT,
+        NULL,
+        NULL, NULL,
+        NULL, NULL,
+        NULL,
+        { }, &dmC64CommonFormatOps[1]
     },
 
     {
@@ -754,11 +780,7 @@
         NULL, NULL,
         NULL, NULL,
         NULL,
-        {
-            { DT_BITMAP_RAM,   0x0000, 0,  0, NULL, NULL },
-            { DT_SCREEN_RAM,   0x1f40, 0,  0, NULL, NULL },
-            { DT_LAST,         0,      0,  0, NULL, NULL },
-        }
+        { }, &dmC64CommonFormatOps[2]
     },
 
     {
@@ -769,28 +791,7 @@
         NULL, NULL,
         NULL, NULL,
         NULL,
-        {
-            { DT_BITMAP_RAM,   0x0000, 0,  0, NULL, NULL },
-            { DT_SCREEN_RAM,   0x1f40, 0,  0, NULL, NULL },
-            { DT_LAST,         0,      0,  0, NULL, NULL },
-        }
-    },
-
-    {
-        D64_FMT_MC, "ipc", "Interpaint MC (unpacked)", 0x4000, 10003, DM_FMT_RDWR,
-        C64_SCR_WIDTH / 2, C64_SCR_HEIGHT,
-        C64_SCR_CH_WIDTH, C64_SCR_CH_HEIGHT,
-        NULL,
-        NULL, NULL,
-        NULL, NULL,
-        NULL,
-        {
-            { DT_BITMAP_RAM,   0x0000, 0,  0, NULL, NULL },
-            { DT_SCREEN_RAM,   0x1f40, 0,  0, NULL, NULL },
-            { DT_COLOR_RAM,    0x2328, 0,  0, NULL, NULL },
-            { DT_COLOR_REG,    0x2710, 0,  DC_BGCOL, NULL, NULL },
-            { DT_LAST,         0,      0,  0, NULL, NULL },
-        }
+        { }, &dmC64CommonFormatOps[2]
     },
 
     {
@@ -805,7 +806,8 @@
             { DT_SCREEN_RAM,   0x0000, 0,  0, NULL, NULL },
             { DT_BITMAP_RAM,   0x0400, 0,  0, NULL, NULL },
             { DT_LAST,         0,      0,  0, NULL, NULL },
-        }
+        },
+        NULL
     },
 
     {
@@ -823,7 +825,8 @@
             DEF_SCREEN_RAMS_8( 0x4401, 8,  0x400),
             { DT_BITMAP_RAM,   0x6401 - 24*8, 1,  0, NULL, NULL },
             { DT_LAST,         0,      0,  0, NULL, NULL },
-        }
+        },
+        NULL
     },
 
 
@@ -841,7 +844,8 @@
             DEF_SCREEN_RAMS_8( 0x0500, 0,  0x400),
             { DT_BITMAP_RAM,   0x2500, 0,  0, NULL, NULL },
             { DT_LAST,         0,      0,  0, NULL, NULL },
-        }
+        },
+        NULL
     },
 
     {
@@ -857,7 +861,8 @@
             DEF_SCREEN_RAMS_8( 0x0400, 0,  0x400),
             { DT_BITMAP_RAM,   0x2400, 0,  0, NULL, NULL },
             { DT_LAST,         0,      0,  0, NULL, NULL },
-        }
+        },
+        NULL
     },
 
     {
@@ -874,7 +879,8 @@
             { DT_COLOR_RAM,    0x2400, 0,  0, NULL, NULL },
             { DT_COLOR_SET,    0x00  , 0,  DC_BGCOL, NULL, NULL },
             { DT_LAST,         0,      0,  0, NULL, NULL },
-        }
+        },
+        NULL
     },
 
 #define XX2_WIDTH_CH   40
@@ -896,7 +902,8 @@
             { DT_COLOR_RAM,    XX2_BSIZE + XX2_SIZE, 0,  XX2_SIZE, NULL, NULL },
             { DT_COLOR_SET,    11,     0,  DC_BGCOL, NULL, NULL },
             { DT_LAST,         0,      0,  0, NULL, NULL },
-        }
+        },
+        NULL
     },
 
     {
@@ -908,16 +915,7 @@
         fmtDecodeFunPaint2, fmtEncodeFunPaint2Unpacked,
         NULL, NULL,
         fmtGetPixelFunPaint2,
-        {
-            DEF_SCREEN_RAMS_8( 0x0000, 0,  0x400),
-            { DT_BITMAP_RAM,   0x2000, 0,  0, NULL, NULL },
-            { DT_EXTRA_DATA,   0x3f40, 0,  100, NULL, NULL },
-            { DT_COLOR_RAM,    0x4000, 0,  0, NULL, NULL },
-            DEF_SCREEN_RAMS_8( 0x43e8, 8,  0x400),
-            { DT_BITMAP_RAM,   0x63e8, 1,  0, NULL, NULL },
-            { DT_EXTRA_DATA,   0x8328, 1,  100, NULL, NULL },
-            { DT_LAST,         0,      0,  0, NULL, NULL },
-        }
+        { }, &dmC64CommonFormatOps[3]
     },
 
     {
@@ -929,16 +927,7 @@
         fmtDecodeFunPaint2, fmtEncodeFunPaint2Packed,
         NULL, NULL,
         fmtGetPixelFunPaint2,
-        {
-            DEF_SCREEN_RAMS_8( 0x0000, 0,  0x400),
-            { DT_BITMAP_RAM,   0x2000, 0,  0, NULL, NULL },
-            { DT_EXTRA_DATA,   0x3f40, 0,  100, NULL, NULL },
-            { DT_COLOR_RAM,    0x4000, 0,  0, NULL, NULL },
-            DEF_SCREEN_RAMS_8( 0x43e8, 8,  0x400),
-            { DT_BITMAP_RAM,   0x63e8, 1,  0, NULL, NULL },
-            { DT_EXTRA_DATA,   0x8328, 1,  100, NULL, NULL },
-            { DT_LAST,         0,      0,  0, NULL, NULL },
-        }
+        { }, &dmC64CommonFormatOps[3]
     },
 
     {
@@ -959,7 +948,8 @@
             { DT_BITMAP_RAM,   0x6400, 1,  0, NULL, NULL },
             { DT_EXTRA_DATA,   0x47e8, 1,  20, NULL, NULL },
             { DT_LAST,         0,      0,  0, NULL, NULL },
-        }
+        },
+        NULL
     },
 
     {
@@ -975,7 +965,8 @@
             { DT_BITMAP_RAM,   0x0000, 0,  0, NULL, NULL },
             DEF_SCREEN_RAMS_8( 0x2000, 0,  0x400),
             { DT_LAST,         0,      0,  0, NULL, NULL },
-        }
+        },
+        NULL
     },
 };
 
--- a/tools/lib64gfx.h	Mon May 14 05:53:22 2018 +0300
+++ b/tools/lib64gfx.h	Mon May 14 06:36:18 2018 +0300
@@ -172,6 +172,9 @@
 } DMC64EncDecOp;
 
 
+typedef DMC64EncDecOp DMC64EncDecOpList[D64_MAX_ENCDEC_OPS];
+
+
 typedef struct _DMC64ImageFormat
 {
     int  type;   // Type flags, see D64_FMT_*
@@ -196,7 +199,7 @@
 
     DMC64GetPixelFunc getPixel;
 
-    DMC64EncDecOp encdecOps[D64_MAX_ENCDEC_OPS];
+    const DMC64EncDecOpList encdecOps, *encdecOpsRef;
 } DMC64ImageFormat;
 
 
@@ -318,7 +321,8 @@
 
 static inline const DMC64EncDecOp * fmtGetEncDecOp(const DMC64ImageFormat *fmt, const int index)
 {
-    return &fmt->encdecOps[index];
+    // Ooh .. look at that beaauuuutiful deref ..
+    return fmt->encdecOpsRef != NULL ? &(* (fmt->encdecOpsRef))[index] : &fmt->encdecOps[index];
 }