⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 scemfdcrenderer.h

📁 Source code for EMFexplorer 1.0
💻 H
📖 第 1 页 / 共 2 页
字号:
	}
	void SCSetupRendering();
	template <class T> void T_SCDrawPolygon(T* pPoints, DWORD dwCount);
	template <class T> void T_SCDrawLines(T* pPoints, DWORD dwCount);
	template <class T> void T_SCDrawPolyPoly(T* pPoints, DWORD dwCount, DWORD *pPolyVertices, DWORD dwNbPolys, BOOL bLines);
	template <class T> void T_SCDrawPolyDraw(T* pPoints, DWORD dwCount, BYTE *pTypes);

	void SCBuildTextRect(ULONG ulTextAlign, POINT PtRef,
		RECT& ClipRect, Gdiplus::RectF TextSize, INT itmAscent);
	void SCComputeTextBBox(ULONG ulTextAlign, Gdiplus::RectF TextSize,
		SCRectPolygon& RectPolygon, POINT& PtRef, INT itmAscent);
	INT SCComputeTextWidth(LPCWSTR pwString, INT iCount, CONST INT* pDxWidths, INT flags);
	void SCOnExtentChanged();
	HRGN SCGetHRGNFromREGIONDATA(LPCBYTE pData, DWORD dwSize);
	void SCAddTextInPath(INT x, INT y, UINT uiOptions, LPCRECT pRect, LPCWSTR pwString,
								UINT uiCount, LPCINT pDxWidths, FLOAT fScaleX, FLOAT fScaleY);
	void SCSelectPrivateFont(LOGFONT& rLogFont, SCFontCollection* pFontCollection, DWORD dwSimul);

	void SCCropToPlayBox(CombineMode nCropMode=CombineModeReplace);
	void SCDPtoLP(Point* pPoints, INT iNbPts);
	void SCLPtoDP(Point* pPoints, INT iNbPts);
	// inlines
	inline void SCRefreshBrush(Brush* pBrush);
	inline void SCUpdateCurPos(INT x, INT y)
	{// See comments in cpp file
		MoveToEx(m_hDC, x, y, NULL);
		m_PtCurPos.X = x;
		m_PtCurPos.Y = y;
	}

#if 0
	// temp code for metaregion
	void SCOnChangeClipping();
#endif


private:
	friend class CSCEMFmetaDCRenderer; 

	DWORD					m_dwLastError;
	HDC						m_hDC;				// Source DC where records are played
	BOOL					m_bMonochrome;		// Source DC is monochrome
	SCStatesArray			m_States;			// Stack for save/restore DC
	GDPMatrix				m_DestMatrix;		// Original matrix of the destination

	// GDI+
	GDPGraphics*			m_pGraphics;
	SCFontCollection*		m_pFontCollection;

	// GDI DC state matching object
	GDPPen*					m_pPen;
	GDPBrush*				m_pBrush;
	SCFont*					m_pFont;
	SCPath*					m_pPath;

	// Holders
	SCPenHolder*			m_pPenHolder;
	SCBrushHolder*			m_pBrushHolder;
	SCFontHolder*			m_pFontHolder;
	SCPathHolder*			m_pPathHolder; // Just for consistency (see SCBeginPath).

	// Rest of GDI DC state
	GDPPoint				m_PtCurPos;
	DWORD					m_dwMapMode;
	DWORD					m_dwBkMode;
	DWORD					m_dwFillMode;
	DWORD					m_dwStretchBltMode;
	DWORD					m_dwTextAlign;
	DWORD					m_dwROP2;
	COLORREF				m_BkColor;
	COLORREF				m_TextColor;
	DWORD					m_dwArcDirection;
	FLOAT					m_fMiterLimit;
	SIZE					m_WinSize;
	SIZE					m_ViewSize;
	POINT					m_PtWinOrg;
	POINT					m_PtViewOrg;
	RECT					m_RcClipBox;

	// Extra stuff
	GDPImgAttribs*			m_pImgAttribs;
	SCGDIpDrawingAttributes m_DrawingAttributes;
};

// Class to save objects matching GDI DC objects
class CSCGDIState
{
	friend class CSCEMFdcRenderer;

		CSCGDIState(
				SCPenHolder*			pSvdPenHolder,
				SCBrushHolder*			pSvdBrushHolder,
				SCFontHolder*			pSvdFontHolder,
				SCPathHolder*			pSvdPathHolder,
				GDPPoint&				PtSvdCurPos,
				GDPGCState				SvdGraphicsState,
				DWORD					dwSvdMapMode,
				DWORD					dwSvdBkMode,
				DWORD					dwSvdFillMode,
				DWORD					dwSvdStretchBltMode,
				DWORD					dwSvdTextAlign,
				DWORD					dwSvdROP2,
				COLORREF				SvdBkColor,
				COLORREF				SvdTextColor,
				DWORD					dwSvdArcDirection,
				FLOAT					fSvdMiterLimit,
				SIZE					SvdWinSize,
				SIZE					SvdViewSize,
				POINT					PtSvdWinOrg,
				POINT					PtSvdViewOrg,
				RECT&					rRcSvdClipBox):
			m_pSvdPenHolder(pSvdPenHolder),
			m_pSvdBrushHolder(pSvdBrushHolder),
			m_pSvdFontHolder(pSvdFontHolder),
			m_pSvdPathHolder(pSvdPathHolder),
			m_PtSvdCurPos(PtSvdCurPos),
			m_SvdGraphicsState(SvdGraphicsState),
			m_dwSvdMapMode(dwSvdMapMode),
			m_dwSvdBkMode(dwSvdBkMode),
			m_dwSvdFillMode(dwSvdFillMode),
			m_dwSvdStretchBltMode(dwSvdStretchBltMode),
			m_dwSvdTextAlign(dwSvdTextAlign),
			m_dwSvdROP2(dwSvdROP2),
			m_SvdBkColor(SvdBkColor),
			m_SvdTextColor(SvdTextColor),
			m_dwSvdArcDirection(dwSvdArcDirection),
			m_fSvdMiterLimit(fSvdMiterLimit),
			m_SvdWinSize(SvdWinSize),
			m_SvdViewSize(SvdViewSize),
			m_PtSvdWinOrg(PtSvdWinOrg),
			m_PtSvdViewOrg(PtSvdViewOrg)
		{
			SC_REFCOUNTED_ADDREF(m_pSvdPenHolder);
			SC_REFCOUNTED_ADDREF(m_pSvdBrushHolder);
			SC_REFCOUNTED_ADDREF(m_pSvdFontHolder);
			SC_REFCOUNTED_ADDREF(m_pSvdPathHolder);

			CopyRect(&m_RcSvdClipBox, &rRcSvdClipBox);
		}
		
		~CSCGDIState()
		{
			SC_REFCOUNTED_RELEASE(m_pSvdPenHolder);
			SC_REFCOUNTED_RELEASE(m_pSvdBrushHolder);
			SC_REFCOUNTED_RELEASE(m_pSvdFontHolder);
			SC_REFCOUNTED_RELEASE(m_pSvdPathHolder);
		}
		
		SCPenHolder*			m_pSvdPenHolder;
		SCBrushHolder*			m_pSvdBrushHolder;
		SCFontHolder*			m_pSvdFontHolder;
		SCPathHolder*			m_pSvdPathHolder;
		GDPPoint				m_PtSvdCurPos;
		GDPGCState				m_SvdGraphicsState;
		DWORD					m_dwSvdMapMode;
		DWORD					m_dwSvdBkMode;
		DWORD					m_dwSvdFillMode;
		DWORD					m_dwSvdStretchBltMode;
		DWORD					m_dwSvdTextAlign;
		DWORD					m_dwSvdROP2;
		COLORREF				m_SvdBkColor;
		COLORREF				m_SvdTextColor;
		DWORD					m_dwSvdArcDirection;
		FLOAT					m_fSvdMiterLimit;
		SIZE					m_SvdWinSize;
		SIZE					m_SvdViewSize;
		POINT					m_PtSvdWinOrg;
		POINT					m_PtSvdViewOrg;
		RECT					m_RcSvdClipBox;
};

////////////////////////////////////////////////////////////////////////////////////
/// Class to render into metafiles
class CSCEMFmetaDCRenderer : public CSCEMFdcRenderer
{
// Construction/Destruction
public:
	CSCEMFmetaDCRenderer(GDPMetafile* pDestMeta):
	  CSCEMFdcRenderer(),
	  m_pMeta(pDestMeta)
	{
	}
	virtual ~CSCEMFmetaDCRenderer()
	{
	}

// Attributes
	// Getters

	// Setters

// Operation

// Implementation

protected:
	// Output device
	virtual BOOL SCCreateSurface(HDC hDestDC)
	{
		ASSERT(m_pMeta);

		m_pGraphics = new Graphics(m_pMeta);
		if (!m_pGraphics)
			return FALSE;

		// TODO: revise this when DC cloning is ractivated

		XFORM xform;
		GetWorldTransform(m_hDC, &xform);
		if (!SCIsIdentityXFORM(xform))
		{
			Matrix matrix(xform.eM11, xform.eM12, xform.eM21, xform.eM22, xform.eDx, xform.eDy);
			m_pGraphics->SetTransform(&matrix);
		}

		// Output goes to metafile. So we must copy destination transform
		// even if hDestDC==m_hDC. Becareful though to not apply the transformation twice.
		GetWorldTransform(hDestDC, &xform);
		m_DestMatrix.SetElements(xform.eM11, xform.eM12, xform.eM21, xform.eM22, xform.eDx, xform.eDy); 

		return TRUE;
	}

// Data
private:
	GDPMetafile*	m_pMeta;

	// prohibited calls
	CSCEMFmetaDCRenderer();
};

#endif //_SCEMFDCRENDERER_H_
//  ------------------------------------------------------------

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -