# HG changeset patch # User Matti Hamalainen # Date 1589304420 -10800 # Node ID 5fcc9f7b8ad866d92c52461ac507d3e91d1e46f9 # Parent a40de347fcb0f9e8d3ee9191e7a3f30dd9fdc973 Change dmC64DecodeBMP() probeOffs and dataOffs to ssize_t, and use default values if negative values are provided. Also implement support for load-addressless formats. diff -r a40de347fcb0 -r 5fcc9f7b8ad8 tools/64vw.c --- a/tools/64vw.c Tue May 12 20:06:24 2020 +0300 +++ b/tools/64vw.c Tue May 12 20:27:00 2020 +0300 @@ -222,7 +222,7 @@ if (optProbeOnly) ret = dmC64ProbeBMP(&tmp, fmt) != DM_PROBE_SCORE_FALSE ? DMERR_OK : DMERR_NOT_SUPPORTED; else - ret = dmC64DecodeBMP(cimage, &tmp, 0, 2, fmt, forced); + ret = dmC64DecodeBMP(cimage, &tmp, -1, -1, fmt, forced); exit: dmFree(dataBuf); diff -r a40de347fcb0 -r 5fcc9f7b8ad8 tools/gfxconv.c --- a/tools/gfxconv.c Tue May 12 20:06:24 2020 +0300 +++ b/tools/gfxconv.c Tue May 12 20:27:00 2020 +0300 @@ -2770,7 +2770,7 @@ res = dmC64DecodeBMP(&inC64Image, dmGrowBufConstCreateFrom(&tbuf, dataBuf, dataSize), - 0, 2, &inC64Fmt, forced); + -1, -1, &inC64Fmt, forced); if (forced == NULL && inC64Fmt != NULL && res == DMERR_OK) { diff -r a40de347fcb0 -r 5fcc9f7b8ad8 tools/lib64gfx.c --- a/tools/lib64gfx.c Tue May 12 20:06:24 2020 +0300 +++ b/tools/lib64gfx.c Tue May 12 20:27:00 2020 +0300 @@ -1512,7 +1512,7 @@ int dmC64DecodeBMP(DMC64Image **img, const DMGrowBuf *buf, - const size_t probeOffs, const size_t loadOffs, + ssize_t probeOffs, ssize_t dataOffs, const DMC64ImageFormat **fmt, const DMC64ImageFormat *forced) { DMGrowBuf tmp; @@ -1526,7 +1526,10 @@ else { // Nope, perform a generic probe - if (probeOffs >= buf->len) + if (probeOffs < 0) + probeOffs = 0; + + if ((size_t) probeOffs >= buf->len) return DMERR_OUT_OF_DATA; dmGrowBufConstCopyOffs(&tmp, buf, probeOffs); @@ -1534,9 +1537,6 @@ return DMERR_NOT_SUPPORTED; } - if (loadOffs >= buf->len) - return DMERR_INVALID_ARGS; - if (*fmt == NULL) return DMERR_NOT_SUPPORTED; @@ -1548,7 +1548,14 @@ if ((*img = dmC64ImageAlloc(*fmt)) == NULL) return DMERR_MALLOC; - dmGrowBufConstCopyOffs(&tmp, buf, loadOffs); + // If the format has a loading address, adjust buffer + if (dataOffs < 0) + dataOffs = 2; + + if ((*fmt)->addr >= 0) + dmGrowBufConstCopyOffs(&tmp, buf, dataOffs); + else + dmGrowBufConstCopy(&tmp, buf); // Decode the bitmap to memory layout if ((*fmt)->decode != NULL) diff -r a40de347fcb0 -r 5fcc9f7b8ad8 tools/lib64gfx.h --- a/tools/lib64gfx.h Tue May 12 20:06:24 2020 +0300 +++ b/tools/lib64gfx.h Tue May 12 20:27:00 2020 +0300 @@ -424,7 +424,7 @@ int dmC64ConvertBMP2Image(DMImage **pdst, const DMC64Image *src, const DMC64ImageConvSpec *spec); int dmC64ConvertImage2BMP(DMC64Image **pdst, const DMImage *src, const DMC64ImageFormat *fmt, const DMC64ImageConvSpec *spec); -int dmC64DecodeBMP(DMC64Image **img, const DMGrowBuf *buf, const size_t probeOffs, const size_t loadOffs, const DMC64ImageFormat **fmt, const DMC64ImageFormat *forced); +int dmC64DecodeBMP(DMC64Image **img, const DMGrowBuf *buf, ssize_t probeOffs, ssize_t dataOffs, const DMC64ImageFormat **fmt, const DMC64ImageFormat *forced); int dmC64EncodeBMP(DMGrowBuf *buf, const DMC64Image *img, const DMC64ImageFormat *fmt); int dmGenericRLEAnalyze(const DMGrowBuf *buf, DMCompParams *cfg);