# HG changeset patch # User Matti Hamalainen # Date 1526268978 -10800 # Node ID 91d1bb571fca1dd68dc723cc0a258f82bb041743 # Parent 3cc7b2aadda33f672a7ac79c1cb4ef14e2078629 Implement common encdec ops lists for sharing oplists between formats that use the exact same ops. diff -r 3cc7b2aadda3 -r 91d1bb571fca tools/lib64fmts.c --- 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 }, }; diff -r 3cc7b2aadda3 -r 91d1bb571fca tools/lib64gfx.h --- 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]; }