diff tools/lib64fmts.c @ 2129:2129d4ac6f45

Refactor c64 image rendering completely to be more flexible.
author Matti Hamalainen <ccr@tnsp.org>
date Mon, 27 May 2019 11:29:37 +0300
parents c1a9519a619f
children 3b5be00759ed
line wrap: on
line diff
--- a/tools/lib64fmts.c	Mon May 27 11:28:19 2019 +0300
+++ b/tools/lib64fmts.c	Mon May 27 11:29:37 2019 +0300
@@ -265,6 +265,23 @@
 }
 
 
+static int fmtGetPixelDrazLace(Uint8 *col,
+    const DMC64Image *img, const int rasterX, const int rasterY)
+{
+    const int
+        x = rasterX / 8,
+        y = rasterY / 8,
+        yoffs = y * img->fmt->chWidth,
+        bmoffs = yoffs * 8 + (rasterY & 7) + (x * 8),
+        scroffs = yoffs + x,
+        vshift = 6 - (rasterX & 6);
+
+    return dmC64GetGenericMCPixel(col, img,
+        bmoffs, scroffs, vshift,
+        0, rasterX & 1, 0, img->bgcolor);
+}
+
+
 static const char *fmtBDP5MagicID = "BDP 5.00";
 
 static int fmtProbeBDP5Packed(const DMGrowBuf *buf, const DMC64ImageFormat *fmt)
@@ -474,12 +491,13 @@
 }
 
 
-static Uint8 fmtGetPixelFLIDesigner(
-    const DMC64Image *img, const int bmoffs, const int scroffs,
-    const int shiftX, const int bitmap, const int rasterX, const int rasterY)
+static int fmtGetPixelFLIDesigner(Uint8 *col,
+    const DMC64Image *img, const int rasterX, const int rasterY)
 {
-    (void) rasterX;
-    return dmC64GetGenericMCPixel(img, bmoffs, scroffs, shiftX, rasterY & 7, bitmap, 0, img->bgcolor);
+    DM_C64_GENERIC_MC_PIXEL_DEFS(img)
+
+    //return dmC64GetGenericMCPixel(   img, bmoffs, scroffs, vshift, rasterY & 7, bitmap, 0, img->bgcolor);
+    return dmC64GetGenericMCPixel(col, img, bmoffs, scroffs, vshift, rasterY & 7, 0, 0, img->bgcolor);
 }
 
 
@@ -565,17 +583,17 @@
 }
 
 
-static Uint8 fmtGetPixelBlackMailFLI(
-    const DMC64Image *img, const int bmoffs, const int scroffs,
-    const int shiftX, const int bitmap, const int rasterX, const int rasterY)
+static int fmtGetPixelBlackMailFLI(Uint8 *col,
+    const DMC64Image *img, const int rasterX, const int rasterY)
 {
-    const int vbank = rasterY & 7;
-    (void) rasterX;
+    DM_C64_GENERIC_MC_PIXEL_DEFS(img)
 
-    return dmC64GetGenericMCPixel(
-        img, bmoffs, scroffs, shiftX,
-        vbank, bitmap, 0,
-        img->extraData[0].data[rasterY] & 15);
+    Uint8 bgcol = (unsigned) rasterY < img->extraData[0].size ?
+        img->extraData[0].data[rasterY] : img->bgcolor;
+
+    return dmC64GetGenericMCPixel(col, img,
+        bmoffs, scroffs, vshift, rasterY & 7, 0, 0,
+        bgcol & 15);
 }
 
 
@@ -590,13 +608,19 @@
 }
 
 
-static Uint8 fmtGetPixelTruePaint(
-    const DMC64Image *img, const int bmoffs, const int scroffs,
-    const int shiftX, const int bitmap, const int rasterX, const int rasterY)
+static int fmtGetPixelTruePaint(Uint8 *col,
+    const DMC64Image *img, const int rasterX, const int rasterY)
 {
-    (void) rasterX;
-    (void) rasterY;
-    return dmC64GetGenericMCPixel(img, bmoffs, scroffs, shiftX, 0, bitmap, 0, img->bgcolor);
+    const int
+        x = rasterX / 8,
+        y = rasterY / 8,
+        yoffs = y * img->fmt->chWidth,
+        bmoffs = yoffs * 8 + (rasterY & 7) + (x * 8),
+        scroffs = yoffs + x,
+        vshift = 6 - (rasterX & 6);
+
+    return dmC64GetGenericMCPixel(col, img,
+        bmoffs, scroffs, vshift, 0, rasterX & 1, 0, img->bgcolor);
 }
 
 
@@ -891,39 +915,46 @@
 }
 
 
-static Uint8 fmtGetPixelFunPaint2(
-    const DMC64Image *img, const int bmoffs, const int scroffs,
-    const int shiftX, const int bitmap, const int rasterX, const int rasterY)
+static int fmtGetPixelFunPaint2(Uint8 *col,
+    const DMC64Image *img, const int rasterX, const int rasterY)
 {
-    const int vbank = (rasterY & 7) + (bitmap * 8);
-    (void) rasterX;
+    const int
+        x = rasterX / 8,
+        y = rasterY / 8,
+        yb = rasterY & 7,
+        yoffs = y * img->fmt->chWidth,
+        bmoffs = yoffs * 8 + yb + (x * 8),
+        scroffs = yoffs + x,
+        vshift = 6 - (rasterX & 6),
+        bitmap = rasterX & 1,
+        vbank = yb + (bitmap * 8);
 
-    return dmC64GetGenericMCPixel(
-        img, bmoffs, scroffs, shiftX,
-        vbank, bitmap, 0,
-        img->extraData[0].data[rasterY] & 15);
+    Uint8 bgcol = (unsigned) rasterY < img->extraData[0].size ?
+        img->extraData[0].data[rasterY] : img->bgcolor;
+
+    return dmC64GetGenericMCPixel(col, img,
+        bmoffs, scroffs, vshift,
+        vbank, bitmap, 0, bgcol & 15);
 }
 
 
-static Uint8 fmtGetPixelBFLI(
-    const DMC64Image *img, const int bmoffs, const int scroffs,
-    const int shiftX, const int bitmap, const int rasterX, const int rasterY)
+static int fmtGetPixelBFLI(Uint8 *col,
+    const DMC64Image *img, const int rasterX, const int rasterY)
 {
+    DM_C64_GENERIC_MC_PIXEL_DEFS(img)
     const int vbb = rasterY < 200 ? 0 : 1;
     const int vbank = (rasterY & 7) + (vbb * 8);
-    (void) bitmap;
-    (void) rasterX;
 
-    return dmC64GetGenericMCPixel(
+    return dmC64GetGenericMCPixel(col,
         img, bmoffs & 0x1fff, scroffs & 0x3ff,
-        shiftX, vbank, vbb, 0, img->bgcolor);
+        vshift, vbank, vbb, 0, img->bgcolor);
 }
 
 
-static Uint8 fmtGetPixelPentelPaint(
-    const DMC64Image *img, const int bmoffs, const int scroffs,
-    const int shiftX, const int bitmap, const int rasterX, const int rasterY)
+static int fmtGetPixelPentelPaint(Uint8 *col,
+    const DMC64Image *img, const int rasterX, const int rasterY)
 {
+    DM_C64_GENERIC_SC_PIXEL_DEFS(img)
     const int ry = rasterY / D64_SPR_HEIGHT_PX;
     const int yd = rasterY % D64_SPR_HEIGHT_PX;
     const int rx = rasterX / D64_SPR_WIDTH_PX;
@@ -931,35 +962,41 @@
     const int offs = (ry * 8 + rx) * D64_SPR_SIZE + (yd * D64_SPR_WIDTH_UT) + (xd / 8);
     const int mask = 1 << (7 - (rasterX & 7));
 
-    Uint8 color1 = dmC64GetGenericSCPixel(img, bmoffs, scroffs, shiftX, 0, bitmap, 0);
-    Uint8 color2 = img->extraData[0].data[offs] & mask ? 0x0f : 0;
-    Uint8 color3 = img->extraData[0].data[offs + D64_SPR_SIZE * 155] & mask ? img->d022 : 0;
+    Uint8 color1,
+        color2 = img->extraData[0].data[offs] & mask ? 0x0f : 0,
+        color3 = img->extraData[0].data[offs + D64_SPR_SIZE * 155] & mask ? img->d022 : 0;
+
+    int res;
 
-    return color3 ? color3 : ( color2 ? color2 : color1 );
+    if ((res = dmC64GetGenericSCPixel(&color1, img, bmoffs, scroffs, vshift, 0, 0)) != DMERR_OK)
+        return res;
+
+    *col = color3 ? color3 : ( color2 ? color2 : color1 );
+    return DMERR_OK;
 }
 
 
-static Uint8 fmtGetPixelHCB(
-    const DMC64Image *img, const int bmoffs, const int scroffs,
-    const int shiftX, const int bitmap, const int rasterX, const int rasterY)
+static int fmtGetPixelHCB(Uint8 *col,
+    const DMC64Image *img, const int rasterX, const int rasterY)
 {
+    DM_C64_GENERIC_MC_PIXEL_DEFS(img)
     const int vbank = (rasterY / 4) & 1;
-    (void) bitmap;
-    (void) rasterX;
+    const int ry = rasterY / 5;
 
-    return dmC64GetGenericMCPixel(
-        img, bmoffs, scroffs,
-        shiftX, vbank, 0, vbank,
-        img->extraData[0].data[rasterY / 5] & 15);
+    Uint8 bgcol = (unsigned) ry < img->extraData[0].size ?
+        img->extraData[0].data[ry] : img->bgcolor;
+
+    return dmC64GetGenericMCPixel(col, img,
+        bmoffs, scroffs,
+        vshift, vbank, 0, vbank, bgcol & 15);
 }
 
 
-static Uint8 fmtGetPixelCrestHIFLIorCDHM(
-    const DMC64Image *img, const int bmoffs, const int scroffs,
-    const int shiftX, const int bitmap, const int rasterX, const int rasterY)
+static int fmtGetPixelCrestHIFLIorCDHM(Uint8 *col,
+    const DMC64Image *img, const int rasterX, const int rasterY)
 {
-    (void) rasterX;
-    return dmC64GetGenericSCPixel(img, bmoffs, scroffs, shiftX, rasterY & 7, bitmap, 0);
+    DM_C64_GENERIC_SC_PIXEL_DEFS(img)
+    return dmC64GetGenericSCPixel(col, img, bmoffs, scroffs, vshift, rasterY & 7, 0);
 }
 
 
@@ -974,18 +1011,20 @@
 }
 
 
-static Uint8 fmtGetPixelECI(
-    const DMC64Image *img, const int bmoffs, const int scroffs,
-    const int shiftX, const int bitmap, const int rasterX, const int rasterY)
+static int fmtGetPixelECI(Uint8 *col,
+    const DMC64Image *img, const int rasterX, const int rasterY)
 {
+    DM_C64_GENERIC_SC_PIXEL_DEFS(img)
     const int vbank = rasterY & 7;
-    Uint8
-        c1 = dmC64GetGenericSCPixel(img, bmoffs, scroffs, shiftX, vbank    , 0, 0),
-        c2 = dmC64GetGenericSCPixel(img, bmoffs, scroffs, shiftX, vbank + 8, 1, 0);
+    Uint8 color1, color2;
+    int res;
 
-    (void) bitmap;
-    (void) rasterX;
-    return (c1 * D64_NCOLORS) + c2;
+    if ((res = dmC64GetGenericSCPixel(&color1, img, bmoffs, scroffs, vshift, vbank    , 0)) != DMERR_OK ||
+        (res = dmC64GetGenericSCPixel(&color2, img, bmoffs, scroffs, vshift, vbank + 8, 1)) != DMERR_OK)
+        return res;
+
+    *col = (color1 * D64_NCOLORS) + color2;
+    return DMERR_OK;
 }
 
 
@@ -1198,7 +1237,7 @@
         D64_SCR_CH_WIDTH, D64_SCR_CH_HEIGHT,
         1, 1,
         NULL, NULL,
-        NULL,
+        fmtGetPixelDrazLace,
         {
             { DO_COPY       , DS_COLOR_RAM   , 0x0000, 0,  0,   0, NULL, NULL },
             { DO_COPY       , DS_BITMAP_RAM  , 0x0800, 0,  0,   0, NULL, NULL },