emfdc.cpp

来自「Windows 图形编程 书籍」· C++ 代码 · 共 918 行 · 第 1/2 页

CPP
918
字号
//-----------------------------------------------------------------------------------//
//              Windows Graphics Programming: Win32 GDI and DirectDraw               //
//                             ISBN  0-13-086985-6                                   //
//                                                                                   //
//  Written            by  Yuan, Feng                             www.fengyuan.com   //
//  Copyright (c) 2000 by  Hewlett-Packard Company                www.hp.com         //
//  Published          by  Prentice Hall PTR, Prentice-Hall, Inc. www.phptr.com      //
//                                                                                   //
//  FileName   : emfdc.cpp						                                     //
//  Description: EMF decompiler								                         //
//  Version    : 1.00.000, May 31, 2000                                              //
//-----------------------------------------------------------------------------------//

#define  STRICT
#define WIN32_LEAN_AND_MEAN
#define _WIN32_WINNT 0x0500
#define WINVER		 0x500

#include <windows.h>
#include <assert.h>
#include <commctrl.h>
#include <fstream>

#include "..\..\include\treeview.h"
#include "..\..\include\mmfile.h"

#include "EmfDC.h"
#include "Formator.h"
#include "OutPipe.h"

#include "resource.h"


const DicItem Dic_BkMode[] =
{
	pair(OPAQUE),
	pair(TRANSPARENT),
	dummyitem
};


const DicItem Dic_ArcDirection[] =
{
	pair(AD_COUNTERCLOCKWISE),
	pair(AD_CLOCKWISE),
	dummyitem
};
 

const DicItem Dic_PolyFillMode[] =
{
	pair(ALTERNATE),
	pair(WINDING),
	dummyitem
};


const DicItem Dic_MapMode[] =
{
	pair(MM_ANISOTROPIC), 
	pair(MM_HIENGLISH), 
	pair(MM_HIMETRIC), 
	pair(MM_ISOTROPIC), 
	pair(MM_LOENGLISH), 
	pair(MM_LOMETRIC), 
	pair(MM_TEXT), 
	pair(MM_TWIPS),
	dummyitem
};
 

const DicItem Dic_StretchBltMode[] =
{ 
	pair(STRETCH_ANDSCANS), 
	pair(STRETCH_DELETESCANS), 
	pair(STRETCH_ORSCANS),
	pair(STRETCH_HALFTONE), 
	pair(BLACKONWHITE),
	pair(COLORONCOLOR),
	pair(HALFTONE),
	pair(WHITEONBLACK),
	dummyitem
};


const DicItem Dic_ICMMode [] =
{
	pair(ICM_ON),
	pair(ICM_OFF),
	pair(ICM_QUERY),
	dummyitem
};


const DicItem Dic_RegionOper [] =
{
	pair(RGN_AND),
	pair(RGN_XOR),
	pair(RGN_COPY), 
	pair(RGN_DIFF), 
	pair(RGN_OR),
	dummyitem
};


const DicItem Dic_TransCombineMode [] =
{
	pair(MWT_IDENTITY),
	pair(MWT_LEFTMULTIPLY),
	pair(MWT_RIGHTMULTIPLY),
	dummyitem
};


const DicItem Dic_ROP2 [] =
{
	pair(R2_BLACK), 
	pair(R2_COPYPEN), 
	pair(R2_MASKNOTPEN), 
	pair(R2_MASKPEN), 
	pair(R2_MASKPENNOT),
	pair(R2_MERGENOTPEN), 
	pair(R2_MERGEPEN), 
	pair(R2_MERGEPENNOT), 
	pair(R2_NOP), 
	pair(R2_NOT), 
	pair(R2_NOTCOPYPEN), 
	pair(R2_NOTMASKPEN), 
	pair(R2_NOTMERGEPEN), 
	pair(R2_NOTXORPEN), 
	pair(R2_WHITE), 
	pair(R2_XORPEN),
	dummyitem
};


const DicItem Dic_FloodFillMode [] =
{
	pair(FLOODFILLBORDER),
	pair(FLOODFILLSURFACE),
	dummyitem
};


const DicItem Dic_PenStyle[] =
{
//	tripod(PS_COSMETIC,     PS_TYPE_MASK),
	tripod(PS_GEOMETRIC,    PS_TYPE_MASK),

	tripod(PS_SOLID,		PS_STYLE_MASK),
	tripod(PS_DASH,			PS_STYLE_MASK),
	tripod(PS_DOT,			PS_STYLE_MASK),
	tripod(PS_DASHDOT,		PS_STYLE_MASK),
	tripod(PS_DASHDOTDOT,	PS_STYLE_MASK),
	tripod(PS_NULL,			PS_STYLE_MASK),
	tripod(PS_INSIDEFRAME,	PS_STYLE_MASK),
	tripod(PS_USERSTYLE,	PS_STYLE_MASK),
	tripod(PS_ALTERNATE,	PS_STYLE_MASK),

//	tripod(PS_ENDCAP_ROUND, PS_ENDCAP_MASK),
	tripod(PS_ENDCAP_SQUARE,PS_ENDCAP_MASK),
	tripod(PS_ENDCAP_FLAT,  PS_ENDCAP_MASK),
	
//	tripod(PS_JOIN_ROUND,   PS_JOIN_MASK),
	tripod(PS_JOIN_BEVEL,   PS_JOIN_MASK),
	tripod(PS_JOIN_MITER,   PS_JOIN_MASK),
	
	dummyitem
};


const DicItem Dic_ROP3[] =
{
	pair(BLACKNESS), 
	pair(DSTINVERT), 
	pair(MERGECOPY), 
	pair(MERGEPAINT), 
	pair(NOTSRCCOPY), 
	pair(NOTSRCERASE), 
	pair(PATCOPY), 
	pair(PATINVERT), 
	pair(PATPAINT), 
	pair(SRCAND), 
	pair(SRCCOPY), 
	pair(SRCERASE), 
	pair(SRCINVERT), 
	pair(SRCPAINT), 
	pair(WHITENESS), 
	dummyitem
};


const DicItem Dic_DIBColor [] =
{
	pair(DIB_PAL_COLORS),
//	pair(DIB_PAL_INDICES),
	pair(DIB_RGB_COLORS),
	dummyitem
};

typedef struct
{
	unsigned      type;

	const TCHAR * funcname;
	const DicItem * dic;
}	EmrInfo;


const DicItem Dic_TextAlign [] = 
{
	tripod(TA_NOUPDATECP,     0x01),
	tripod(TA_UPDATECP,       0x01),

	tripod(TA_LEFT,			  0x06),
	tripod(TA_RIGHT,          0x06),
	tripod(TA_CENTER,         0x06),

	tripod(TA_TOP,            0x18),
	tripod(TA_BOTTOM,         0x18),
	tripod(TA_BASELINE,       0x18),

	tripod(TA_RTLREADING,     0x100),

	dummyitem
};


const DicItem Dic_ExtTextOption [] = 
{
	tripod(ETO_OPAQUE,			ETO_OPAQUE),
	tripod(ETO_CLIPPED,			ETO_CLIPPED),
	tripod(ETO_GLYPH_INDEX,		ETO_GLYPH_INDEX),
	tripod(ETO_RTLREADING,		ETO_RTLREADING),
	tripod(ETO_NUMERICSLOCAL,	ETO_NUMERICSLOCAL),
	tripod(ETO_NUMERICSLATIN,	ETO_NUMERICSLATIN),
	tripod(ETO_IGNORELANGUAGE,	ETO_IGNORELANGUAGE),
	tripod(ETO_PDY,				ETO_PDY),
	dummyitem
};


const EmrInfo Pattern [] = 
{
	{ EMR_SETWINDOWEXTEX          , "SetWindowExtEx"		"(hDC, %d, %d, NULL);" },
    { EMR_SETWINDOWORGEX          , "SetWindowOrgEx"		"(hDC, %d, %d, NULL);" },
    { EMR_SETVIEWPORTEXTEX        , "SetViewportExtEx"		"(hDC, %d, %d, NULL);" },
    { EMR_SETVIEWPORTORGEX        , "SetViewportOrgEx"		"(hDC, %d, %d, NULL);" },
    { EMR_SCALEVIEWPORTEXTEX      , "ScaleViewportExtEx"	"(hDC, %d, %d, %d, %d, NULL);" },
    { EMR_SCALEWINDOWEXTEX        , "ScaleWindowExtEx"		"(hDC, %d, %d, %d, %d, NULL);" },
	{ EMR_SETLAYOUT				  , "SetLayout"				"(hDC, %d)" },
	{ EMR_SETMETARGN              , "SetMetaRgn"			"(hDC);" },
        
	{ EMR_BEGINPATH               , "BeginPath"				"(hDC);" },
    { EMR_ENDPATH                 , "EndPath"				"(hDC);" },
	{ EMR_ABORTPATH               , "AbortPath"				"(hDC);" },
    { EMR_FLATTENPATH             , "FlattenPath"			"(hDC);" },
    { EMR_WIDENPATH               , "WidenPath"				"(hDC);" },
    { EMR_CLOSEFIGURE             , "CloseFigure"			"(hDC);" },
	{ EMR_FILLPATH                , "FillPath"				"(hDC);" },
    { EMR_STROKEANDFILLPATH       , "StrokeAndFillPath"		"(hDC);" },
    { EMR_STROKEPATH              , "StrokePath"			"(hDC);" },
    { EMR_SAVEDC                  , "SaveDC"				"(hDC);" },
    { EMR_RESTOREDC               , "RestoreDC"				"(hDC, %d);" },
    
	{ EMR_CREATEPEN               , "#o=CreatePen(%L, %d%_, #c);", Dic_PenStyle },
    { EMR_CREATEBRUSHINDIRECT     , "#o=#C;" },
	{ EMR_EXTCREATEFONTINDIRECTW  , "#o=CreateFont(%d,%d,%d,%d,%d,%b,%b,%b,%b,%b,%b,%b,%b,%S);" },
    { EMR_CREATEPALETTE           , "#o=CreatePalette(LOGPALETTE {%D,%D,...});" },
    
	{ EMR_SELECTOBJECT            , "SelectObject(hDC, #o);" },
	{ EMR_SELECTPALETTE           , "SelectPalette(hDC, (HPALETTE)#o, TRUE);" },
	{ EMR_SETCOLORSPACE           , "SetColorSpace(hDC, #o);" },
    { EMR_DELETEOBJECT            , "DeleteObject(#o);" },
    { EMR_DELETECOLORSPACE        , "DeleteColorSpace(#o);" },
    
	{ EMR_SETTEXTCOLOR            , "SetTextColor(hDC, #c);" },
    { EMR_SETBKCOLOR              , "SetBkColor(hDC, #c);" },
	{ EMR_SETBRUSHORGEX           , "SetBrushOrgEx(hDC, %d, %d, NULL);" },
	{ EMR_SELECTCLIPPATH          , "SelectClipPath(hDC, %L);", Dic_RegionOper },
    { EMR_SETTEXTALIGN            , "SetTextAlign(hDC, %L);", Dic_TextAlign },
    
	{ EMR_SETBKMODE               , "SetBkMode(hDC, %L);",			Dic_BkMode },
    { EMR_SETARCDIRECTION         , "SetArcDirection(hDC, %L);",		Dic_ArcDirection },
    { EMR_SETPOLYFILLMODE         , "SetPolyFillMode(hDC, %L);",		Dic_PolyFillMode },
    { EMR_SETMAPMODE              , "SetMapMode(hDC, %L);",			Dic_MapMode },
    { EMR_SETSTRETCHBLTMODE       , "SetStretchBltMode(hDC, %L);",	Dic_StretchBltMode },
    { EMR_SETMAPPERFLAGS          , "SetMapperFlags(hDC, %d);" },
    { EMR_SETICMMODE              , "SetICMMode(hDC, %d);",          Dic_ICMMode },
    { EMR_SETROP2                 , "SetROP2(hDC, %L);",             Dic_ROP2 },

    { EMR_SETMITERLIMIT           , "SetMiterLimit(hDC, %f);" },
    { EMR_SETWORLDTRANSFORM       , "SetWorldTransform(hDC, %f, %f, %f, %f, %f, %f);" }, 
    { EMR_MODIFYWORLDTRANSFORM    , "ModifyWorldTransform(hDC, %f, %f, %f, %f, %f, %f, %L);", Dic_TransCombineMode },
    
	{ EMR_REALIZEPALETTE          , "RealizePalette(hDC);" },
    { EMR_RESIZEPALETTE           , "ResizePalette(hDC, #o, %d);" },
    
	{ EMR_OFFSETCLIPRGN           , "OffsetClipRgn(hDC, %d, %d);" },
    { EMR_EXCLUDECLIPRECT         , "ExcludeClipRect(hDC, %d, %d, %d, %d);" },
    { EMR_INTERSECTCLIPRECT       , "IntersectClipRect(hDC, %d, %d, %d, %d);" },
    
    { EMR_SETPIXELV               , "SetPixelV(hDC, %d, %d, #c);" },
    { EMR_MOVETOEX                , "MoveToEx(hDC, %d, %d, NULL);" },
    { EMR_LINETO                  , "LineTo(hDC, %d, %d);" },
	{ EMR_RECTANGLE               , "Rectangle(hDC, %d, %d, %d, %d);" },
    { EMR_ELLIPSE                 , "Ellipse(hDC, %d, %d, %d, %d);" },
	{ EMR_ROUNDRECT               , "RoundRect(hDC, %d, %d, %d, %d, %d, %d);" },
    { EMR_PIE                     , "Pie(hDC, %d, %d, %d, %d, %d, %d, %d, %d);" },
    { EMR_ARC                     , "Arc(hDC, %d, %d, %d, %d, %d, %d, %d, %d);" },
    { EMR_CHORD                   , "Chord(hDC, %d, %d, %d, %d, %d, %d, %d, %d);" },
    { EMR_ARCTO                   , "ArcTo(hDC, %d, %d, %d, %d, %d, %d, %d, %d);" },
	{ EMR_ANGLEARC                , "AngleArc(hDC, %d, %d, %d, %f, %f);" },
    { EMR_EXTFLOODFILL            , "ExtFloodFill(hDC, %d, %d, #c, %L);", Dic_FloodFillMode },
    
    { EMR_POLYLINE16              , "\nstatic const POINT Points_%n[]=#p;\n"     "Polyline(hDC, Points_%n, %4);" },
    { EMR_POLYLINETO16            , "\nstatic const POINT Points_%n[]=#p;\n"   "PolylineTo(hDC, Points_%n, %4);" },
	{ EMR_POLYBEZIER16            , "\nstatic const POINT Points_%n[]=#p;\n"   "PolyBezier(hDC, Points_%n, %4);" },
    { EMR_POLYBEZIERTO16          , "\nstatic const POINT Points_%n[]=#p;\n" "PolyBezierTo(hDC, Points_%n, %4);" },
    { EMR_POLYGON16               , "\nstatic const POINT Points_%n[]=#p;\n"      "Polygon(hDC, Points_%n, %4);" },
    
	{ EMR_POLYLINE                , "\nstatic const POINT Points_%n[]=#P;\n"     "Polyline(hDC, Points_%n, %4);" },
    { EMR_POLYLINETO              , "\nstatic const POINT Points_%n[]=#P;\n"   "PolylineTo(hDC, Points_%n, %4);" },
	{ EMR_POLYBEZIER              , "\nstatic const POINT Points_%n[]=#P;\n"   "PolyBezier(hDC, Points_%n, %4);" },
    { EMR_POLYBEZIERTO            , "\nstatic const POINT Points_%n[]=#P;\n" "PolyBezierTo(hDC, Points_%n, %4);" },
    { EMR_POLYGON                 , "\nstatic const POINT Points_%n[]=#P;\n"      "Polygon(hDC, Points_%n, %4);" },
    
	//////////////////
//  { EMR_HEADER                  , "// Header" },
    
  	{ EMR_POLYDRAW16              , "PolyDraw16" },
    
	{ EMR_EOF                     , "// EMREOF(%d, %d, %d)" },
    { EMR_SETCOLORADJUSTMENT      , "SetColorAdjustment" },
    { EMR_SETPALETTEENTRIES       , "SetPaletteEntries" },
    { EMR_POLYDRAW                , "PolyDraw" },
    
    { EMR_GDICOMMENT              , "// GdiComment(%d, %c%c%c%c, 0x%x)" },
    { EMR_FILLRGN                 , "FillRgn" },
    { EMR_FRAMERGN                , "FrameRgn" },
    { EMR_INVERTRGN               , "InvertRgn" },
    { EMR_PAINTRGN                , "PaintRgn" },
    { EMR_MASKBLT                 , "MaskBlt" },
    { EMR_PLGBLT                  , "PlgBlt" },
    { EMR_SETDIBITSTODEVICE       , "SetDIBSToDevice" },
    { EMR_CREATEDIBPATTERNBRUSHPT , "CreateDIBPatternBrushPT" },
    { EMR_POLYTEXTOUTA            , "PolyTextOutA" },
    { EMR_POLYTEXTOUTW            , "PolyTextOutW" },
    { EMR_CREATECOLORSPACE        , "CreateColorSpace" },
    { EMR_GLSRECORD               , "GlsRecord" },
    { EMR_GLSBOUNDEDRECORD        , "GlsBOundedRecord" },
    { EMR_PIXELFORMAT             , "PixelFormat" },

	{ EMR_COLORCORRECTPALETTE	  , "ColorCorrectPalette" },
	{ EMR_SETICMPROFILEA		  , "SetICMProfileA" },
	{ EMR_SETICMPROFILEW		  , "SetICMProfileW" },
	{ EMR_ALPHABLEND			  , "AlphaBlend" },
	{ EMR_TRANSPARENTBLT		  , "TransParentBlt" },
	{ EMR_GRADIENTFILL			  , "GradientFill" },

//	{ EMR_DRAWESCAPE			  , "DrawEscape" },
//	{ EMR_EXTESCAPE               , "ExtEscape" },
//	{ EMR_STARTDOC                , "StartDoc" },
//	{ EMR_FORCEUFIMAPPING         , "ForceEuFiMapping" },
//	{ EMR_NAMEDESCAPE			  , "NamedEscape" },
//	{ EMR_TRANSPARENTDIB		  , "TransParentDIB" },
//	{ EMR_SETLINKEDUFIS           , "SetLinkEDUFIS" },
//	{ EMR_SETTEXTJUSTIFICATION    , "SetTextJustification" }
//  { EMR_EXTSELECTCLIPRGN        , "ExtSelectClipRgn" },
//	{ EMR_SMALLTEXTOUT            , "TextOut" },
//	{ EMR_CREATEMONOBRUSH         , "CreateMonoBrush" },
    
};

typedef struct
{
    EMR    emr;     
	POINTL ptlReference;     
	DWORD  nChars;     
	DWORD  fOptions;     
	DWORD  iGraphicsMode;
	FLOAT  exScale;
	FLOAT  eyScale;
	char   Text[1];
} EMRSMALLTEXTOUT;
		  

inline const void * Offset(const void * base, long ofst)
{
	return (const void *) ( (const char *) base + ofst);
}

const TCHAR Format_ENHMETAHEADER [] =
	"4iType: %d\0" 
    "4nSize: %d\0" 
    "grclBounds: { %d, %d, %d, %d}\0"
    "grclFrame: { %d, %d, %d, %d}\0" 
    "4dSignature: 0x%08x\0" 
    "4nVersion: 0x%x\0" 
    "4nBytes: %d\0" 
    "4nRecords: %d\0"
    "2nHandles: %d\0"
    "2sReserved: %d\0" 
    "4nDescription: %d\0" 
    "4offDescription: %d\0" 
    "4nPalEntries: %d\0" 
    "8szlDevice: { %d, %d }\0" 
    "8szlMillimeters: { %d, %d }\0"
    "4cbPixelFormat: %d\0"
    "4offPixelFormat: %d\0"
    "4bOpenGL: %d\0"
	"8szMicroMeters: { %d, %d }\0";



bool KEmfDC::Decode(const EMR * emr, KTreeView * pTree)
{
	if ( pTree && emr->iType==EMR_HEADER )
	{
		pTree->InsertTree(TVI_LAST, TVI_ROOT, "1: ENHMETAHEADER", Format_ENHMETAHEADER, emr);
		return true;
	}

	const TCHAR * rslt = DecodeRecord(emr);

	if ( pTree )
	{
		TCHAR temp[1024];

		m_nSeq ++;
		wsprintf(temp, "%d: ", m_nSeq);
		_tcscat(temp, rslt);

		wsprintf(temp + _tcslen(temp), ", %d bytes", emr->nSize);
		
		pTree->InsertItem(temp);
	}

	return true;
}


const TCHAR * KEmfDC::DecodeRecord(const EMR * emr)
{
	fmt.Newline();

	for (int i=0; i< sizeof(Pattern)/sizeof(Pattern[0]); i++)
		if ( Pattern[i].type == emr->iType)
		{
			fmt.Format(Pattern[i].funcname, (const long *) & emr[1], Pattern[i].dic);
			
			return fmt.m_buffer;
		}

	switch ( emr->iType )
	{		
		case EMR_HEADER:
			fmt.Write("// Header");
			break;

⌨️ 快捷键说明

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