HGImgFmt中集成freeimage库,实现tga、pcx和ras图像格式的处理
This commit is contained in:
parent
baeb5a09db
commit
f1535d3290
|
@ -64,6 +64,7 @@ win32 {
|
||||||
INCLUDEPATH += $$PWD/../../../third_party/giflib/$${MY_OS}/include
|
INCLUDEPATH += $$PWD/../../../third_party/giflib/$${MY_OS}/include
|
||||||
INCLUDEPATH += $$PWD/../../../third_party/mupdf/$${MY_OS}/include
|
INCLUDEPATH += $$PWD/../../../third_party/mupdf/$${MY_OS}/include
|
||||||
INCLUDEPATH += $$PWD/../../../third_party/pdflib/$${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/libzip/$${MY_OS}/include
|
||||||
INCLUDEPATH += $$PWD/../../../third_party/tinyxml2/$${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
|
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/libtiff/$${MY_OS}/lib/$${MY_ARCH}/tiff.lib
|
||||||
LIBS += $$PWD/../../../third_party/giflib/$${MY_OS}/lib/$${MY_ARCH}/giflib.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/libzip/$${MY_OS}/lib/$${MY_ARCH}/zip.lib
|
||||||
|
LIBS += $$PWD/../../../third_party/freeimage/$${MY_OS}/lib/$${MY_ARCH}/FreeImage.lib
|
||||||
}
|
}
|
||||||
|
|
||||||
unix {
|
unix {
|
||||||
|
|
|
@ -9,6 +9,352 @@
|
||||||
#include "HGPnm.h"
|
#include "HGPnm.h"
|
||||||
#include "../base/HGInc.h"
|
#include "../base/HGInc.h"
|
||||||
#include <string>
|
#include <string>
|
||||||
|
#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
|
struct HGImgFmtReaderImpl
|
||||||
{
|
{
|
||||||
|
@ -36,7 +382,7 @@ struct HGImgFmtWriterImpl
|
||||||
std::string fileName;
|
std::string fileName;
|
||||||
HGUInt fmtType;
|
HGUInt fmtType;
|
||||||
HGPointer handle;
|
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)
|
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;
|
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;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -174,6 +544,24 @@ HGResult HGAPI HGImgFmt_GetImgFmtTypeFromFileName(const HGChar* fileName, HGUInt
|
||||||
*fmtType = HGIMGFMT_TYPE_PNM;
|
*fmtType = HGIMGFMT_TYPE_PNM;
|
||||||
return HGBASE_ERR_OK;
|
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
|
#else
|
||||||
if (0 == strcasecmp(p, ".jpe") || 0 == strcasecmp(p, ".jpg") || 0 == strcasecmp(p, ".jpeg"))
|
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;
|
*fmtType = HGIMGFMT_TYPE_PNM;
|
||||||
return HGBASE_ERR_OK;
|
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
|
#endif
|
||||||
|
|
||||||
return HGBASE_ERR_FAIL;
|
return HGBASE_ERR_FAIL;
|
||||||
|
@ -229,13 +635,14 @@ HGResult HGAPI HGImgFmt_GetImgFmtTypeFromFileName(const HGChar* fileName, HGUInt
|
||||||
|
|
||||||
HGResult HGAPI HGImgFmt_IsMultiImgFmtType(HGUInt fmtType, HGBool* isMulti)
|
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;
|
return HGBASE_ERR_INVALIDARG;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (HGIMGFMT_TYPE_JPEG == fmtType || HGIMGFMT_TYPE_BMP == fmtType || HGIMGFMT_TYPE_PNG == fmtType
|
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;
|
*isMulti = HGFALSE;
|
||||||
else
|
else
|
||||||
*isMulti = HGTRUE;
|
*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,
|
HGResult HGAPI HGImgFmt_LoadImage(const HGChar* fileName, HGUInt fmtType, HGImgFmtLoadInfo* info,
|
||||||
HGUInt imgType, HGUInt imgOrigin, HGImage* image)
|
HGUInt imgType, HGUInt imgOrigin, HGImage* image)
|
||||||
{
|
{
|
||||||
if (fmtType > HGIMGFMT_TYPE_PNM)
|
if (fmtType > HGIMGFMT_TYPE_RAS)
|
||||||
{
|
{
|
||||||
return HGBASE_ERR_INVALIDARG;
|
return HGBASE_ERR_INVALIDARG;
|
||||||
}
|
}
|
||||||
|
@ -439,6 +846,18 @@ HGResult HGAPI HGImgFmt_LoadImage(const HGChar* fileName, HGUInt fmtType, HGImgF
|
||||||
|
|
||||||
return HGBASE_ERR_OK;
|
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);
|
assert(0 == fmtType);
|
||||||
|
|
||||||
|
@ -599,12 +1018,30 @@ HGResult HGAPI HGImgFmt_LoadImage(const HGChar* fileName, HGUInt fmtType, HGImgF
|
||||||
return HGBASE_ERR_OK;
|
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;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
HGResult HGAPI HGImgFmt_SaveImage(HGImage image, HGUInt fmtType, const HGImgFmtSaveInfo* info, const HGChar* fileName)
|
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;
|
return HGBASE_ERR_INVALIDARG;
|
||||||
}
|
}
|
||||||
|
@ -612,7 +1049,7 @@ HGResult HGAPI HGImgFmt_SaveImage(HGImage image, HGUInt fmtType, const HGImgFmtS
|
||||||
if (0 == fmtType)
|
if (0 == fmtType)
|
||||||
{
|
{
|
||||||
HGImgFmt_GetImgFmtTypeFromFileName(fileName, &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;
|
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);
|
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)
|
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;
|
return HGBASE_ERR_INVALIDARG;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (HGIMGFMT_TYPE_JPEG == fmtType || HGIMGFMT_TYPE_BMP == fmtType
|
if (HGIMGFMT_TYPE_JPEG == fmtType || HGIMGFMT_TYPE_BMP == fmtType || HGIMGFMT_TYPE_PNG == 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)
|
||||||
{
|
{
|
||||||
HGImgFmtReaderImpl* imgFmtReaderImpl = new HGImgFmtReaderImpl;
|
HGImgFmtReaderImpl* imgFmtReaderImpl = new HGImgFmtReaderImpl;
|
||||||
imgFmtReaderImpl->fileName = fileName;
|
imgFmtReaderImpl->fileName = fileName;
|
||||||
|
@ -909,6 +1359,42 @@ HGResult HGAPI HGImgFmt_OpenImageReader(const HGChar* fileName, HGUInt fmtType,
|
||||||
return HGBASE_ERR_OK;
|
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;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1171,6 +1657,33 @@ HGResult HGAPI HGImgFmt_LoadImageFromReader(HGImgFmtReader reader, HGUInt index,
|
||||||
|
|
||||||
return HGBASE_ERR_OK;
|
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);
|
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)
|
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;
|
return HGBASE_ERR_INVALIDARG;
|
||||||
}
|
}
|
||||||
|
@ -1218,14 +1731,15 @@ HGResult HGAPI HGImgFmt_OpenImageWriter(const HGChar* fileName, HGUInt fmtType,
|
||||||
if (0 == fmtType)
|
if (0 == fmtType)
|
||||||
{
|
{
|
||||||
HGImgFmt_GetImgFmtTypeFromFileName(fileName, &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;
|
return HGBASE_ERR_INVALIDARG;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (HGIMGFMT_TYPE_JPEG == fmtType || HGIMGFMT_TYPE_BMP == fmtType
|
if (HGIMGFMT_TYPE_JPEG == fmtType || HGIMGFMT_TYPE_BMP == fmtType || HGIMGFMT_TYPE_PNG == 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)
|
||||||
{
|
{
|
||||||
HGImgFmtWriterImpl* imgFmtWriterImpl = new HGImgFmtWriterImpl;
|
HGImgFmtWriterImpl* imgFmtWriterImpl = new HGImgFmtWriterImpl;
|
||||||
imgFmtWriterImpl->fileName = fileName;
|
imgFmtWriterImpl->fileName = fileName;
|
||||||
|
@ -1479,6 +1993,51 @@ HGResult HGAPI HGImgFmt_SaveImageToWriter(HGImgFmtWriter writer, HGImage image,
|
||||||
|
|
||||||
return ret;
|
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);
|
assert(HGIMGFMT_TYPE_GIF == imgFmtWriterImpl->fmtType);
|
||||||
|
|
||||||
|
|
|
@ -26,6 +26,12 @@ HG_DECLARE_HANDLE(HGImgFmtWriter);
|
||||||
#define HGIMGFMT_TYPE_GIF 7L
|
#define HGIMGFMT_TYPE_GIF 7L
|
||||||
/* PNM */
|
/* PNM */
|
||||||
#define HGIMGFMT_TYPE_PNM 8L
|
#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(push)
|
||||||
#pragma pack(4)
|
#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);
|
HGEXPORT HGResult HGAPI HGImgFmt_SaveImageToWriter(HGImgFmtWriter writer, HGImage image, const HGImgFmtSaveInfo *info);
|
||||||
|
|
||||||
#endif /* __HGIMGFMT_H__ */
|
#endif /* __HGIMGFMT_H__ */
|
||||||
|
|
Loading…
Reference in New Issue