Mercurial > hg > dmlib
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 } |