diff --git a/modules/imgfmt/HGImgFmt.cpp b/modules/imgfmt/HGImgFmt.cpp index 0924f85f..bdac07ef 100644 --- a/modules/imgfmt/HGImgFmt.cpp +++ b/modules/imgfmt/HGImgFmt.cpp @@ -5,6 +5,7 @@ #include "HGTiff.h" #include "HGPdf.h" #include "HGOfd.h" +#include "HGGif.h" #include "../base/HGInc.h" #include @@ -19,6 +20,7 @@ struct HGImgFmtReaderImpl std::string fileName; HGUInt fmtType; HGPointer handle; + HGGifLoadInfo gifLoadInfo; }; struct HGImgFmtWriterImpl @@ -91,6 +93,14 @@ HGResult HGAPI HGImgFmt_GetImgFmtType(const HGChar* fileName, HGUInt* fmtType) return HGBASE_ERR_OK; } + HGBool isGif = HGFALSE; + HGImgFmt_CheckGifFile(fileName, &isGif); + if (isGif) + { + *fmtType = HGIMGFMT_TYPE_GIF; + return HGBASE_ERR_OK; + } + return HGBASE_ERR_FAIL; } @@ -143,6 +153,12 @@ HGResult HGAPI HGImgFmt_GetImgFmtTypeFromFileName(const HGChar* fileName, HGUInt *fmtType = HGIMGFMT_TYPE_OFD; return HGBASE_ERR_OK; } + + if (0 == _stricmp(p, ".gif")) + { + *fmtType = HGIMGFMT_TYPE_GIF; + return HGBASE_ERR_OK; + } #else if (0 == strcasecmp(p, ".jpe") || 0 == strcasecmp(p, ".jpg") || 0 == strcasecmp(p, ".jpeg")) { @@ -179,6 +195,12 @@ HGResult HGAPI HGImgFmt_GetImgFmtTypeFromFileName(const HGChar* fileName, HGUInt *fmtType = HGIMGFMT_TYPE_OFD; return HGBASE_ERR_OK; } + + if (0 == strcasecmp(p, ".gif")) + { + *fmtType = HGIMGFMT_TYPE_GIF; + return HGBASE_ERR_OK; + } #endif return HGBASE_ERR_FAIL; @@ -186,7 +208,7 @@ HGResult HGAPI HGImgFmt_GetImgFmtTypeFromFileName(const HGChar* fileName, HGUInt HGResult HGAPI HGImgFmt_IsMultiImgFmtType(HGUInt fmtType, HGBool* isMulti) { - if (fmtType < HGIMGFMT_TYPE_JPEG || fmtType > HGIMGFMT_TYPE_OFD || NULL == isMulti) + if (fmtType < HGIMGFMT_TYPE_JPEG || fmtType > HGIMGFMT_TYPE_GIF || NULL == isMulti) { return HGBASE_ERR_INVALIDARG; } @@ -201,7 +223,7 @@ HGResult HGAPI HGImgFmt_IsMultiImgFmtType(HGUInt fmtType, HGBool* isMulti) HGResult HGAPI HGImgFmt_LoadImage(const HGChar* fileName, HGUInt fmtType, HGImgFmtLoadInfo* info, HGUInt imgType, HGUInt imgOrigin, HGImage* image) { - if (fmtType > HGIMGFMT_TYPE_OFD) + if (fmtType > HGIMGFMT_TYPE_GIF) { return HGBASE_ERR_INVALIDARG; } @@ -349,6 +371,26 @@ HGResult HGAPI HGImgFmt_LoadImage(const HGChar* fileName, HGUInt fmtType, HGImgF return HGBASE_ERR_OK; } + else if (HGIMGFMT_TYPE_GIF == fmtType) + { + HGGifLoadInfo gifInfo; + HGResult ret = HGImgFmt_LoadGifImage(fileName, &gifInfo, NULL, imgType, imgOrigin, image); + if (HGBASE_ERR_OK != ret) + { + return ret; + } + + if (NULL != info) + { + info->width = gifInfo.width; + info->height = gifInfo.height; + info->bpp = gifInfo.colorResolution; + info->xDpi = 0; + info->yDpi = 0; + } + + return HGBASE_ERR_OK; + } assert(0 == fmtType); @@ -465,12 +507,27 @@ HGResult HGAPI HGImgFmt_LoadImage(const HGChar* fileName, HGUInt fmtType, HGImgF return HGBASE_ERR_OK; } + HGGifLoadInfo gifInfo; + if (HGBASE_ERR_OK == HGImgFmt_LoadGifImage(fileName, &gifInfo, NULL, imgType, imgOrigin, image)) + { + if (NULL != info) + { + info->width = gifInfo.width; + info->height = gifInfo.height; + info->bpp = gifInfo.colorResolution; + info->xDpi = 0; + info->yDpi = 0; + } + + return HGBASE_ERR_OK; + } + return HGBASE_ERR_FAIL; } HGResult HGAPI HGImgFmt_SaveImage(HGImage image, HGUInt fmtType, const HGImgFmtSaveInfo* info, const HGChar* fileName) { - if (fmtType > HGIMGFMT_TYPE_OFD) + if (fmtType > HGIMGFMT_TYPE_GIF) { return HGBASE_ERR_INVALIDARG; } @@ -478,7 +535,7 @@ HGResult HGAPI HGImgFmt_SaveImage(HGImage image, HGUInt fmtType, const HGImgFmtS if (0 == fmtType) { HGImgFmt_GetImgFmtTypeFromFileName(fileName, &fmtType); - if (fmtType < HGIMGFMT_TYPE_JPEG || fmtType > HGIMGFMT_TYPE_OFD) + if (fmtType < HGIMGFMT_TYPE_JPEG || fmtType > HGIMGFMT_TYPE_GIF) { return HGBASE_ERR_INVALIDARG; } @@ -565,27 +622,31 @@ HGResult HGAPI HGImgFmt_SaveImage(HGImage image, HGUInt fmtType, const HGImgFmtS return HGImgFmt_SavePdfJpegImage(image, pJpegInfo, fileName); } - - assert(HGIMGFMT_TYPE_OFD == fmtType); - - HGJpegSaveInfo jpegInfo; - HGJpegSaveInfo* pJpegInfo = NULL; - - if (NULL != info) + else if (HGIMGFMT_TYPE_OFD == fmtType) { - jpegInfo.quality = info->jpegQuality; - jpegInfo.densityUnit = HGIMGFMT_JPEGDENUNIT_INCH; - jpegInfo.xDensity = xDpi; - jpegInfo.yDensity = yDpi; - pJpegInfo = &jpegInfo; + HGJpegSaveInfo jpegInfo; + HGJpegSaveInfo* pJpegInfo = NULL; + + if (NULL != info) + { + jpegInfo.quality = info->jpegQuality; + jpegInfo.densityUnit = HGIMGFMT_JPEGDENUNIT_INCH; + jpegInfo.xDensity = xDpi; + jpegInfo.yDensity = yDpi; + pJpegInfo = &jpegInfo; + } + + return HGImgFmt_SaveOfdJpegImage(image, pJpegInfo, fileName); } - return HGImgFmt_SaveOfdJpegImage(image, pJpegInfo, fileName); + assert(HGIMGFMT_TYPE_GIF == fmtType); + + return HGImgFmt_SaveGifImage(image, NULL, 0, fileName); } HGResult HGAPI HGImgFmt_OpenImageReader(const HGChar* fileName, HGUInt fmtType, HGImgFmtReader* reader) { - if (NULL == fileName || fmtType > HGIMGFMT_TYPE_OFD || NULL == reader) + if (NULL == fileName || fmtType > HGIMGFMT_TYPE_GIF || NULL == reader) { return HGBASE_ERR_INVALIDARG; } @@ -648,6 +709,24 @@ HGResult HGAPI HGImgFmt_OpenImageReader(const HGChar* fileName, HGUInt fmtType, *reader = (HGImgFmtReader)imgFmtReaderImpl; return HGBASE_ERR_OK; } + else if (HGIMGFMT_TYPE_GIF == fmtType) + { + HGGifLoadInfo gifLoadInfo; + HGGifReader gifReader = NULL; + HGResult ret = HGImgFmt_OpenGifReader(fileName, &gifLoadInfo, &gifReader); + if (HGBASE_ERR_OK != ret) + { + return ret; + } + + HGImgFmtReaderImpl* imgFmtReaderImpl = new HGImgFmtReaderImpl; + imgFmtReaderImpl->fileName = fileName; + imgFmtReaderImpl->fmtType = fmtType; + imgFmtReaderImpl->handle = gifReader; + memcpy(&imgFmtReaderImpl->gifLoadInfo, &gifLoadInfo, sizeof(HGGifLoadInfo)); + *reader = (HGImgFmtReader)imgFmtReaderImpl; + return HGBASE_ERR_OK; + } assert(0 == fmtType); @@ -723,6 +802,20 @@ HGResult HGAPI HGImgFmt_OpenImageReader(const HGChar* fileName, HGUInt fmtType, return HGBASE_ERR_OK; } + HGGifLoadInfo gifLoadInfo; + HGGifReader gifReader = NULL; + ret = HGImgFmt_OpenGifReader(fileName, &gifLoadInfo, &gifReader); + if (HGBASE_ERR_OK == ret) + { + HGImgFmtReaderImpl* imgFmtReaderImpl = new HGImgFmtReaderImpl; + imgFmtReaderImpl->fileName = fileName; + imgFmtReaderImpl->fmtType = HGIMGFMT_TYPE_GIF; + imgFmtReaderImpl->handle = gifReader; + memcpy(&imgFmtReaderImpl->gifLoadInfo, &gifLoadInfo, sizeof(HGGifLoadInfo)); + *reader = (HGImgFmtReader)imgFmtReaderImpl; + return HGBASE_ERR_OK; + } + return HGBASE_ERR_FAIL; } @@ -740,6 +833,8 @@ HGResult HGAPI HGImgFmt_CloseImageReader(HGImgFmtReader reader) HGImgFmt_ClosePdfReader((HGPdfReader)imgFmtReaderImpl->handle); else if (HGIMGFMT_TYPE_OFD == imgFmtReaderImpl->fmtType) HGImgFmt_CloseOfdReader((HGOfdReader)imgFmtReaderImpl->handle); + else if (HGIMGFMT_TYPE_GIF == imgFmtReaderImpl->fmtType) + HGImgFmt_CloseGifReader((HGGifReader)imgFmtReaderImpl->handle); delete imgFmtReaderImpl; return HGBASE_ERR_OK; @@ -759,6 +854,11 @@ HGResult HGAPI HGImgFmt_GetImagePageCount(HGImgFmtReader reader, HGUInt* count) return HGImgFmt_GetPdfPageCount((HGPdfReader)imgFmtReaderImpl->handle, count); else if (HGIMGFMT_TYPE_OFD == imgFmtReaderImpl->fmtType) return HGImgFmt_GetOfdPageCount((HGOfdReader)imgFmtReaderImpl->handle, count); + else if (HGIMGFMT_TYPE_GIF == imgFmtReaderImpl->fmtType) + { + *count = imgFmtReaderImpl->gifLoadInfo.imageCount; + return HGBASE_ERR_OK; + } *count = 1; return HGBASE_ERR_OK; @@ -912,30 +1012,65 @@ HGResult HGAPI HGImgFmt_LoadImageFromReader(HGImgFmtReader reader, HGUInt index, return HGBASE_ERR_OK; } - - assert(HGIMGFMT_TYPE_OFD == imgFmtReaderImpl->fmtType); - - HGResult ret = HGImgFmt_LoadImageFromOfdReader((HGOfdReader)imgFmtReaderImpl->handle, index, 1.0f, 1.0f, imgType, imgOrigin, image); - if (HGBASE_ERR_OK != ret) + else if (HGIMGFMT_TYPE_OFD == imgFmtReaderImpl->fmtType) { - return ret; + HGResult ret = HGImgFmt_LoadImageFromOfdReader((HGOfdReader)imgFmtReaderImpl->handle, index, 1.0f, 1.0f, imgType, imgOrigin, image); + if (HGBASE_ERR_OK != ret) + { + return ret; + } + + if (NULL != info) + { + info->width = 0; + info->height = 0; + info->bpp = 0; + info->xDpi = 0; + info->yDpi = 0; + } + + return HGBASE_ERR_OK; + } + + assert(HGIMGFMT_TYPE_GIF == imgFmtReaderImpl->fmtType); + + if (NULL == image) + { + if (0 != imgType || 0 != imgOrigin) + { + return HGBASE_ERR_INVALIDARG; + } + } + + if (index >= imgFmtReaderImpl->gifLoadInfo.imageCount) + { + return HGBASE_ERR_INVALIDARG; } if (NULL != info) { - info->width = 0; - info->height = 0; - info->bpp = 0; + info->width = imgFmtReaderImpl->gifLoadInfo.width; + info->height = imgFmtReaderImpl->gifLoadInfo.height; + info->bpp = imgFmtReaderImpl->gifLoadInfo.colorResolution; info->xDpi = 0; info->yDpi = 0; } + if (NULL != image) + { + HGResult ret = HGImgFmt_LoadImageFromGifReader((HGGifReader)imgFmtReaderImpl->handle, index, NULL, imgType, imgOrigin, image); + if (HGBASE_ERR_OK != ret) + { + return ret; + } + } + return HGBASE_ERR_OK; } HGResult HGAPI HGImgFmt_OpenImageWriter(const HGChar* fileName, HGUInt fmtType, HGImgFmtWriter* writer) { - if (fmtType > HGIMGFMT_TYPE_OFD || NULL == writer) + if (fmtType > HGIMGFMT_TYPE_GIF || NULL == writer) { return HGBASE_ERR_INVALIDARG; } @@ -943,7 +1078,7 @@ HGResult HGAPI HGImgFmt_OpenImageWriter(const HGChar* fileName, HGUInt fmtType, if (0 == fmtType) { HGImgFmt_GetImgFmtTypeFromFileName(fileName, &fmtType); - if (fmtType < HGIMGFMT_TYPE_JPEG || fmtType > HGIMGFMT_TYPE_OFD) + if (fmtType < HGIMGFMT_TYPE_JPEG || fmtType > HGIMGFMT_TYPE_GIF) { return HGBASE_ERR_INVALIDARG; } @@ -994,11 +1129,28 @@ HGResult HGAPI HGImgFmt_OpenImageWriter(const HGChar* fileName, HGUInt fmtType, *writer = (HGImgFmtWriter)imgFmtWriterImpl; return HGBASE_ERR_OK; } + else if (HGIMGFMT_TYPE_OFD == fmtType) + { + HGOfdImageWriter ofdWriter = NULL; + HGResult ret = HGImgFmt_OpenOfdImageWriter(fileName, &ofdWriter); + if (HGBASE_ERR_OK != ret) + { + return ret; + } - assert(HGIMGFMT_TYPE_OFD == fmtType); + HGImgFmtWriterImpl* imgFmtWriterImpl = new HGImgFmtWriterImpl; + imgFmtWriterImpl->fileName = fileName; + imgFmtWriterImpl->fmtType = fmtType; + imgFmtWriterImpl->handle = ofdWriter; + imgFmtWriterImpl->write = HGFALSE; + *writer = (HGImgFmtWriter)imgFmtWriterImpl; + return HGBASE_ERR_OK; + } - HGOfdImageWriter ofdWriter = NULL; - HGResult ret = HGImgFmt_OpenOfdImageWriter(fileName, &ofdWriter); + assert(HGIMGFMT_TYPE_GIF == fmtType); + + HGGifWriter gifWriter = NULL; + HGResult ret = HGImgFmt_OpenGifWriter(fileName, NULL, &gifWriter); if (HGBASE_ERR_OK != ret) { return ret; @@ -1007,7 +1159,7 @@ HGResult HGAPI HGImgFmt_OpenImageWriter(const HGChar* fileName, HGUInt fmtType, HGImgFmtWriterImpl* imgFmtWriterImpl = new HGImgFmtWriterImpl; imgFmtWriterImpl->fileName = fileName; imgFmtWriterImpl->fmtType = fmtType; - imgFmtWriterImpl->handle = ofdWriter; + imgFmtWriterImpl->handle = gifWriter; imgFmtWriterImpl->write = HGFALSE; *writer = (HGImgFmtWriter)imgFmtWriterImpl; return HGBASE_ERR_OK; @@ -1027,6 +1179,8 @@ HGResult HGAPI HGImgFmt_CloseImageWriter(HGImgFmtWriter writer) HGImgFmt_ClosePdfImageWriter((HGPdfImageWriter)imgFmtWriterImpl->handle); else if (HGIMGFMT_TYPE_OFD == imgFmtWriterImpl->fmtType) HGImgFmt_CloseOfdImageWriter((HGOfdImageWriter)imgFmtWriterImpl->handle); + else if (HGIMGFMT_TYPE_GIF == imgFmtWriterImpl->fmtType) + HGImgFmt_CloseGifWriter((HGGifWriter)imgFmtWriterImpl->handle); delete imgFmtWriterImpl; return HGBASE_ERR_OK; @@ -1154,20 +1308,24 @@ HGResult HGAPI HGImgFmt_SaveImageToWriter(HGImgFmtWriter writer, HGImage image, return HGImgFmt_SaveJpegImageToPdfImageWriter((HGPdfImageWriter)imgFmtWriterImpl->handle, image, pJpegInfo); } - - assert(HGIMGFMT_TYPE_OFD == imgFmtWriterImpl->fmtType); - - HGJpegSaveInfo jpegInfo; - HGJpegSaveInfo* pJpegInfo = NULL; - - if (NULL != info) + else if (HGIMGFMT_TYPE_OFD == imgFmtWriterImpl->fmtType) { - jpegInfo.quality = info->jpegQuality; - jpegInfo.densityUnit = HGIMGFMT_JPEGDENUNIT_INCH; - jpegInfo.xDensity = xDpi; - jpegInfo.yDensity = yDpi; - pJpegInfo = &jpegInfo; + HGJpegSaveInfo jpegInfo; + HGJpegSaveInfo* pJpegInfo = NULL; + + if (NULL != info) + { + jpegInfo.quality = info->jpegQuality; + jpegInfo.densityUnit = HGIMGFMT_JPEGDENUNIT_INCH; + jpegInfo.xDensity = xDpi; + jpegInfo.yDensity = yDpi; + pJpegInfo = &jpegInfo; + } + + return HGImgFmt_SaveJpegImageToOfdImageWriter((HGOfdImageWriter)imgFmtWriterImpl->handle, image, pJpegInfo); } - return HGImgFmt_SaveJpegImageToOfdImageWriter((HGOfdImageWriter)imgFmtWriterImpl->handle, image, pJpegInfo); + assert(HGIMGFMT_TYPE_GIF == imgFmtWriterImpl->fmtType); + + return HGImgFmt_SaveImageToGifWriter((HGGifWriter)imgFmtWriterImpl->handle, 0, image); } \ No newline at end of file diff --git a/modules/imgfmt/HGImgFmt.h b/modules/imgfmt/HGImgFmt.h index 32eb29f3..9676541e 100644 --- a/modules/imgfmt/HGImgFmt.h +++ b/modules/imgfmt/HGImgFmt.h @@ -22,6 +22,8 @@ HG_DECLARE_HANDLE(HGImgFmtWriter); #define HGIMGFMT_TYPE_PDF 5L /* OFD */ #define HGIMGFMT_TYPE_OFD 6L +/* GIF */ +#define HGIMGFMT_TYPE_GIF 7L typedef struct { diff --git a/third_party/giflib/windows/lib/x64/giflib.lib b/third_party/giflib/windows/lib/x64/giflib.lib index a8df9809..541d7228 100644 Binary files a/third_party/giflib/windows/lib/x64/giflib.lib and b/third_party/giflib/windows/lib/x64/giflib.lib differ diff --git a/third_party/giflib/windows/lib/x86/giflib.lib b/third_party/giflib/windows/lib/x86/giflib.lib index 723a4d56..7b4314a6 100644 Binary files a/third_party/giflib/windows/lib/x86/giflib.lib and b/third_party/giflib/windows/lib/x86/giflib.lib differ