用于EagleEye3.0 规则集漏报和误报测试的示例项目,项目收集于github和gitee
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

150 lines
3.7 KiB

5 months ago

#define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers
#include <windows.h>
#include "imgdecoder-stb.h"
#define STB_IMAGE_IMPLEMENTATION
#include "stb_image.h"
namespace SOUI
{
//////////////////////////////////////////////////////////////////////////
// SImgFrame_STB
SImgFrame_STB::SImgFrame_STB(BYTE *data,int w,int h):m_data(data),m_nWid(w),m_nHei(h)
{
}
SImgFrame_STB::~SImgFrame_STB()
{
if(m_data) free(m_data);
}
BOOL SImgFrame_STB::GetSize( UINT *pWid,UINT *pHei )
{
*pWid = m_nWid;
*pHei = m_nHei;
return TRUE;
}
BOOL SImgFrame_STB::CopyPixels( /* [unique][in] */ const RECT *prc, /* [in] */ UINT cbStride, /* [in] */ UINT cbBufferSize, /* [size_is][out] */ BYTE *pbBuffer )
{
if(cbBufferSize != m_nHei * m_nWid *4) return FALSE;
memcpy(pbBuffer,m_data,cbBufferSize);
return TRUE;
}
//////////////////////////////////////////////////////////////////////////
// SImgX_STB
int SImgX_STB::LoadFromMemory( void *pBuf,size_t bufLen )
{
if(m_pImg) delete m_pImg;
m_pImg = NULL;
if(!pBuf) return 0;
int w=0,h=0;
unsigned char *data = stbi_load_from_memory((stbi_uc const *)pBuf,bufLen,&w,&h,NULL,4);
if(!data)
{
return 0;
}
_DoPromultiply(data,w,h);
m_pImg = new SImgFrame_STB(data,w,h);
return 1;
}
int SImgX_STB::LoadFromFile( LPCWSTR pszFileName )
{
if(m_pImg) delete m_pImg;
m_pImg = NULL;
FILE *f=_wfopen(pszFileName,L"rb");
if(!f) return 0;
int w=0,h=0;
unsigned char *data = stbi_load_from_file(f,&w,&h,NULL,4);
fclose(f);
if(!data)
{
return 0;
}
_DoPromultiply(data,w,h);
m_pImg = new SImgFrame_STB(data,w,h);
return 1;
}
int SImgX_STB::LoadFromFile( LPCSTR pszFileName )
{
wchar_t wszFileName[MAX_PATH+1];
MultiByteToWideChar(CP_ACP,0,pszFileName,-1,wszFileName,MAX_PATH);
if(GetLastError()==ERROR_INSUFFICIENT_BUFFER) return 0;
return LoadFromFile(wszFileName);
}
SImgX_STB::SImgX_STB(BOOL bPremultiple)
:m_pImg(NULL)
,m_bPremultiple(bPremultiple)
{
}
SImgX_STB::~SImgX_STB( void )
{
if(m_pImg) delete m_pImg;
}
void SImgX_STB::_DoPromultiply( BYTE *pdata,int nWid,int nHei )
{
//swap rgba to bgra and do premultiply
BYTE *p=pdata;
int pixel_count = nWid * nHei;
for (int i=0; i < pixel_count; ++i) {
stbi_uc a = p[3];
stbi_uc t = p[0];
if (a)
{
p[0] = (p[2] *a)/255;
p[1] = (p[1] * a)/255;
p[2] = (t * a)/255;
}else
{
memset(p,0,4);
}
p += 4;
}
}
//////////////////////////////////////////////////////////////////////////
// SImgDecoderFactory_STB
SImgDecoderFactory_STB::SImgDecoderFactory_STB( )
{
}
SImgDecoderFactory_STB::~SImgDecoderFactory_STB()
{
}
BOOL SImgDecoderFactory_STB::CreateImgX( IImgX **ppImgDecoder )
{
*ppImgDecoder = new SImgX_STB(TRUE);
return TRUE;
}
LPCWSTR SImgDecoderFactory_STB::GetDescription() const
{
return DESC_IMGDECODER;
}
//////////////////////////////////////////////////////////////////////////
BOOL IMGDECODOR_STB::SCreateInstance( IObjRef **pImgDecoderFactory )
{
*pImgDecoderFactory = new SImgDecoderFactory_STB();
return TRUE;
}
}//end of namespace SOUI