blob: 997e9c8fdf25b65ef1066c68180484187c34dca6 [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.io.IOException;
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.IRenderToPath;
import org.eclipse.gmf.runtime.draw2d.ui.render.awt.internal.svg.metafile.ITraceMe;
import org.eclipse.gmf.runtime.draw2d.ui.render.awt.internal.svg.metafile.IWmf2SvgConverter;
import org.eclipse.gmf.runtime.draw2d.ui.render.awt.internal.svg.metafile.Record;
/**
* @author dhabib
*/
abstract class AbstractPoly implements IEmf2SvgConverter, IWmf2SvgConverter, IRenderToPath, ITraceMe
{
private static final int EMF_POINT_COUNT_OFFSET = 16;
private static final int EMF_POINT_ARRAY_START = 20;
private static final int WMF_POINT_COUNT_OFFSET = 0;
private static final int WMF_POINT_ARRAY_START = 2;
private int m_count = 0;
private int[] m_xPoints = null;
private int[] m_yPoints = null;
private boolean m_b16Bits = true;
protected int[] m_xPointsConv = null;
protected int[] m_yPointsConv = null;
public AbstractPoly( boolean b16Bits )
{
m_b16Bits = b16Bits;
}
public void readWMFRecord( Record emr ) throws IOException
{
m_count = emr.getShortAt( WMF_POINT_COUNT_OFFSET );
readPoly( emr, WMF_POINT_ARRAY_START );
}
public void readEMFRecord( Record emr ) throws IOException
{
m_count = emr.getIntAt( EMF_POINT_COUNT_OFFSET );
readPoly( emr, EMF_POINT_ARRAY_START );
}
protected int getCount()
{
return m_count;
}
protected int[] getXPoints()
{
return m_xPoints;
}
protected int[] getYPoints()
{
return m_yPoints;
}
private boolean readPoly( Record emr, int pointOffset ) throws IOException
{
/*
* RECTL rclBounds; // Polygon boundary, in device units.
* DWORD cptl; // number of points
* POINTL aptl[1]; // array of cptl points (each a pair of integers)
*/
m_xPoints = new int[ m_count ];
m_yPoints = new int[ m_count ];
int curPos = pointOffset;
for( int i = 0; i < m_count; i++ )
{
// Read the points
if( m_b16Bits )
{
m_xPoints[ i ] = emr.getShortAt( curPos );
m_yPoints[ i ] = emr.getShortAt( curPos + 2 );
curPos += 4;
}
else
{
m_xPoints[ i ] = emr.getIntAt( curPos );
m_yPoints[ i ] = emr.getIntAt( curPos + 4 );
curPos += 8;
}
}
return true;
}
public String toString() {
StringBuffer sb = new StringBuffer();
sb.append("cnt=" + m_count); //$NON-NLS-1$
dumpPoints(sb, ", Converted:", m_xPointsConv, m_yPointsConv); //$NON-NLS-1$
dumpPoints(sb, ", Original:", m_xPoints, m_yPoints); //$NON-NLS-1$
return sb.toString();
}
private void dumpPoints(StringBuffer sb, String what, int[] x, int[] y) {
sb.append(what);
if (x == null || y == null) {
sb.append(" (null)"); //$NON-NLS-1$
} else {
for (int ix = 0; ix < m_count; ++ix) {
sb.append(" (" + x[ix] + ',' + y[ix] + ')'); //$NON-NLS-1$
}
}
}
}