comparison lib64gfx.c @ 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
comparison
equal deleted inserted replaced
530:5b37a2e427b7 531:2ac364d0ace9
261 img->laceBank2 = 1; 261 img->laceBank2 = 1;
262 return TRUE; 262 return TRUE;
263 } 263 }
264 264
265 265
266 static BOOL fmtSetFLIType(DMC64Image *img, const struct _DMC64EncDecOp *op, const Uint8 *buf, const size_t len)
267 {
268 (void) buf;
269 (void) len;
270 img->fliType = op->bank;
271 return TRUE;
272 }
273
274
266 const DMC64ImageFormat dmC64ImageFormats[] = 275 const DMC64ImageFormat dmC64ImageFormats[] =
267 { 276 {
268 { 277 {
269 D64_FMT_MC, ".drp", "DrazPaint 2.0 (packed)", 0x5800, -1, 278 D64_FMT_MC, ".drp", "DrazPaint 2.0 (packed)", 0x5800, -1,
270 fmtProbeDrazPaint20Packed, fmtDecodeDrazPaintPacked, 279 fmtProbeDrazPaint20Packed, fmtDecodeDrazPaintPacked,
341 D64_FMT_MC, ".kla", "Koala Paint (unpacked)", 0x6000, 10003, 350 D64_FMT_MC, ".kla", "Koala Paint (unpacked)", 0x6000, 10003,
342 NULL, NULL, 351 NULL, NULL,
343 NULL, NULL, NULL, 352 NULL, NULL, NULL,
344 4, 353 4,
345 { 354 {
355 { DT_BITMAP, 0x0000, 0, 0, NULL, NULL },
356 { DT_SCREEN_RAM, 0x1f40, 0, 0, NULL, NULL },
357 { DT_COLOR_RAM, 0x2328, 0, 0, NULL, NULL },
358 { DT_BGCOLOR, 0x2710, 0, 0, NULL, NULL },
359 }
360 },
361
362 {
363 D64_FMT_MC, ".ocp", "Advanced Art Studio (unpacked)", 0x2000, 10018,
364 NULL, NULL,
365 NULL, NULL, NULL,
366 4,
367 {
368 { DT_BITMAP, 0x0000, 0, 0, NULL, NULL },
369 { DT_SCREEN_RAM, 0x1f40, 0, 0, NULL, NULL },
370 { DT_COLOR_RAM, 0x2338, 0, 0, NULL, NULL },
371 { DT_BGCOLOR, 0x2329, 0, 0, NULL, NULL },
372 }
373 },
374
375 {
376 D64_FMT_MC, ".ami", "Amica Paint (packed)", 0x4000, -1,
377 fmtProbeAmicaPaintPacked, fmtDecodeAmicaPaintPacked,
378 NULL, NULL, NULL,
379 4,
380 {
346 { DT_COLOR_RAM, 0x2328, 0, 0, NULL, NULL }, 381 { DT_COLOR_RAM, 0x2328, 0, 0, NULL, NULL },
347 { DT_BITMAP, 0x0000, 0, 0, NULL, NULL }, 382 { DT_BITMAP, 0x0000, 0, 0, NULL, NULL },
348 { DT_SCREEN_RAM, 0x1f40, 0, 0, NULL, NULL }, 383 { DT_SCREEN_RAM, 0x1f40, 0, 0, NULL, NULL },
349 { DT_BGCOLOR, 0x2710, 0, 0, NULL, NULL }, 384 { DT_BGCOLOR, 0x2710, 0, 0, NULL, NULL },
350 } 385 }
351 }, 386 },
352 387
353 { 388 {
354 D64_FMT_MC, ".ocp", "Advanced Art Studio (unpacked)", 0x2000, 10018, 389 D64_FMT_MC, ".rpm", "Run Paint (unpacked)", 0x6000, 10006,
355 NULL, NULL, 390 NULL, NULL,
356 NULL, NULL, NULL,
357 4,
358 {
359 { DT_BITMAP, 0x0000, 0, 0, NULL, NULL },
360 { DT_SCREEN_RAM, 0x1f40, 0, 0, NULL, NULL },
361 { DT_COLOR_RAM, 0x2338, 0, 0, NULL, NULL },
362 { DT_BGCOLOR, 0x2329, 0, 0, NULL, NULL },
363 }
364 },
365
366 {
367 D64_FMT_MC, ".ami", "Amica Paint (packed)", 0x4000, -1,
368 fmtProbeAmicaPaintPacked, fmtDecodeAmicaPaintPacked,
369 NULL, NULL, NULL, 391 NULL, NULL, NULL,
370 4, 392 4,
371 { 393 {
372 { DT_COLOR_RAM, 0x2328, 0, 0, NULL, NULL }, 394 { DT_COLOR_RAM, 0x2328, 0, 0, NULL, NULL },
373 { DT_BITMAP, 0x0000, 0, 0, NULL, NULL }, 395 { DT_BITMAP, 0x0000, 0, 0, NULL, NULL },
375 { DT_BGCOLOR, 0x2710, 0, 0, NULL, NULL }, 397 { DT_BGCOLOR, 0x2710, 0, 0, NULL, NULL },
376 } 398 }
377 }, 399 },
378 400
379 { 401 {
380 D64_FMT_MC, ".rpm", "Run Paint (unpacked)", 0x6000, 10006, 402 D64_FMT_HIRES, ".art", "Art Studio (unpacked)", 0x2000, 9009,
381 NULL, NULL, 403 NULL, NULL,
382 NULL, NULL, NULL, 404 NULL, NULL, NULL,
383 4, 405 2,
384 { 406 {
385 { DT_COLOR_RAM, 0x2328, 0, 0, NULL, NULL },
386 { DT_BITMAP, 0x0000, 0, 0, NULL, NULL }, 407 { DT_BITMAP, 0x0000, 0, 0, NULL, NULL },
387 { DT_SCREEN_RAM, 0x1f40, 0, 0, NULL, NULL }, 408 { DT_SCREEN_RAM, 0x1f40, 0, 0, NULL, NULL },
388 { DT_BGCOLOR, 0x2710, 0, 0, NULL, NULL }, 409 }
389 } 410 },
390 }, 411
391 412 {
392 { 413 D64_FMT_HIRES, ".iph", "Interpaint (unpacked)", 0x4000, 9002,
393 D64_FMT_HIRES, ".art", "Art Studio (unpacked)", 0x2000, 9009,
394 NULL, NULL, 414 NULL, NULL,
395 NULL, NULL, NULL, 415 NULL, NULL, NULL,
396 2, 416 2,
397 { 417 {
398 { DT_BITMAP, 0x0000, 0, 0, NULL, NULL }, 418 { DT_BITMAP, 0x0000, 0, 0, NULL, NULL },
399 { DT_SCREEN_RAM, 0x1f40, 0, 0, NULL, NULL }, 419 { DT_SCREEN_RAM, 0x1f40, 0, 0, NULL, NULL },
400 } 420 }
401 }, 421 },
402 422
403 { 423 {
404 D64_FMT_HIRES, ".iph", "Interpaint (unpacked)", 0x4000, 9002,
405 NULL, NULL,
406 NULL, NULL, NULL,
407 2,
408 {
409 { DT_BITMAP, 0x0000, 0, 0, NULL, NULL },
410 { DT_SCREEN_RAM, 0x1f40, 0, 0, NULL, NULL },
411 }
412 },
413
414 {
415 D64_FMT_HIRES, ".dd", "Doodle (unpacked)", 0x1c00, 9218, 424 D64_FMT_HIRES, ".dd", "Doodle (unpacked)", 0x1c00, 9218,
416 NULL, NULL, 425 NULL, NULL,
417 NULL, NULL, NULL, 426 NULL, NULL, NULL,
418 2, 427 2,
419 { 428 {
420 { DT_SCREEN_RAM, 0x0000, 0, 0, NULL, NULL }, 429 { DT_SCREEN_RAM, 0x0000, 0, 0, NULL, NULL },
421 { DT_BITMAP, 0x0400, 0, 0, NULL, NULL }, 430 { DT_BITMAP, 0x0400, 0, 0, NULL, NULL },
422 } 431 }
423 }, 432 },
424 433
434 {
435 D64_FMT_MC | D64_FMT_FLI, ".bml", "Blackmail FLI (unpacked)", 0x3b00, 17474,
436 NULL, NULL,
437 NULL, NULL, NULL,
438 11,
439 {
440 { DT_COLOR_RAM, 0x0100, 0, 0, NULL, NULL },
441
442 { DT_SCREEN_RAM, 0x0500, 0, 0, NULL, NULL },
443 { DT_SCREEN_RAM, 0x0900, 1, 0, NULL, NULL },
444 { DT_SCREEN_RAM, 0x0d00, 2, 0, NULL, NULL },
445 { DT_SCREEN_RAM, 0x1100, 3, 0, NULL, NULL },
446
447 { DT_SCREEN_RAM, 0x1500, 4, 0, NULL, NULL },
448 { DT_SCREEN_RAM, 0x1900, 5, 0, NULL, NULL },
449 { DT_SCREEN_RAM, 0x1d00, 6, 0, NULL, NULL },
450 { DT_SCREEN_RAM, 0x2100, 7, 0, NULL, NULL },
451
452 { DT_BITMAP, 0x2500, 0, 0, NULL, NULL },
453 { DT_DEC_FUNCTION, 0x0000, D64_FLI_8BANK, 0, fmtSetFLIType, NULL },
454 }
455 },
456
457 {
458 D64_FMT_MC | D64_FMT_FLI, ".fli", "FLI Designer (unpacked)", 0x3c00, 17409,
459 NULL, NULL,
460 NULL, NULL, NULL,
461 11,
462 {
463 { DT_COLOR_RAM, 0x0000, 0, 0, NULL, NULL },
464 { DT_SCREEN_RAM, 0x0400, 0, 0, NULL, NULL },
465 { DT_SCREEN_RAM, 0x0800, 1, 0, NULL, NULL },
466 { DT_SCREEN_RAM, 0x0c00, 2, 0, NULL, NULL },
467 { DT_SCREEN_RAM, 0x1000, 3, 0, NULL, NULL },
468 { DT_SCREEN_RAM, 0x1400, 4, 0, NULL, NULL },
469 { DT_SCREEN_RAM, 0x1800, 5, 0, NULL, NULL },
470 { DT_SCREEN_RAM, 0x1c00, 6, 0, NULL, NULL },
471 { DT_SCREEN_RAM, 0x2000, 7, 0, NULL, NULL },
472 { DT_BITMAP, 0x2400, 0, 0, NULL, NULL },
473 { DT_DEC_FUNCTION, 0x0000, D64_FLI_8BANK, 0, fmtSetFLIType, NULL },
474 }
475 },
476
425 }; 477 };
426 478
427 const int ndmC64ImageFormats = sizeof(dmC64ImageFormats) / sizeof(dmC64ImageFormats[0]); 479 const int ndmC64ImageFormats = sizeof(dmC64ImageFormats) / sizeof(dmC64ImageFormats[0]);
428 480
429 481
548 600
549 return DMERR_OK; 601 return DMERR_OK;
550 } 602 }
551 603
552 604
553 static inline Uint8 dmC64GetMCColor(const DMC64Image *img, const int bits, const int bank, const int scroffs) 605 static inline Uint8 dmC64GetMCColor(const DMC64Image *img, const int bits, const int cbank, const int vbank, const int scroffs)
554 { 606 {
555 switch (bits) 607 switch (bits)
556 { 608 {
557 case 0: return img->bgcolor; break; 609 case 0: return img->bgcolor; break;
558 case 1: return img->screen[bank][scroffs] >> 4; break; 610 case 1: return img->screen[vbank][scroffs] >> 4; break;
559 case 2: return img->screen[bank][scroffs] & 15; break; 611 case 2: return img->screen[vbank][scroffs] & 15; break;
560 default: return img->color[bank][scroffs] & 15; break; 612 default: return img->color[cbank][scroffs] & 15; break;
561 } 613 }
562 } 614 }
563 615
564 616
565 // Convert a generic "C64" format bitmap in DMC64Image struct to 617 // Convert a generic "C64" format bitmap in DMC64Image struct to
602 const int v = 6 - ((xc * 2) & 6); 654 const int v = 6 - ((xc * 2) & 6);
603 Uint8 c; 655 Uint8 c;
604 656
605 if (src->type & D64_FMT_FLI) 657 if (src->type & D64_FMT_FLI)
606 { 658 {
607 int bank = 0; 659 int vbank = 0;
608 switch (src->fliType) 660 switch (src->fliType)
609 { 661 {
610 case D64_FLI_2BANK: 662 case D64_FLI_2BANK:
611 bank = yb / 4; 663 vbank = yb / 4;
612 break; 664 break;
613 case D64_FLI_4BANK: 665 case D64_FLI_4BANK:
614 bank = yb / 2; 666 vbank = yb / 2;
615 break; 667 break;
616 case D64_FLI_8BANK: 668 case D64_FLI_8BANK:
617 bank = yb; 669 vbank = yb;
618 break; 670 break;
619 } 671 }
620 c = dmC64GetMCColor(src, (src->bitmap[0][bmoffs] >> v) & 3, bank, scroffs); 672 c = dmC64GetMCColor(src, (src->bitmap[0][bmoffs] >> v) & 3, 0, vbank, scroffs);
621 *d++ = c; 673 *d++ = c;
622 *d++ = c; 674 *d++ = c;
623 } 675 }
624 else 676 else
625 if (src->type & D64_FMT_ILACE) 677 if (src->type & D64_FMT_ILACE)
626 { 678 {
627 *d++ = dmC64GetMCColor(src, (src->bitmap[0][bmoffs] >> v) & 3, src->laceBank1, scroffs); 679 *d++ = dmC64GetMCColor(src, (src->bitmap[0][bmoffs] >> v) & 3, 0, src->laceBank1, scroffs);
628 *d++ = dmC64GetMCColor(src, (src->bitmap[1][bmoffs] >> v) & 3, src->laceBank2, scroffs); 680 *d++ = dmC64GetMCColor(src, (src->bitmap[1][bmoffs] >> v) & 3, 0, src->laceBank2, scroffs);
629 } 681 }
630 else 682 else
631 { 683 {
632 c = dmC64GetMCColor(src, (src->bitmap[0][bmoffs] >> v) & 3, 0, scroffs); 684 c = dmC64GetMCColor(src, (src->bitmap[0][bmoffs] >> v) & 3, 0, 0, scroffs);
633 *d++ = c; 685 *d++ = c;
634 *d++ = c; 686 *d++ = c;
635 } 687 }
636 } 688 }
637 } 689 }