// Copyright 2001-2006, FreeHEP.
package org.freehep.graphicsio.emf.gdi;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import org.freehep.graphicsio.emf.EMFInputStream;
import org.freehep.graphicsio.emf.EMFOutputStream;
import org.freehep.graphicsio.emf.EMFTag;
import org.freehep.util.io.Tag;
/**
* GDIComment TAG.
*
* @author Mark Donszelmann
* @version $Id: GDIComment.java,v 1.4 2009-08-17 21:44:44 murkle Exp $
*/
public class GDIComment extends EMFTag {
private static final String EMF_PLUS = "EMF+";
private byte[] bytes;
private EMFTag tag;
public GDIComment() {
super(70, 1);
}
public GDIComment(String comment) {
this(comment.getBytes());
}
public GDIComment(byte[] bytes) {
this();
this.bytes = bytes;
}
// FIXME should be EMFPlusTag
public GDIComment(EMFTag tag) {
this();
this.tag = tag;
}
@Override
public EMFTag read(int tagID, EMFInputStream emf, int len)
throws IOException {
// FIXME decode internal EMFPlus Tags
int l = emf.readDWORD();
GDIComment tag = new GDIComment(emf.readBYTE(l));
// Align to 4-byte boundary
if (l % 4 != 0) {
emf.readBYTE(4 - l % 4);
}
return tag;
}
@Override
public void write(int tagID, EMFOutputStream emf) throws IOException {
if (tag != null) {
emf.pushBuffer();
emf.writeBYTE(EMF_PLUS.getBytes());
emf.writeTag(tag, true);
int len = emf.popBuffer();
emf.writeDWORD(len);
emf.append();
} else {
emf.writeDWORD(bytes.length);
emf.writeBYTE(bytes);
if (bytes.length % 4 != 0) {
for (int i = 0; i < 4 - bytes.length % 4; i++) {
emf.writeBYTE(0);
}
}
}
}
@Override
public String toString() {
StringBuffer sb = new StringBuffer(super.toString());
sb.append("\n");
sb.append(" length: ");
sb.append(bytes.length);
sb.append("\n");
String s = new String(bytes);
if (s.startsWith(EMF_PLUS)) {
try {
EMFInputStream emf = new EMFInputStream(
new ByteArrayInputStream(bytes, 4, bytes.length - 4),
0x4001);
sb.append(" --> Embedding:\n");
Tag emfPlusTag = emf.readTag();
while (emfPlusTag != null) {
sb.append(emfPlusTag);
emfPlusTag = emf.readTag();
if (emfPlusTag != null) {
sb.append("\n");
}
}
emf.close();
} catch (IOException e) {
System.err.println(e);
}
} else {
int n = Math.min(bytes.length, 40);
sb.append(" bytes: ");
for (int i = 0; i < n; i++) {
if (i != 0) {
sb.append(" ");
}
sb.append(Integer.toHexString(bytes[i]));
}
sb.append(" ");
sb.append(new String(bytes));
}
return sb.toString();
}
}