diff --git a/build/windows/HGImgFmt/HGImgFmt.def b/build/windows/HGImgFmt/HGImgFmt.def index 0cd4ae61..53843e1a 100644 --- a/build/windows/HGImgFmt/HGImgFmt.def +++ b/build/windows/HGImgFmt/HGImgFmt.def @@ -74,3 +74,7 @@ HGImgFmt_OpenOfdImageWriter HGImgFmt_CloseOfdImageWriter HGImgFmt_SaveJpegImageToOfdImageWriter HGImgFmt_SaveOfdJpegImage + +HGImgFmt_CheckPnmFile +HGImgFmt_LoadPnmImage +HGImgFmt_SavePnmImage diff --git a/build/windows/HGImgFmt/HGImgFmt.vcxproj b/build/windows/HGImgFmt/HGImgFmt.vcxproj index c85b5931..58c10812 100644 --- a/build/windows/HGImgFmt/HGImgFmt.vcxproj +++ b/build/windows/HGImgFmt/HGImgFmt.vcxproj @@ -47,6 +47,7 @@ + @@ -61,6 +62,7 @@ + diff --git a/build/windows/HGTest/pch.h b/build/windows/HGTest/pch.h index c9162a8e..5a011805 100644 --- a/build/windows/HGTest/pch.h +++ b/build/windows/HGTest/pch.h @@ -18,6 +18,7 @@ #include "imgfmt/HGGif.h" #include "imgfmt/HGPdf.h" #include "imgfmt/HGOfd.h" +#include "imgfmt/HGPnm.h" #include "imgfmt/HGImgFmt.h" #include "imgproc/HGImgProc.h" #include "imgproc/HGOCR.h" diff --git a/modules/imgfmt/HGBmp.cpp b/modules/imgfmt/HGBmp.cpp index 0f5b7871..67087e4f 100644 --- a/modules/imgfmt/HGBmp.cpp +++ b/modules/imgfmt/HGBmp.cpp @@ -71,7 +71,7 @@ HGResult HGAPI HGImgFmt_LoadBmpImage(const HGChar* fileName, HGBmpLoadInfo* info return HGBASE_ERR_INVALIDARG; } - if (HGBASE_IMGORIGIN_TOP != imgOrigin && HGBASE_IMGORIGIN_BOTTOM != imgOrigin) + if (0 != imgOrigin && HGBASE_IMGORIGIN_TOP != imgOrigin && HGBASE_IMGORIGIN_BOTTOM != imgOrigin) { return HGBASE_ERR_INVALIDARG; } @@ -194,6 +194,11 @@ HGResult HGAPI HGImgFmt_LoadBmpImage(const HGChar* fileName, HGBmpLoadInfo* info } } + if (imgOrigin == 0) + { + imgOrigin = HGBASE_IMGORIGIN_TOP; + } + HGImageInfo bmpImageInfo; bmpImageInfo.width = bmp.width; bmpImageInfo.height = bmp.height; diff --git a/modules/imgfmt/HGGif.cpp b/modules/imgfmt/HGGif.cpp index dd6ce4a5..624b4d83 100644 --- a/modules/imgfmt/HGGif.cpp +++ b/modules/imgfmt/HGGif.cpp @@ -648,7 +648,7 @@ HGResult HGAPI HGImgFmt_LoadImageFromGifReader(HGGifReader reader, HGUInt index, return HGBASE_ERR_INVALIDARG; } - if (HGBASE_IMGORIGIN_TOP != imgOrigin && HGBASE_IMGORIGIN_BOTTOM != imgOrigin) + if (0 != imgOrigin && HGBASE_IMGORIGIN_TOP != imgOrigin && HGBASE_IMGORIGIN_BOTTOM != imgOrigin) { return HGBASE_ERR_INVALIDARG; } @@ -664,6 +664,11 @@ HGResult HGAPI HGImgFmt_LoadImageFromGifReader(HGGifReader reader, HGUInt index, imgType = HGBASE_IMGTYPE_RGB; } + if (imgOrigin == 0) + { + imgOrigin = HGBASE_IMGORIGIN_TOP; + } + if (index < gifReaderImpl->m_curIndex) { gifReaderImpl->m_curIndex = 0xFFFFFFFF; diff --git a/modules/imgfmt/HGJpeg.cpp b/modules/imgfmt/HGJpeg.cpp index 0c36280b..e3f9cef4 100644 --- a/modules/imgfmt/HGJpeg.cpp +++ b/modules/imgfmt/HGJpeg.cpp @@ -57,7 +57,7 @@ HGResult HGAPI HGImgFmt_LoadJpegImage(const HGChar* fileName, HGJpegLoadInfo* in return HGBASE_ERR_INVALIDARG; } - if (HGBASE_IMGORIGIN_TOP != imgOrigin && HGBASE_IMGORIGIN_BOTTOM != imgOrigin) + if (0 != imgOrigin && HGBASE_IMGORIGIN_TOP != imgOrigin && HGBASE_IMGORIGIN_BOTTOM != imgOrigin) { return HGBASE_ERR_INVALIDARG; } @@ -112,6 +112,11 @@ HGResult HGAPI HGImgFmt_LoadJpegImage(const HGChar* fileName, HGJpegLoadInfo* in imgType = HGBASE_IMGTYPE_GRAY; } + if (0 == imgOrigin) + { + imgOrigin = HGBASE_IMGORIGIN_TOP; + } + cinfo.out_color_space = JCS_RGB; jpeg_start_decompress(&cinfo); @@ -183,7 +188,7 @@ HGResult HGAPI HGImgFmt_LoadJpegImageFromBuffer(HGBuffer buffer, HGJpegLoadInfo* return HGBASE_ERR_INVALIDARG; } - if (HGBASE_IMGORIGIN_TOP != imgOrigin && HGBASE_IMGORIGIN_BOTTOM != imgOrigin) + if (0 != imgOrigin && HGBASE_IMGORIGIN_TOP != imgOrigin && HGBASE_IMGORIGIN_BOTTOM != imgOrigin) { return HGBASE_ERR_INVALIDARG; } @@ -235,6 +240,11 @@ HGResult HGAPI HGImgFmt_LoadJpegImageFromBuffer(HGBuffer buffer, HGJpegLoadInfo* imgType = HGBASE_IMGTYPE_GRAY; } + if (0 == imgOrigin) + { + imgOrigin = HGBASE_IMGORIGIN_TOP; + } + cinfo.out_color_space = JCS_RGB; jpeg_start_decompress(&cinfo); diff --git a/modules/imgfmt/HGOfdImpl.cpp b/modules/imgfmt/HGOfdImpl.cpp index 577257fb..4ccbb3f5 100644 --- a/modules/imgfmt/HGOfdImpl.cpp +++ b/modules/imgfmt/HGOfdImpl.cpp @@ -293,7 +293,7 @@ HGResult HGOfdReaderImpl::LoadImage(HGUInt page, HGFloat xScale, HGFloat yScale, return HGBASE_ERR_FAIL; } - if (HGBASE_IMGORIGIN_TOP != imgOrigin && HGBASE_IMGORIGIN_BOTTOM != imgOrigin) + if (0 != imgOrigin && HGBASE_IMGORIGIN_TOP != imgOrigin && HGBASE_IMGORIGIN_BOTTOM != imgOrigin) { return HGBASE_ERR_INVALIDARG; } diff --git a/modules/imgfmt/HGPdfImpl.cpp b/modules/imgfmt/HGPdfImpl.cpp index 1e5d209f..545c7fc8 100644 --- a/modules/imgfmt/HGPdfImpl.cpp +++ b/modules/imgfmt/HGPdfImpl.cpp @@ -185,7 +185,7 @@ HGResult HGPdfReaderImpl::LoadImage(HGUInt page, HGFloat xScale, HGFloat yScale, return HGBASE_ERR_FAIL; } - if (HGBASE_IMGORIGIN_TOP != imgOrigin && HGBASE_IMGORIGIN_BOTTOM != imgOrigin) + if (0 != imgOrigin && HGBASE_IMGORIGIN_TOP != imgOrigin && HGBASE_IMGORIGIN_BOTTOM != imgOrigin) { return HGBASE_ERR_INVALIDARG; } @@ -210,6 +210,9 @@ HGResult HGPdfReaderImpl::LoadImage(HGUInt page, HGFloat xScale, HGFloat yScale, if (0 == imgType) imgType = HGBASE_IMGTYPE_RGB; + if (imgOrigin == 0) + imgOrigin = HGBASE_IMGORIGIN_TOP; + HGImage image2 = NULL; HGImageInfo imgInfo = { (uint32_t)width, (uint32_t)height, HGBASE_IMGTYPE_RGB, (uint32_t)pix->stride, HGBASE_IMGORIGIN_TOP }; if (HGBASE_ERR_OK == HGBase_CreateImageWithData(pix->samples, &imgInfo, &image2)) diff --git a/modules/imgfmt/HGPng.cpp b/modules/imgfmt/HGPng.cpp index fbf41546..e3d9ae83 100644 --- a/modules/imgfmt/HGPng.cpp +++ b/modules/imgfmt/HGPng.cpp @@ -42,7 +42,7 @@ HGResult HGAPI HGImgFmt_LoadPngImage(const HGChar* fileName, HGPngLoadInfo* info return HGBASE_ERR_INVALIDARG; } - if (HGBASE_IMGORIGIN_TOP != imgOrigin && HGBASE_IMGORIGIN_BOTTOM != imgOrigin) + if (0 != imgOrigin && HGBASE_IMGORIGIN_TOP != imgOrigin && HGBASE_IMGORIGIN_BOTTOM != imgOrigin) { return HGBASE_ERR_INVALIDARG; } @@ -171,6 +171,11 @@ HGResult HGAPI HGImgFmt_LoadPngImage(const HGChar* fileName, HGPngLoadInfo* info } } + if (imgOrigin == 0) + { + imgOrigin = HGBASE_IMGORIGIN_TOP; + } + if (HGBASE_ERR_OK != HGBase_CreateImage(info_ptr->width, info_ptr->height, HGBASE_IMGTYPE_RGBA, HGBASE_IMGORIGIN_TOP, &image2)) { longjmp(png_jmpbuf(png_ptr), (int)HGBASE_ERR_FAIL); diff --git a/modules/imgfmt/HGPnm.cpp b/modules/imgfmt/HGPnm.cpp index 3c5bc471..8a44bd4e 100644 --- a/modules/imgfmt/HGPnm.cpp +++ b/modules/imgfmt/HGPnm.cpp @@ -1,5 +1,6 @@ -#include "HGPnm.h" +#include "HGPnm.h" #include "../base/HGInc.h" +#include HGResult HGAPI HGImgFmt_CheckPnmFile(const HGChar* fileName, HGBool* isPnm) { @@ -14,149 +15,146 @@ HGResult HGAPI HGImgFmt_CheckPnmFile(const HGChar* fileName, HGBool* isPnm) return HGBASE_ERR_OK; } -static HGResult bnm_load_P6(FILE &file, HGPnmLoadInfo* info, HGUInt imgType, HGUInt imgOrigin, HGImage* image) +static HGResult BnmLoadP6Info(FILE* file, HGUInt *width, HGUInt *height, HGUInt *maxColor) { - HGChar c; - HGInt rgbMaxColor, width, height; + assert(NULL != file && NULL != width && NULL != height && NULL != maxColor); - c = getc(&file); - while (c == '#') - { - while (getc(&file) != '\n'); - c = getc(&file); - } - ungetc(c, &file); + bool getWidth = false; + bool getHeight = false; + bool getMaxColor = false; + std::vector buf; - while (c == '\n' || c == '\r' || c == '\t' || c == ' ') + while (1) { - c = fgetc(&file); - while (c == '#') + HGByte c = 0; + if (1 != fread(&c, 1, 1, file)) { - while (getc(&file) != '\n'); - c = getc(&file); + return HGBASE_ERR_INVALIDDATA; } - - } - ungetc(c, &file); - fscanf(&file, "%d", &width); - - c = getc(&file); - while (c == '\n' || c == '\r' || c == '\t' || c == ' ') - { - c = fgetc(&file); - while (c == '#') + if (c == '#' || c == '\n' || c == '\r' || c == '\t' || c == ' ') { - while (getc(&file) != '\n'); - c = getc(&file); + if (!buf.empty()) + { + buf.push_back(0); + + if (!getWidth) + { + *width = atoi(&buf[0]); + if (*width == 0) + return HGBASE_ERR_INVALIDDATA; + getWidth = true; + } + else if (!getHeight) + { + *height = atoi(&buf[0]); + if (*height == 0) + return HGBASE_ERR_INVALIDDATA; + getHeight = true; + } + else if (!getMaxColor) + { + *maxColor = atoi(&buf[0]); + if (*maxColor == 0) + return HGBASE_ERR_INVALIDDATA; + getMaxColor = true; + } + + buf.clear(); + } + + if (c == '#') + { + while (c != '\n') + { + if (1 != fread(&c, 1, 1, file)) + { + return HGBASE_ERR_INVALIDDATA; + } + } + } + } + else if (c >= '0' && c <= '9') + { + buf.push_back(c); + } + else + { + return HGBASE_ERR_INVALIDDATA; + } + + if (getMaxColor) + { + break; } } - ungetc(c, &file); - fscanf(&file, "%d", &height); - if (width <= 0 || height <= 0) + return HGBASE_ERR_OK; +} + +static HGResult BnmLoadP6Image(FILE* file, HGPnmLoadInfo* info, HGUInt imgType, HGUInt imgOrigin, HGImage* image) +{ + HGUInt width, height, maxColor; + HGResult ret = BnmLoadP6Info(file , &width, &height, &maxColor); + if (HGBASE_ERR_OK != ret || 255 != maxColor) { - return HGBASE_ERR_INVALIDARG; + return ret; } - c = getc(&file); - while (c == '\n' || c == '\r' || c == '\t' || c == ' ') - { - c = fgetc(&file); - while (c == '#') - { - while (getc(&file) != '\n'); - c = getc(&file); - } - } - ungetc(c, &file); - - fscanf(&file, "%d", &rgbMaxColor); - - if (rgbMaxColor <= 0) - { - return HGBASE_ERR_INVALIDARG; - } - - c = fgetc(&file); - while (c == '\n' || c == '\r' || c == '\t' || c == ' ') - { - c = fgetc(&file); - while (c == '#') - { - while (getc(&file) != '\n'); - c = getc(&file); - } - } - ungetc(c, &file); - - _fseeki64(&file, 0, SEEK_CUR); - uint64_t headerSize = _ftelli64(&file); - - _fseeki64(&file, 0, SEEK_END); - uint64_t totalSize = _ftelli64(&file); - - if (0 == headerSize || 0 == totalSize) - { - fclose(&file); - return HGBASE_ERR_FAIL; - } - - size_t dataSize = (size_t)totalSize - (size_t)headerSize; - uint8_t* buffer = (uint8_t*)malloc(dataSize); - if (NULL == buffer) - { - fclose(&file); - return HGBASE_ERR_FAIL; - } - - _fseeki64(&file, headerSize, SEEK_SET); - size_t readSize = fread(buffer, 1, dataSize, &file); - if (readSize != dataSize || dataSize != (size_t)width * (size_t)height * 3) - { - free(buffer); - buffer = NULL; - fclose(&file); - return HGBASE_ERR_FAIL; - } - - HGImage image2 = NULL; - - if (info != NULL) + if (NULL != info) { info->width = width; info->height = height; info->type = HGIMGFMT_PNMTYPE_RGB_BINRAY; } - if (image != NULL) + if (NULL != image) { if (imgType == 0) { imgType = HGBASE_IMGTYPE_RGB; - } - HGBase_CreateImage(width, height, HGBASE_IMGTYPE_RGB, HGBASE_IMGORIGIN_TOP, &image2); + if (imgOrigin == 0) + { + imgOrigin = HGBASE_IMGORIGIN_TOP; + } + + HGImage image2 = NULL; + ret = HGBase_CreateImage(width, height, HGBASE_IMGTYPE_RGB, HGBASE_IMGORIGIN_TOP, &image2); + if (HGBASE_ERR_OK != ret) + { + return ret; + } uint8_t* data; HGBase_GetImageData(image2, &data); HGImageInfo imgInfo; HGBase_GetImageInfo(image2, &imgInfo); - memcpy(data, buffer, dataSize); - - if(HGBASE_ERR_OK != HGBase_CloneImage(image2, imgType, imgOrigin, image)) + HGByte* buf = new HGByte[width * 3]; + for (HGUInt i = 0; i < height; ++i) { - return HGBASE_ERR_FAIL; + if (width * 3 != fread(buf, 1, width * 3, file)) + { + delete[] buf; + HGBase_DestroyImage(image2); + return HGBASE_ERR_INVALIDDATA; + } + + memcpy(data + i * imgInfo.widthStep, buf, width * 3); + } + delete[] buf; + + ret = HGBase_CloneImage(image2, imgType, imgOrigin, image); + HGBase_DestroyImage(image2); + + if (HGBASE_ERR_OK != ret) + { + return ret; } } - HGBase_DestroyImage(image2); - image2 = NULL; - free(buffer); - buffer = NULL; - fclose(&file); return HGBASE_ERR_OK; } @@ -184,7 +182,7 @@ HGResult HGAPI HGImgFmt_LoadPnmImage(const HGChar* fileName, HGPnmLoadInfo* info return HGBASE_ERR_INVALIDARG; } - if (HGBASE_IMGORIGIN_TOP != imgOrigin && HGBASE_IMGORIGIN_BOTTOM != imgOrigin) + if (0 != imgOrigin && HGBASE_IMGORIGIN_TOP != imgOrigin && HGBASE_IMGORIGIN_BOTTOM != imgOrigin) { return HGBASE_ERR_INVALIDARG; } @@ -196,42 +194,20 @@ HGResult HGAPI HGImgFmt_LoadPnmImage(const HGChar* fileName, HGPnmLoadInfo* info return HGBASE_ERR_ACCESSDENIED; } - HGChar header[1024] = {0}; - HGChar c = NULL; - - c = getc(file); - while (c == '#') - { - while (getc(file) != '\n'); - c = getc(file); - } - - while (c == '\n' || c == '\r' || c == '\t' || c == ' ') - { - c = getc(file); - while (c == '#') - { - while (getc(file) != '\n'); - c = getc(file); - } - } - if (c != 'P') + HGByte magicKey[2] = {0}; + if (2 != fread(magicKey, 1, 2, file)) { return HGBASE_ERR_INVALIDDATA; } - else - { - c = getc(file); - if (c < '1' || c > '6') - { - return HGBASE_ERR_INVALIDDATA; - } - if (c == '6') - { - bnm_load_P6(*file, info, imgType, imgOrigin, image); - } + HGResult ret = HGBASE_ERR_INVALIDDATA; + if (magicKey[0] == 'P' && magicKey[1] == '6') + { + ret = BnmLoadP6Image(file, info, imgType, imgOrigin, image); } + + fclose(file); + return ret; } HGResult HGAPI HGImgFmt_SavePnmImage(HGImage image, const HGPnmSaveInfo* info, const HGChar* fileName) diff --git a/modules/imgfmt/HGPnm.h b/modules/imgfmt/HGPnm.h index 903a5416..562679d8 100644 --- a/modules/imgfmt/HGPnm.h +++ b/modules/imgfmt/HGPnm.h @@ -1,5 +1,5 @@ -#ifndef __HGPnm_H__ -#define __HGPnm_H__ +#ifndef __HGPNM_H__ +#define __HGPNM_H__ #include "../base/HGDef.h" #include "../base/HGBaseErr.h" @@ -38,4 +38,4 @@ HGEXPORT HGResult HGAPI HGImgFmt_LoadPnmImage(const HGChar* fileName, HGPnmLoadI HGEXPORT HGResult HGAPI HGImgFmt_SavePnmImage(HGImage image, const HGPnmSaveInfo* info, const HGChar* fileName); -#endif // __HGPnm_H__ +#endif // __HGPNM_H__ diff --git a/modules/imgfmt/HGTiff.cpp b/modules/imgfmt/HGTiff.cpp index c1fe8021..a78bd4cb 100644 --- a/modules/imgfmt/HGTiff.cpp +++ b/modules/imgfmt/HGTiff.cpp @@ -85,7 +85,7 @@ HGResult HGAPI HGImgFmt_LoadImageFromTiffReader(HGTiffReader reader, HGUInt inde return HGBASE_ERR_INVALIDARG; } - if (HGBASE_IMGORIGIN_TOP != imgOrigin && HGBASE_IMGORIGIN_BOTTOM != imgOrigin) + if (0 != imgOrigin && HGBASE_IMGORIGIN_TOP != imgOrigin && HGBASE_IMGORIGIN_BOTTOM != imgOrigin) { return HGBASE_ERR_INVALIDARG; } @@ -158,6 +158,11 @@ HGResult HGAPI HGImgFmt_LoadImageFromTiffReader(HGTiffReader reader, HGUInt inde } } + if (imgOrigin == 0) + { + imgOrigin = HGBASE_IMGORIGIN_TOP; + } + HGImageInfo tiffImageInfo; tiffImageInfo.width = width; tiffImageInfo.height = height;