blob: f1c9b09b1d2ac8a88e9300641cd9c09959ff4c37 [file] [log] [blame]
/******************************************************************************
* 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;
}
}