// virtual function to process every EMF record, return 0 to terminate virtual int ProcessRecord(HDC hDC, HANDLETABLE * pHTable, const ENHMETARECORD * pEMFR, int nObj) { int rslt; switch ( pEMFR->iType ) { case EMR_CREATEBRUSHINDIRECT: { EMRCREATEBRUSHINDIRECT cbi; cbi = * (const EMRCREATEBRUSHINDIRECT *) pEMFR; MaptoGray(cbi.lb.lbColor); rslt = PlayEnhMetaFileRecord(hDC, pHTable, (const ENHMETARECORD *) & cbi, nObj); } break; case EMR_CREATEPEN: { EMRCREATEPEN cp; cp = * (const EMRCREATEPEN *) pEMFR; MaptoGray(cp.lopn.lopnColor); rslt = PlayEnhMetaFileRecord(hDC, pHTable, (const ENHMETARECORD *) & cp, nObj); } break; case EMR_SETTEXTCOLOR: case EMR_SETBKCOLOR: { EMRSETTEXTCOLOR stc; stc = * (const EMRSETTEXTCOLOR *) pEMFR; MaptoGray(stc.crColor); rslt = PlayEnhMetaFileRecord(hDC, pHTable, (const ENHMETARECORD *) & stc, nObj); } break; case EMR_RESERVED_105: case EMR_RESERVED_106: case EMR_RESERVED_107: case EMR_RESERVED_108: case EMR_RESERVED_109: case EMR_RESERVED_110: case EMR_RESERVED_119: case EMR_RESERVED_120: rslt = PlayEnhMetaFileRecord(hDC, pHTable, pEMFR, nObj); break; default: rslt = PlayEnhMetaFileRecord(hDC, pHTable, pEMFR, nObj); } return rslt; }
int CALLBACK EnhMetaFileProc (HDC hdc, HANDLETABLE * pHandleTable, CONST ENHMETARECORD * pEmfRecord, int iHandles, LPARAM pData) { HBRUSH hBrush ; HPEN hPen ; LOGBRUSH lb ; if (pEmfRecord->iType != EMR_HEADER && pEmfRecord->iType != EMR_EOF) PlayEnhMetaFileRecord (hdc, pHandleTable, pEmfRecord, iHandles) ; if (pEmfRecord->iType == EMR_RECTANGLE) { hBrush = SelectObject (hdc, GetStockObject (NULL_BRUSH)) ; lb.lbStyle = BS_SOLID ; lb.lbColor = RGB (0, 255, 0) ; lb.lbHatch = 0 ; hPen = SelectObject (hdc, ExtCreatePen (PS_SOLID | PS_GEOMETRIC, 5, &lb, 0, NULL)) ; Ellipse (hdc, 100, 100, 200, 200) ; DeleteObject (SelectObject (hdc, hPen)) ; SelectObject (hdc, hBrush) ; } return TRUE ; }
int CALLBACK EnhMetaFileProc (HDC hdc, HANDLETABLE * pHandleTable, CONST ENHMETARECORD * pEmfRecord, int iHandles, LPARAM pData) { PlayEnhMetaFileRecord (hdc, pHandleTable, pEmfRecord, iHandles) ; return TRUE ; }
// virtual function to process every EMF record, return 0 to terminate virtual int ProcessRecord(HDC hDC, HANDLETABLE * pHTable, const ENHMETARECORD * pEMFR, int nObj) { CompareDC(hDC); m_pLog->Log("%4d: %08x %3d % 6d ", m_nSeq++, pEMFR, pEMFR->iType, pEMFR->nSize); m_pLog->Log(m_emfdc.DecodeRecord((const EMR *) pEMFR)); m_pLog->Log("\r\n"); return PlayEnhMetaFileRecord(hDC, pHTable, pEMFR, nObj); }
// virtual function to process every EMF record, return 0 to terminate virtual int ProcessRecord(HDC hDC, HANDLETABLE * pHTable, const ENHMETARECORD * pEMFR, int nObj) { Sleep(m_delay); // MSG msg; // while ( PeekMessage(&msg, NULL, 0, 0, PM_REMOVE) ) // { // TranslateMessage(&msg); // DispatchMessage(&msg); // } return PlayEnhMetaFileRecord(hDC, pHTable, pEMFR, nObj); }
int CALLBACK SlowPaintEMF(HDC hDC, HANDLETABLE *lpHTable, ENHMETARECORD *lpEMFR, int nObj, LPVOID lpData) { if (lpData) { KProgress *Progress = (KProgress *) lpData; if (Progress->Active()) if (Progress->AbortDraw()) Progress->Destroy(); else { Progress->Delay(); if (lpEMFR->iType==EMR_HEADER) Progress->SetRange(0, ((ENHMETAHEADER *)lpEMFR)->nRecords); else Progress->Move(); } } return PlayEnhMetaFileRecord(hDC, lpHTable, lpEMFR, nObj); }
GpStatus WINGDIPAPI GdipPlayMetafileRecord(GDIPCONST GpMetafile *metafile, EmfPlusRecordType recordType, UINT flags, UINT dataSize, GDIPCONST BYTE *data) { GpStatus stat; GpMetafile *real_metafile = (GpMetafile*)metafile; TRACE("(%p,%x,%x,%d,%p)\n", metafile, recordType, flags, dataSize, data); if (!metafile || (dataSize && !data) || !metafile->playback_graphics) return InvalidParameter; if (recordType >= 1 && recordType <= 0x7a) { /* regular EMF record */ if (metafile->playback_dc) { ENHMETARECORD *record; record = heap_alloc_zero(dataSize + 8); if (record) { record->iType = recordType; record->nSize = dataSize + 8; memcpy(record->dParm, data, dataSize); PlayEnhMetaFileRecord(metafile->playback_dc, metafile->handle_table, record, metafile->handle_count); heap_free(record); } else return OutOfMemory; } } else { EmfPlusRecordHeader *header = (EmfPlusRecordHeader*)(data)-1; METAFILE_PlaybackReleaseDC((GpMetafile*)metafile); switch(recordType) { case EmfPlusRecordTypeHeader: case EmfPlusRecordTypeEndOfFile: break; case EmfPlusRecordTypeGetDC: METAFILE_PlaybackGetDC((GpMetafile*)metafile); break; case EmfPlusRecordTypeClear: { EmfPlusClear *record = (EmfPlusClear*)header; return GdipGraphicsClear(metafile->playback_graphics, record->Color); } case EmfPlusRecordTypeFillRects: { EmfPlusFillRects *record = (EmfPlusFillRects*)header; GpBrush *brush, *temp_brush=NULL; GpRectF *rects, *temp_rects=NULL; if (dataSize + sizeof(EmfPlusRecordHeader) < sizeof(EmfPlusFillRects)) return InvalidParameter; if (flags & 0x4000) { if (dataSize + sizeof(EmfPlusRecordHeader) < sizeof(EmfPlusFillRects) + sizeof(EmfPlusRect) * record->Count) return InvalidParameter; } else { if (dataSize + sizeof(EmfPlusRecordHeader) < sizeof(EmfPlusFillRects) + sizeof(GpRectF) * record->Count) return InvalidParameter; } if (flags & 0x8000) { stat = GdipCreateSolidFill((ARGB)record->BrushID, (GpSolidFill**)&temp_brush); brush = temp_brush; } else { FIXME("brush deserialization not implemented\n"); return NotImplemented; } if (stat == Ok) { if (flags & 0x4000) { EmfPlusRect *int_rects = (EmfPlusRect*)(record+1); int i; rects = temp_rects = heap_alloc_zero(sizeof(GpRectF) * record->Count); if (rects) { for (i=0; i<record->Count; i++) { rects[i].X = int_rects[i].X; rects[i].Y = int_rects[i].Y; rects[i].Width = int_rects[i].Width; rects[i].Height = int_rects[i].Height; } } else stat = OutOfMemory; } else rects = (GpRectF*)(record+1); } if (stat == Ok) { stat = GdipFillRectangles(metafile->playback_graphics, brush, rects, record->Count); } GdipDeleteBrush(temp_brush); heap_free(temp_rects); return stat; } case EmfPlusRecordTypeSetPageTransform: { EmfPlusSetPageTransform *record = (EmfPlusSetPageTransform*)header; GpUnit unit = (GpUnit)flags; if (dataSize + sizeof(EmfPlusRecordHeader) < sizeof(EmfPlusSetPageTransform)) return InvalidParameter; real_metafile->page_unit = unit; real_metafile->page_scale = record->PageScale; return METAFILE_PlaybackUpdateWorldTransform(real_metafile); } default: FIXME("Not implemented for record type %x\n", recordType); return NotImplemented; } } return Ok; }