diff --git a/build2/qt/HGImgFmt/HGImgFmt.pro b/build2/qt/HGImgFmt/HGImgFmt.pro index e68edca8..44c6e1aa 100644 --- a/build2/qt/HGImgFmt/HGImgFmt.pro +++ b/build2/qt/HGImgFmt/HGImgFmt.pro @@ -64,6 +64,7 @@ win32 { INCLUDEPATH += $$PWD/../../../third_party/giflib/$${MY_OS}/include INCLUDEPATH += $$PWD/../../../third_party/mupdf/$${MY_OS}/include INCLUDEPATH += $$PWD/../../../third_party/pdflib/$${MY_OS}/include + INCLUDEPATH += $$PWD/../../../third_party/freeimage/$${MY_OS}/include INCLUDEPATH += $$PWD/../../../third_party/libzip/$${MY_OS}/include INCLUDEPATH += $$PWD/../../../third_party/tinyxml2/$${MY_OS}/include LIBS += $$PWD/../../../third_party/libjpeg-turbo/$${MY_OS}/lib/$${MY_ARCH}/turbojpeg-static.lib @@ -73,6 +74,7 @@ win32 { LIBS += $$PWD/../../../third_party/libtiff/$${MY_OS}/lib/$${MY_ARCH}/tiff.lib LIBS += $$PWD/../../../third_party/giflib/$${MY_OS}/lib/$${MY_ARCH}/giflib.lib LIBS += $$PWD/../../../third_party/libzip/$${MY_OS}/lib/$${MY_ARCH}/zip.lib + LIBS += $$PWD/../../../third_party/freeimage/$${MY_OS}/lib/$${MY_ARCH}/FreeImage.lib } unix { diff --git a/modules/imgfmt/HGImgFmt.cpp b/modules/imgfmt/HGImgFmt.cpp index 2e44a118..92818bf2 100644 --- a/modules/imgfmt/HGImgFmt.cpp +++ b/modules/imgfmt/HGImgFmt.cpp @@ -9,6 +9,352 @@ #include "HGPnm.h" #include "../base/HGInc.h" #include +#if defined(HG_CMP_MSC) +#include "FreeImage.h" +#endif + +// -----------------FREEIMAGE--------------------- + +#if defined(HG_CMP_MSC) +static HGResult FBITMAPToHGImage(FIBITMAP *dib, HGUInt imgType, HGUInt imgOrigin, HGImage *image) +{ + assert(NULL != dib); + assert(NULL != image); + + BYTE *data = FreeImage_GetBits(dib); + HGUInt width = FreeImage_GetWidth(dib); + HGUInt height = FreeImage_GetHeight(dib); + HGUInt bpp = FreeImage_GetBPP(dib); + HGUInt pitch = FreeImage_GetPitch(dib); + + if (0 == imgType) + { + imgType = HGBASE_IMGTYPE_RGB; + if (1 == bpp) + imgType = HGBASE_IMGTYPE_BINARY; + else if (8 == bpp) + imgType = HGBASE_IMGTYPE_GRAY; + else if (32 == bpp) + imgType = HGBASE_IMGTYPE_RGBA; + } + + if (0 == imgOrigin) + { + imgOrigin = HGBASE_IMGORIGIN_TOP; + } + + HGImageInfo imgInfo; + imgInfo.width = width; + imgInfo.height = height; + imgInfo.type = 0; + imgInfo.widthStep = pitch; + imgInfo.origin = HGBASE_IMGORIGIN_BOTTOM; + + if (1 == bpp) + imgInfo.type = HGBASE_IMGTYPE_BINARY; + else if (8 == bpp) + imgInfo.type = HGBASE_IMGTYPE_GRAY; + else if (24 == bpp) + imgInfo.type = HGBASE_IMGTYPE_BGR; + else if (32 == bpp) + imgInfo.type = HGBASE_IMGTYPE_BGRA; + + if (0 != imgInfo.type) + { + HGResult ret = HGBase_CreateImageFromData(data, &imgInfo, NULL, imgType, imgOrigin, image); + if (HGBASE_ERR_OK == ret) + { + HGBase_SetImageDpi(*image, (HGUInt)((double)FreeImage_GetDotsPerMeterX(dib) / 39.3700787 + 0.5), + (HGUInt)((double)FreeImage_GetDotsPerMeterY(dib) / 39.3700787 + 0.5)); + } + + return ret; + } + + FIBITMAP *dib2 = FreeImage_ConvertTo32Bits(dib); + if (NULL == dib2) + { + return HGBASE_ERR_FAIL; + } + + data = FreeImage_GetBits(dib2); + width = FreeImage_GetWidth(dib2); + height = FreeImage_GetHeight(dib2); + pitch = FreeImage_GetPitch(dib2); + + imgInfo.width = width; + imgInfo.height = height; + imgInfo.type = HGBASE_IMGTYPE_BGRA; + imgInfo.widthStep = pitch; + imgInfo.origin = HGBASE_IMGORIGIN_BOTTOM; + HGResult ret = HGBase_CreateImageFromData(data, &imgInfo, NULL, imgType, imgOrigin, image); + if (HGBASE_ERR_OK == ret) + { + HGBase_SetImageDpi(*image, (HGUInt)((double)FreeImage_GetDotsPerMeterX(dib2) / 39.3700787 + 0.5), + (HGUInt)((double)FreeImage_GetDotsPerMeterY(dib2) / 39.3700787 + 0.5)); + } + + FreeImage_Unload(dib2); + return ret; +} + +static HGResult HGImageToFIBITMAP(HGImage image, FIBITMAP **dib) +{ + assert(NULL != image); + assert(NULL != dib); + + HGImage image2 = NULL; + + HGImageInfo imgInfo; + HGBase_GetImageInfo(image, &imgInfo); + if (HGBASE_IMGTYPE_RGB == imgInfo.type || HGBASE_IMGTYPE_RGBA == imgInfo.type) + { + HGResult ret = HGBase_CloneImage(image, (HGBASE_IMGTYPE_RGB == imgInfo.type ? HGBASE_IMGTYPE_BGR : HGBASE_IMGTYPE_BGRA), + imgInfo.origin, &image2); + if (HGBASE_ERR_OK != ret) + { + return ret; + } + + HGBase_GetImageInfo(image2, &imgInfo); + } + else + { + image2 = image; + } + + HGByte *data = NULL; + HGBase_GetImageData(image2, &data); + HGUInt xDpi, yDpi; + HGBase_GetImageDpi(image2, &xDpi, &yDpi); + + unsigned int bpp = 1; + if (HGBASE_IMGTYPE_GRAY == imgInfo.type) + bpp = 8; + else if (HGBASE_IMGTYPE_BGR == imgInfo.type) + bpp = 24; + else if (HGBASE_IMGTYPE_BGRA == imgInfo.type) + bpp = 32; + else + assert(HGBASE_IMGTYPE_BINARY == imgInfo.type); + + *dib = FreeImage_ConvertFromRawBits(data, imgInfo.width, imgInfo.height, imgInfo.widthStep, + bpp, 0, 0, 0, (HGBASE_IMGORIGIN_TOP == imgInfo.origin)); + if (NULL != *dib) + { + FreeImage_SetDotsPerMeterX(*dib, (uint32_t)((double)xDpi * 39.3700787 + 0.5)); + FreeImage_SetDotsPerMeterY(*dib, (uint32_t)((double)yDpi * 39.3700787 + 0.5)); + } + + if (image2 != image) + { + HGBase_DestroyImage(image2); + } + + return (NULL != *dib ? HGBASE_ERR_OK : HGBASE_ERR_FAIL); +} + +static HGResult CheckFIFile(const HGChar* fileName, FREE_IMAGE_FORMAT fif, HGBool* isTrue) +{ + if (NULL == fileName || NULL == isTrue) + { + return HGBASE_ERR_INVALIDARG; + } + + FIBITMAP *dib = FreeImage_Load(fif, fileName); + if (NULL == dib) + { + return HGBASE_ERR_FAIL; + } + + *isTrue = HGTRUE; + FreeImage_Unload(dib); + return HGBASE_ERR_OK; +} + +static HGResult LoadFIImage(const HGChar* fileName, FREE_IMAGE_FORMAT fif, HGImgFmtLoadInfo* info, + HGUInt imgType, HGUInt imgOrigin, HGImage* image) +{ + if (NULL == fileName) + { + return HGBASE_ERR_INVALIDARG; + } + + if (NULL == image) + { + if (0 != imgType || 0 != imgOrigin) + { + return HGBASE_ERR_INVALIDARG; + } + } + else + { + if (0 != imgType && HGBASE_IMGTYPE_BINARY != imgType && HGBASE_IMGTYPE_GRAY != imgType + && HGBASE_IMGTYPE_BGR != imgType && HGBASE_IMGTYPE_RGB != imgType + && HGBASE_IMGTYPE_BGRA != imgType && HGBASE_IMGTYPE_RGBA != imgType) + { + return HGBASE_ERR_INVALIDARG; + } + + if (0 != imgOrigin && HGBASE_IMGORIGIN_TOP != imgOrigin && HGBASE_IMGORIGIN_BOTTOM != imgOrigin) + { + return HGBASE_ERR_INVALIDARG; + } + } + +#if defined(HG_CMP_MSC) + if (0 != _access(fileName, 0)) +#else + if (0 != access(fileName, 0)) +#endif + { + return HGBASE_ERR_FILENOTEXIST; + } + + FIBITMAP *dib = FreeImage_Load(fif, fileName); + if (NULL == dib) + { + return HGBASE_ERR_FAIL; + } + + if (NULL != info) + { + info->width = FreeImage_GetWidth(dib); + info->height = FreeImage_GetHeight(dib); + info->bpp = FreeImage_GetBPP(dib); + info->xDpi = (HGUInt)((double)FreeImage_GetDotsPerMeterX(dib) / 39.3700787 + 0.5); + info->yDpi = (HGUInt)((double)FreeImage_GetDotsPerMeterY(dib) / 39.3700787 + 0.5); + } + + if (NULL != image) + { + HGResult ret = FBITMAPToHGImage(dib, imgType, imgOrigin, image); + if (HGBASE_ERR_OK != ret) + { + FreeImage_Unload(dib); + return ret; + } + } + + FreeImage_Unload(dib); + return HGBASE_ERR_OK; +} + +static HGResult SaveFIImage(HGImage image, const HGImgFmtSaveInfo* info, const HGChar* fileName, FREE_IMAGE_FORMAT fif) +{ + if (NULL == image || NULL == fileName) + { + return HGBASE_ERR_INVALIDARG; + } + + if (NULL != info) + { + // 检查合法性 + } + + FIBITMAP *dib = NULL; + HGResult ret = HGImageToFIBITMAP(image, &dib); + if (HGBASE_ERR_OK != ret) + { + return ret; + } + + if (!FreeImage_Save(fif, dib, fileName)) + { + FreeImage_Unload(dib); + return HGBASE_ERR_FAIL; + } + + FreeImage_Unload(dib); + return HGBASE_ERR_OK; +} +#endif + +static HGResult CheckTgaFile(const HGChar* fileName, HGBool* isTga) +{ +#if defined(HG_CMP_MSC) + return CheckFIFile(fileName, FIF_TARGA, isTga); +#else + return HGBASE_ERR_FAIL; +#endif +} + +static HGResult LoadTgaImage(const HGChar* fileName, HGImgFmtLoadInfo* info, + HGUInt imgType, HGUInt imgOrigin, HGImage* image) +{ +#if defined(HG_CMP_MSC) + return LoadFIImage(fileName, FIF_TARGA, info, imgType, imgOrigin, image); +#else + return HGBASE_ERR_FAIL; +#endif +} + +static HGResult SaveTgaImage(HGImage image, const HGImgFmtSaveInfo* info, const HGChar* fileName) +{ +#if defined(HG_CMP_MSC) + return SaveFIImage(image, info, fileName, FIF_TARGA); +#else + return HGBASE_ERR_FAIL; +#endif +} + +static HGResult CheckPcxFile(const HGChar* fileName, HGBool* isPcx) +{ +#if defined(HG_CMP_MSC) + return CheckFIFile(fileName, FIF_PCX, isPcx); +#else + return HGBASE_ERR_FAIL; +#endif +} + +static HGResult LoadPcxImage(const HGChar* fileName, HGImgFmtLoadInfo* info, + HGUInt imgType, HGUInt imgOrigin, HGImage* image) +{ +#if defined(HG_CMP_MSC) + return LoadFIImage(fileName, FIF_PCX, info, imgType, imgOrigin, image); +#else + return HGBASE_ERR_FAIL; +#endif +} + +static HGResult SavePcxImage(HGImage image, const HGImgFmtSaveInfo* info, const HGChar* fileName) +{ +#if defined(HG_CMP_MSC) + return SaveFIImage(image, info, fileName, FIF_PCX); +#else + return HGBASE_ERR_FAIL; +#endif +} + +static HGResult CheckRasFile(const HGChar* fileName, HGBool* isRas) +{ +#if defined(HG_CMP_MSC) + return CheckFIFile(fileName, FIF_RAS, isRas); +#else + return HGBASE_ERR_FAIL; +#endif +} + +static HGResult LoadRasImage(const HGChar* fileName, HGImgFmtLoadInfo* info, + HGUInt imgType, HGUInt imgOrigin, HGImage* image) +{ +#if defined(HG_CMP_MSC) + return LoadFIImage(fileName, FIF_RAS, info, imgType, imgOrigin, image); +#else + return HGBASE_ERR_FAIL; +#endif +} + +static HGResult SaveRasImage(HGImage image, const HGImgFmtSaveInfo* info, const HGChar* fileName) +{ +#if defined(HG_CMP_MSC) + return SaveFIImage(image, info, fileName, FIF_RAS); +#else + return HGBASE_ERR_FAIL; +#endif +} + +// -----------------FREEIMAGE--------------------- struct HGImgFmtReaderImpl { @@ -36,7 +382,7 @@ struct HGImgFmtWriterImpl std::string fileName; HGUInt fmtType; HGPointer handle; - HGBool write; // 用于标记JPEG、BMP、PNG和PNM是否已经写入 + HGBool write; // 用于标记JPEG、BMP、PNG、PNM、TGA、PCX和RAS是否已经写入 }; HGResult HGAPI HGImgFmt_GetImgFmtType(const HGChar* fileName, HGUInt* fmtType) @@ -110,6 +456,30 @@ HGResult HGAPI HGImgFmt_GetImgFmtType(const HGChar* fileName, HGUInt* fmtType) return HGBASE_ERR_OK; } + HGBool isTga = HGFALSE; + ret = CheckTgaFile(fileName, &isTga); + if (isTga) + { + *fmtType = HGIMGFMT_TYPE_TGA; + return HGBASE_ERR_OK; + } + + HGBool isPcx = HGFALSE; + ret = CheckPcxFile(fileName, &isPcx); + if (isPcx) + { + *fmtType = HGIMGFMT_TYPE_PCX; + return HGBASE_ERR_OK; + } + + HGBool isRas = HGFALSE; + ret = CheckRasFile(fileName, &isRas); + if (isRas) + { + *fmtType = HGIMGFMT_TYPE_RAS; + return HGBASE_ERR_OK; + } + return ret; } @@ -174,6 +544,24 @@ HGResult HGAPI HGImgFmt_GetImgFmtTypeFromFileName(const HGChar* fileName, HGUInt *fmtType = HGIMGFMT_TYPE_PNM; return HGBASE_ERR_OK; } + + if (0 == _stricmp(p, ".tga")) + { + *fmtType = HGIMGFMT_TYPE_TGA; + return HGBASE_ERR_OK; + } + + if (0 == _stricmp(p, ".pcx")) + { + *fmtType = HGIMGFMT_TYPE_PCX; + return HGBASE_ERR_OK; + } + + if (0 == _stricmp(p, ".ras")) + { + *fmtType = HGIMGFMT_TYPE_RAS; + return HGBASE_ERR_OK; + } #else if (0 == strcasecmp(p, ".jpe") || 0 == strcasecmp(p, ".jpg") || 0 == strcasecmp(p, ".jpeg")) { @@ -222,6 +610,24 @@ HGResult HGAPI HGImgFmt_GetImgFmtTypeFromFileName(const HGChar* fileName, HGUInt *fmtType = HGIMGFMT_TYPE_PNM; return HGBASE_ERR_OK; } + + if (0 == strcasecmp(p, ".tga")) + { + *fmtType = HGIMGFMT_TYPE_TGA; + return HGBASE_ERR_OK; + } + + if (0 == strcasecmp(p, ".pcx")) + { + *fmtType = HGIMGFMT_TYPE_PCX; + return HGBASE_ERR_OK; + } + + if (0 == strcasecmp(p, ".ras")) + { + *fmtType = HGIMGFMT_TYPE_RAS; + return HGBASE_ERR_OK; + } #endif return HGBASE_ERR_FAIL; @@ -229,13 +635,14 @@ HGResult HGAPI HGImgFmt_GetImgFmtTypeFromFileName(const HGChar* fileName, HGUInt HGResult HGAPI HGImgFmt_IsMultiImgFmtType(HGUInt fmtType, HGBool* isMulti) { - if (fmtType < HGIMGFMT_TYPE_JPEG || fmtType > HGIMGFMT_TYPE_PNM || NULL == isMulti) + if (fmtType < HGIMGFMT_TYPE_JPEG || fmtType > HGIMGFMT_TYPE_RAS || NULL == isMulti) { return HGBASE_ERR_INVALIDARG; } if (HGIMGFMT_TYPE_JPEG == fmtType || HGIMGFMT_TYPE_BMP == fmtType || HGIMGFMT_TYPE_PNG == fmtType - || HGIMGFMT_TYPE_PNM == fmtType) + || HGIMGFMT_TYPE_PNM == fmtType || HGIMGFMT_TYPE_TGA == fmtType || HGIMGFMT_TYPE_PCX == fmtType + || HGIMGFMT_TYPE_RAS == fmtType) *isMulti = HGFALSE; else *isMulti = HGTRUE; @@ -245,7 +652,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_PNM) + if (fmtType > HGIMGFMT_TYPE_RAS) { return HGBASE_ERR_INVALIDARG; } @@ -439,6 +846,18 @@ HGResult HGAPI HGImgFmt_LoadImage(const HGChar* fileName, HGUInt fmtType, HGImgF return HGBASE_ERR_OK; } + else if (HGIMGFMT_TYPE_TGA == fmtType) + { + return LoadTgaImage(fileName, info, imgType, imgOrigin, image); + } + else if (HGIMGFMT_TYPE_PCX == fmtType) + { + return LoadPcxImage(fileName, info, imgType, imgOrigin, image); + } + else if (HGIMGFMT_TYPE_RAS == fmtType) + { + return LoadRasImage(fileName, info, imgType, imgOrigin, image); + } assert(0 == fmtType); @@ -599,12 +1018,30 @@ HGResult HGAPI HGImgFmt_LoadImage(const HGChar* fileName, HGUInt fmtType, HGImgF return HGBASE_ERR_OK; } + ret = LoadTgaImage(fileName, info, imgType, imgOrigin, image); + if (HGBASE_ERR_OK == ret) + { + return HGBASE_ERR_OK; + } + + ret = LoadPcxImage(fileName, info, imgType, imgOrigin, image); + if (HGBASE_ERR_OK == ret) + { + return HGBASE_ERR_OK; + } + + ret = LoadRasImage(fileName, info, imgType, imgOrigin, image); + if (HGBASE_ERR_OK == ret) + { + return HGBASE_ERR_OK; + } + return ret; } HGResult HGAPI HGImgFmt_SaveImage(HGImage image, HGUInt fmtType, const HGImgFmtSaveInfo* info, const HGChar* fileName) { - if (fmtType > HGIMGFMT_TYPE_PNM) + if (fmtType > HGIMGFMT_TYPE_RAS) { return HGBASE_ERR_INVALIDARG; } @@ -612,7 +1049,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_PNM) + if (fmtType < HGIMGFMT_TYPE_JPEG || fmtType > HGIMGFMT_TYPE_RAS) { return HGBASE_ERR_INVALIDARG; } @@ -719,21 +1156,34 @@ HGResult HGAPI HGImgFmt_SaveImage(HGImage image, HGUInt fmtType, const HGImgFmtS { return HGImgFmt_SaveGifImage(image, NULL, 50, HG_MAKECOLOR(255, 255, 255, 255), fileName); } + else if (HGIMGFMT_TYPE_PNM == fmtType) + { + return HGImgFmt_SavePnmImage(image, NULL, fileName); + } + else if (HGIMGFMT_TYPE_TGA == fmtType) + { + return SaveTgaImage(image, NULL, fileName); + } + else if (HGIMGFMT_TYPE_PCX == fmtType) + { + return SavePcxImage(image, NULL, fileName); + } - assert(HGIMGFMT_TYPE_PNM == fmtType); + assert(HGIMGFMT_TYPE_RAS == fmtType); - return HGImgFmt_SavePnmImage(image, NULL, fileName); + return SaveRasImage(image, NULL, fileName); } HGResult HGAPI HGImgFmt_OpenImageReader(const HGChar* fileName, HGUInt fmtType, HGImgFmtReader* reader) { - if (NULL == fileName || fmtType > HGIMGFMT_TYPE_PNM || NULL == reader) + if (NULL == fileName || fmtType > HGIMGFMT_TYPE_RAS || NULL == reader) { return HGBASE_ERR_INVALIDARG; } - if (HGIMGFMT_TYPE_JPEG == fmtType || HGIMGFMT_TYPE_BMP == fmtType - || HGIMGFMT_TYPE_PNG == fmtType || HGIMGFMT_TYPE_PNM == fmtType) + if (HGIMGFMT_TYPE_JPEG == fmtType || HGIMGFMT_TYPE_BMP == fmtType || HGIMGFMT_TYPE_PNG == fmtType + || HGIMGFMT_TYPE_PNM == fmtType || HGIMGFMT_TYPE_TGA == fmtType || HGIMGFMT_TYPE_PCX == fmtType + || HGIMGFMT_TYPE_RAS == fmtType) { HGImgFmtReaderImpl* imgFmtReaderImpl = new HGImgFmtReaderImpl; imgFmtReaderImpl->fileName = fileName; @@ -909,6 +1359,42 @@ HGResult HGAPI HGImgFmt_OpenImageReader(const HGChar* fileName, HGUInt fmtType, return HGBASE_ERR_OK; } + HGBool isTga = HGFALSE; + ret = CheckTgaFile(fileName, &isTga); + if (isTga) + { + HGImgFmtReaderImpl* imgFmtReaderImpl = new HGImgFmtReaderImpl; + imgFmtReaderImpl->fileName = fileName; + imgFmtReaderImpl->fmtType = HGIMGFMT_TYPE_TGA; + imgFmtReaderImpl->handle = NULL; + *reader = (HGImgFmtReader)imgFmtReaderImpl; + return HGBASE_ERR_OK; + } + + HGBool isPcx = HGFALSE; + ret = CheckPcxFile(fileName, &isPcx); + if (isPcx) + { + HGImgFmtReaderImpl* imgFmtReaderImpl = new HGImgFmtReaderImpl; + imgFmtReaderImpl->fileName = fileName; + imgFmtReaderImpl->fmtType = HGIMGFMT_TYPE_PCX; + imgFmtReaderImpl->handle = NULL; + *reader = (HGImgFmtReader)imgFmtReaderImpl; + return HGBASE_ERR_OK; + } + + HGBool isRas = HGFALSE; + ret = CheckRasFile(fileName, &isRas); + if (isRas) + { + HGImgFmtReaderImpl* imgFmtReaderImpl = new HGImgFmtReaderImpl; + imgFmtReaderImpl->fileName = fileName; + imgFmtReaderImpl->fmtType = HGIMGFMT_TYPE_RAS; + imgFmtReaderImpl->handle = NULL; + *reader = (HGImgFmtReader)imgFmtReaderImpl; + return HGBASE_ERR_OK; + } + return ret; } @@ -1171,6 +1657,33 @@ HGResult HGAPI HGImgFmt_LoadImageFromReader(HGImgFmtReader reader, HGUInt index, return HGBASE_ERR_OK; } + else if (HGIMGFMT_TYPE_TGA == imgFmtReaderImpl->fmtType) + { + if (0 != index) + { + return HGBASE_ERR_INVALIDARG; + } + + return LoadTgaImage(imgFmtReaderImpl->fileName.c_str(), info, imgType, imgOrigin, image); + } + else if (HGIMGFMT_TYPE_PCX == imgFmtReaderImpl->fmtType) + { + if (0 != index) + { + return HGBASE_ERR_INVALIDARG; + } + + return LoadPcxImage(imgFmtReaderImpl->fileName.c_str(), info, imgType, imgOrigin, image); + } + else if (HGIMGFMT_TYPE_RAS == imgFmtReaderImpl->fmtType) + { + if (0 != index) + { + return HGBASE_ERR_INVALIDARG; + } + + return LoadRasImage(imgFmtReaderImpl->fileName.c_str(), info, imgType, imgOrigin, image); + } assert(HGIMGFMT_TYPE_GIF == imgFmtReaderImpl->fmtType); @@ -1210,7 +1723,7 @@ HGResult HGAPI HGImgFmt_LoadImageFromReader(HGImgFmtReader reader, HGUInt index, HGResult HGAPI HGImgFmt_OpenImageWriter(const HGChar* fileName, HGUInt fmtType, HGImgFmtWriter* writer) { - if (fmtType > HGIMGFMT_TYPE_PNM || NULL == writer) + if (fmtType > HGIMGFMT_TYPE_RAS || NULL == writer) { return HGBASE_ERR_INVALIDARG; } @@ -1218,14 +1731,15 @@ HGResult HGAPI HGImgFmt_OpenImageWriter(const HGChar* fileName, HGUInt fmtType, if (0 == fmtType) { HGImgFmt_GetImgFmtTypeFromFileName(fileName, &fmtType); - if (fmtType < HGIMGFMT_TYPE_JPEG || fmtType > HGIMGFMT_TYPE_PNM) + if (fmtType < HGIMGFMT_TYPE_JPEG || fmtType > HGIMGFMT_TYPE_RAS) { return HGBASE_ERR_INVALIDARG; } } - if (HGIMGFMT_TYPE_JPEG == fmtType || HGIMGFMT_TYPE_BMP == fmtType - || HGIMGFMT_TYPE_PNG == fmtType || HGIMGFMT_TYPE_PNM == fmtType) + if (HGIMGFMT_TYPE_JPEG == fmtType || HGIMGFMT_TYPE_BMP == fmtType || HGIMGFMT_TYPE_PNG == fmtType + || HGIMGFMT_TYPE_PNM == fmtType || HGIMGFMT_TYPE_TGA == fmtType || HGIMGFMT_TYPE_PCX == fmtType + || HGIMGFMT_TYPE_RAS == fmtType) { HGImgFmtWriterImpl* imgFmtWriterImpl = new HGImgFmtWriterImpl; imgFmtWriterImpl->fileName = fileName; @@ -1479,6 +1993,51 @@ HGResult HGAPI HGImgFmt_SaveImageToWriter(HGImgFmtWriter writer, HGImage image, return ret; } + else if (HGIMGFMT_TYPE_TGA == imgFmtWriterImpl->fmtType) + { + if (imgFmtWriterImpl->write) + { + return HGBASE_ERR_FAIL; + } + + HGResult ret = SaveTgaImage(image, NULL, imgFmtWriterImpl->fileName.c_str()); + if (HGBASE_ERR_OK == ret) + { + imgFmtWriterImpl->write = HGTRUE; + } + + return ret; + } + else if (HGIMGFMT_TYPE_PCX == imgFmtWriterImpl->fmtType) + { + if (imgFmtWriterImpl->write) + { + return HGBASE_ERR_FAIL; + } + + HGResult ret = SavePcxImage(image, NULL, imgFmtWriterImpl->fileName.c_str()); + if (HGBASE_ERR_OK == ret) + { + imgFmtWriterImpl->write = HGTRUE; + } + + return ret; + } + else if (HGIMGFMT_TYPE_RAS == imgFmtWriterImpl->fmtType) + { + if (imgFmtWriterImpl->write) + { + return HGBASE_ERR_FAIL; + } + + HGResult ret = SaveRasImage(image, NULL, imgFmtWriterImpl->fileName.c_str()); + if (HGBASE_ERR_OK == ret) + { + imgFmtWriterImpl->write = HGTRUE; + } + + return ret; + } assert(HGIMGFMT_TYPE_GIF == imgFmtWriterImpl->fmtType); diff --git a/modules/imgfmt/HGImgFmt.h b/modules/imgfmt/HGImgFmt.h index 133b8483..c5e9fdb8 100644 --- a/modules/imgfmt/HGImgFmt.h +++ b/modules/imgfmt/HGImgFmt.h @@ -26,6 +26,12 @@ HG_DECLARE_HANDLE(HGImgFmtWriter); #define HGIMGFMT_TYPE_GIF 7L /* PNM */ #define HGIMGFMT_TYPE_PNM 8L +/* TGA */ +#define HGIMGFMT_TYPE_TGA 9L +/* PCX */ +#define HGIMGFMT_TYPE_PCX 10L +/* RAS */ +#define HGIMGFMT_TYPE_RAS 11L #pragma pack(push) #pragma pack(4) @@ -74,4 +80,4 @@ HGEXPORT HGResult HGAPI HGImgFmt_CloseImageWriter(HGImgFmtWriter writer); HGEXPORT HGResult HGAPI HGImgFmt_SaveImageToWriter(HGImgFmtWriter writer, HGImage image, const HGImgFmtSaveInfo *info); -#endif /* __HGIMGFMT_H__ */ \ No newline at end of file +#endif /* __HGIMGFMT_H__ */