poi-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Praveen Mathew" <prmat...@in.ibm.com>
Subject New FFN & Fontable classes
Date Thu, 03 Jul 2003 12:05:15 GMT
I am unable to connect to cvs through Eclipse due to firewall problems. I 
am trying out "cvsgrab"  as avik suggested
As soon as I set up the cvs I will sent the patch.

If i dont need to send codes like this please tell me.

FontTable.java...

/* ====================================================================
 * The Apache Software License, Version 1.1
 *
 * Copyright (c) 2003 The Apache Software Foundation.  All rights
 * reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 *
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in
 *    the documentation and/or other materials provided with the
 *    distribution.
 * 
 * 3. The end-user documentation included with the redistribution,
 *    if any, must include the following acknowledgment:
 *       "This product includes software developed by the
 *        Apache Software Foundation (http://www.apache.org/)."
 *    Alternately, this acknowledgment may appear in the software itself,
 *    if and wherever such third-party acknowledgments normally appear.
 *
 * 4. The names "Apache" and "Apache Software Foundation" and
 *    "Apache POI" must not be used to endorse or promote products
 *    derived from this software without prior written permission. For
 *    written permission, please contact apache@apache.org.
 *
 * 5. Products derived from this software may not be called "Apache",
 *    "Apache POI", nor may "Apache" appear in their name, without
 *    prior written permission of the Apache Software Foundation.
 *
 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
 * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
 * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
 * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 * SUCH DAMAGE.
 * ====================================================================
 *
 * This software consists of voluntary contributions made by many
 * individuals on behalf of the Apache Software Foundation.  For more
 * information on the Apache Software Foundation, please see
 * <http://www.apache.org/>.
 */

package org.apache.poi.hwpf.model.hdftypes;

import java.io.IOException;
import org.apache.poi.hwpf.model.io.HWPFFileSystem;
import org.apache.poi.hwpf.model.io.HWPFOutputStream;
import org.apache.poi.util.LittleEndian;

/**
 * FontTable or in MS terminology sttbfffn is a common data structure written in all 
 * Word files. The sttbfffn is an sttbf where each string is an FFN structure instead
 * of pascal-style strings. An sttbf is a string Table stored in file. Thus sttbffn 
 * is like an Sttbf with an array of FFN structures that stores the font name strings
 * 
 * @author Praveen Mathew
 */
public class FontTable
{
  private short exntdChar;// strings are extended character if = 0xFFFF
  private short stringCount;// how many strings are included in the string table
  private short extraDataSz;// size in bytes of the extra data

 
  // added extra facilitator members
  private int lcbSttbfffn;// count of bytes in sttbfffn
  private boolean isExtndChar;
  private int fcSttbfffnMainOffset = 0x0112;// offset in mainStream
  private int lcbSttbfffnMainOffset = 0x0116;// offset in mainstream
  private int fcSttbfffn;// table stream offset for sttbfffn


  // FFN structure containing strings of font names
  private Ffn[] fontNames = null;
 
 
  public FontTable(byte[] buf, int offset, int lcbSttbfffn)
  {
    this.lcbSttbfffn = lcbSttbfffn;
    this.fcSttbfffn = offset;
 
    exntdChar = LittleEndian.getShort(buf, offset);
    offset += LittleEndian.SHORT_SIZE;
    stringCount = LittleEndian.getShort(buf, offset);
    offset += LittleEndian.SHORT_SIZE;
    extraDataSz = LittleEndian.getShort(buf, offset);
    offset += LittleEndian.SHORT_SIZE;

    if ((exntdChar & 0xFFFF) == 0xFFFF)
    {
      isExtndChar = true;
    }
    else
    {
      isExtndChar = false;
    }

    fontNames = new Ffn[stringCount]; //Ffn corresponds to a Pascal style String in STTBF.

    for(int i = 0;i<stringCount; i++)
    {
      // some mistake in the fields we have chosen
      if(offset >= this.getSize())
      {
        System.out.println("Total size of Sttbfn mismatched with calculated size");
        break;
      }

      fontNames[i] = new Ffn(buf,offset);
      offset += fontNames[i].getSize();
    }
  }

  public boolean isExtndChar()
  {
    return  isExtndChar;
  }

  public short getStringCount()
  {
    return  stringCount;
  }

  public int getSize()
  {
    return lcbSttbfffn;
  }

  public char [] getMainFont(int chpFtc )
  {
    if(chpFtc >= stringCount)
    {
      System.out.println("Mismatch in chpFtc with stringCount");
      return null;
    }

    return fontNames[chpFtc].getMainFontName();
  }

  public char [] getAltFont(int chpFtc )
  {
    if(chpFtc >= stringCount)
    {
      System.out.println("Mismatch in chpFtc with stringCount");
      return null;
    }

    return fontNames[chpFtc].getAltFontName();
  }

  public void setStringCount(short stringCount)
  {
    this.stringCount = stringCount;
  }
 
  public void writeTo(HWPFFileSystem sys, int fcMin)
          throws IOException
        {
          HWPFOutputStream docStream = sys.getStream("WordDocument");
          HWPFOutputStream tableStream = sys.getStream("1Table");
          byte[] buf = docStream.toByteArray();
          LittleEndian.putInt(buf,fcSttbfffnMainOffset, fcSttbfffn);
          LittleEndian.putInt(buf,lcbSttbfffnMainOffset, lcbSttbfffn);
          docStream.write(buf);
 
          byte[] buf1 = new byte[LittleEndian.SHORT_SIZE];
          LittleEndian.putShort(buf1, exntdChar);
          tableStream.write(buf1);
          LittleEndian.putShort(buf1, stringCount); 
          tableStream.write(buf1);
          LittleEndian.putShort(buf1, extraDataSz);
          tableStream.write(buf1);
 
          for(int i = 0; i < fontNames.length; i++)
          {
                tableStream.write(fontNames[i].toByteArray());
          } 
 
        }
 


}



Ffn.java.....

/* ====================================================================
 * The Apache Software License, Version 1.1
 *
 * Copyright (c) 2003 The Apache Software Foundation.  All rights
 * reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 *
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in
 *    the documentation and/or other materials provided with the
 *    distribution.
 *
 * 3. The end-user documentation included with the redistribution,
 *    if any, must include the following acknowledgment:
 *       "This product includes software developed by the
 *        Apache Software Foundation (http://www.apache.org/)."
 *    Alternately, this acknowledgment may appear in the software itself,
 *    if and wherever such third-party acknowledgments normally appear.
 *
 * 4. The names "Apache" and "Apache Software Foundation" and
 *    "Apache POI" must not be used to endorse or promote products
 *    derived from this software without prior written permission. For
 *    written permission, please contact apache@apache.org.
 *
 * 5. Products derived from this software may not be called "Apache",
 *    "Apache POI", nor may "Apache" appear in their name, without
 *    prior written permission of the Apache Software Foundation.
 *
 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
 * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
 * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
 * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 * SUCH DAMAGE.
 * ====================================================================
 *
 * This software consists of voluntary contributions made by many
 * individuals on behalf of the Apache Software Foundation.  For more
 * information on the Apache Software Foundation, please see
 * <http://www.apache.org/>.
 */

package org.apache.poi.hwpf.model.hdftypes;

import org.apache.poi.util.BitField;
import org.apache.poi.util.LittleEndian;

/**
 * FFN - Font Family Name. FFN is a data structure that stores the names of the Main 
 * Font and that of Alternate font as an array of characters. It has also a header
 * that stores info about the whole structure and the fonts
 * 
 * @author Praveen Mathew
 */
public class Ffn
{
  private int field1_cbFfnM1;//total length of FFN - 1.
  private byte field2;
    private  static BitField _prq = new BitField(0x0003);// pitch request
    private  static BitField _fTrueType = new BitField(0x0004);// when 1, font is a TrueType
font
    private  static BitField _ff = new BitField(0x0070);
  private short field3_wWeight;// base weight of font
  private byte field4_chs;// character set identifier
  private byte field5_ixchSzAlt;  // index into ffn.szFfn to the name of
                                  // the alternate font
  private byte [] panose = new byte[10];//????
  private byte [] fontSig         = new byte[24];//????

  // zero terminated string that records name of font, cuurently not
  // supporting Extended chars
  private char [] xszFfn;
  private int xszFfnLength;

  public Ffn(byte[] buf, int offset)
  {
    field1_cbFfnM1 = LittleEndian.getUnsignedByte(buf,offset);
    offset += LittleEndian.BYTE_SIZE;
    field2 = buf[offset];
    offset += LittleEndian.BYTE_SIZE;
    field3_wWeight = LittleEndian.getShort(buf, offset);
    offset += LittleEndian.SHORT_SIZE;
    field4_chs = buf[offset];
    offset += LittleEndian.BYTE_SIZE;
    field5_ixchSzAlt = buf[offset];
    offset += LittleEndian.BYTE_SIZE;

    // read panose and fs so we can write them back out.
    System.arraycopy(buf, offset, panose, 0, panose.length);
    offset += panose.length;
    System.arraycopy(buf, offset, fontSig, 0, fontSig.length);
    offset += fontSig.length;

    xszFfnLength = this.getSize() - offset;
    xszFfn = new char[xszFfnLength];

    for(int i = 0; i < xszFfnLength; i++)
    {
      xszFfn[i] = (char)LittleEndian.getUnsignedByte(buf, offset);
      offset += LittleEndian.BYTE_SIZE;
    }


  }

  public int getField1_cbFfnM1()
  {
    return  field1_cbFfnM1;
  }

  public int getSize()
  {
    return (field1_cbFfnM1 + 1);
  }

  public char [] getMainFontName()
  {
    char [] temp = new char[field5_ixchSzAlt];
    System.arraycopy(xszFfn,0,temp,0,temp.length);
    return temp;
  }

  public char [] getAltFontName()
  {
    char [] temp = new char[xszFfnLength - field5_ixchSzAlt];
    System.arraycopy(xszFfn, field5_ixchSzAlt, temp, 0, temp.length);
    return temp;
  }

  public void setField1_cbFfnM1(int field1_cbFfnM1)
  {
    this.field1_cbFfnM1 = field1_cbFfnM1;
  }

  // changed protected to public
  public byte[] toByteArray()
  {
        int offset = 0;
        byte[] buf = new byte[this.getSize()];
 
        buf[offset] = (byte)field1_cbFfnM1;
        offset += LittleEndian.BYTE_SIZE;
        buf[offset] = field2;
        offset += LittleEndian.BYTE_SIZE;
        LittleEndian.putShort(buf, offset, field3_wWeight);
        offset += LittleEndian.SHORT_SIZE;
        buf[offset] = field4_chs;
        offset += LittleEndian.BYTE_SIZE;
        buf[offset] = field5_ixchSzAlt;
        offset += LittleEndian.BYTE_SIZE;
 
        System.arraycopy(panose,0,buf, offset,panose.length);
        offset += panose.length;
        System.arraycopy(fontSig,0,buf, offset, fontSig.length);
        offset += fontSig.length;
 
        for(int i = 0; i < xszFfn.length; i++)
        {
                buf[offset] = (byte)xszFfn[i]; 
                offset += LittleEndian.BYTE_SIZE;
        }
 
    return buf;
 
  }


}




Thanks & Regards
Praveen

Praveen Mathew
IBM Software Labs,Airport Road,
Bangalore - 560 017,India.
Ph : +91- 80 - 504 4609 (Direct)
       +91 - 80 - 5262355 Extn: 3609
Email: prmathew@in.ibm.com




"Ryan Ackley" <sackley@cfl.rr.com>
03/07/2003 15:39
Please respond to "POI Developers List"

 
        To:     "POI Developers List" <poi-dev@jakarta.apache.org>
        cc: 
        Subject:        Re: HWPF: java doubts

 

> Thats cool!!
>
> Then why we need getUnsignedByte() itself??
> eg:  to read a byte read 0xff , get its unsigned value by typcasting to
> int  i,e 0x000000ff;
> & to write it back just write the byte  0xff.

The byte 0xff is equal to -1 so when you cast it to an int you end up with
an int that is equal to -1 (0xffffffff). We want an int that is equal to
255. When you cast from a smaller precision number to a larger precision
number (byte->int) the JVM will always preserve the sign.


---------------------------------------------------------------------
To unsubscribe, e-mail: poi-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: poi-dev-help@jakarta.apache.org




Mime
  • Unnamed multipart/alternative (inline, None, 0 bytes)
View raw message