| /* | |
| * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | |
| */ | |
| #include "config.h" | |
| #include "wine/port.h" | |
| #include <stdio.h> | |
| #ifdef HAVE_UNISTD_H | |
| # include <unistd.h> | |
| #endif | |
| #ifdef HAVE_SYS_TYPES_H | |
| # include <sys/types.h> | |
| #endif | |
| #include <fcntl.h> | |
| #include <stdarg.h> | |
| #include "windef.h" | |
| #include "winbase.h" | |
| #include "wingdi.h" | |
| static unsigned int read_int(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 int dump_emfrecord(int fd) | |
| { | |
| unsigned char buffer[8]; | |
| int r; | |
| unsigned int type, length, i; | |
| r = read(fd, buffer, 8); | |
| if(r!=8) | |
| return -1; | |
| type = read_int(buffer); | |
| length = read_int(buffer+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; | |
| for(i=0; i<length; i+=4) | |
| { | |
| if (i%16 == 0) | |
| printf(" "); | |
| memset(buffer,0,sizeof buffer); | |
| r = read(fd,buffer,4); | |
| if(r!=4) | |
| return -1; | |
| printf("%08x ", read_int(buffer)); | |
| if ( (i%16 == 12) || ((i+4)==length) ) | |
| printf("\n"); | |
| } | |
| return 0; | |
| } | |
| static int dump_emf_records(int fd) | |
| { | |
| while(!dump_emfrecord(fd)) | |
| ; | |
| return 0; | |
| } | |
| int dump_emf(const char *emf) | |
| { | |
| int fd; | |
| fd = open(emf,O_RDONLY); | |
| if (fd<0) return -1; | |
| dump_emf_records(fd); | |
| close(fd); | |
| return 0; | |
| } |