📄 ximainfo.cpp
字号:
#endif
#if CXIMAGE_SUPPORT_ICO
n++; if (id == CXIMAGE_FORMAT_ICO) return n;
#endif
#if CXIMAGE_SUPPORT_TIF
n++; if (id == CXIMAGE_FORMAT_TIF) return n;
#endif
#if CXIMAGE_SUPPORT_TGA
n++; if (id == CXIMAGE_FORMAT_TGA) return n;
#endif
#if CXIMAGE_SUPPORT_PCX
n++; if (id == CXIMAGE_FORMAT_PCX) return n;
#endif
#if CXIMAGE_SUPPORT_WBMP
n++; if (id == CXIMAGE_FORMAT_WBMP) return n;
#endif
#if CXIMAGE_SUPPORT_WMF
n++; if (id == CXIMAGE_FORMAT_WMF) return n;
#endif
#if CXIMAGE_SUPPORT_JP2
n++; if (id == CXIMAGE_FORMAT_JP2) return n;
#endif
#if CXIMAGE_SUPPORT_JPC
n++; if (id == CXIMAGE_FORMAT_JPC) return n;
#endif
#if CXIMAGE_SUPPORT_PGX
n++; if (id == CXIMAGE_FORMAT_PGX) return n;
#endif
#if CXIMAGE_SUPPORT_PNM
n++; if (id == CXIMAGE_FORMAT_PNM) return n;
#endif
#if CXIMAGE_SUPPORT_RAS
n++; if (id == CXIMAGE_FORMAT_RAS) return n;
#endif
#if CXIMAGE_SUPPORT_JBG
n++; if (id == CXIMAGE_FORMAT_JBG) return n;
#endif
#if CXIMAGE_SUPPORT_MNG
n++; if (id == CXIMAGE_FORMAT_MNG) return n;
#endif
#if CXIMAGE_SUPPORT_SKA
n++; if (id == CXIMAGE_FORMAT_SKA) return n;
#endif
#if CXIMAGE_SUPPORT_RAW
n++; if (id == CXIMAGE_FORMAT_RAW) return n;
#endif
return 0;
}
////////////////////////////////////////////////////////////////////////////////
/**
* \return current frame delay in milliseconds. Only for GIF and MNG formats.
*/
DWORD CxImage::GetFrameDelay() const
{
return info.dwFrameDelay;
}
////////////////////////////////////////////////////////////////////////////////
/**
* Sets current frame delay. Only for GIF format.
* \param d = delay in milliseconds
*/
void CxImage::SetFrameDelay(DWORD d)
{
info.dwFrameDelay=d;
}
////////////////////////////////////////////////////////////////////////////////
void CxImage::GetOffset(long *x,long *y)
{
*x=info.xOffset;
*y=info.yOffset;
}
////////////////////////////////////////////////////////////////////////////////
void CxImage::SetOffset(long x,long y)
{
info.xOffset=x;
info.yOffset=y;
}
////////////////////////////////////////////////////////////////////////////////
/**
* \sa SetJpegQuality, GetJpegQualityF
* \author [DP]; changes [Stefan Sch黵mans]
*/
BYTE CxImage::GetJpegQuality() const
{
return (BYTE)(info.fQuality + 0.5f);
}
////////////////////////////////////////////////////////////////////////////////
/**
* \sa SetJpegQuality, GetJpegQuality
* \author [Stefan Sch黵mans]
*/
float CxImage::GetJpegQualityF() const
{
return info.fQuality;
}
////////////////////////////////////////////////////////////////////////////////
/**
* quality level for JPEG and JPEG2000
* \param q: can be from 0 to 100
* \author [DP]; changes [Stefan Sch黵mans]
*/
void CxImage::SetJpegQuality(BYTE q){
info.fQuality = (float)q;
}
////////////////////////////////////////////////////////////////////////////////
/**
* quality level for JPEG and JPEG2000
* necessary for JPEG2000 when quality is between 0.0 and 1.0
* \param q: can be from 0.0 to 100.0
* \author [Stefan Sch黵mans]
*/
void CxImage::SetJpegQualityF(float q){
if (q>0) info.fQuality = q;
else info.fQuality = 0.0f;
}
////////////////////////////////////////////////////////////////////////////////
/**
* \sa SetJpegScale
*/
BYTE CxImage::GetJpegScale() const
{
return info.nJpegScale;
}
////////////////////////////////////////////////////////////////////////////////
/**
* scaling down during JPEG decoding valid numbers are 1, 2, 4, 8
* \author [ignacio]
*/
void CxImage::SetJpegScale(BYTE q){
info.nJpegScale = q;
}
////////////////////////////////////////////////////////////////////////////////
/**
* Used to monitor the slow loops.
* \return value is from 0 to 100.
* \sa SetProgress
*/
long CxImage::GetProgress() const
{
return info.nProgress;
}
////////////////////////////////////////////////////////////////////////////////
/**
* \return the escape code.
* \sa SetEscape
*/
long CxImage::GetEscape() const
{
return info.nEscape;
}
////////////////////////////////////////////////////////////////////////////////
/**
* Forces the value of the internal progress variable.
* \param p should be from 0 to 100.
* \sa GetProgress
*/
void CxImage::SetProgress(long p)
{
info.nProgress = p;
}
////////////////////////////////////////////////////////////////////////////////
/**
* Used to quit the slow loops or the codecs.
* - SetEscape(-1) before Decode forces the function to exit, right after
* the image width and height are available ( for bmp, jpg, gif, tif )
*/
void CxImage::SetEscape(long i)
{
info.nEscape = i;
}
////////////////////////////////////////////////////////////////////////////////
/**
* Checks if the image is correctly initializated.
*/
bool CxImage::IsValid() const
{
return pDib!=0;
}
////////////////////////////////////////////////////////////////////////////////
/**
* True if the image is enabled for painting.
*/
bool CxImage::IsEnabled() const
{
return info.bEnabled;
}
////////////////////////////////////////////////////////////////////////////////
/**
* Enables/disables the image.
*/
void CxImage::Enable(bool enable)
{
info.bEnabled=enable;
}
////////////////////////////////////////////////////////////////////////////////
/**
* This function must be used after a Decode() / Load() call.
* Use the sequence SetFrame(-1); Load(...); GetNumFrames();
* to get the number of images without loading the first image.
* \return the number of images in the file.
*/
long CxImage::GetNumFrames() const
{
return info.nNumFrames;
}
////////////////////////////////////////////////////////////////////////////////
/**
* \return the current selected image (zero-based index).
*/
long CxImage::GetFrame() const
{
return info.nFrame;
}
////////////////////////////////////////////////////////////////////////////////
/**
* Sets the image number that the next Decode() / Load() call will load
*/
void CxImage::SetFrame(long nFrame){
info.nFrame=nFrame;
}
////////////////////////////////////////////////////////////////////////////////
/**
* Sets the method for drawing the frame related to others
* \sa GetDisposalMethod
*/
void CxImage::SetDisposalMethod(BYTE dm)
{ info.dispmeth=dm; }
////////////////////////////////////////////////////////////////////////////////
/**
* Gets the method for drawing the frame related to others
* Values : 0 - No disposal specified. The decoder is
* not required to take any action.
* 1 - Do not dispose. The graphic is to be left
* in place.
* 2 - Restore to background color. The area used by the
* graphic must be restored to the background color.
* 3 - Restore to previous. The decoder is required to
* restore the area overwritten by the graphic with
* what was there prior to rendering the graphic.
* 4-7 - To be defined.
*/
BYTE CxImage::GetDisposalMethod() const
{ return info.dispmeth; }
////////////////////////////////////////////////////////////////////////////////
bool CxImage::GetRetreiveAllFrames() const
{ return info.bGetAllFrames; }
////////////////////////////////////////////////////////////////////////////////
void CxImage::SetRetreiveAllFrames(bool flag)
{ info.bGetAllFrames = flag; }
////////////////////////////////////////////////////////////////////////////////
CxImage * CxImage::GetFrame(long nFrame) const
{
if ( ppFrames == NULL) return NULL;
if ( info.nNumFrames == 0) return NULL;
if ( nFrame >= info.nNumFrames ) return NULL;
if ( nFrame < 0) nFrame = info.nNumFrames - 1;
return ppFrames[nFrame];
}
////////////////////////////////////////////////////////////////////////////////
short CxImage::ntohs(const short word)
{
if (info.bLittleEndianHost) return word;
return ( (word & 0xff) << 8 ) | ( (word >> 8) & 0xff );
}
////////////////////////////////////////////////////////////////////////////////
long CxImage::ntohl(const long dword)
{
if (info.bLittleEndianHost) return dword;
return ((dword & 0xff) << 24 ) | ((dword & 0xff00) << 8 ) |
((dword >> 8) & 0xff00) | ((dword >> 24) & 0xff);
}
////////////////////////////////////////////////////////////////////////////////
void CxImage::bihtoh(BITMAPINFOHEADER* bih)
{
bih->biSize = ntohl(bih->biSize);
bih->biWidth = ntohl(bih->biWidth);
bih->biHeight = ntohl(bih->biHeight);
bih->biPlanes = ntohs(bih->biPlanes);
bih->biBitCount = ntohs(bih->biBitCount);
bih->biCompression = ntohl(bih->biCompression);
bih->biSizeImage = ntohl(bih->biSizeImage);
bih->biXPelsPerMeter = ntohl(bih->biXPelsPerMeter);
bih->biYPelsPerMeter = ntohl(bih->biYPelsPerMeter);
bih->biClrUsed = ntohl(bih->biClrUsed);
bih->biClrImportant = ntohl(bih->biClrImportant);
}
////////////////////////////////////////////////////////////////////////////////
/**
* Returns the last reported error.
*/
const char* CxImage::GetLastError()
{
return info.szLastError;
}
////////////////////////////////////////////////////////////////////////////////
DWORD CxImage::DumpSize()
{
DWORD n;
n = sizeof(BITMAPINFOHEADER) + sizeof(CXIMAGEINFO) + GetSize();
if (pAlpha){
n += 1 + head.biWidth * head.biHeight;
} else n++;
if (pSelection){
n += 1 + head.biWidth * head.biHeight;
} else n++;
if (ppLayers){
for (long m=0; m<GetNumLayers(); m++){
if (GetLayer(m)){
n += 1 + GetLayer(m)->DumpSize();
}
}
} else n++;
if (ppFrames){
for (long m=0; m<GetNumFrames(); m++){
if (GetFrame(m)){
n += 1 + GetFrame(m)->DumpSize();
}
}
} else n++;
return n;
}
////////////////////////////////////////////////////////////////////////////////
DWORD CxImage::Dump(BYTE * dst)
{
if (!dst) return 0;
memcpy(dst,&head,sizeof(BITMAPINFOHEADER));
dst += sizeof(BITMAPINFOHEADER);
memcpy(dst,&info,sizeof(CXIMAGEINFO));
dst += sizeof(CXIMAGEINFO);
memcpy(dst,pDib,GetSize());
dst += GetSize();
if (pAlpha){
memset(dst++, 1, 1);
memcpy(dst,pAlpha,head.biWidth * head.biHeight);
dst += head.biWidth * head.biHeight;
} else {
memset(dst++, 0, 1);
}
if (pSelection){
memset(dst++, 1, 1);
memcpy(dst,pSelection,head.biWidth * head.biHeight);
dst += head.biWidth * head.biHeight;
} else {
memset(dst++, 0, 1);
}
if (ppLayers){
memset(dst++, 1, 1);
for (long m=0; m<GetNumLayers(); m++){
if (GetLayer(m)){
dst += GetLayer(m)->Dump(dst);
}
}
} else {
memset(dst++, 0, 1);
}
if (ppFrames){
memset(dst++, 1, 1);
for (long m=0; m<GetNumFrames(); m++){
if (GetFrame(m)){
dst += GetFrame(m)->Dump(dst);
}
}
} else {
memset(dst++, 0, 1);
}
return DumpSize();
}
////////////////////////////////////////////////////////////////////////////////
DWORD CxImage::UnDump(const BYTE * src)
{
if (!src)
return 0;
if (!Destroy())
return 0;
if (!DestroyFrames())
return 0;
DWORD n = 0;
memcpy(&head,src,sizeof(BITMAPINFOHEADER));
n += sizeof(BITMAPINFOHEADER);
memcpy(&info,&src[n],sizeof(CXIMAGEINFO));
n += sizeof(CXIMAGEINFO);
if (!Create(head.biWidth, head.biHeight, head.biBitCount, info.dwType))
return 0;
memcpy(pDib,&src[n],GetSize());
n += GetSize();
if (src[n++]){
if (AlphaCreate()){
memcpy(pAlpha, &src[n], head.biWidth * head.biHeight);
}
n += head.biWidth * head.biHeight;
}
if (src[n++]){
RECT box = info.rSelectionBox;
if (SelectionCreate()){
info.rSelectionBox = box;
memcpy(pSelection, &src[n], head.biWidth * head.biHeight);
}
n += head.biWidth * head.biHeight;
}
if (src[n++]){
ppLayers = new CxImage*[info.nNumLayers];
for (long m=0; m<GetNumLayers(); m++){
ppLayers[m] = new CxImage();
n += ppLayers[m]->UnDump(&src[n]);
}
}
if (src[n++]){
ppFrames = new CxImage*[info.nNumFrames];
for (long m=0; m<GetNumFrames(); m++){
ppFrames[m] = new CxImage();
n += ppFrames[m]->UnDump(&src[n]);
}
}
return n;
}
////////////////////////////////////////////////////////////////////////////////
/**
* \return A.BBCCCDDDD
* - A = main version
* - BB = main revision
* - CCC = minor revision (letter)
* - DDDD = experimental revision
*/
const float CxImage::GetVersionNumber()
{
return 6.000000015f;
}
////////////////////////////////////////////////////////////////////////////////
const TCHAR* CxImage::GetVersion()
{
static const TCHAR CxImageVersion[] = _T("CxImage 6.0.0");
return (CxImageVersion);
}
////////////////////////////////////////////////////////////////////////////////
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -