package uk.co.mmscomputing.imageio.tiff; import java.io.*; import java.util.*; import java.nio.ByteOrder; import javax.imageio.stream.*; import uk.co.mmscomputing.math.Rational; abstract class DE implements TIFFConstants{ // ImageFileDirectoryEntry private int tag; protected int type; protected long len; protected long val; DE(int tagid)throws IOException{ tag=tagid; } int getTag(){return tag;} int getType(){return type;} void setType(int type){this.type=type;} long getCount(){return (int)len;} void setCount(long count){this.len=count;} long getLength(){return (int)len;} void setLength(long len){this.len=len;} long getValue(){return val;} void setValue(long value){val=value;} void read(ImageInputStream in)throws IOException{ type=in.readUnsignedShort(); len=in.readUnsignedInt(); // count of items of tag type to follow val=readValue(in); // System.out.println(getClass().getName()+"\n\t Tag = "+tag+" Type = "+type+" Len = "+len+" Val = 0x"+Long.toHexString(val)+" Val = "+val); } private long readValue(ImageInputStream in)throws IOException{ long val=0; int sot=sizeOfType(); if(len*sot<=4){ val=in.readUnsignedInt(); if(in.getByteOrder()==ByteOrder.BIG_ENDIAN){ long v; switch(type){ case BYTE: case SBYTE: v = val &0x000000FF; val =(val>>24)&0x000000FF; val|=(v <<24)&0xFF000000; v = val &0x0000FF00; val|=(val>> 8)&0x0000FF00; val|=(v << 8)&0x00FF0000; break; case SHORT: case SSHORT: v = val &0x0000FFFF; val =(val>>16)&0x0000FFFF; val|=(v <<16)&0xFFFF0000; break; } } }else{ val=in.readUnsignedInt(); } return val; } void writeEntry(ImageOutputStream out) throws IOException { out.writeShort(tag); out.writeShort(type); out.writeInt((int)len); out.writeInt((int)val); } protected int sizeOfType(){ switch(type){ case BYTE: case SBYTE: case UNDEFINED: return 1; case SHORT: case SSHORT: return 2; case LONG: case SLONG: case FLOAT: return 4; case RATIONAL: case SRATIONAL: case DOUBLE: return 8; default:/*error*/return -1; } } protected long readInt(ImageInputStream in)throws IOException{ switch(type){ case BYTE: return in.readUnsignedByte(); case SHORT: return in.readUnsignedShort(); case LONG: return in.readUnsignedInt(); case SBYTE: return in.read(); case SSHORT: return in.readShort(); case SLONG: return in.readInt(); default:/*error*/return 0; } } protected void writeInt(ImageOutputStream out,long val)throws IOException{ switch(type){ case BYTE: out.writeByte((byte)val);break; case SHORT: out.writeShort((short)val);break; case LONG: out.writeInt((int)val);break; case SBYTE: out.write((byte)val);break; case SSHORT: out.writeShort((short)val);break; case SLONG: out.writeInt((int)val);break; default:/*error*/break; } } protected String[] readString(ImageInputStream in)throws IOException{ if(type!=ASCII){/*error*/return null;} in.mark(); in.seek(val); Vector v=new Vector(); int i=0; while(i>shift)&0x0000FFFF;shift+=16; // System.out.println("["+i+"]= 0x"+Long.toHexString(array[i])); } break; case 4: array[0]=val; // System.out.println("[0]= 0x"+Long.toHexString(array[0])); break; } }else{ in.mark(); in.seek(val); for(int i=0;i