/****************************************************************************** * Copyright (c) 2003, 2006 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * IBM Corporation - initial API and implementation ****************************************************************************/ package org.eclipse.gmf.runtime.draw2d.ui.render.awt.internal.svg.metafile; import java.awt.Dimension; import java.io.BufferedInputStream; import java.io.IOException; import org.eclipse.gmf.runtime.draw2d.ui.render.awt.internal.svg.metafile.AbortPath; import org.eclipse.gmf.runtime.draw2d.ui.render.awt.internal.svg.metafile.AbstractTranscoder; import org.eclipse.gmf.runtime.draw2d.ui.render.awt.internal.svg.metafile.AngleArc; import org.eclipse.gmf.runtime.draw2d.ui.render.awt.internal.svg.metafile.Arc; import org.eclipse.gmf.runtime.draw2d.ui.render.awt.internal.svg.metafile.BeginPath; import org.eclipse.gmf.runtime.draw2d.ui.render.awt.internal.svg.metafile.BitBlt; import org.eclipse.gmf.runtime.draw2d.ui.render.awt.internal.svg.metafile.CloseFigure; import org.eclipse.gmf.runtime.draw2d.ui.render.awt.internal.svg.metafile.CreateBrushIndirect; import org.eclipse.gmf.runtime.draw2d.ui.render.awt.internal.svg.metafile.CreateFontIndirect; import org.eclipse.gmf.runtime.draw2d.ui.render.awt.internal.svg.metafile.CreatePatternBrush; import org.eclipse.gmf.runtime.draw2d.ui.render.awt.internal.svg.metafile.CreatePen; import org.eclipse.gmf.runtime.draw2d.ui.render.awt.internal.svg.metafile.DeleteObject; import org.eclipse.gmf.runtime.draw2d.ui.render.awt.internal.svg.metafile.EMFRecord; import org.eclipse.gmf.runtime.draw2d.ui.render.awt.internal.svg.metafile.EOF; import org.eclipse.gmf.runtime.draw2d.ui.render.awt.internal.svg.metafile.Ellipse; import org.eclipse.gmf.runtime.draw2d.ui.render.awt.internal.svg.metafile.EndPath; import org.eclipse.gmf.runtime.draw2d.ui.render.awt.internal.svg.metafile.ExtCreatePen; import org.eclipse.gmf.runtime.draw2d.ui.render.awt.internal.svg.metafile.ExtTextOut; import org.eclipse.gmf.runtime.draw2d.ui.render.awt.internal.svg.metafile.FillPath; import org.eclipse.gmf.runtime.draw2d.ui.render.awt.internal.svg.metafile.FlattenPath; import org.eclipse.gmf.runtime.draw2d.ui.render.awt.internal.svg.metafile.Header; import org.eclipse.gmf.runtime.draw2d.ui.render.awt.internal.svg.metafile.IEmf2SvgConverter; import org.eclipse.gmf.runtime.draw2d.ui.render.awt.internal.svg.metafile.IRenderableObject; import org.eclipse.gmf.runtime.draw2d.ui.render.awt.internal.svg.metafile.LineTo; import org.eclipse.gmf.runtime.draw2d.ui.render.awt.internal.svg.metafile.ModifyWorldTransform; import org.eclipse.gmf.runtime.draw2d.ui.render.awt.internal.svg.metafile.MoveTo; import org.eclipse.gmf.runtime.draw2d.ui.render.awt.internal.svg.metafile.PolyBezier; import org.eclipse.gmf.runtime.draw2d.ui.render.awt.internal.svg.metafile.PolyDraw; import org.eclipse.gmf.runtime.draw2d.ui.render.awt.internal.svg.metafile.PolyPolyLine; import org.eclipse.gmf.runtime.draw2d.ui.render.awt.internal.svg.metafile.PolyPolygon; import org.eclipse.gmf.runtime.draw2d.ui.render.awt.internal.svg.metafile.Polygon; import org.eclipse.gmf.runtime.draw2d.ui.render.awt.internal.svg.metafile.Polyline; import org.eclipse.gmf.runtime.draw2d.ui.render.awt.internal.svg.metafile.PolylineTo; import org.eclipse.gmf.runtime.draw2d.ui.render.awt.internal.svg.metafile.Record; import org.eclipse.gmf.runtime.draw2d.ui.render.awt.internal.svg.metafile.Rectangle; import org.eclipse.gmf.runtime.draw2d.ui.render.awt.internal.svg.metafile.RestoreDC; import org.eclipse.gmf.runtime.draw2d.ui.render.awt.internal.svg.metafile.RoundRect; import org.eclipse.gmf.runtime.draw2d.ui.render.awt.internal.svg.metafile.SaveDC; import org.eclipse.gmf.runtime.draw2d.ui.render.awt.internal.svg.metafile.SelectObject; import org.eclipse.gmf.runtime.draw2d.ui.render.awt.internal.svg.metafile.SetArcDirection; import org.eclipse.gmf.runtime.draw2d.ui.render.awt.internal.svg.metafile.SetBkColor; import org.eclipse.gmf.runtime.draw2d.ui.render.awt.internal.svg.metafile.SetBkMode; import org.eclipse.gmf.runtime.draw2d.ui.render.awt.internal.svg.metafile.SetMapMode; import org.eclipse.gmf.runtime.draw2d.ui.render.awt.internal.svg.metafile.SetMiterLimit; import org.eclipse.gmf.runtime.draw2d.ui.render.awt.internal.svg.metafile.SetPolyFillMode; import org.eclipse.gmf.runtime.draw2d.ui.render.awt.internal.svg.metafile.SetROP2; import org.eclipse.gmf.runtime.draw2d.ui.render.awt.internal.svg.metafile.SetStretchBltMode; import org.eclipse.gmf.runtime.draw2d.ui.render.awt.internal.svg.metafile.SetTextAlign; import org.eclipse.gmf.runtime.draw2d.ui.render.awt.internal.svg.metafile.SetTextColor; import org.eclipse.gmf.runtime.draw2d.ui.render.awt.internal.svg.metafile.SetViewportExtent; import org.eclipse.gmf.runtime.draw2d.ui.render.awt.internal.svg.metafile.SetViewportOrg; import org.eclipse.gmf.runtime.draw2d.ui.render.awt.internal.svg.metafile.SetWindowExtent; import org.eclipse.gmf.runtime.draw2d.ui.render.awt.internal.svg.metafile.SetWindowOrg; import org.eclipse.gmf.runtime.draw2d.ui.render.awt.internal.svg.metafile.StretchBlt; import org.eclipse.gmf.runtime.draw2d.ui.render.awt.internal.svg.metafile.StretchDIBits; import org.eclipse.gmf.runtime.draw2d.ui.render.awt.internal.svg.metafile.StrokeAndFillPath; import org.eclipse.gmf.runtime.draw2d.ui.render.awt.internal.svg.metafile.StrokePath; import org.eclipse.gmf.runtime.draw2d.ui.render.awt.internal.svg.metafile.TranscoderException; /** * This class implements a fairly simple transcoder for Windows format Enhanced Metafiles. It reads the * metafile records and turns them into SVG. It uses the Batik libraries for the SVG generation. * * To use this class, create an input stream containing the contents of an EMF file. * Create an output stream to hold the generated SVG data. * Finally, create an instance of EMFTranscoder and call transcode( input, output ). If there are no errors * the output stream will contain the SVG output. * * This implementation covers a subset of the metafile records. It is possible to extend this class by * overriding the 'getConverter' method, and creating classes that implement IEmf2SvgConverter to handle the * additional record types. See 'getConverter' and the IEmf2SvgConverter interface for more details. * * This class should not be used externally. The diagramming engine can support * rendering of EMF and WMF files through the RenderedImage infrastructure now, * so it is not necessary for clients to convert them to SVG before creating the * RenderedImage file. * * @author dhabib * @author sshaw */ public class EMFTranscoder extends AbstractTranscoder { private static final int EMR_HEADER = 1; private static final int EMR_POLYBEZIER = 2; private static final int EMR_POLYGON = 3; private static final int EMR_POLYLINE = 4; private static final int EMR_POLYBEZIERTO = 5; private static final int EMR_POLYLINETO = 6; private static final int EMR_POLYPOLYLINE = 7; private static final int EMR_POLYPOLYGON = 8; private static final int EMR_SETWINDOWEXTEX = 9; private static final int EMR_SETWINDOWORGEX = 10; private static final int EMR_SETVIEWPORTEXTEX = 11; private static final int EMR_SETVIEWPORTORGEX = 12; private static final int EMR_SETBRUSHORGEX = 13; private static final int EMR_EOF = 14; private static final int EMR_SETPIXELV = 15; private static final int EMR_SETMAPPERFLAGS = 16; private static final int EMR_SETMAPMODE = 17; private static final int EMR_SETBKMODE = 18; private static final int EMR_SETPOLYFILLMODE = 19; private static final int EMR_SETROP2 = 20; private static final int EMR_SETSTRETCHBLTMODE = 21; private static final int EMR_SETTEXTALIGN = 22; private static final int EMR_SETCOLORADJUSTMENT = 23; private static final int EMR_SETTEXTCOLOR = 24; private static final int EMR_SETBKCOLOR = 25; private static final int EMR_OFFSETCLIPRGN = 26; private static final int EMR_MOVETOEX = 27; private static final int EMR_SETMETARGN = 28; private static final int EMR_EXCLUDECLIPRECT = 29; private static final int EMR_INTERSECTCLIPRECT = 30; private static final int EMR_SCALEVIEWPORTEXTEX = 31; private static final int EMR_SCALEWINDOWEXTEX = 32; private static final int EMR_SAVEDC = 33; private static final int EMR_RESTOREDC = 34; private static final int EMR_SETWORLDTRANSFORM = 35; private static final int EMR_MODIFYWORLDTRANSFORM = 36; private static final int EMR_SELECTOBJECT = 37; private static final int EMR_CREATEPEN = 38; private static final int EMR_CREATEBRUSHINDIRECT = 39; private static final int EMR_DELETEOBJECT = 40; private static final int EMR_ANGLEARC = 41; private static final int EMR_ELLIPSE = 42; private static final int EMR_RECTANGLE = 43; private static final int EMR_ROUNDRECT = 44; private static final int EMR_ARC = 45; private static final int EMR_CHORD = 46; private static final int EMR_PIE = 47; private static final int EMR_SELECTPALETTE = 48; private static final int EMR_CREATEPALETTE = 49; private static final int EMR_SETPALETTEENTRIES = 50; private static final int EMR_RESIZEPALETTE = 51; private static final int EMR_REALIZEPALETTE = 52; private static final int EMR_EXTFLOODFILL = 53; private static final int EMR_LINETO = 54; private static final int EMR_ARCTO = 55; private static final int EMR_POLYDRAW = 56; private static final int EMR_SETARCDIRECTION = 57; private static final int EMR_SETMITERLIMIT = 58; private static final int EMR_BEGINPATH = 59; private static final int EMR_ENDPATH = 60; private static final int EMR_CLOSEFIGURE = 61; private static final int EMR_FILLPATH = 62; private static final int EMR_STROKEANDFILLPATH = 63; private static final int EMR_STROKEPATH = 64; private static final int EMR_FLATTENPATH = 65; private static final int EMR_WIDENPATH = 66; private static final int EMR_SELECTCLIPPATH = 67; private static final int EMR_ABORTPATH = 68; private static final int EMR_GDICOMMENT = 70; private static final int EMR_FILLRGN = 71; private static final int EMR_FRAMERGN = 72; private static final int EMR_INVERTRGN = 73; private static final int EMR_PAINTRGN = 74; private static final int EMR_EXTSELECTCLIPRGN = 75; private static final int EMR_BITBLT = 76; private static final int EMR_STRETCHBLT = 77; private static final int EMR_MASKBLT = 78; private static final int EMR_PLGBLT = 79; private static final int EMR_SETDIBITSTODEVICE = 80; private static final int EMR_STRETCHDIBITS = 81; private static final int EMR_EXTCREATEFONTINDIRECTW = 82; private static final int EMR_EXTTEXTOUTA = 83; private static final int EMR_EXTTEXTOUTW = 84; private static final int EMR_POLYBEZIER16 = 85; private static final int EMR_POLYGON16 = 86; private static final int EMR_POLYLINE16 = 87; private static final int EMR_POLYBEZIERTO16 = 88; private static final int EMR_POLYLINETO16 = 89; private static final int EMR_POLYPOLYLINE16 = 90; private static final int EMR_POLYPOLYGON16 = 91; private static final int EMR_POLYDRAW16 = 92; private static final int EMR_CREATEMONOBRUSH = 93; private static final int EMR_CREATEDIBPATTERNBRUSHPT = 94; private static final int EMR_EXTCREATEPEN = 95; private static final int EMR_POLYTEXTOUTA = 96; private static final int EMR_POLYTEXTOUTW = 97; private static final int EMR_SETICMMODE = 98; private static final int EMR_CREATECOLORSPACE = 99; private static final int EMR_SETCOLORSPACE = 100; private static final int EMR_DELETECOLORSPACE = 101; private static final int EMR_GLSRECORD = 102; private static final int EMR_GLSBOUNDEDRECORD = 103; private static final int EMR_PIXELFORMAT = 104; private static final int EMR_DRAWESCAPE = 105; private static final int EMR_EXTESCAPE = 106; private static final int EMR_STARTDOC = 107; private static final int EMR_SMALLTEXTOUT = 108; private static final int EMR_FORCEUFIMAPPING = 109; private static final int EMR_NAMEDESCAPE = 110; private static final int EMR_COLORCORRECTPALETTE = 111; private static final int EMR_SETICMPROFILEA = 112; private static final int EMR_SETICMPROFILEW = 113; private static final int EMR_ALPHABLEND = 114; private static final int EMR_ALPHADIBBLEND = 115; private static final int EMR_TRANSPARENTBLT = 116; private static final int EMR_TRANSPARENTDIB = 117; private static final int EMR_GRADIENTFILL = 118; private static final int EMR_SETLINKEDUFIS = 119; private static final int EMR_SETTEXTJUSTIFICATION = 120; private int m_numRecords = 0; /** * Reads the APM/WMF header from the input stream. These records are * special since they don't follow the normal WMF record format (no * type and size). This method constructs a fake header record * and returns it to the caller. * * @param stream Contains the data for the WMF/APM file * @return <code>boolean</code> <code>true</code> if the header portion of the stream is validated * to be part of an EMF file, <code>false</code> otherwise. * @throws IOException */ private boolean validateHeader( BufferedInputStream stream ) throws IOException { // Mark the stream so we can reset to the current position. stream.mark( 1000 ); // See if it's an APM Record rec = new Record( 0, EMFRecord.EMR_HEADER_SIZE, stream ); int type = (int)rec.getDWORDAt( 0 ); int size = (int)rec.getDWORDAt( 4 ); // Subtract 8 bytes for the header // verify type and that size is something reasonable... if (type == EMR_HEADER && size < 5000) { stream.reset(); return true; } return false; } /* (non-Javadoc) * @see org.eclipse.gmf.runtime.gef.ui.internal.metafile2svg.AbstractTranscoder#getNextRecord(java.io.BufferedInputStream, int) */ protected Record getNextRecord( BufferedInputStream stream, int curRecord ) throws IOException { EMFRecord rec = null; if( curRecord == 0 ) { // Read the metafile header. Unlike EMF, this is not a standard record type, // so we have to special case it here... if (!validateHeader( stream )) { throw new IOException( "Invalid Enhanced Metafile Format: Invalid header" );//$NON-NLS-1$ } } // if curRecord is 0 then we need to read the header since that // contains the total number of records. if( curRecord == 0 || curRecord < m_numRecords ) { rec = new EMFRecord( stream ); } return rec; } /* (non-Javadoc) * @see org.eclipse.gmf.runtime.gef.ui.internal.metafile2svg.AbstractTranscoder#getConverter(org.eclipse.gmf.runtime.gef.ui.internal.metafile2svg.Record) */ protected IRenderableObject getConverter( Record emr ) throws TranscoderException { IRenderableObject svgConverter = null; switch( emr.getType() ) { case EMR_HEADER: svgConverter = new Header(); break; case EMR_MOVETOEX: svgConverter = new MoveTo(); break; case EMR_LINETO: svgConverter = new LineTo(); break; case EMR_POLYGON16: svgConverter = new Polygon( true ); break; case EMR_POLYGON: svgConverter = new Polygon( false ); break; case EMR_POLYBEZIER: svgConverter = new PolyBezier( false, false ); break; case EMR_POLYBEZIER16: svgConverter = new PolyBezier( true, false ); break; case EMR_POLYBEZIERTO: svgConverter = new PolyBezier( false, true ); break; case EMR_POLYBEZIERTO16: svgConverter = new PolyBezier( true, true ); break; case EMR_POLYLINE: svgConverter = new Polyline( false ); break; case EMR_POLYLINE16: svgConverter = new Polyline( true ); break; case EMR_POLYLINETO: svgConverter = new PolylineTo( false ); break; case EMR_POLYLINETO16: svgConverter = new PolylineTo( true ); break; case EMR_POLYPOLYLINE: svgConverter = new PolyPolyLine( false ); break; case EMR_POLYPOLYLINE16: svgConverter = new PolyPolyLine( true ); break; case EMR_POLYPOLYGON: svgConverter = new PolyPolygon( false ); break; case EMR_POLYPOLYGON16: svgConverter = new PolyPolygon( true ); break; case EMR_SETWINDOWEXTEX: svgConverter = new SetWindowExtent(); break; case EMR_SETVIEWPORTEXTEX: svgConverter = new SetViewportExtent(); break; case EMR_SETWINDOWORGEX: svgConverter = new SetWindowOrg(); break; case EMR_SETVIEWPORTORGEX: svgConverter = new SetViewportOrg(); break; case EMR_SETMAPMODE: svgConverter = new SetMapMode(); break; case EMR_SETTEXTCOLOR: svgConverter = new SetTextColor(); break; case EMR_SETBKCOLOR: svgConverter = new SetBkColor(); break; case EMR_CREATEBRUSHINDIRECT: svgConverter = new CreateBrushIndirect(); break; case EMR_CREATEDIBPATTERNBRUSHPT: svgConverter = new CreatePatternBrush( true ); break; case EMR_CREATEMONOBRUSH: svgConverter = new CreatePatternBrush( false ); break; case EMR_CREATEPEN: svgConverter = new CreatePen(); break; case EMR_EXTCREATEFONTINDIRECTW: svgConverter = new CreateFontIndirect(); break; case EMR_SELECTOBJECT: svgConverter = new SelectObject(); break; case EMR_DELETEOBJECT: svgConverter = new DeleteObject(); break; case EMR_SETTEXTALIGN: svgConverter = new SetTextAlign(); break; case EMR_EXTTEXTOUTA: svgConverter = new ExtTextOut( false ); break; case EMR_EXTTEXTOUTW: svgConverter = new ExtTextOut( true ); break; case EMR_ELLIPSE: svgConverter = new Ellipse(); break; case EMR_RECTANGLE: svgConverter = new Rectangle(); break; case EMR_ROUNDRECT: svgConverter = new RoundRect(); break; case EMR_SETARCDIRECTION: svgConverter = new SetArcDirection(); break; case EMR_ARC: svgConverter = new Arc( Arc.ARC ); break; case EMR_ARCTO: svgConverter = new Arc( Arc.ARCTO ); break; case EMR_PIE: svgConverter = new Arc( Arc.PIE ); break; case EMR_CHORD: svgConverter = new Arc( Arc.CHORD ); break; case EMR_ANGLEARC: svgConverter = new AngleArc(); break; case EMR_POLYDRAW: svgConverter = new PolyDraw( false ); break; case EMR_POLYDRAW16: svgConverter = new PolyDraw( true ); break; case EMR_SETPOLYFILLMODE: svgConverter = new SetPolyFillMode(); break; case EMR_EXTCREATEPEN: svgConverter = new ExtCreatePen(); break; case EMR_BEGINPATH: svgConverter = new BeginPath(); break; case EMR_ENDPATH: svgConverter = new EndPath(); break; case EMR_ABORTPATH: svgConverter = new AbortPath(); break; case EMR_FILLPATH: svgConverter = new FillPath(); break; case EMR_STROKEPATH: svgConverter = new StrokePath(); break; case EMR_STROKEANDFILLPATH: svgConverter = new StrokeAndFillPath(); break; case EMR_CLOSEFIGURE: svgConverter = new CloseFigure(); break; case EMR_FLATTENPATH: svgConverter = new FlattenPath(); break; case EMR_SETMITERLIMIT: svgConverter = new SetMiterLimit(); break; case EMR_WIDENPATH: // Probably don't need this. break; case EMR_SETBKMODE: svgConverter = new SetBkMode(); break; case EMR_EOF: svgConverter = new EOF(); break; case EMR_BITBLT: svgConverter = new BitBlt(); break; case EMR_STRETCHBLT: svgConverter = new StretchBlt(); break; case EMR_STRETCHDIBITS: svgConverter = new StretchDIBits(); break; case EMR_SETSTRETCHBLTMODE: svgConverter = new SetStretchBltMode(); break; case EMR_SETROP2: svgConverter = new SetROP2(); break; case EMR_SAVEDC: svgConverter = new SaveDC(); break; case EMR_RESTOREDC: svgConverter = new RestoreDC(); break; case EMR_MODIFYWORLDTRANSFORM: svgConverter = new ModifyWorldTransform(); break; // To be implemented: case EMR_MASKBLT: case EMR_PLGBLT: // Not yet implemented: case EMR_SELECTPALETTE: case EMR_CREATEPALETTE: case EMR_SETPALETTEENTRIES: case EMR_RESIZEPALETTE: case EMR_REALIZEPALETTE: case EMR_SELECTCLIPPATH: case EMR_FRAMERGN: case EMR_INVERTRGN: case EMR_PAINTRGN: case EMR_EXTSELECTCLIPRGN: case EMR_EXCLUDECLIPRECT: case EMR_INTERSECTCLIPRECT: case EMR_FILLRGN: case EMR_OFFSETCLIPRGN: case EMR_SETMETARGN: case EMR_SETPIXELV: case EMR_EXTFLOODFILL: // These are not really scalable since it's pixel by pixel. Not sure what // SVG will do with these. Not easy to implement in a reasonable way. case EMR_SETCOLORADJUSTMENT: case EMR_GRADIENTFILL: case EMR_POLYTEXTOUTA: case EMR_POLYTEXTOUTW: case EMR_SETBRUSHORGEX: case EMR_SETMAPPERFLAGS: case EMR_SCALEVIEWPORTEXTEX: case EMR_SCALEWINDOWEXTEX: case EMR_SETWORLDTRANSFORM: case EMR_GDICOMMENT: case EMR_SETDIBITSTODEVICE: case EMR_SETICMMODE: case EMR_CREATECOLORSPACE: case EMR_SETCOLORSPACE: case EMR_DELETECOLORSPACE: case EMR_GLSRECORD: case EMR_GLSBOUNDEDRECORD: case EMR_FORCEUFIMAPPING: case EMR_COLORCORRECTPALETTE: case EMR_SETICMPROFILEA: case EMR_SETICMPROFILEW: case EMR_ALPHABLEND: case EMR_ALPHADIBBLEND: case EMR_TRANSPARENTBLT: case EMR_TRANSPARENTDIB: case EMR_SETLINKEDUFIS: case EMR_SETTEXTJUSTIFICATION: // Can't find definitions in the docs for these. case EMR_PIXELFORMAT: case EMR_DRAWESCAPE: case EMR_EXTESCAPE: case EMR_STARTDOC: case EMR_NAMEDESCAPE: case EMR_SMALLTEXTOUT: default: break; } if( svgConverter != null ) { initializeConverter( svgConverter, emr ); } return svgConverter; } /** * Initializes the specified converter with data from the specified record. * @param svgConverter * @param rec * @throws TranscoderException */ private void initializeConverter( IRenderableObject svgConverter, Record rec ) throws TranscoderException { try { IEmf2SvgConverter converter = (IEmf2SvgConverter) svgConverter; converter.readEMFRecord( rec ); // Header record is special. It contains info that the transcoder needs to function // such as the number of records in the metafile. if( converter instanceof Header ) { Header header = (Header) converter; m_numRecords = header.getNumRecords(); setSize( new Dimension( header.getBounds().width, header.getBounds().height ) ); } } catch( IOException e ) { throw new TranscoderException( e, false ); // don't log this exception since it will be used for autosense failure } } /* (non-Javadoc) * @see org.eclipse.gmf.runtime.gef.ui.internal.metafile2svg.AbstractTranscoder#getUserFriendlyName(int) */ protected String getUserFriendlyName( int emrType ) { String name = ""; //$NON-NLS-1$ switch( emrType ) { case EMR_HEADER: name = "HEADER"; //$NON-NLS-1$ break; case EMR_POLYBEZIER: name = "POLYBEZIER"; //$NON-NLS-1$ break; case EMR_POLYGON: name = "POLYGON"; //$NON-NLS-1$ break; case EMR_POLYLINE: name = "POLYLINE"; //$NON-NLS-1$ break; case EMR_POLYBEZIERTO: name = "POLYBEZIERTO"; //$NON-NLS-1$ break; case EMR_POLYLINETO: name = "POLYLINETO"; //$NON-NLS-1$ break; case EMR_POLYPOLYLINE: name = "POLYPOLYLINE"; //$NON-NLS-1$ break; case EMR_POLYPOLYGON: name = "POLYPOLYGON"; //$NON-NLS-1$ break; case EMR_SETWINDOWEXTEX: name = "SETWINDOWEXTEX"; //$NON-NLS-1$ break; case EMR_SETWINDOWORGEX: name = "SETWINDOWORGEX"; //$NON-NLS-1$ break; case EMR_SETVIEWPORTEXTEX: name = "SETVIEWPORTEXTEX"; //$NON-NLS-1$ break; case EMR_SETVIEWPORTORGEX: name = "SETVIEWPORTORGEX"; //$NON-NLS-1$ break; case EMR_SETBRUSHORGEX: name = "SETBRUSHORGEX"; //$NON-NLS-1$ break; case EMR_EOF: name = "EOF"; //$NON-NLS-1$ break; case EMR_SETPIXELV: name = "SETPIXELV"; //$NON-NLS-1$ break; case EMR_SETMAPPERFLAGS: name = "SETMAPPERFLAGS"; //$NON-NLS-1$ break; case EMR_SETMAPMODE: name = "SETMAPMODE"; //$NON-NLS-1$ break; case EMR_SETBKMODE: name = "SETBKMODE"; //$NON-NLS-1$ break; case EMR_SETPOLYFILLMODE: name = "SETPOLYFILLMODE"; //$NON-NLS-1$ break; case EMR_SETROP2: name = "SETROP2"; //$NON-NLS-1$ break; case EMR_SETSTRETCHBLTMODE: name = "SETSTRETCHBLTMODE"; //$NON-NLS-1$ break; case EMR_SETTEXTALIGN: name = "SETTEXTALIGN"; //$NON-NLS-1$ break; case EMR_SETCOLORADJUSTMENT: name = "SETCOLORADJUSTMENT"; //$NON-NLS-1$ break; case EMR_SETTEXTCOLOR: name = "SETTEXTCOLOR"; //$NON-NLS-1$ break; case EMR_SETBKCOLOR: name = "SETBKCOLOR"; //$NON-NLS-1$ break; case EMR_OFFSETCLIPRGN: name = "OFFSETCLIPRGN"; //$NON-NLS-1$ break; case EMR_MOVETOEX: name = "MOVETOEX"; //$NON-NLS-1$ break; case EMR_SETMETARGN: name = "SETMETARGN"; //$NON-NLS-1$ break; case EMR_EXCLUDECLIPRECT: name = "EXCLUDECLIPRECT"; //$NON-NLS-1$ break; case EMR_INTERSECTCLIPRECT: name = "INTERSECTCLIPRECT"; //$NON-NLS-1$ break; case EMR_SCALEVIEWPORTEXTEX: name = "SCALEVIEWPORTEXTEX"; //$NON-NLS-1$ break; case EMR_SCALEWINDOWEXTEX: name = "SCALEWINDOWEXTEX"; //$NON-NLS-1$ break; case EMR_SAVEDC: name = "SAVEDC"; //$NON-NLS-1$ break; case EMR_RESTOREDC: name = "RESTOREDC"; //$NON-NLS-1$ break; case EMR_SETWORLDTRANSFORM: name = "SETWORLDTRANSFORM"; //$NON-NLS-1$ break; case EMR_MODIFYWORLDTRANSFORM: name = "MODIFYWORLDTRANSFORM"; //$NON-NLS-1$ break; case EMR_SELECTOBJECT: name = "SELECTOBJECT"; //$NON-NLS-1$ break; case EMR_CREATEPEN: name = "CREATEPEN"; //$NON-NLS-1$ break; case EMR_CREATEBRUSHINDIRECT: name = "CREATEBRUSHINDIRECT"; //$NON-NLS-1$ break; case EMR_DELETEOBJECT: name = "DELETEOBJECT"; //$NON-NLS-1$ break; case EMR_ANGLEARC: name = "ANGLEARC"; //$NON-NLS-1$ break; case EMR_ELLIPSE: name = "ELLIPSE"; //$NON-NLS-1$ break; case EMR_RECTANGLE: name = "RECTANGLE"; //$NON-NLS-1$ break; case EMR_ROUNDRECT: name = "ROUNDRECT"; //$NON-NLS-1$ break; case EMR_ARC: name = "ARC"; //$NON-NLS-1$ break; case EMR_CHORD: name = "CHORD"; //$NON-NLS-1$ break; case EMR_PIE: name = "PIE"; //$NON-NLS-1$ break; case EMR_SELECTPALETTE: name = "SELECTPALETTE"; //$NON-NLS-1$ break; case EMR_CREATEPALETTE: name = "CREATEPALETTE"; //$NON-NLS-1$ break; case EMR_SETPALETTEENTRIES: name = "SETPALETTEENTRIES"; //$NON-NLS-1$ break; case EMR_RESIZEPALETTE: name = "RESIZEPALETTE"; //$NON-NLS-1$ break; case EMR_REALIZEPALETTE: name = "REALIZEPALETTE"; //$NON-NLS-1$ break; case EMR_EXTFLOODFILL: name = "EXTFLOODFILL"; //$NON-NLS-1$ break; case EMR_LINETO: name = "LINETO"; //$NON-NLS-1$ break; case EMR_ARCTO: name = "ARCTO"; //$NON-NLS-1$ break; case EMR_POLYDRAW: name = "POLYDRAW"; //$NON-NLS-1$ break; case EMR_SETARCDIRECTION: name = "SETARCDIRECTION"; //$NON-NLS-1$ break; case EMR_SETMITERLIMIT: name = "SETMITERLIMIT"; //$NON-NLS-1$ break; case EMR_BEGINPATH: name = "BEGINPATH"; //$NON-NLS-1$ break; case EMR_ENDPATH: name = "ENDPATH"; //$NON-NLS-1$ break; case EMR_CLOSEFIGURE: name = "CLOSEFIGURE"; //$NON-NLS-1$ break; case EMR_FILLPATH: name = "FILLPATH"; //$NON-NLS-1$ break; case EMR_STROKEANDFILLPATH: name = "STROKEANDFILLPATH"; //$NON-NLS-1$ break; case EMR_STROKEPATH: name = "STROKEPATH"; //$NON-NLS-1$ break; case EMR_FLATTENPATH: name = "FLATTENPATH"; //$NON-NLS-1$ break; case EMR_WIDENPATH: name = "WIDENPATH"; //$NON-NLS-1$ break; case EMR_SELECTCLIPPATH: name = "SELECTCLIPPATH"; //$NON-NLS-1$ break; case EMR_ABORTPATH: name = "ABORTPATH"; //$NON-NLS-1$ break; case EMR_GDICOMMENT: name = "GDICOMMENT"; //$NON-NLS-1$ break; case EMR_FILLRGN: name = "FILLRGN"; //$NON-NLS-1$ break; case EMR_FRAMERGN: name = "FRAMERGN"; //$NON-NLS-1$ break; case EMR_INVERTRGN: name = "INVERTRGN"; //$NON-NLS-1$ break; case EMR_PAINTRGN: name = "PAINTRGN"; //$NON-NLS-1$ break; case EMR_EXTSELECTCLIPRGN: name = "EXTSELECTCLIPRGN"; //$NON-NLS-1$ break; case EMR_BITBLT: name = "BITBLT"; //$NON-NLS-1$ break; case EMR_STRETCHBLT: name = "STRETCHBLT"; //$NON-NLS-1$ break; case EMR_MASKBLT: name = "MASKBLT"; //$NON-NLS-1$ break; case EMR_PLGBLT: name = "PLGBLT"; //$NON-NLS-1$ break; case EMR_SETDIBITSTODEVICE: name = "SETDIBITSTODEVICE"; //$NON-NLS-1$ break; case EMR_STRETCHDIBITS: name = "STRETCHDIBITS"; //$NON-NLS-1$ break; case EMR_EXTCREATEFONTINDIRECTW: name = "EXTCREATEFONTINDIRECTW"; //$NON-NLS-1$ break; case EMR_EXTTEXTOUTA: name = "EXTTEXTOUTA"; //$NON-NLS-1$ break; case EMR_EXTTEXTOUTW: name = "EXTTEXTOUTW"; //$NON-NLS-1$ break; case EMR_POLYBEZIER16: name = "POLYBEZIER16"; //$NON-NLS-1$ break; case EMR_POLYGON16: name = "POLYGON16"; //$NON-NLS-1$ break; case EMR_POLYLINE16: name = "POLYLINE16"; //$NON-NLS-1$ break; case EMR_POLYBEZIERTO16: name = "POLYBEZIERTO16"; //$NON-NLS-1$ break; case EMR_POLYLINETO16: name = "POLYLINETO16"; //$NON-NLS-1$ break; case EMR_POLYPOLYLINE16: name = "POLYPOLYLINE16"; //$NON-NLS-1$ break; case EMR_POLYPOLYGON16: name = "POLYPOLYGON16"; //$NON-NLS-1$ break; case EMR_POLYDRAW16: name = "POLYDRAW16"; //$NON-NLS-1$ break; case EMR_CREATEMONOBRUSH: name = "CREATEMONOBRUSH"; //$NON-NLS-1$ break; case EMR_CREATEDIBPATTERNBRUSHPT: name = "CREATEDIBPATTERNBRUSHPT"; //$NON-NLS-1$ break; case EMR_EXTCREATEPEN: name = "EXTCREATEPEN"; //$NON-NLS-1$ break; case EMR_POLYTEXTOUTA: name = "POLYTEXTOUTA"; //$NON-NLS-1$ break; case EMR_POLYTEXTOUTW: name = "POLYTEXTOUTW"; //$NON-NLS-1$ break; case EMR_SETICMMODE: name = "SETICMMODE"; //$NON-NLS-1$ break; case EMR_CREATECOLORSPACE: name = "CREATECOLORSPACE"; //$NON-NLS-1$ break; case EMR_SETCOLORSPACE: name = "SETCOLORSPACE"; //$NON-NLS-1$ break; case EMR_DELETECOLORSPACE: name = "DELETECOLORSPACE"; //$NON-NLS-1$ break; case EMR_GLSRECORD: name = "GLSRECORD"; //$NON-NLS-1$ break; case EMR_GLSBOUNDEDRECORD: name = "GLSBOUNDEDRECORD"; //$NON-NLS-1$ break; case EMR_PIXELFORMAT: name = "PIXELFORMAT"; //$NON-NLS-1$ break; case EMR_DRAWESCAPE: name = "DRAWESCAPE"; //$NON-NLS-1$ break; case EMR_EXTESCAPE: name = "EXTESCAPE"; //$NON-NLS-1$ break; case EMR_STARTDOC: name = "STARTDOC"; //$NON-NLS-1$ break; case EMR_SMALLTEXTOUT: name = "SMALLTEXTOUT"; //$NON-NLS-1$ break; case EMR_FORCEUFIMAPPING: name = "FORCEUFIMAPPING"; //$NON-NLS-1$ break; case EMR_NAMEDESCAPE: name = "NAMEDESCAPE"; //$NON-NLS-1$ break; case EMR_COLORCORRECTPALETTE: name = "COLORCORRECTPALETTE"; //$NON-NLS-1$ break; case EMR_SETICMPROFILEA: name = "SETICMPROFILEA"; //$NON-NLS-1$ break; case EMR_SETICMPROFILEW: name = "SETICMPROFILEW"; //$NON-NLS-1$ break; case EMR_ALPHABLEND: name = "ALPHABLEND"; //$NON-NLS-1$ break; case EMR_ALPHADIBBLEND: name = "ALPHADIBBLEND"; //$NON-NLS-1$ break; case EMR_TRANSPARENTBLT: name = "TRANSPARENTBLT"; //$NON-NLS-1$ break; case EMR_TRANSPARENTDIB: name = "TRANSPARENTDIB"; //$NON-NLS-1$ break; case EMR_GRADIENTFILL: name = "GRADIENTFILL"; //$NON-NLS-1$ break; case EMR_SETLINKEDUFIS: name = "SETLINKEDUFIS"; //$NON-NLS-1$ break; case EMR_SETTEXTJUSTIFICATION: name = "SETTEXTJUSTIFICATION"; //$NON-NLS-1$ break; default: name = "<unknown>"; //$NON-NLS-1$ break; } return name; } }