📄 scemfdcrenderer.h
字号:
}
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 + -