comparison lib64gfx.c @ 419:936bc27a79d6

Modularize some functions to lib64gfx, fix bitmap -> image conversion, and implement various cleanups.
author Matti Hamalainen <ccr@tnsp.org>
date Sat, 03 Nov 2012 07:53:38 +0200
parents e4b2f689aff6
children 8d15443ce209
comparison
equal deleted inserted replaced
418:b6a1dc3bd2c3 419:936bc27a79d6
243 } 243 }
244 244
245 245
246 static BOOL fmtDrazLaceSetLaceType(DMC64Image *img, const struct _DMDecodeOp *op, const Uint8 *buf, const size_t len) 246 static BOOL fmtDrazLaceSetLaceType(DMC64Image *img, const struct _DMDecodeOp *op, const Uint8 *buf, const size_t len)
247 { 247 {
248 (void) len;
249
248 img->laceType = buf[op->offs] ? DM_C64ILACE_RES : DM_C64ILACE_COLOR; 250 img->laceType = buf[op->offs] ? DM_C64ILACE_RES : DM_C64ILACE_COLOR;
249 img->laceBank2 = 0; 251 img->laceBank2 = 0;
250 return TRUE; 252 return TRUE;
251 } 253 }
252 254
322 } 324 }
323 325
324 326
325 static BOOL fmtTruePaintSetLaceType(DMC64Image *img, const struct _DMDecodeOp *op, const Uint8 *buf, const size_t len) 327 static BOOL fmtTruePaintSetLaceType(DMC64Image *img, const struct _DMDecodeOp *op, const Uint8 *buf, const size_t len)
326 { 328 {
329 (void) op;
330 (void) buf;
331 (void) len;
327 img->laceType = DM_C64ILACE_RES; 332 img->laceType = DM_C64ILACE_RES;
328 img->laceBank2 = 1; 333 img->laceBank2 = 1;
329 return TRUE; 334 return TRUE;
330 } 335 }
331 336
426 }; 431 };
427 432
428 const int ndmC64ImageFormats = sizeof(dmC64ImageFormats) / sizeof(dmC64ImageFormats[0]); 433 const int ndmC64ImageFormats = sizeof(dmC64ImageFormats) / sizeof(dmC64ImageFormats[0]);
429 434
430 435
431 int dmC64ProbeGeneric(const Uint8 *buf, const size_t len, 436 int dmC64ProbeGeneric(const Uint8 *buf, const size_t len, DMC64ImageFormat **pfmt)
432 DMC64ImageFormat **pfmt) 437 {
433 { 438 int i, scoreMax = DM_PROBE_SCORE_FALSE, scoreIndex = -1;
434 int i, scoreMax = 0, scoreIndex = -1;
435 439
436 for (i = 0; i < ndmC64ImageFormats; i++) 440 for (i = 0; i < ndmC64ImageFormats; i++)
437 { 441 {
438 DMC64ImageFormat *fmt = &dmC64ImageFormats[i]; 442 DMC64ImageFormat *fmt = &dmC64ImageFormats[i];
439 int score = fmt->probe(buf, len); 443 int score = fmt->probe(buf, len);
448 { 452 {
449 *pfmt = &dmC64ImageFormats[scoreIndex]; 453 *pfmt = &dmC64ImageFormats[scoreIndex];
450 return scoreMax; 454 return scoreMax;
451 } 455 }
452 else 456 else
453 return 0; 457 return DM_PROBE_SCORE_FALSE;
454 } 458 }
455 459
456 460
457 int dmC64DecodeGenericBMP(DMC64Image *img, const Uint8 *buf, 461 int dmC64DecodeGenericBMP(DMC64Image *img, const Uint8 *buf,
458 const size_t len, const DMC64ImageFormat *fmt) 462 const size_t len, const DMC64ImageFormat *fmt)
665 } 669 }
666 } 670 }
667 671
668 672
669 #define BUF_SIZE_INITIAL (16*1024) 673 #define BUF_SIZE_INITIAL (16*1024)
670 #define BUF_SIZE_GROW (2*1024) 674 #define BUF_SIZE_GROW (8*1024)
671 675
672 int dmReadDataFile(const char *filename, Uint8 **pbuf, size_t *pbufSize) 676 int dmReadDataFile(FILE *inFile, const char *filename, Uint8 **pbuf, size_t *pbufSize)
673 { 677 {
674 FILE *f; 678 FILE *f;
679 int res = DMERR_OK;
675 Uint8 *dataBuf = NULL, *dataPtr; 680 Uint8 *dataBuf = NULL, *dataPtr;
676 size_t bufSize, readSize, dataSize; 681 size_t readSize, dataSize, dataRead;
677 682
678 if (filename == NULL) 683 if (inFile != NULL)
679 f = stdin; 684 f = inFile;
680 else 685 else
681 if ((f = fopen(filename, "rb")) == NULL) 686 if (filename != NULL)
682 { 687 {
683 int err = errno; 688 if ((f = fopen(filename, "rb")) == NULL)
684 dmError("Could not open input file '%s': %d, %s\n", 689 {
685 filename, err, strerror(err)); 690 dmError("Could not open '%s' for reading.\n", filename);
686 return -1; 691 return DMERR_FOPEN;
687 } 692 }
688 693 }
689 readSize = bufSize = BUF_SIZE_INITIAL; 694 else
690 if ((dataBuf = dmMalloc(bufSize)) == NULL) 695 {
691 { 696 dmError("NULL filename and stream pointers.\n");
692 fclose(f); 697 return DMERR_NULLPTR;
693 dmError("Error allocating memory for data, %d bytes.\n", bufSize); 698 }
694 return -4; 699
700 // Allocate initial data buffer
701 readSize = dataSize = BUF_SIZE_INITIAL;
702 if ((dataBuf = dmMalloc(dataSize)) == NULL)
703 {
704 dmError("Error allocating memory for data, %d bytes.\n", dataSize);
705 res = DMERR_MALLOC;
706 goto error;
695 } 707 }
696 708
697 dataPtr = dataBuf; 709 dataPtr = dataBuf;
698 dataSize = 0; 710 dataRead = 0;
711 dataPtr += read;
712 dataRead += read;
699 713
700 while (!feof(f) && !ferror(f)) 714 while (!feof(f) && !ferror(f))
701 { 715 {
702 size_t read = fread(dataPtr, 1, readSize, f); 716 size_t read = fread(dataPtr, 1, readSize, f);
703 717
704 dataSize += read; 718 if (dataRead >= dataSize)
705 dataPtr += read;
706
707 if (read == readSize && !feof(f))
708 { 719 {
709 readSize = BUF_SIZE_GROW; 720 readSize = BUF_SIZE_GROW;
710 bufSize += BUF_SIZE_GROW; 721 dataSize += BUF_SIZE_GROW;
711 if ((dataBuf = dmRealloc(dataBuf, bufSize)) == NULL) 722 if ((dataBuf = dmRealloc(dataBuf, dataSize)) == NULL)
712 { 723 {
713 dmError("Error reallocating memory for data, %d bytes.\n", bufSize); 724 dmError("Error reallocating memory for data, %d bytes.\n", dataSize);
714 return -4; 725 res = DMERR_MALLOC;
726 goto error;
715 } 727 }
716 } 728 }
717 else 729 else
718 break; 730 break;
719 } 731 }
720 732
721 fclose(f); 733 *pbufSize = dataRead;
722
723 *pbuf = dataBuf; 734 *pbuf = dataBuf;
724 *pbufSize = dataSize; 735
725 736 error:
726 return 0; 737 if (f != inFile)
727 } 738 fclose(f);
739
740 return res;
741 }
742
743
744 int dmC64DecodeBMP(DMC64Image *img, const Uint8 *buf, const size_t len,
745 const size_t probeOffs, const size_t loadOffs,
746 DMC64ImageFormat **fmt, DMC64ImageFormat *forced)
747 {
748 // Check for forced format
749 if (forced != NULL)
750 *fmt = forced;
751 else
752 {
753 // Nope, perform a generic probe
754 if (probeOffs >= len)
755 return -200;
756
757 if (dmC64ProbeGeneric(buf + probeOffs, len - probeOffs, fmt) == DM_PROBE_SCORE_FALSE)
758 return -201;
759 }
760
761 if (loadOffs >= len)
762 return -203;
763
764 // Decode the bitmap to memory layout
765 if ((*fmt)->decode != NULL)
766 return (*fmt)->decode(img, buf + loadOffs, len - loadOffs, *fmt);
767 else
768 return dmC64DecodeGenericBMP(img, buf + loadOffs, len - loadOffs, *fmt);
769 }