2009-06-01 17:07:20 -04:00
|
|
|
/* ====================================================================
|
|
|
|
Licensed to the Apache Software Foundation (ASF) under one or more
|
|
|
|
contributor license agreements. See the NOTICE file distributed with
|
|
|
|
this work for additional information regarding copyright ownership.
|
|
|
|
The ASF licenses this file to You under the Apache License, Version 2.0
|
|
|
|
(the "License"); you may not use this file except in compliance with
|
|
|
|
the License. You may obtain a copy of the License at
|
|
|
|
|
|
|
|
http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
|
|
|
|
Unless required by applicable law or agreed to in writing, software
|
|
|
|
distributed under the License is distributed on an "AS IS" BASIS,
|
|
|
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
|
|
See the License for the specific language governing permissions and
|
|
|
|
limitations under the License.
|
|
|
|
==================================================================== */
|
|
|
|
|
2005-05-01 18:00:12 -04:00
|
|
|
package org.apache.poi.ddf;
|
|
|
|
|
|
|
|
import org.apache.poi.util.HexDump;
|
|
|
|
import org.apache.poi.util.LittleEndian;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @author Glen Stampoultzis
|
|
|
|
*/
|
2009-05-19 15:21:12 -04:00
|
|
|
public class EscherBitmapBlip extends EscherBlipRecord {
|
2005-05-01 18:00:12 -04:00
|
|
|
public static final short RECORD_ID_JPEG = (short) 0xF018 + 5;
|
|
|
|
public static final short RECORD_ID_PNG = (short) 0xF018 + 6;
|
|
|
|
public static final short RECORD_ID_DIB = (short) 0xF018 + 7;
|
|
|
|
|
|
|
|
private static final int HEADER_SIZE = 8;
|
|
|
|
|
2015-09-24 01:51:38 -04:00
|
|
|
private final byte[] field_1_UID = new byte[16];
|
2005-05-01 18:00:12 -04:00
|
|
|
private byte field_2_marker = (byte) 0xFF;
|
|
|
|
|
2009-05-19 15:21:12 -04:00
|
|
|
public int fillFields(byte[] data, int offset, EscherRecordFactory recordFactory) {
|
2005-05-01 18:00:12 -04:00
|
|
|
int bytesAfterHeader = readHeader( data, offset );
|
|
|
|
int pos = offset + HEADER_SIZE;
|
|
|
|
|
|
|
|
System.arraycopy( data, pos, field_1_UID, 0, 16 ); pos += 16;
|
|
|
|
field_2_marker = data[pos]; pos++;
|
|
|
|
|
|
|
|
field_pictureData = new byte[bytesAfterHeader - 17];
|
|
|
|
System.arraycopy( data, pos, field_pictureData, 0, field_pictureData.length );
|
|
|
|
|
|
|
|
return bytesAfterHeader + HEADER_SIZE;
|
|
|
|
}
|
|
|
|
|
|
|
|
public int serialize( int offset, byte[] data, EscherSerializationListener listener )
|
|
|
|
{
|
|
|
|
listener.beforeRecordSerialize(offset, getRecordId(), this);
|
|
|
|
|
|
|
|
LittleEndian.putShort( data, offset, getOptions() );
|
|
|
|
LittleEndian.putShort( data, offset + 2, getRecordId() );
|
|
|
|
LittleEndian.putInt( data, offset + 4, getRecordSize() - HEADER_SIZE );
|
|
|
|
int pos = offset + HEADER_SIZE;
|
|
|
|
|
|
|
|
System.arraycopy( field_1_UID, 0, data, pos, 16 );
|
|
|
|
data[pos + 16] = field_2_marker;
|
|
|
|
System.arraycopy( field_pictureData, 0, data, pos + 17, field_pictureData.length );
|
|
|
|
|
|
|
|
listener.afterRecordSerialize(offset + getRecordSize(), getRecordId(), getRecordSize(), this);
|
|
|
|
return HEADER_SIZE + 16 + 1 + field_pictureData.length;
|
|
|
|
}
|
|
|
|
|
|
|
|
public int getRecordSize()
|
|
|
|
{
|
|
|
|
return 8 + 16 + 1 + field_pictureData.length;
|
|
|
|
}
|
|
|
|
|
|
|
|
public byte[] getUID()
|
|
|
|
{
|
|
|
|
return field_1_UID;
|
|
|
|
}
|
|
|
|
|
2015-09-23 19:22:46 -04:00
|
|
|
public void setUID( byte[] field_1_UID ) {
|
2015-09-24 01:51:38 -04:00
|
|
|
if (field_1_UID == null || field_1_UID.length != 16) {
|
|
|
|
throw new IllegalArgumentException("field_1_UID must be byte[16]");
|
2015-09-23 19:22:46 -04:00
|
|
|
}
|
2015-09-24 01:51:38 -04:00
|
|
|
System.arraycopy(field_1_UID, 0, this.field_1_UID , 0, 16);
|
2005-05-01 18:00:12 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
public byte getMarker()
|
|
|
|
{
|
|
|
|
return field_2_marker;
|
|
|
|
}
|
|
|
|
|
|
|
|
public void setMarker( byte field_2_marker )
|
|
|
|
{
|
|
|
|
this.field_2_marker = field_2_marker;
|
|
|
|
}
|
|
|
|
|
|
|
|
public String toString()
|
|
|
|
{
|
|
|
|
String nl = System.getProperty( "line.separator" );
|
|
|
|
|
2015-08-29 10:41:12 -04:00
|
|
|
String extraData = HexDump.dump(this.field_pictureData, 0, 0);
|
|
|
|
|
2005-05-01 18:00:12 -04:00
|
|
|
return getClass().getName() + ":" + nl +
|
|
|
|
" RecordId: 0x" + HexDump.toHex( getRecordId() ) + nl +
|
2011-08-31 09:14:09 -04:00
|
|
|
" Version: 0x" + HexDump.toHex( getVersion() ) + nl +
|
|
|
|
" Instance: 0x" + HexDump.toHex( getInstance() ) + nl +
|
2005-05-01 18:00:12 -04:00
|
|
|
" UID: 0x" + HexDump.toHex( field_1_UID ) + nl +
|
|
|
|
" Marker: 0x" + HexDump.toHex( field_2_marker ) + nl +
|
|
|
|
" Extra Data:" + nl + extraData;
|
|
|
|
}
|
2012-05-02 10:00:46 -04:00
|
|
|
|
|
|
|
@Override
|
|
|
|
public String toXml(String tab) {
|
2015-08-29 10:41:12 -04:00
|
|
|
String extraData = HexDump.dump(this.field_pictureData, 0, 0);
|
2012-05-02 10:00:46 -04:00
|
|
|
StringBuilder builder = new StringBuilder();
|
|
|
|
builder.append(tab).append(formatXmlRecordHeader(getClass().getSimpleName(), HexDump.toHex(getRecordId()), HexDump.toHex(getVersion()), HexDump.toHex(getInstance())))
|
|
|
|
.append(tab).append("\t").append("<UID>0x").append(HexDump.toHex(field_1_UID)).append("</UID>\n")
|
|
|
|
.append(tab).append("\t").append("<Marker>0x").append(HexDump.toHex(field_2_marker)).append("</Marker>\n")
|
|
|
|
.append(tab).append("\t").append("<ExtraData>").append(extraData).append("</ExtraData>\n");
|
|
|
|
builder.append(tab).append("</").append(getClass().getSimpleName()).append(">\n");
|
|
|
|
return builder.toString();
|
|
|
|
}
|
2005-05-01 18:00:12 -04:00
|
|
|
}
|