/* * Dump an Enhanced Meta File * * Copyright 2005 Mike McCormack * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ #include "config.h" #include "wine/port.h" #include "winedump.h" #include #ifdef HAVE_UNISTD_H # include #endif #ifdef HAVE_SYS_TYPES_H # include #endif #include #include #include "windef.h" #include "winbase.h" #include "wingdi.h" static unsigned int read_int(const unsigned char *buffer) { return buffer[0] + (buffer[1]<<8) + (buffer[2]<<16) + (buffer[3]<<24); } #define EMRCASE(x) case x: printf("%-20s %08x\n", #x, length); break static unsigned offset = 0; static int dump_emfrecord(void) { const unsigned char* ptr; unsigned int type, length, i; ptr = PRD(offset, 8); if (!ptr) return -1; type = read_int(ptr); length = read_int(ptr + 4); switch(type) { EMRCASE(EMR_HEADER); EMRCASE(EMR_POLYGON); EMRCASE(EMR_POLYLINE); EMRCASE(EMR_SETWINDOWEXTEX); EMRCASE(EMR_SETWINDOWORGEX); EMRCASE(EMR_SETVIEWPORTEXTEX); EMRCASE(EMR_EOF); EMRCASE(EMR_SETMAPMODE); EMRCASE(EMR_SETPOLYFILLMODE); EMRCASE(EMR_SETROP2); EMRCASE(EMR_SCALEWINDOWEXTEX); EMRCASE(EMR_SAVEDC); EMRCASE(EMR_SELECTOBJECT); EMRCASE(EMR_CREATEPEN); EMRCASE(EMR_CREATEBRUSHINDIRECT); EMRCASE(EMR_DELETEOBJECT); EMRCASE(EMR_RECTANGLE); EMRCASE(EMR_SELECTPALETTE); EMRCASE(EMR_GDICOMMENT); EMRCASE(EMR_EXTSELECTCLIPRGN); EMRCASE(EMR_EXTCREATEFONTINDIRECTW); EMRCASE(EMR_EXTTEXTOUTW); EMRCASE(EMR_POLYGON16); EMRCASE(EMR_POLYLINE16); default: printf("%08x %08x\n",type,length); break; } if ( (length < 8) || (length % 4) ) return -1; length -= 8; offset += 8; for(i=0; iiType == EMR_HEADER && hdr->dSignature == ENHMETA_SIGNATURE) return SIG_EMF; return SIG_UNKNOWN; } void emf_dump(void) { offset = 0; while (!dump_emfrecord()); }