changeset 531:2ac364d0ace9

Add support for converting some FLI formats, such as Blackmail FLI and FLI Designer FLI.
author Matti Hamalainen <ccr@tnsp.org>
date Thu, 22 Nov 2012 17:10:05 +0200
parents 5b37a2e427b7
children 128a50feff07
files lib64gfx.c
diffstat 1 files changed, 65 insertions(+), 13 deletions(-) [+]
line wrap: on
line diff
--- a/lib64gfx.c	Thu Nov 22 15:28:27 2012 +0200
+++ b/lib64gfx.c	Thu Nov 22 17:10:05 2012 +0200
@@ -263,6 +263,15 @@
 }
 
 
+static BOOL fmtSetFLIType(DMC64Image *img, const struct _DMC64EncDecOp *op, const Uint8 *buf, const size_t len)
+{
+    (void) buf;
+    (void) len;
+    img->fliType = op->bank;
+    return TRUE;
+}
+
+
 const DMC64ImageFormat dmC64ImageFormats[] =
 {
     {
@@ -343,9 +352,9 @@
         NULL, NULL, NULL,
         4,
         {
-            { DT_COLOR_RAM,    0x2328, 0,  0, NULL, NULL },
             { DT_BITMAP,       0x0000, 0,  0, NULL, NULL },
             { DT_SCREEN_RAM,   0x1f40, 0,  0, NULL, NULL },
+            { DT_COLOR_RAM,    0x2328, 0,  0, NULL, NULL },
             { DT_BGCOLOR,      0x2710, 0,  0, NULL, NULL },
         }
     },
@@ -422,6 +431,49 @@
         }
     },
     
+    {
+        D64_FMT_MC | D64_FMT_FLI, ".bml", "Blackmail FLI (unpacked)", 0x3b00, 17474,
+        NULL, NULL,
+        NULL, NULL, NULL,
+        11,
+        {
+            { DT_COLOR_RAM,    0x0100, 0,  0, NULL, NULL },
+
+            { DT_SCREEN_RAM,   0x0500, 0,  0, NULL, NULL },
+            { DT_SCREEN_RAM,   0x0900, 1,  0, NULL, NULL },
+            { DT_SCREEN_RAM,   0x0d00, 2,  0, NULL, NULL },
+            { DT_SCREEN_RAM,   0x1100, 3,  0, NULL, NULL },
+
+            { DT_SCREEN_RAM,   0x1500, 4,  0, NULL, NULL },
+            { DT_SCREEN_RAM,   0x1900, 5,  0, NULL, NULL },
+            { DT_SCREEN_RAM,   0x1d00, 6,  0, NULL, NULL },
+            { DT_SCREEN_RAM,   0x2100, 7,  0, NULL, NULL },
+
+            { DT_BITMAP,       0x2500, 0,  0, NULL, NULL },
+            { DT_DEC_FUNCTION, 0x0000, D64_FLI_8BANK,  0, fmtSetFLIType, NULL },
+        }
+    },
+
+    {
+        D64_FMT_MC | D64_FMT_FLI, ".fli", "FLI Designer (unpacked)", 0x3c00, 17409,
+        NULL, NULL,
+        NULL, NULL, NULL,
+        11,
+        {
+            { DT_COLOR_RAM,    0x0000, 0,  0, NULL, NULL },
+            { DT_SCREEN_RAM,   0x0400, 0,  0, NULL, NULL },
+            { DT_SCREEN_RAM,   0x0800, 1,  0, NULL, NULL },
+            { DT_SCREEN_RAM,   0x0c00, 2,  0, NULL, NULL },
+            { DT_SCREEN_RAM,   0x1000, 3,  0, NULL, NULL },
+            { DT_SCREEN_RAM,   0x1400, 4,  0, NULL, NULL },
+            { DT_SCREEN_RAM,   0x1800, 5,  0, NULL, NULL },
+            { DT_SCREEN_RAM,   0x1c00, 6,  0, NULL, NULL },
+            { DT_SCREEN_RAM,   0x2000, 7,  0, NULL, NULL },
+            { DT_BITMAP,       0x2400, 0,  0, NULL, NULL },
+            { DT_DEC_FUNCTION, 0x0000, D64_FLI_8BANK,  0, fmtSetFLIType, NULL },
+        }
+    },
+
 };
 
 const int ndmC64ImageFormats = sizeof(dmC64ImageFormats) / sizeof(dmC64ImageFormats[0]);
@@ -550,14 +602,14 @@
 }
 
 
-static inline Uint8 dmC64GetMCColor(const DMC64Image *img, const int bits,  const int bank, const int scroffs)
+static inline Uint8 dmC64GetMCColor(const DMC64Image *img, const int bits, const int cbank, const int vbank, const int scroffs)
 {
     switch (bits)
     {
         case  0: return img->bgcolor; break;
-        case  1: return img->screen[bank][scroffs] >> 4; break;
-        case  2: return img->screen[bank][scroffs] & 15; break;
-        default: return img->color[bank][scroffs] & 15; break;
+        case  1: return img->screen[vbank][scroffs] >> 4; break;
+        case  2: return img->screen[vbank][scroffs] & 15; break;
+        default: return img->color[cbank][scroffs] & 15; break;
     }
 }
 
@@ -604,32 +656,32 @@
 
                 if (src->type & D64_FMT_FLI)
                 {
-                    int bank = 0;
+                    int vbank = 0;
                     switch (src->fliType)
                     {
                         case D64_FLI_2BANK:
-                            bank = yb / 4;
+                            vbank = yb / 4;
                             break;
                         case D64_FLI_4BANK:
-                            bank = yb / 2;
+                            vbank = yb / 2;
                             break;
                         case D64_FLI_8BANK:
-                            bank = yb;
+                            vbank = yb;
                             break;
                     }
-                    c = dmC64GetMCColor(src, (src->bitmap[0][bmoffs] >> v) & 3, bank, scroffs);
+                    c = dmC64GetMCColor(src, (src->bitmap[0][bmoffs] >> v) & 3, 0, vbank, scroffs);
                     *d++ = c;
                     *d++ = c;
                 }
                 else
                 if (src->type & D64_FMT_ILACE)
                 {
-                    *d++ = dmC64GetMCColor(src, (src->bitmap[0][bmoffs] >> v) & 3, src->laceBank1, scroffs);
-                    *d++ = dmC64GetMCColor(src, (src->bitmap[1][bmoffs] >> v) & 3, src->laceBank2, scroffs);
+                    *d++ = dmC64GetMCColor(src, (src->bitmap[0][bmoffs] >> v) & 3, 0, src->laceBank1, scroffs);
+                    *d++ = dmC64GetMCColor(src, (src->bitmap[1][bmoffs] >> v) & 3, 0, src->laceBank2, scroffs);
                 }
                 else
                 {
-                    c = dmC64GetMCColor(src, (src->bitmap[0][bmoffs] >> v) & 3, 0, scroffs);
+                    c = dmC64GetMCColor(src, (src->bitmap[0][bmoffs] >> v) & 3, 0, 0, scroffs);
                     *d++ = c;
                     *d++ = c;
                 }