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;