/* * This program is free software; you can redistribute it and/or modify it under the * terms of the GNU Lesser General Public License, version 2.1 as published by the Free Software * Foundation. * * You should have received a copy of the GNU Lesser General Public License along with this * program; if not, you can obtain a copy at http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html * or from the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This program 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. * * Copyright (c) 2001 - 2013 Object Refinery Ltd, Pentaho Corporation and Contributors.. All rights reserved. */ package org.pentaho.reporting.libraries.pixie.wmf; import java.io.IOException; import java.io.InputStream; /** * A Windows metafile record. * <p/> * Every record has a standard header. <table border="1"> <tr> <th>bytes</th> <th>meaning</th> </tr> <tr> <td>4</td> * <td>Size of header in words</td> </tr> <tr> <td>2</td> <td>type of the record</td> </tr> <tr> <td>n*2</td> <td>array * with n words parameters</td> </tr> </table> */ public class MfRecord extends Buffer { /** * The size of the record header in bytes. */ public static final int RECORD_HEADER_SIZE = 6; private static final int RECORD_TYPE_POS = 4; /** * the RecordType. */ private MfType type; /** * Creates a new MetaFileRecord with the specified capacitiy. The capacity is given in 16-Bit words. The resulting * buffer has the size of 2*parcount + RECORD_HEADER. * * @param parcount the number of 16-Bit words stored as bulk in the record. */ public MfRecord( final int parcount ) { super( parcount * 2 + RECORD_HEADER_SIZE ); } /** * Constructs a new MfRecord by reading the data from the input stream. * * @param in the source inputstream * @throws IOException if an IOError occurs. */ public MfRecord( final InputStream in ) throws IOException { read( in ); } /** * Read a record from an input stream. */ protected void read( final InputStream in ) throws IOException { super.read( in, 0, RECORD_HEADER_SIZE ); final int remaining = getInt( 0 ) * 2 - RECORD_HEADER_SIZE; if ( remaining > 0 ) { super.read( in, RECORD_HEADER_SIZE, remaining ); } type = MfType.get( getType() ); } /** * Queries the 16-bit type of this record. * * @return the RecordType */ public int getType() { return getShort( RECORD_TYPE_POS ); } /** * Defines the 16-bit type of this record. * * @param type the RecordType */ public void setType( final int type ) { setShort( RECORD_TYPE_POS, type ); } /** * Return a 16-bit param from the given offset. Offset is in 16-bit words. * * @param p the parameter position in words. * @return the parameter value. */ public int getParam( final int p ) { return getShort( p * 2 + RECORD_HEADER_SIZE ); } /** * Defines a 16-bit param at the given offset. Offset is in 16-bit words. * * @param p the parameter position in words. * @param value the parameter value. */ public void setParam( final int p, final int value ) { setShort( p * 2 + RECORD_HEADER_SIZE, value ); } /** * Return a 32-bit param from the given offset. Offset is in 16-bit words. * * @param p the parameter position in words. * @return the parameter value. */ public int getLongParam( final int p ) { // Offset is in 16-bit words. return getInt( p * 2 + RECORD_HEADER_SIZE ); } /** * Defines a 32-bit param at the given offset. Offset is in 16-bit words. * * @param p the parameter position in words. * @param value the parameter value. */ public void setLongParam( final int p, final int value ) { setInt( p * 2 + RECORD_HEADER_SIZE, value ); } /** * Return a string param from the given offset. Offset is in 16-bit words. * * @param p the parameter position in words. * @return the parameter value. */ public String getStringParam( final int p, final int len ) { return getString( p * 2 + RECORD_HEADER_SIZE, len ); } /** * Defines a string param at the given offset. Offset is in 16-bit words. * * @param p the parameter position in words. * @param s the parameter value. */ public void setStringParam( final int p, final String s ) { setString( p * 2 + RECORD_HEADER_SIZE, s ); } /** * Return the name of this type of record. */ public String getName() { return type.getName(); } /** * Return debug info. */ public String toString() { final StringBuffer result = new StringBuffer(); result.append( type ); result.append( ' ' ); result.append( getName() ); result.append( ": " ); final StringBuffer str = new StringBuffer(); final int len = ( getInt( 0 ) - 3 ) * 2; for ( int i = 0; i < len; i++ ) { if ( ( i % 16 ) == 0 ) { result.append( '\n' ); str.append( '\n' ); } else if ( ( i % 8 ) == 0 ) { result.append( ' ' ); } final int by = getByte( i + RECORD_HEADER_SIZE ); if ( by < 16 ) { result.append( '0' ); } result.append( Integer.toHexString( by ) ); //str.append ((char) by); result.append( ' ' ); } return result.toString(); } /** * True if this record marks the screen. Currently such records are ignored. */ public boolean doesMark() { return ( type.doesMark() ); } /** * True if this record affects mapping modes. */ public boolean isMappingMode() { return ( type.isMappingMode() ); } }