Mercurial > hg > dmlib
comparison tools/libgfx.c @ 2101:da886b8cbb09
Improve PPM/PGM/PNM probing and header parsing.
author | Matti Hamalainen <ccr@tnsp.org> |
---|---|
date | Wed, 06 Mar 2019 10:00:03 +0200 |
parents | 81fb21dd3265 |
children | 0905b2a87cbd |
comparison
equal
deleted
inserted
replaced
2100:81fb21dd3265 | 2101:da886b8cbb09 |
---|---|
804 // Write image data | 804 // Write image data |
805 return dmWriteImageData(img, (void *) fp, dmWritePPMRow, &tmpSpec); | 805 return dmWriteImageData(img, (void *) fp, dmWritePPMRow, &tmpSpec); |
806 } | 806 } |
807 | 807 |
808 | 808 |
809 // Read a PPM/PGM/PNM header line, skipping comments | |
810 static BOOL dmReadPPMHeader(DMResource *fp, char *buf, const size_t bufLen) | |
811 { | |
812 BOOL end = FALSE, comment = FALSE; | |
813 size_t offs = 0; | |
814 | |
815 do | |
816 { | |
817 int ch = dmfgetc(fp); | |
818 if (ch == EOF) | |
819 return FALSE; | |
820 else | |
821 if (ch == '#') | |
822 comment = TRUE; | |
823 else | |
824 if (ch == '\n') | |
825 { | |
826 if (!comment) | |
827 end = TRUE; | |
828 else | |
829 comment = FALSE; | |
830 } | |
831 else | |
832 if (!comment) | |
833 { | |
834 if (offs < bufLen - 1) | |
835 buf[offs++] = ch; | |
836 } | |
837 } while (!end); | |
838 | |
839 buf[offs] = 0; | |
840 return TRUE; | |
841 } | |
842 | |
843 | |
809 int dmReadPPMImage(DMResource *fp, DMImage **pimg) | 844 int dmReadPPMImage(DMResource *fp, DMImage **pimg) |
810 { | 845 { |
811 DMImage *img = NULL; | 846 DMImage *img = NULL; |
812 unsigned int width, height; | 847 unsigned int width, height; |
813 int itype, res = DMERR_OK; | 848 int itype, res = DMERR_OK; |
814 char hdr1[8], hdr2[32], hdr3[16]; | 849 char hdr1[8], hdr2[32], hdr3[16]; |
815 | 850 |
816 // Read PPM header | 851 // Read PPM header |
817 if (dmfgets(hdr1, sizeof(hdr1), fp) == NULL || | 852 if (!dmReadPPMHeader(fp, hdr1, sizeof(hdr1)) || |
818 dmfgets(hdr2, sizeof(hdr2), fp) == NULL || | 853 !dmReadPPMHeader(fp, hdr2, sizeof(hdr2)) || |
819 dmfgets(hdr3, sizeof(hdr3), fp) == NULL) | 854 !dmReadPPMHeader(fp, hdr3, sizeof(hdr3))) |
820 { | 855 { |
821 res = dmError(DMERR_FREAD, | 856 res = dmError(DMERR_FREAD, |
822 "PPM: Could not read image header data.\n"); | 857 "PPM: Could not read image header data.\n"); |
823 goto error; | 858 goto error; |
824 } | 859 } |
873 | 908 |
874 static int fmtProbePPM(const Uint8 *buf, const size_t len) | 909 static int fmtProbePPM(const Uint8 *buf, const size_t len) |
875 { | 910 { |
876 if (len > 32 && | 911 if (len > 32 && |
877 buf[0] == 'P' && | 912 buf[0] == 'P' && |
878 (buf[1] == '5' || buf[1] == '6') && | 913 (buf[1] == '5' || buf[1] == '6')) |
879 buf[2] == 0x0a && isdigit(buf[3])) | |
880 return DM_PROBE_SCORE_MAX; | 914 return DM_PROBE_SCORE_MAX; |
881 | 915 |
882 return DM_PROBE_SCORE_FALSE; | 916 return DM_PROBE_SCORE_FALSE; |
883 } | 917 } |
884 | 918 |