📄 scemfgdiparser.cpp
字号:
SCPlayRecord(); // required for ROP management
#endif
EMRSCALEWINDOWEXTEX *pRec = (EMRSCALEWINDOWEXTEX*)m_pRecord;
m_pRenderer->SCScaleWindow(pRec->xNum, pRec->xDenom, pRec->yNum, pRec->yDenom);
return SC_BRK_NOERROR;
}
SC_BRKRESULT CSCEMFgdiParser::OnEmfSAVEDC()
{
// TRACE0("**EMR_SAVEDC\n");
ASSERT(m_pRenderer);
SCPlayRecord();
m_pRenderer->SCOnDCSaved();
return SC_BRK_NOERROR;
}
SC_BRKRESULT CSCEMFgdiParser::OnEmfRESTOREDC()
{
// TRACE0("**EMR_RESTOREDC\n");
ASSERT(m_pRenderer);
SCPlayRecord();
// Be careful : sometimes we get bad values from the record.
// Some documents contain values like 30,
// though there is only one DC state on the stack
m_pRenderer->SCOnDCRestored(((EMRRESTOREDC*)m_pRecord)->iRelative);
return SC_BRK_NOERROR;
}
SC_BRKRESULT CSCEMFgdiParser::OnEmfSETWORLDTRANSFORM()
{
// TRACE0("**EMR_SETWORLDTRANSFORM\n");
ASSERT(m_pRenderer);
#ifndef SC_RENDERER_CAN_DOROP
SCPlayRecord(); // required for ROP management
#endif
m_pRenderer->SCSetWorldTransform(((EMRSETWORLDTRANSFORM*)m_pRecord)->xform);
return SC_BRK_NOERROR;
}
SC_BRKRESULT CSCEMFgdiParser::OnEmfMODIFYWORLDTRANSFORM()
{
// TRACE0("**EMR_MODIFYWORLDTRANSFORM\n");
ASSERT(m_pRenderer);
#ifndef SC_RENDERER_CAN_DOROP
SCPlayRecord(); // required for ROP management
#endif
m_pRenderer->SCModifyWorldTransform(((EMRMODIFYWORLDTRANSFORM*)m_pRecord)->xform,
((EMRMODIFYWORLDTRANSFORM*)m_pRecord)->iMode);
return SC_BRK_NOERROR;
}
SC_BRKRESULT CSCEMFgdiParser::OnEmfSELECTOBJECT()
{
// TRACE0("**EMR_SELECTOBJECT\n");
ASSERT(m_pRenderer);
// First, play the record to realize GDI objects
SCPlayRecord();
// Then extract objects characteristics
EMRSELECTOBJECT *pRec = (EMRSELECTOBJECT*)m_pRecord;
HGDIOBJ hGdiObj;
// Is the high order bit set?
if (pRec->ihObject & 0x80000000)
{
// High order bit is set - its a stock object
// Strip the high bit to get the index
DWORD dwIndex = pRec->ihObject & 0x7fffffff;
// Pass the index to GetStockObject()
hGdiObj = GetStockObject( dwIndex );
} else
// High order bit isn't set - not a stock object
hGdiObj = (HGDIOBJ)m_lpEnumHandleTable->objectHandle[pRec->ihObject];
long lType = GetObjectType(hGdiObj);
switch(lType)
{
case OBJ_EXTPEN:
m_pRenderer->SCOnChangeExtPen((HPEN)hGdiObj);
break;
case OBJ_PEN:
m_pRenderer->SCOnChangePen((HPEN)hGdiObj);
break;
case OBJ_BRUSH:
m_pRenderer->SCOnChangeBrush((HBRUSH)hGdiObj);
break;
case OBJ_FONT:
m_pRenderer->SCOnChangeFont((HFONT)hGdiObj);
break;
//case OBJ_PAL:
// unlikely to occur (The SelectObject function does not work with palettes)
//m_pRenderer->SCOnChangePalette((HPALETTE)hGdiObj);
//break;
}
return SC_BRK_NOERROR;
}
SC_BRKRESULT CSCEMFgdiParser::OnEmfCREATEPEN()
{
// TRACE0("**EMR_CREATEPEN\n");
ASSERT(m_pRenderer);
SCPlayRecord();
// Object creation: do nothing
// EMRCREATEPEN *pRec = (EMRCREATEPEN*)m_pRecord;
return SC_BRK_NOERROR;
}
SC_BRKRESULT CSCEMFgdiParser::OnEmfCREATEBRUSHINDIRECT()
{
// TRACE0("**EMR_CREATEBRUSHINDIRECT\n");
ASSERT(m_pRenderer);
// Note: due to dithering, Windows may change BS_SOLID in BS_PATTERN
SCPlayRecord();
// Object creation: do nothing
// EMRCREATEBRUSHINDIRECT *pRec = (EMRCREATEBRUSHINDIRECT*)m_pRecord;
return SC_BRK_NOERROR;
}
SC_BRKRESULT CSCEMFgdiParser::OnEmfDELETEOBJECT()
{
// TRACE0("**EMR_DELETEOBJECT\n");
ASSERT(m_pRenderer);
SCPlayRecord();
// Object deletion: do nothing
// EMRDELETEOBJECT *pRec = (EMRDELETEOBJECT*)m_pRecord;
return SC_BRK_NOERROR;
}
SC_BRKRESULT CSCEMFgdiParser::OnEmfANGLEARC()
{
// TRACE0("**EMR_ANGLEARC\n");
ASSERT(m_pRenderer);
EMRANGLEARC *pRec = (EMRANGLEARC*)m_pRecord;
m_pRenderer->SCDrawAngleArc((LPPOINT)&pRec->ptlCenter, pRec->nRadius, pRec->eStartAngle, pRec->eSweepAngle);
return SC_BRK_NOERROR;
}
SC_BRKRESULT CSCEMFgdiParser::OnEmfELLIPSE()
{
// TRACE0("**EMR_ELLIPSE\n");
ASSERT(m_pRenderer);
m_pRenderer->SCDrawEllipse((LPCRECT)&((EMRELLIPSE*)m_pRecord)->rclBox);
return SC_BRK_NOERROR;
}
SC_BRKRESULT CSCEMFgdiParser::OnEmfRECTANGLE()
{
// TRACE0("**EMR_RECTANGLE\n");
ASSERT(m_pRenderer);
m_pRenderer->SCDrawRectangle((LPCRECT)&((EMRRECTANGLE*)m_pRecord)->rclBox);
return SC_BRK_NOERROR;
}
SC_BRKRESULT CSCEMFgdiParser::OnEmfROUNDRECT()
{
// TRACE0("**EMR_ROUNDRECT\n");
ASSERT(m_pRenderer);
m_pRenderer->SCDrawRoundRectangle((LPCRECT)&((EMRROUNDRECT*)m_pRecord)->rclBox,
((EMRROUNDRECT*)m_pRecord)->szlCorner);
return SC_BRK_NOERROR;
}
SC_BRKRESULT CSCEMFgdiParser::OnEmfARC()
{
// TRACE0("**EMR_ARC\n");
ASSERT(m_pRenderer);
m_pRenderer->SCDrawArc(&((EMRARC*)m_pRecord)->rclBox,
&((EMRARC*)m_pRecord)->ptlStart,
&((EMRARC*)m_pRecord)->ptlEnd);
return SC_BRK_NOERROR;
}
SC_BRKRESULT CSCEMFgdiParser::OnEmfCHORD()
{
// TRACE0("**EMR_CHORD\n");
ASSERT(m_pRenderer);
m_pRenderer->SCDrawChord(&((EMRCHORD*)m_pRecord)->rclBox,
&((EMRCHORD*)m_pRecord)->ptlStart,
&((EMRCHORD*)m_pRecord)->ptlEnd);
return SC_BRK_NOERROR;
}
SC_BRKRESULT CSCEMFgdiParser::OnEmfPIE()
{
// TRACE0("**EMR_PIE\n");
ASSERT(m_pRenderer);
m_pRenderer->SCDrawPie(&((EMRPIE*)m_pRecord)->rclBox,
&((EMRPIE*)m_pRecord)->ptlStart,
&((EMRPIE*)m_pRecord)->ptlEnd);
return SC_BRK_NOERROR;
}
SC_BRKRESULT CSCEMFgdiParser::OnEmfSELECTPALETTE()
{
// TRACE0("**EMR_SELECTPALETTE\n");
ASSERT(m_pRenderer);
SCPlayRecord();
m_pRenderer->SCOnChangePalette((HPALETTE)((EMRSELECTPALETTE*)m_pRecord)->ihPal);
return SC_BRK_NOERROR;
}
SC_BRKRESULT CSCEMFgdiParser::OnEmfCREATEPALETTE()
{
// TRACE0("**EMR_CREATEPALETTE\n");
ASSERT(m_pRenderer);
SCPlayRecord();
// Object creation: do nothing
// EMRCREATEPALETTE *pRec = (EMRCREATEPALETTE*)m_pRecord;
return SC_BRK_NOERROR;
}
SC_BRKRESULT CSCEMFgdiParser::OnEmfSETPALETTEENTRIES()
{
// TRACE0("**EMR_SETPALETTEENTRIES\n");
ASSERT(m_pRenderer);
SCPlayRecord();
// Object creation: do nothing
// EMRSETPALETTEENTRIES *pRec = (EMRSETPALETTEENTRIES*)m_pRecord;
return SC_BRK_NOERROR;
}
SC_BRKRESULT CSCEMFgdiParser::OnEmfRESIZEPALETTE()
{
// TRACE0("**EMR_RESIZEPALETTE\n");
ASSERT(m_pRenderer);
SCPlayRecord();
// Object creation: do nothing
// EMRRESIZEPALETTE *pRec = (EMRRESIZEPALETTE*)m_pRecord;
return SC_BRK_NOERROR;
}
SC_BRKRESULT CSCEMFgdiParser::OnEmfREALIZEPALETTE()
{
// TRACE0("**EMR_REALIZEPALETTE\n");
ASSERT(m_pRenderer);
SCPlayRecord();
// Object creation: do nothing
// EMRREALIZEPALETTE *pRec = (EMRREALIZEPALETTE*)m_pRecord;
return SC_BRK_NOERROR;
}
SC_BRKRESULT CSCEMFgdiParser::OnEmfEXTFLOODFILL()
{
// TRACE0("**EMR_EXTFLOODFILL\n");
ASSERT(m_pRenderer);
m_pRenderer->SCFloodFill(((EMREXTFLOODFILL*)m_pRecord)->ptlStart,
((EMREXTFLOODFILL*)m_pRecord)->crColor,
((EMREXTFLOODFILL*)m_pRecord)->iMode);
return SC_BRK_NOERROR;
}
SC_BRKRESULT CSCEMFgdiParser::OnEmfLINETO()
{
// TRACE0("**EMR_LINETO\n");
ASSERT(m_pRenderer);
m_pRenderer->SCDrawLinesTo((LPPOINT)&((EMRLINETO*)m_pRecord)->ptl, 1);
return SC_BRK_NOERROR;
}
SC_BRKRESULT CSCEMFgdiParser::OnEmfARCTO()
{
// TRACE0("**EMR_ARCTO\n");
ASSERT(m_pRenderer);
m_pRenderer->SCDrawArcTo(&((EMRARCTO*)m_pRecord)->rclBox,
&((EMRARCTO*)m_pRecord)->ptlStart,
&((EMRARCTO*)m_pRecord)->ptlEnd);
return SC_BRK_NOERROR;
}
SC_BRKRESULT CSCEMFgdiParser::OnEmfPOLYDRAW()
{
// TRACE0("**EMR_POLYDRAW\n");
ASSERT(m_pRenderer);
EMRPOLYDRAW *pRec = (EMRPOLYDRAW*)m_pRecord;
BYTE* pTypes = (BYTE*)((POINTL*)pRec->aptl + pRec->cptl);
m_pRenderer->SCDrawPolyDraw((POINT*)pRec->aptl,
pRec->cptl,
pTypes);
return SC_BRK_NOERROR;
}
SC_BRKRESULT CSCEMFgdiParser::OnEmfSETARCDIRECTION()
{
// TRACE0("**EMR_SETARCDIRECTION\n");
ASSERT(m_pRenderer);
m_pRenderer->SCSetArcDirection(((EMRSETARCDIRECTION*)m_pRecord)->iArcDirection);
return SC_BRK_NOERROR;
}
SC_BRKRESULT CSCEMFgdiParser::OnEmfSETMITERLIMIT()
{
// TRACE0("**EMR_SETMITERLIMIT\n");
ASSERT(m_pRenderer);
m_pRenderer->SCSetMiterLimit(((EMRSETMITERLIMIT*)m_pRecord)->eMiterLimit);
return SC_BRK_NOERROR;
}
SC_BRKRESULT CSCEMFgdiParser::OnEmfBEGINPATH()
{
// TRACE0("**EMR_BEGINPATH\n");
ASSERT(m_pRenderer);
//EMRBEGINPATH *pRec = (EMRBEGINPATH*)m_pRecord;
m_pRenderer->SCBeginPath();
return SC_BRK_NOERROR;
}
SC_BRKRESULT CSCEMFgdiParser::OnEmfENDPATH()
{
// TRACE0("**EMR_ENDPATH\n");
ASSERT(m_pRenderer);
//EMRENDPATH *pRec = (EMRENDPATH*)m_pRecord;
m_pRenderer->SCEndPath();
return SC_BRK_NOERROR;
}
SC_BRKRESULT CSCEMFgdiParser::OnEmfCLOSEFIGURE()
{
// TRACE0("**EMR_CLOSEFIGURE\n");
ASSERT(m_pRenderer);
//EMRCLOSEFIGURE *pRec = (EMRCLOSEFIGURE*)m_pRecord;
m_pRenderer->SCCloseFigure();
return SC_BRK_NOERROR;
}
SC_BRKRESULT CSCEMFgdiParser::OnEmfFILLPATH()
{
// TRACE0("**EMR_FILLPATH\n");
ASSERT(m_pRenderer);
//EMRFILLPATH *pRec = (EMRFILLPATH*)m_pRecord;
// Note: Don't know what the rclBounds is doing in the record
m_pRenderer->SCApplyPath(SC_PATH_FILL);
return SC_BRK_NOERROR;
}
SC_BRKRESULT CSCEMFgdiParser::OnEmfSTROKEANDFILLPATH()
{
// TRACE0("**EMR_STROKEANDFILLPATH\n");
ASSERT(m_pRenderer);
//EMRSTROKEANDFILLPATH *pRec = (EMRSTROKEANDFILLPATH*)m_pRecord;
// Note: Don't know what the rclBounds is doing in the record
m_pRenderer->SCApplyPath(SC_PATH_STROKEANDFILL);
return SC_BRK_NOERROR;
}
SC_BRKRESULT CSCEMFgdiParser::OnEmfSTROKEPATH()
{
// TRACE0("**EMR_STROKEPATH\n");
ASSERT(m_pRenderer);
//EMRSTROKEPATH *pRec = (EMRSTROKEPATH*)m_pRecord;
// Note: Don't know what the rclBounds is doing in the record
m_pRenderer->SCApplyPath(SC_PATH_STROKE);
return SC_BRK_NOERROR;
}
SC_BRKRESULT CSCEMFgdiParser::OnEmfFLATTENPATH()
{
// TRACE0("**EMR_FLATTENPATH\n");
ASSERT(m_pRenderer);
//EMRFLATTENPATH *pRec = (EMRFLATTENPATH*)m_pRecord;
m_pRenderer->SCFlattenPath();
return SC_BRK_NOERROR;
}
SC_BRKRESULT CSCEMFgdiParser::OnEmfWIDENPATH()
{
// TRACE0("**EMR_WIDENPATH\n");
ASSERT(m_pRenderer);
//EMRWIDENPATH *pRec = (EMRWIDENPATH*)m_pRecord;
m_pRenderer->SCWidenPath();
return SC_BRK_NOERROR;
}
SC_BRKRESULT CSCEMFgdiParser::OnEmfSELECTCLIPPATH()
{
// TRACE0("**EMR_SELECTCLIPPATH\n");
ASSERT(m_pRenderer);
m_pRenderer->SCApplyPath(SC_PATH_CLIP, ((EMRSELECTCLIPPATH*)m_pRecord)->iMode);
return SC_BRK_NOERROR;
}
SC_BRKRESULT CSCEMFgdiParser::OnEmfABORTPATH()
{
// TRACE0("**EMR_ABORTPATH\n");
ASSERT(m_pRenderer);
//EMRABORTPATH *pRec = (EMRABORTPATH*)m_pRecord;
m_pRenderer->SCAbortPath();
return SC_BRK_NOERROR;
}
SC_BRKRESULT CSCEMFgdiParser::OnEmfGDICOMMENT()
{
// TRACE0("**EMR_GDICOMMENT\n");
ASSERT(m_pRenderer);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -