|
|
@@ -458,107 +458,6 @@ public class TTFSubSetFile extends TTFFile { |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* Returns a List containing the glyph itself plus all glyphs |
|
|
|
* that this composite glyph uses |
|
|
|
*/ |
|
|
|
private List<Integer> getIncludedGlyphs(FontFileReader in, int glyphOffset, |
|
|
|
Integer glyphIdx) throws IOException { |
|
|
|
List<Integer> ret = new java.util.ArrayList<Integer>(); |
|
|
|
ret.add(glyphIdx); |
|
|
|
int offset = glyphOffset + (int)mtxTab[glyphIdx.intValue()].getOffset() + 10; |
|
|
|
Integer compositeIdx = null; |
|
|
|
int flags = 0; |
|
|
|
boolean moreComposites = true; |
|
|
|
while (moreComposites) { |
|
|
|
flags = in.readTTFUShort(offset); |
|
|
|
compositeIdx = Integer.valueOf(in.readTTFUShort(offset + 2)); |
|
|
|
ret.add(compositeIdx); |
|
|
|
|
|
|
|
offset += 4; |
|
|
|
if ((flags & 1) > 0) { |
|
|
|
// ARG_1_AND_ARG_2_ARE_WORDS |
|
|
|
offset += 4; |
|
|
|
} else { |
|
|
|
offset += 2; |
|
|
|
} |
|
|
|
|
|
|
|
if ((flags & 8) > 0) { |
|
|
|
offset += 2; // WE_HAVE_A_SCALE |
|
|
|
} else if ((flags & 64) > 0) { |
|
|
|
offset += 4; // WE_HAVE_AN_X_AND_Y_SCALE |
|
|
|
} else if ((flags & 128) > 0) { |
|
|
|
offset += 8; // WE_HAVE_A_TWO_BY_TWO |
|
|
|
} |
|
|
|
|
|
|
|
if ((flags & 32) > 0) { |
|
|
|
moreComposites = true; |
|
|
|
} else { |
|
|
|
moreComposites = false; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
return ret; |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
* Rewrite all compositepointers in glyphindex glyphIdx |
|
|
|
* |
|
|
|
*/ |
|
|
|
private void remapComposite(FontFileReader in, Map<Integer, Integer> glyphs, |
|
|
|
int glyphOffset, |
|
|
|
Integer glyphIdx) throws IOException { |
|
|
|
int offset = glyphOffset + (int)mtxTab[glyphIdx.intValue()].getOffset() |
|
|
|
+ 10; |
|
|
|
|
|
|
|
Integer compositeIdx = null; |
|
|
|
int flags = 0; |
|
|
|
boolean moreComposites = true; |
|
|
|
|
|
|
|
while (moreComposites) { |
|
|
|
flags = in.readTTFUShort(offset); |
|
|
|
compositeIdx = Integer.valueOf(in.readTTFUShort(offset + 2)); |
|
|
|
Integer newIdx = glyphs.get(compositeIdx); |
|
|
|
if (newIdx == null) { |
|
|
|
// This errormessage would look much better |
|
|
|
// if the fontname was printed to |
|
|
|
//log.error("An embedded font " |
|
|
|
// + "contains bad glyph data. " |
|
|
|
// + "Characters might not display " |
|
|
|
// + "correctly."); |
|
|
|
moreComposites = false; |
|
|
|
continue; |
|
|
|
} |
|
|
|
|
|
|
|
in.writeTTFUShort(offset + 2, newIdx.intValue()); |
|
|
|
|
|
|
|
offset += 4; |
|
|
|
|
|
|
|
if ((flags & 1) > 0) { |
|
|
|
// ARG_1_AND_ARG_2_ARE_WORDS |
|
|
|
offset += 4; |
|
|
|
} else { |
|
|
|
offset += 2; |
|
|
|
} |
|
|
|
|
|
|
|
if ((flags & 8) > 0) { |
|
|
|
offset += 2; // WE_HAVE_A_SCALE |
|
|
|
} else if ((flags & 64) > 0) { |
|
|
|
offset += 4; // WE_HAVE_AN_X_AND_Y_SCALE |
|
|
|
} else if ((flags & 128) > 0) { |
|
|
|
offset += 8; // WE_HAVE_A_TWO_BY_TWO |
|
|
|
} |
|
|
|
|
|
|
|
if ((flags & 32) > 0) { |
|
|
|
moreComposites = true; |
|
|
|
} else { |
|
|
|
moreComposites = false; |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
* Reads a font and creates a subset of the font. |
|
|
|
* |