klease      2002/11/21 13:58:49

  Modified:    src/org/apache/fop/fonts Tag: fop-0_20_2-maintain
                        TTFSubSetFile.java
  Log:
  Correct ordering of loca table in embedded true type fonts
  
  Revision  Changes    Path
  No                   revision
  
  
  No                   revision
  
  
  1.5.2.3   +46 -23    xml-fop/src/org/apache/fop/fonts/TTFSubSetFile.java
  
  Index: TTFSubSetFile.java
  ===================================================================
  RCS file: /home/cvs/xml-fop/src/org/apache/fop/fonts/TTFSubSetFile.java,v
  retrieving revision 1.5.2.2
  retrieving revision 1.5.2.3
  diff -u -r1.5.2.2 -r1.5.2.3
  --- TTFSubSetFile.java        8 Nov 2002 10:25:26 -0000       1.5.2.2
  +++ TTFSubSetFile.java        21 Nov 2002 21:58:49 -0000      1.5.2.3
  @@ -311,31 +311,44 @@
               pad4();
               start = currentPos;
   
  +            /* Loca table must be in order by glyph index, so build
  +             * an array first and then write the glyph info and
  +             * location offset.
  +             */
  +            int[] origIndexes = new int[glyphs.size()];
  +
               for (Iterator e = glyphs.keySet().iterator(); e.hasNext(); ) {
  -                int glyphLength = 0;
                   Integer origIndex = (Integer)e.next();
                   Integer subsetIndex = (Integer)glyphs.get(origIndex);
  +                origIndexes[subsetIndex.intValue()] = origIndex.intValue();
  +            }
   
  +            for (int i=0;i<origIndexes.length;i++) {
  +                int glyphLength = 0;
                   int nextOffset = 0;
  -                if (origIndex.intValue() >= (mtx_tab.length - 1))
  +                int origGlyphIndex = origIndexes[i];
  +                if (origGlyphIndex >= (mtx_tab.length - 1)) {
                       nextOffset = (int)lastLoca;
  -                else
  +                }
  +                else {
                       nextOffset =
  -                        (int)mtx_tab[origIndex.intValue() + 1].offset;
  -
  +                        (int)mtx_tab[origGlyphIndex + 1].offset;
  +                }
                   glyphLength = nextOffset
  -                              - (int)mtx_tab[origIndex.intValue()].offset;
  +                              - (int)mtx_tab[origGlyphIndex].offset;
   
                   // Copy glyph
  -                System.arraycopy(in.getBytes((int)entry.offset + 
(int)mtx_tab[origIndex.intValue()].offset, glyphLength),
  +                System.arraycopy(in.getBytes((int)entry.offset +
  +                                       (int)mtx_tab[origGlyphIndex].offset,
  +                                       glyphLength),
                                    0, output, currentPos, glyphLength);
   
   
                   // Update loca table
  -                writeULong(locaOffset + subsetIndex.intValue() * 4,
  -                           currentPos - start);
  -                if ((currentPos - start + glyphLength) > endOffset)
  +                writeULong(locaOffset + i * 4, currentPos - start);
  +                if ((currentPos - start + glyphLength) > endOffset) {
                       endOffset = (currentPos - start + glyphLength);
  +                }
   
                   currentPos += glyphLength;
                   realSize += glyphLength;
  @@ -426,17 +439,21 @@
                   offset += 2;
               }
   
  -            if ((flags & 8) > 0)
  +            if ((flags & 8) > 0) {
                   offset += 2;    // WE_HAVE_A_SCALE
  -            else if ((flags & 64) > 0)
  +            }
  +            else if ((flags & 64) > 0) {
                   offset += 4;    // WE_HAVE_AN_X_AND_Y_SCALE
  -            else if ((flags & 128) > 0)
  +            }
  +            else if ((flags & 128) > 0) {
                   offset += 8;    // WE_HAVE_A_TWO_BY_TWO
  -
  -            if ((flags & 32) > 0)
  +            }
  +            if ((flags & 32) > 0) {
                   moreComposites = true;
  -            else
  +            }
  +            else {
                   moreComposites = false;
  +            }
           }
   
           return ret;
  @@ -491,10 +508,12 @@
                   offset += 8;    // WE_HAVE_A_TWO_BY_TWO
               }
   
  -            if ((flags & 32) > 0)
  +            if ((flags & 32) > 0) {
                   moreComposites = true;
  -            else
  +            }
  +            else {
                   moreComposites = false;
  +            }
           }
       }
   
  @@ -576,8 +595,9 @@
            * Check if TrueType collection, and that the name
            * exists in the collection
            */
  -        if (!checkTTC(in, name, false))
  +        if (!checkTTC(in, name, false)) {
               throw new IOException("Failed to read font");
  +        }
   
           output = new byte[in.getFileSize()];
   
  @@ -733,8 +753,9 @@
        */
       private int readUShort(int pos) {
           int ret = (int)output[pos];
  -        if (ret < 0)
  +        if (ret < 0) {
               ret += 256;
  +        }
           ret = ret << 8;
           if ((int)output[pos + 1] < 0) {
               ret |= (int)output[pos + 1] + 256;
  @@ -780,8 +801,9 @@
           // All the tables here are aligned on four byte boundaries
           // Add remainder to size if it's not a multiple of 4
           int remainder = size % 4;
  -        if (remainder != 0)
  +        if (remainder != 0) {
               size += remainder;
  +        }
   
           long sum = 0;
   
  @@ -791,8 +813,9 @@
               l += (int)(output[start + i + 2] << 16);
               l += (int)(output[start + i + 3] << 16);
               sum += l;
  -            if (sum > 0xffffffff)
  +            if (sum > 0xffffffff) {
                   sum = sum - 0xffffffff;
  +            }
           }
   
           return sum;
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to