用于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.
 
 
 
 
 
 

425 lines
14 KiB

#pragma once
#include <helper/SColor.h>
#include <unknown/obj-ref-impl.hpp>
#include <string/tstring.h>
#include <string/strcpcvt.h>
#include <interface/SRender-i.h>
#include <souicoll.h>
namespace SOUI
{
//////////////////////////////////////////////////////////////////////////
// SRenderFactory_GDI
class SRenderFactory_GDI : public TObjRefImpl<IRenderFactory>
{
public:
SRenderFactory_GDI()
{
}
~SRenderFactory_GDI()
{
}
virtual IImgDecoderFactory * GetImgDecoderFactory(){return m_imgDecoderFactory;}
virtual void SetImgDecoderFactory(IImgDecoderFactory *pImgDecoderFac){ m_imgDecoderFactory=pImgDecoderFac;}
virtual BOOL CreateRenderTarget(IRenderTarget ** ppRenderTarget,int nWid,int nHei);
virtual BOOL CreateFont(IFont ** ppFont , const LOGFONT &lf);
virtual BOOL CreateBitmap(IBitmap ** ppBitmap);
virtual BOOL CreateRegion(IRegion **ppRgn);
virtual BOOL CreatePath(IPath ** ppPath);
virtual BOOL CreatePathEffect(REFGUID guidEffect,IPathEffect ** ppPathEffect);
virtual BOOL CreatePathMeasure(IPathMeasure ** ppPathMeasure);
virtual HRESULT CreateBlurMaskFilter(float radius, IMaskFilter::SkBlurStyle style,IMaskFilter::SkBlurFlags flag,IMaskFilter ** ppMaskFilter){return E_NOTIMPL;}
virtual HRESULT CreateEmbossMaskFilter(float direction[3], float ambient, float specular, float blurRadius,IMaskFilter ** ppMaskFilter){return E_NOTIMPL;}
protected:
SAutoRefPtr<IImgDecoderFactory> m_imgDecoderFactory;
};
//////////////////////////////////////////////////////////////////////////
// TGdiRenderObjImpl
template<class T>
class TGdiRenderObjImpl : public TObjRefImpl< SObjectImpl<T> >
{
public:
TGdiRenderObjImpl(IRenderFactory * pRenderFac):m_pRenderFactory(pRenderFac)
{
}
virtual ~TGdiRenderObjImpl(){}
virtual IRenderFactory * GetRenderFactory() const
{
return m_pRenderFactory;
}
protected:
IRenderFactory *m_pRenderFactory;
};
//////////////////////////////////////////////////////////////////////////
// SPen_GDI
class SPen_GDI : public TGdiRenderObjImpl<IPen>
{
SOUI_CLASS_NAME(SPen_GDI,L"pen")
public:
SPen_GDI(IRenderFactory * pRenderFac,int iStyle=PS_SOLID,COLORREF cr=0,int cWidth=1)
:TGdiRenderObjImpl<IPen>(pRenderFac)
,m_nWidth(cWidth),m_style(iStyle),m_cr(cr)
,m_hPen(NULL)
{
if (iStyle & PS_GEOMETRIC)
{
LOGBRUSH lb;
lb.lbStyle = BS_SOLID;
lb.lbColor = m_cr & 0x00ffffff;
lb.lbHatch = 0;
m_hPen = ::ExtCreatePen(m_style | PS_GEOMETRIC, m_nWidth, &lb, 0, NULL);
}
else
{
m_hPen = ::CreatePen(m_style , m_nWidth, m_cr & 0x00ffffff);
}
}
~SPen_GDI()
{
DeleteObject(m_hPen);
}
int GetWidth(){return m_nWidth;}
int GetStyle(){return m_style;}
void SetWidth(int nWid) {m_nWidth=nWid;}
COLORREF GetColor(){return m_cr;}
void SetColor(COLORREF cr){m_cr = cr;}
HPEN GetPen(){return m_hPen;}
protected:
int m_style;
int m_nWidth;
COLORREF m_cr;
HPEN m_hPen;
};
//////////////////////////////////////////////////////////////////////////
// SFont_GDI
class SFont_GDI: public TGdiRenderObjImpl<IFont>
{
SOUI_CLASS_NAME(SFont_GDI,L"font")
public:
SFont_GDI(IRenderFactory * pRenderFac,const LOGFONT * plf)
:TGdiRenderObjImpl<IFont>(pRenderFac),m_hFont(NULL)
{
memcpy(&m_lf,plf,sizeof(LOGFONT));
m_hFont=CreateFontIndirect(&m_lf);
}
~SFont_GDI()
{
DeleteObject(m_hFont);
}
virtual const LOGFONT * LogFont() const {return &m_lf;}
virtual LPCTSTR FamilyName()
{
return m_lf.lfFaceName;
}
virtual int TextSize(){return m_lf.lfHeight;}
virtual BOOL IsBold(){ return m_lf.lfWeight == FW_BOLD;}
virtual BOOL IsUnderline(){return m_lf.lfUnderline;}
virtual BOOL IsItalic(){return m_lf.lfItalic;}
virtual BOOL IsStrikeOut(){return m_lf.lfStrikeOut;}
virtual BOOL UpdateFont(const LOGFONT *pLogFont)
{
if(!m_hFont) return FALSE;
DeleteObject(m_hFont);
memcpy(&m_lf,pLogFont,sizeof(LOGFONT));
m_hFont = CreateFontIndirect(&m_lf);
return TRUE;
}
HFONT GetFont(){return m_hFont;}
protected:
LOGFONT m_lf;
HFONT m_hFont;
};
class SBrush_GDI : public TGdiRenderObjImpl<IBrush>
{
SOUI_CLASS_NAME(SBrush_GDI,L"brush")
public:
static SBrush_GDI * CreateSolidBrush(IRenderFactory * pRenderFac,COLORREF cr){
return new SBrush_GDI(pRenderFac,cr);
}
static SBrush_GDI * CreateBitmapBrush(IRenderFactory * pRenderFac,HBITMAP hBmp)
{
return new SBrush_GDI(pRenderFac,hBmp);
}
BOOL IsBitmap(){return m_fBmp;}
HBRUSH GetBrush(){return m_hBrush;}
COLORREF GetColor() const {return m_cr;}
protected:
SBrush_GDI(IRenderFactory * pRenderFac,COLORREF cr)
:TGdiRenderObjImpl<IBrush>(pRenderFac),m_fBmp(FALSE),m_cr(cr)
{
m_hBrush = ::CreateSolidBrush(m_cr&0x00ffffff);
}
SBrush_GDI(IRenderFactory * pRenderFac,HBITMAP hBmp)
:TGdiRenderObjImpl<IBrush>(pRenderFac),m_fBmp(TRUE)
{
m_hBrush = ::CreatePatternBrush(hBmp);
}
~SBrush_GDI()
{
DeleteObject(m_hBrush);
}
HBRUSH m_hBrush;
BOOL m_fBmp;
COLORREF m_cr;
};
//////////////////////////////////////////////////////////////////////////
// SBitmap_GDI
class SBitmap_GDI : public TGdiRenderObjImpl<IBitmap>
{
SOUI_CLASS_NAME(SBitmap_GDI,L"bitmap")
public:
SBitmap_GDI(IRenderFactory *pRenderFac)
:TGdiRenderObjImpl<IBitmap>(pRenderFac),m_hBmp(0)
{
m_sz.cx=m_sz.cy=0;
}
virtual ~SBitmap_GDI()
{
if(m_hBmp) DeleteObject(m_hBmp);
}
virtual HRESULT Init(int nWid,int nHei,const LPVOID pBits=NULL);
virtual HRESULT Init(IImgFrame *pFrame);
virtual HRESULT LoadFromFile(LPCTSTR pszFileName);
virtual HRESULT LoadFromMemory(LPBYTE pBuf,size_t szLen);
virtual UINT Width() const;
virtual UINT Height() const;
virtual SIZE Size() const;
virtual LPVOID LockPixelBits();
virtual void UnlockPixelBits(LPVOID pBuf);
virtual const LPVOID GetPixelBits() const;
HBITMAP GetBitmap(){return m_hBmp;}
static HBITMAP CreateGDIBitmap(int nWid,int nHei,void ** ppBits);
protected:
HRESULT ImgFromDecoder(IImgX *imgDecoder);
SIZE m_sz;
HBITMAP m_hBmp; //标准的32位位图,和m_bitmap共享内存
};
//////////////////////////////////////////////////////////////////////////
// SRegion_GDI
class SRegion_GDI: public TGdiRenderObjImpl<IRegion>
{
SOUI_CLASS_NAME(SRegion_GDI,L"region")
friend class SRenderTarget_GDI;
public:
SRegion_GDI(IRenderFactory *pRenderFac);
~SRegion_GDI(){
DeleteObject(m_hRgn);
}
virtual void CombineRect(LPCRECT lprect,int nCombineMode);
virtual void CombineRoundRect(LPCRECT lprect, POINT ptRadius, int nCombineMode);
virtual void CombineEllipse(LPCRECT lprect , int nCombineMode);
virtual void CombinePolygon(const POINT * pts, int count, int nPolygonMode, int nCombineMode);
virtual void CombineRgn(const IRegion * pRgnSrc,int nCombineMode );
virtual BOOL PtInRegion(POINT pt) const;
virtual BOOL RectInRegion(LPCRECT lprect) const;
virtual void GetRgnBox(LPRECT lprect) const;
virtual BOOL IsEmpty() const;
virtual void Offset(POINT pt);
virtual void Clear();
virtual BOOL IsEqual(const IRegion * testRgn) const;
protected:
HRGN GetRegion() const;
void _CombineRgn(HRGN hRgn,int nCombineMode);
HRGN m_hRgn;
};
//////////////////////////////////////////////////////////////////////////
// SRenderTarget_GDI
//////////////////////////////////////////////////////////////////////////
class SRenderTarget_GDI: public TObjRefImpl<IRenderTarget>
{
public:
SRenderTarget_GDI(IRenderFactory* pRenderFactory,int nWid,int nHei);
~SRenderTarget_GDI();
//只支持创建位图表面
virtual HRESULT CreateCompatibleRenderTarget(SIZE szTarget,IRenderTarget **ppRenderTarget);
virtual HRESULT CreatePen(int iStyle,COLORREF cr,int cWidth,IPen ** ppPen);
virtual HRESULT CreateSolidColorBrush(COLORREF cr,IBrush ** ppBrush);
virtual HRESULT CreateBitmapBrush( IBitmap *pBmp,IBrush ** ppBrush );
virtual HRESULT Resize(SIZE sz);
virtual HRESULT OffsetViewportOrg(int xOff, int yOff, LPPOINT lpPoint=NULL);
virtual HRESULT GetViewportOrg(LPPOINT lpPoint);
virtual HRESULT SetViewportOrg(POINT pt);
virtual HRESULT PushClipRect(LPCRECT pRect,UINT mode=RGN_AND);
virtual HRESULT PushClipRegion(IRegion *pRegion,UINT mode=RGN_AND);
virtual HRESULT PopClip();
virtual HRESULT ExcludeClipRect(LPCRECT pRc);
virtual HRESULT IntersectClipRect(LPCRECT pRc);
virtual HRESULT SaveClip(int *pnState);
virtual HRESULT RestoreClip(int nState=-1);
virtual HRESULT GetClipRegion(IRegion **ppRegion);
virtual HRESULT GetClipBox(LPRECT prc);
virtual HRESULT BitBlt(LPCRECT pRcDest,IRenderTarget *pRTSour,int xSrc,int ySrc,DWORD dwRop=SRCCOPY);
virtual HRESULT AlphaBlend(LPCRECT pRcDest,IRenderTarget *pRTSrc,LPCRECT pRcSrc,BYTE byAlpha);
virtual HRESULT DrawText( LPCTSTR pszText,int cchLen,LPRECT pRc,UINT uFormat);
virtual HRESULT MeasureText(LPCTSTR pszText,int cchLen, SIZE *psz );
virtual HRESULT DrawRectangle(LPCRECT pRect);
virtual HRESULT FillRectangle(LPCRECT pRect);
virtual HRESULT FillSolidRect(LPCRECT pRect,COLORREF cr);
virtual HRESULT ClearRect(LPCRECT pRect,COLORREF cr);
virtual HRESULT InvertRect(LPCRECT pRect);
virtual HRESULT DrawEllipse(LPCRECT pRect);
virtual HRESULT FillEllipse(LPCRECT pRect);
virtual HRESULT FillSolidEllipse(LPCRECT pRect,COLORREF cr);
virtual HRESULT DrawArc(LPCRECT pRect,float startAngle,float sweepAngle,bool useCenter);
virtual HRESULT FillArc(LPCRECT pRect,float startAngle,float sweepAngle);
virtual HRESULT DrawRoundRect(LPCRECT pRect,POINT pt);
virtual HRESULT FillRoundRect(LPCRECT pRect,POINT pt);
virtual HRESULT FillSolidRoundRect(LPCRECT pRect,POINT pt,COLORREF cr);
virtual HRESULT DrawLines(LPPOINT pPt,size_t nCount);
virtual HRESULT GradientFill(LPCRECT pRect,BOOL bVert,COLORREF crBegin,COLORREF crEnd,BYTE byAlpha=0xFF);
virtual HRESULT GradientFillEx( LPCRECT pRect,const POINT* pts,COLORREF *colors,float *pos,int nCount,BYTE byAlpha=0xFF );
virtual HRESULT TextOut(
int x,
int y,
LPCTSTR lpszString,
int nCount);
virtual HRESULT DrawIconEx(int xLeft, int yTop, HICON hIcon, int cxWidth,int cyWidth,UINT diFlags);
virtual HRESULT DrawBitmap(LPCRECT pRcDest,IBitmap *pBitmap,int xSrc,int ySrc,BYTE byAlpha=0xFF);
virtual HRESULT DrawBitmapEx(LPCRECT pRcDest,IBitmap *pBitmap,LPCRECT pRcSrc,UINT expendMode, BYTE byAlpha=0xFF);
virtual HRESULT DrawBitmap9Patch(LPCRECT pRcDest,IBitmap *pBitmap,LPCRECT pRcSrc,LPCRECT pRcSourMargin,UINT expendMode,BYTE byAlpha=0xFF);
virtual IRenderObj * GetCurrentObject(OBJTYPE uType);
virtual HRESULT SelectDefaultObject(OBJTYPE objType, IRenderObj ** ppOldObj = NULL);
virtual HRESULT SelectObject(IRenderObj *pObj,IRenderObj ** ppOldObj = NULL);
virtual COLORREF GetTextColor()
{
return m_curColor.toCOLORREF();
}
virtual COLORREF SetTextColor(COLORREF color)
{
COLORREF crOld=m_curColor.toCOLORREF();
m_curColor.setRGB(color);
::SetTextColor(m_hdc,color&0x00ffffff);
return crOld;
}
virtual void SetMaskFilter(IMaskFilter *pMaskFilter){}
virtual IMaskFilter* GetMaskFilter(){return NULL;}
virtual HDC GetDC(UINT uFlag=0);
virtual void ReleaseDC(HDC hdc);
virtual HRESULT SetTransform(const float matrix[9], float oldMatrix[9]);
virtual HRESULT GetTransform(float matrix[9]) const;
virtual COLORREF GetPixel( int x, int y );
virtual COLORREF SetPixel( int x, int y, COLORREF cr );
virtual HRESULT GradientFill2(LPCRECT pRect,GradientType type,COLORREF crStart,COLORREF crCenter,COLORREF crEnd,float fLinearAngle,float fCenterX,float fCenterY,int nRadius,BYTE byAlpha=0xff);
virtual HRESULT CreateRegion( IRegion ** ppRegion );
virtual HRESULT PushClipPath(const IPath * path, UINT mode, bool doAntiAlias = false);
virtual HRESULT DrawPath(const IPath * path,IPathEffect * pathEffect=NULL);
virtual HRESULT FillPath(const IPath * path);
virtual HRESULT PushLayer(const RECT * pRect,BYTE byAlpha);
virtual HRESULT PopLayer();
virtual HRESULT SetXfermode(int mode,int *pOldMode);
virtual BOOL SetAntiAlias(BOOL bAntiAlias);
protected:
HDC m_hdc;
SColor m_curColor;
SAutoRefPtr<SBitmap_GDI> m_curBmp;
SAutoRefPtr<SPen_GDI> m_curPen;
SAutoRefPtr<SBrush_GDI> m_curBrush;
SAutoRefPtr<SFont_GDI> m_curFont;
POINT m_ptOrg;
//注意保存4个默认的GDI对象
SAutoRefPtr<IBitmap> m_defBmp;
SAutoRefPtr<IPen> m_defPen;
SAutoRefPtr<IBrush> m_defBrush;
SAutoRefPtr<IFont> m_defFont;
SAutoRefPtr<IRenderFactory> m_pRenderFactory;
UINT m_uGetDCFlag;
};
namespace RENDER_GDI
{
SOUI_COM_C BOOL SOUI_COM_API SCreateInstance(IObjRef ** ppRenderFactory);
}
}