diff options
-rw-r--r-- | src/java/org/apache/fop/fonts/CMapSegment.java (renamed from src/java/org/apache/fop/fonts/BFEntry.java) | 25 | ||||
-rw-r--r-- | src/java/org/apache/fop/fonts/CustomFont.java | 10 | ||||
-rw-r--r-- | src/java/org/apache/fop/fonts/FontReader.java | 8 | ||||
-rw-r--r-- | src/java/org/apache/fop/fonts/MultiByteFont.java | 26 | ||||
-rw-r--r-- | src/java/org/apache/fop/fonts/apps/TTFReader.java | 4 | ||||
-rw-r--r-- | src/java/org/apache/fop/fonts/truetype/TTFFile.java | 17 | ||||
-rw-r--r-- | src/java/org/apache/fop/fonts/truetype/TTFFontLoader.java | 14 | ||||
-rw-r--r-- | src/java/org/apache/fop/render/ps/PSFontUtils.java | 28 |
8 files changed, 64 insertions, 68 deletions
diff --git a/src/java/org/apache/fop/fonts/BFEntry.java b/src/java/org/apache/fop/fonts/CMapSegment.java index 0841f36c8..816df2ca0 100644 --- a/src/java/org/apache/fop/fonts/BFEntry.java +++ b/src/java/org/apache/fop/fonts/CMapSegment.java @@ -20,31 +20,29 @@ package org.apache.fop.fonts; /** - * This is just a holder class for bfentries, groups of characters of a base font (bf). + * A segment in a cmap table of format 4. Unicode code points between + * {@link #getUnicodeStart()} and {@link #getUnicodeEnd()} map to contiguous glyph indices + * starting from {@link #getGlyphStartIndex()}. */ -public final class BFEntry { - - //TODO Think about renaming this class to CMapRange or something. +public final class CMapSegment { private final int unicodeStart; private final int unicodeEnd; private final int glyphStartIndex; /** - * Main constructor. + * Creates a new segment. + * * @param unicodeStart Unicode start index * @param unicodeEnd Unicode end index * @param glyphStartIndex glyph start index */ - public BFEntry(int unicodeStart, int unicodeEnd, int glyphStartIndex) { + public CMapSegment(int unicodeStart, int unicodeEnd, int glyphStartIndex) { this.unicodeStart = unicodeStart; this.unicodeEnd = unicodeEnd; this.glyphStartIndex = glyphStartIndex; } - /** - * {@inheritDoc} - */ @Override public int hashCode() { int hc = 17; @@ -54,13 +52,10 @@ public final class BFEntry { return hc; } - /** - * {@inheritDoc} - */ @Override public boolean equals(Object o) { - if (o instanceof BFEntry) { - BFEntry ce = (BFEntry) o; + if (o instanceof CMapSegment) { + CMapSegment ce = (CMapSegment) o; return ce.unicodeStart == this.unicodeStart && ce.unicodeEnd == this.unicodeEnd && ce.glyphStartIndex == this.glyphStartIndex; @@ -95,7 +90,7 @@ public final class BFEntry { /** {@inheritDoc} */ @Override public String toString() { - StringBuilder sb = new StringBuilder("BFEntry: "); + StringBuilder sb = new StringBuilder("CMapSegment: "); sb.append ( "{ UC[" ); sb.append ( unicodeStart ); sb.append ( ',' ); diff --git a/src/java/org/apache/fop/fonts/CustomFont.java b/src/java/org/apache/fop/fonts/CustomFont.java index 7386b7341..b506393a6 100644 --- a/src/java/org/apache/fop/fonts/CustomFont.java +++ b/src/java/org/apache/fop/fonts/CustomFont.java @@ -64,7 +64,7 @@ public abstract class CustomFont extends Typeface private boolean useAdvanced = true; /** the character map, mapping Unicode ranges to glyph indices. */ - protected BFEntry[] cmap; + protected CMapSegment[] cmap; /** {@inheritDoc} */ public String getFontName() { @@ -497,8 +497,8 @@ public abstract class CustomFont extends Typeface * to their glyph indices inside the font. * @param cmap the identity character map */ - public void setCMap(BFEntry[] cmap) { - this.cmap = new BFEntry[cmap.length]; + public void setCMap(CMapSegment[] cmap) { + this.cmap = new CMapSegment[cmap.length]; System.arraycopy(cmap, 0, this.cmap, 0, cmap.length); } @@ -507,8 +507,8 @@ public abstract class CustomFont extends Typeface * to their glyph indices inside the font. * @return the identity character map */ - public BFEntry[] getCMap() { - BFEntry[] copy = new BFEntry[cmap.length]; + public CMapSegment[] getCMap() { + CMapSegment[] copy = new CMapSegment[cmap.length]; System.arraycopy(this.cmap, 0, copy, 0, this.cmap.length); return copy; } diff --git a/src/java/org/apache/fop/fonts/FontReader.java b/src/java/org/apache/fop/fonts/FontReader.java index 381eec7f4..46ea9123d 100644 --- a/src/java/org/apache/fop/fonts/FontReader.java +++ b/src/java/org/apache/fop/fonts/FontReader.java @@ -64,7 +64,7 @@ public class FontReader extends DefaultHandler { private Map<Integer, Integer> currentKerning = null; - private List<BFEntry> bfranges = null; + private List<CMapSegment> bfranges = null; private void createFont(InputSource source) throws FOPException { XMLReader parser = null; @@ -201,9 +201,9 @@ public class FontReader extends DefaultHandler { returnFont.putKerningEntry(new Integer(attributes.getValue("kpx1")), currentKerning); } else if ("bfranges".equals(localName)) { - bfranges = new ArrayList<BFEntry>(); + bfranges = new ArrayList<CMapSegment>(); } else if ("bf".equals(localName)) { - BFEntry entry = new BFEntry(getInt(attributes.getValue("us")), + CMapSegment entry = new CMapSegment(getInt(attributes.getValue("us")), getInt(attributes.getValue("ue")), getInt(attributes.getValue("gi"))); bfranges.add(entry); @@ -307,7 +307,7 @@ public class FontReader extends DefaultHandler { multiFont.setWidthArray(wds); } else if ("bfranges".equals(localName)) { - multiFont.setCMap(bfranges.toArray(new BFEntry[0])); + multiFont.setCMap(bfranges.toArray(new CMapSegment[0])); } text.setLength(0); //Reset text buffer (see characters()) } diff --git a/src/java/org/apache/fop/fonts/MultiByteFont.java b/src/java/org/apache/fop/fonts/MultiByteFont.java index c249c4d19..4db5ece84 100644 --- a/src/java/org/apache/fop/fonts/MultiByteFont.java +++ b/src/java/org/apache/fop/fonts/MultiByteFont.java @@ -183,17 +183,17 @@ public class MultiByteFont extends CIDFont implements Substitutable, Positionabl } /** - * Add a private use mapping {PU,GI} to the existing BFENTRIES map. + * Add a private use mapping {PU,GI} to the existing character map. * N.B. Does not insert in order, merely appends to end of existing map. */ private synchronized void addPrivateUseMapping ( int pu, int gi ) { assert findGlyphIndex ( pu ) == SingleByteEncoding.NOT_FOUND_CODE_POINT; - BFEntry[] bfeOld = cmap; - int bfeCnt = bfeOld.length; - BFEntry[] bfeNew = new BFEntry [ bfeCnt + 1 ]; - System.arraycopy ( bfeOld, 0, bfeNew, 0, bfeCnt ); - bfeNew [ bfeCnt ] = new BFEntry ( pu, pu, gi ); - cmap = bfeNew; + CMapSegment[] oldCmap = cmap; + int cmapLength = oldCmap.length; + CMapSegment[] newCmap = new CMapSegment [ cmapLength + 1 ]; + System.arraycopy ( oldCmap, 0, newCmap, 0, cmapLength ); + newCmap [ cmapLength ] = new CMapSegment ( pu, pu, gi ); + cmap = newCmap; } /** @@ -252,11 +252,11 @@ public class MultiByteFont extends CIDFont implements Substitutable, Positionabl private int findCharacterFromGlyphIndex ( int gi, boolean augment ) { int cc = 0; for ( int i = 0, n = cmap.length; i < n; i++ ) { - BFEntry be = cmap [ i ]; - int s = be.getGlyphStartIndex(); - int e = s + ( be.getUnicodeEnd() - be.getUnicodeStart() ); + CMapSegment segment = cmap [ i ]; + int s = segment.getGlyphStartIndex(); + int e = s + ( segment.getUnicodeEnd() - segment.getUnicodeStart() ); if ( ( gi >= s ) && ( gi <= e ) ) { - cc = be.getUnicodeStart() + ( gi - s ); + cc = segment.getUnicodeStart() + ( gi - s ); break; } } @@ -296,10 +296,10 @@ public class MultiByteFont extends CIDFont implements Substitutable, Positionabl * Sets the array of BFEntry instances which constitutes the Unicode to glyph index map for * a font. ("BF" means "base font") * @param entries the Unicode to glyph index map - * @deprecated use {@link #setCMap(BFEntry[])} instead + * @deprecated use {@link #setCMap(CMapSegment[])} instead */ @Deprecated - public void setBFEntries(BFEntry[] entries) { + public void setBFEntries(CMapSegment[] entries) { setCMap(entries); } diff --git a/src/java/org/apache/fop/fonts/apps/TTFReader.java b/src/java/org/apache/fop/fonts/apps/TTFReader.java index 59a5c47bb..224c8de2f 100644 --- a/src/java/org/apache/fop/fonts/apps/TTFReader.java +++ b/src/java/org/apache/fop/fonts/apps/TTFReader.java @@ -33,7 +33,7 @@ import org.xml.sax.SAXException; import org.apache.commons.logging.LogFactory; import org.apache.fop.Version; -import org.apache.fop.fonts.BFEntry; +import org.apache.fop.fonts.CMapSegment; import org.apache.fop.fonts.FontUtil; import org.apache.fop.fonts.truetype.FontFileReader; import org.apache.fop.fonts.truetype.TTFFile; @@ -385,7 +385,7 @@ public class TTFReader extends AbstractFontReader { el = doc.createElement("bfranges"); mel.appendChild(el); - for (BFEntry ce : ttf.getCMaps()) { + for (CMapSegment ce : ttf.getCMaps()) { Element el2 = doc.createElement("bf"); el.appendChild(el2); el2.setAttribute("us", String.valueOf(ce.getUnicodeStart())); diff --git a/src/java/org/apache/fop/fonts/truetype/TTFFile.java b/src/java/org/apache/fop/fonts/truetype/TTFFile.java index 168b49482..77cdddcdd 100644 --- a/src/java/org/apache/fop/fonts/truetype/TTFFile.java +++ b/src/java/org/apache/fop/fonts/truetype/TTFFile.java @@ -43,7 +43,7 @@ import org.apache.fop.complexscripts.fonts.GlyphDefinitionTable; import org.apache.fop.complexscripts.fonts.GlyphPositioningTable; import org.apache.fop.complexscripts.fonts.GlyphSubstitutionTable; import org.apache.fop.complexscripts.fonts.OTFAdvancedTypographicTableReader; -import org.apache.fop.fonts.BFEntry; +import org.apache.fop.fonts.CMapSegment; import org.apache.fop.fonts.FontUtil; /** @@ -161,7 +161,7 @@ public class TTFFile { protected Map<TTFTableName, TTFDirTabEntry> dirTabs; private Map<Integer, Map<Integer, Integer>> kerningTab; // for CIDs private Map<Integer, Map<Integer, Integer>> ansiKerningTab; // For winAnsiEncoding - private List<BFEntry> cmaps; + private List<CMapSegment> cmaps; private Set<UnicodeMapping> unicodeMappings; private int upem; // unitsPerEm from "head" table @@ -764,7 +764,7 @@ public class TTFFile { } private void createCMaps() { - cmaps = new ArrayList<BFEntry>(); + cmaps = new ArrayList<CMapSegment>(); int unicodeStart; int glyphStart; int unicodeEnd; @@ -781,7 +781,7 @@ public class TTFFile { if (((lastMapping.getUnicodeIndex() + 1) != um.getUnicodeIndex()) || ((lastMapping.getGlyphIndex() + 1) != um.getGlyphIndex())) { unicodeEnd = lastMapping.getUnicodeIndex(); - cmaps.add(new BFEntry(unicodeStart, unicodeEnd, glyphStart)); + cmaps.add(new CMapSegment(unicodeStart, unicodeEnd, glyphStart)); unicodeStart = um.getUnicodeIndex(); glyphStart = um.getGlyphIndex(); } @@ -789,7 +789,7 @@ public class TTFFile { } unicodeEnd = lastMapping.getUnicodeIndex(); - cmaps.add(new BFEntry(unicodeStart, unicodeEnd, glyphStart)); + cmaps.add(new CMapSegment(unicodeStart, unicodeEnd, glyphStart)); } /** @@ -1758,10 +1758,11 @@ public class TTFFile { } /** - * Return a List with TTFCmapEntry. - * @return A list of TTFCmapEntry objects + * Returns this font's character to glyph mapping. + * + * @return the font's cmap */ - public List<BFEntry> getCMaps() { + public List<CMapSegment> getCMaps() { return cmaps; } diff --git a/src/java/org/apache/fop/fonts/truetype/TTFFontLoader.java b/src/java/org/apache/fop/fonts/truetype/TTFFontLoader.java index 9a19f287b..9c6098de2 100644 --- a/src/java/org/apache/fop/fonts/truetype/TTFFontLoader.java +++ b/src/java/org/apache/fop/fonts/truetype/TTFFontLoader.java @@ -26,7 +26,7 @@ import java.util.Set; import org.apache.commons.io.IOUtils; -import org.apache.fop.fonts.BFEntry; +import org.apache.fop.fonts.CMapSegment; import org.apache.fop.fonts.CIDFontType; import org.apache.fop.fonts.EmbeddingMode; import org.apache.fop.fonts.EncodingMode; @@ -181,8 +181,8 @@ public class TTFFontLoader extends FontLoader { } } - private BFEntry[] getCMap(TTFFile ttf) { - BFEntry[] array = new BFEntry[ttf.getCMaps().size()]; + private CMapSegment[] getCMap(TTFFile ttf) { + CMapSegment[] array = new CMapSegment[ttf.getCMaps().size()]; return ttf.getCMaps().toArray(array); } @@ -192,12 +192,12 @@ public class TTFFontLoader extends FontLoader { singleFont.setWidth(i, ttf.getCharWidth(i)); } - for (BFEntry ce : ttf.getCMaps()) { - if (ce.getUnicodeStart() < 0xFFFE) { - for (char u = (char)ce.getUnicodeStart(); u <= ce.getUnicodeEnd(); u++) { + for (CMapSegment segment : ttf.getCMaps()) { + if (segment.getUnicodeStart() < 0xFFFE) { + for (char u = (char)segment.getUnicodeStart(); u <= segment.getUnicodeEnd(); u++) { int codePoint = singleFont.getEncoding().mapChar(u); if (codePoint <= 0) { - int glyphIndex = ce.getGlyphStartIndex() + u - ce.getUnicodeStart(); + int glyphIndex = segment.getGlyphStartIndex() + u - segment.getUnicodeStart(); String glyphName = ttf.getGlyphName(glyphIndex); if (glyphName == "" && ttf.getPostScriptVersion() != PostScriptVersion.V2) { glyphName = "u" + HexEncoder.encode(u); diff --git a/src/java/org/apache/fop/render/ps/PSFontUtils.java b/src/java/org/apache/fop/render/ps/PSFontUtils.java index 157f4f419..53ceff53e 100644 --- a/src/java/org/apache/fop/render/ps/PSFontUtils.java +++ b/src/java/org/apache/fop/render/ps/PSFontUtils.java @@ -40,7 +40,7 @@ import org.apache.xmlgraphics.ps.PSGenerator; import org.apache.xmlgraphics.ps.PSResource; import org.apache.xmlgraphics.ps.dsc.ResourceTracker; -import org.apache.fop.fonts.BFEntry; +import org.apache.fop.fonts.CMapSegment; import org.apache.fop.fonts.Base14Font; import org.apache.fop.fonts.CIDFontType; import org.apache.fop.fonts.CIDSubset; @@ -314,7 +314,7 @@ public class PSFontUtils extends org.apache.xmlgraphics.ps.PSFontUtils { } private static void createType42DictionaryEntries(PSGenerator gen, CustomFont font, - BFEntry[] cmap, TTFFile ttfFile) throws IOException { + CMapSegment[] cmap, TTFFile ttfFile) throws IOException { gen.write("/FontName /"); gen.write(font.getEmbedFontName()); gen.writeln(" def"); @@ -354,14 +354,14 @@ public class PSFontUtils extends org.apache.xmlgraphics.ps.PSFontUtils { } private static void buildCharStrings(PSGenerator gen, boolean buildCharStrings, - BFEntry[] cmap, Set<String> glyphNames, CustomFont font) throws IOException { + CMapSegment[] cmap, Set<String> glyphNames, CustomFont font) throws IOException { gen.write("/CharStrings "); if (!buildCharStrings) { gen.write(1); } else if (font.getEmbeddingMode() != EmbeddingMode.FULL) { int charCount = 1; //1 for .notdef - for (BFEntry entry : cmap) { - charCount += entry.getUnicodeEnd() - entry.getUnicodeStart() + 1; + for (CMapSegment segment : cmap) { + charCount += segment.getUnicodeEnd() - segment.getUnicodeStart() + 1; } gen.write(charCount); } else { @@ -378,9 +378,9 @@ public class PSFontUtils extends org.apache.xmlgraphics.ps.PSFontUtils { } if (font.getEmbeddingMode() != EmbeddingMode.FULL) { //Only performed in singly-byte mode, ignored for CID fonts - for (BFEntry entry : cmap) { - int glyphIndex = entry.getGlyphStartIndex(); - for (int ch = entry.getUnicodeStart(); ch <= entry.getUnicodeEnd(); ch++) { + for (CMapSegment segment : cmap) { + int glyphIndex = segment.getGlyphStartIndex(); + for (int ch = segment.getUnicodeStart(); ch <= segment.getUnicodeEnd(); ch++) { char ch16 = (char)ch; //TODO Handle Unicode characters beyond 16bit String glyphName = Glyphs.charToGlyphName(ch16); if ("".equals(glyphName)) { @@ -410,10 +410,10 @@ public class PSFontUtils extends org.apache.xmlgraphics.ps.PSFontUtils { gen.writeln(" def"); } - private static int getGlyphIndex(char c, BFEntry[] cmap) { - for (BFEntry entry : cmap) { - if (entry.getUnicodeStart() <= c && c <= entry.getUnicodeEnd()) { - return entry.getGlyphStartIndex() + c - entry.getUnicodeStart(); + private static int getGlyphIndex(char c, CMapSegment[] cmap) { + for (CMapSegment segment : cmap) { + if (segment.getUnicodeStart() <= c && c <= segment.getUnicodeEnd()) { + return segment.getGlyphStartIndex() + c - segment.getUnicodeStart(); } } return 0; @@ -509,7 +509,7 @@ public class PSFontUtils extends org.apache.xmlgraphics.ps.PSFontUtils { } - createType42DictionaryEntries(gen, font, new BFEntry[0], ttfFile); + createType42DictionaryEntries(gen, font, new CMapSegment[0], ttfFile); gen.writeln("CIDFontName currentdict end /CIDFont defineresource pop"); gen.writeln("end"); gen.writeln("%%EndResource"); @@ -685,7 +685,7 @@ public class PSFontUtils extends org.apache.xmlgraphics.ps.PSFontUtils { private static PSResource defineDerivedTrueTypeFont(PSGenerator gen, PSEventProducer eventProducer, String baseFontName, String fontName, - SingleByteEncoding encoding, BFEntry[] cmap) throws IOException { + SingleByteEncoding encoding, CMapSegment[] cmap) throws IOException { checkPostScriptLevel3(gen, eventProducer); PSResource res = new PSResource(PSResource.TYPE_FONT, fontName); gen.writeDSCComment(DSCConstants.BEGIN_RESOURCE, res); |