public TIFFDirectory(RandomAccessFileOrArray stream, long ifd_offset, int directory) throws IOException { long global_save_offset = stream.getFilePointer(); stream.seek(0L); int endian = stream.readUnsignedShort(); if (!isValidEndianTag(endian)) { throw new IllegalArgumentException("Bad endianness tag (not 0x4949 or 0x4d4d)."); } isBigEndian = (endian == 0x4d4d); stream.seek(ifd_offset); int dirNum = 0; while (dirNum < directory) { int numEntries = readUnsignedShort(stream); stream.seek(ifd_offset + 12 * numEntries); ifd_offset = readUnsignedInt(stream); stream.seek(ifd_offset); dirNum++; } initialize(stream); stream.seek(global_save_offset); }
public static int getNumDirectories(RandomAccessFileOrArray stream) throws IOException { long pointer = stream.getFilePointer(); stream.seek(0L); int endian = stream.readUnsignedShort(); if (!isValidEndianTag(endian)) { throw new IllegalArgumentException("Bad endianness tag (not 0x4949 or 0x4d4d)."); } boolean isBigEndian = (endian == 0x4d4d); int magic = readUnsignedShort(stream, isBigEndian); if (magic != 42) { throw new IllegalArgumentException("Bad magic number, should be 42."); } stream.seek(4L); long offset = readUnsignedInt(stream, isBigEndian); int numDirectories = 0; while (offset != 0L) { ++numDirectories; try { stream.seek(offset); int entries = readUnsignedShort(stream, isBigEndian); stream.skip(12 * entries); offset = readUnsignedInt(stream, isBigEndian); } catch (EOFException eof) { break; } } stream.seek(pointer); return numDirectories; }
public TIFFDirectory(RandomAccessFileOrArray stream, int directory) throws IOException { long global_save_offset = stream.getFilePointer(); long ifd_offset; stream.seek(0L); int endian = stream.readUnsignedShort(); if (!isValidEndianTag(endian)) { throw new IllegalArgumentException("Bad endianness tag (not 0x4949 or 0x4d4d)."); } isBigEndian = (endian == 0x4d4d); int magic = readUnsignedShort(stream); if (magic != 42) { throw new IllegalArgumentException("Bad magic number, should be 42."); } ifd_offset = readUnsignedInt(stream); for (int i = 0; i < directory; i++) { if (ifd_offset == 0L) { throw new IllegalArgumentException("Directory number too large."); } stream.seek(ifd_offset); int entries = readUnsignedShort(stream); stream.skip(12 * entries); ifd_offset = readUnsignedInt(stream); } stream.seek(ifd_offset); initialize(stream); stream.seek(global_save_offset); }
/** * Extracts the names of the font in all the languages available. * * @param id the name id to retrieve * @throws DocumentException on error * @throws IOException on error */ String[][] getNames(int id) throws DocumentException, IOException { int table_location[]; table_location = (int[]) positionTables.get("name"); if (table_location == null) throw new DocumentException("Table 'name' does not exist in " + fileName + style); rf.seek(table_location[0] + 2); int numRecords = rf.readUnsignedShort(); int startOfStorage = rf.readUnsignedShort(); ArrayList<String[]> names = new ArrayList<String[]>(); for (int k = 0; k < numRecords; ++k) { int platformID = rf.readUnsignedShort(); int platformEncodingID = rf.readUnsignedShort(); int languageID = rf.readUnsignedShort(); int nameID = rf.readUnsignedShort(); int length = rf.readUnsignedShort(); int offset = rf.readUnsignedShort(); if (nameID == id) { int pos = rf.getFilePointer(); rf.seek(table_location[0] + startOfStorage + offset); String name; if (platformID == 0 || platformID == 3 || (platformID == 2 && platformEncodingID == 1)) { name = readUnicodeString(length); } else { name = readStandardString(length); } names.add( new String[] { String.valueOf(platformID), String.valueOf(platformEncodingID), String.valueOf(languageID), name }); rf.seek(pos); } } String thisName[][] = new String[names.size()][]; for (int k = 0; k < names.size(); ++k) thisName[k] = (String[]) names.get(k); return thisName; }
private void initialize(RandomAccessFileOrArray stream) throws IOException { long nextTagOffset = 0L; long maxOffset = stream.length(); int i, j; IFDOffset = stream.getFilePointer(); numEntries = readUnsignedShort(stream); fields = new TIFFField[numEntries]; for (i = 0; (i < numEntries) && (nextTagOffset < maxOffset); i++) { int tag = readUnsignedShort(stream); int type = readUnsignedShort(stream); int count = (int) (readUnsignedInt(stream)); boolean processTag = true; nextTagOffset = stream.getFilePointer() + 4; try { if (count * sizeOfType[type] > 4) { long valueOffset = readUnsignedInt(stream); if (valueOffset < maxOffset) { stream.seek(valueOffset); } else { processTag = false; } } } catch (ArrayIndexOutOfBoundsException ae) { processTag = false; } if (processTag) { fieldIndex.put(new Integer(tag), new Integer(i)); Object obj = null; switch (type) { case TIFFField.TIFF_BYTE: case TIFFField.TIFF_SBYTE: case TIFFField.TIFF_UNDEFINED: case TIFFField.TIFF_ASCII: byte[] bvalues = new byte[count]; stream.readFully(bvalues, 0, count); if (type == TIFFField.TIFF_ASCII) { int index = 0, prevIndex = 0; ArrayList v = new ArrayList(); while (index < count) { while ((index < count) && (bvalues[index++] != 0)) ; v.add(new String(bvalues, prevIndex, (index - prevIndex))); prevIndex = index; } count = v.size(); String strings[] = new String[count]; for (int c = 0; c < count; c++) { strings[c] = (String) v.get(c); } obj = strings; } else { obj = bvalues; } break; case TIFFField.TIFF_SHORT: char[] cvalues = new char[count]; for (j = 0; j < count; j++) { cvalues[j] = (char) (readUnsignedShort(stream)); } obj = cvalues; break; case TIFFField.TIFF_LONG: long[] lvalues = new long[count]; for (j = 0; j < count; j++) { lvalues[j] = readUnsignedInt(stream); } obj = lvalues; break; case TIFFField.TIFF_RATIONAL: long[][] llvalues = new long[count][2]; for (j = 0; j < count; j++) { llvalues[j][0] = readUnsignedInt(stream); llvalues[j][1] = readUnsignedInt(stream); } obj = llvalues; break; case TIFFField.TIFF_SSHORT: short[] svalues = new short[count]; for (j = 0; j < count; j++) { svalues[j] = readShort(stream); } obj = svalues; break; case TIFFField.TIFF_SLONG: int[] ivalues = new int[count]; for (j = 0; j < count; j++) { ivalues[j] = readInt(stream); } obj = ivalues; break; case TIFFField.TIFF_SRATIONAL: int[][] iivalues = new int[count][2]; for (j = 0; j < count; j++) { iivalues[j][0] = readInt(stream); iivalues[j][1] = readInt(stream); } obj = iivalues; break; case TIFFField.TIFF_FLOAT: float[] fvalues = new float[count]; for (j = 0; j < count; j++) { fvalues[j] = readFloat(stream); } obj = fvalues; break; case TIFFField.TIFF_DOUBLE: double[] dvalues = new double[count]; for (j = 0; j < count; j++) { dvalues[j] = readDouble(stream); } obj = dvalues; break; default: break; } fields[i] = new TIFFField(tag, type, count, obj); } stream.seek(nextTagOffset); } try { nextIFDOffset = readUnsignedInt(stream); } catch (Exception e) { nextIFDOffset = 0; } }