Example #1
0
  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);
  }
Example #2
0
  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;
  }
Example #3
0
  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);
  }
Example #4
0
 /**
  * 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;
 }
Example #5
0
  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;
    }
  }