| /* |
| * Copyright 1999-2004 The Apache Software Foundation. |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* $Id$ */ |
| |
| package org.apache.fop.fonts; |
| |
| //Java |
| import java.util.Map; |
| |
| /** |
| * Generic MultiByte (CID) font |
| */ |
| public class MultiByteFont extends CIDFont { |
| |
| private static int uniqueCounter = 1; |
| |
| |
| private String ttcName = null; |
| private String encoding = "Identity-H"; |
| |
| private String embedResourceName = null; |
| |
| private int defaultWidth = 0; |
| private CIDFontType cidType = CIDFontType.CIDTYPE2; |
| |
| private String namePrefix = null; // Quasi unique prefix |
| |
| private BFEntry[] bfentries = null; |
| |
| /** |
| * Default constructor |
| */ |
| public MultiByteFont() { |
| // Make sure that the 3 first glyphs are included |
| usedGlyphs.put(new Integer(0), new Integer(0)); |
| usedGlyphsIndex.put(new Integer(0), new Integer(0)); |
| usedGlyphsCount++; |
| usedGlyphs.put(new Integer(1), new Integer(1)); |
| usedGlyphsIndex.put(new Integer(1), new Integer(1)); |
| usedGlyphsCount++; |
| usedGlyphs.put(new Integer(2), new Integer(2)); |
| usedGlyphsIndex.put(new Integer(2), new Integer(2)); |
| usedGlyphsCount++; |
| |
| // Create a quasiunique prefix for fontname |
| int cnt = 0; |
| synchronized (this.getClass()) { |
| cnt = uniqueCounter++; |
| } |
| int ctm = (int)(System.currentTimeMillis() & 0xffff); |
| namePrefix = new String(cnt + "E" + Integer.toHexString(ctm)); |
| |
| setFontType(FontType.TYPE0); |
| } |
| |
| /** |
| * @see org.apache.fop.fonts.CIDFont#getDefaultWidth() |
| */ |
| public int getDefaultWidth() { |
| return defaultWidth; |
| } |
| |
| /** |
| * @see org.apache.fop.fonts.CIDFont#getRegistry() |
| */ |
| public String getRegistry() { |
| return "Adobe"; |
| } |
| |
| /** |
| * @see org.apache.fop.fonts.CIDFont#getOrdering() |
| */ |
| public String getOrdering() { |
| return "UCS"; |
| } |
| |
| /** |
| * @see org.apache.fop.fonts.CIDFont#getSupplement() |
| */ |
| public int getSupplement() { |
| return 0; |
| } |
| |
| /** |
| * @see org.apache.fop.fonts.CIDFont#getCIDType() |
| */ |
| public CIDFontType getCIDType() { |
| return cidType; |
| } |
| |
| /** |
| * Sets the CIDType. |
| * @param cidType The cidType to set |
| */ |
| public void setCIDType(CIDFontType cidType) { |
| this.cidType = cidType; |
| } |
| |
| /** |
| * @see org.apache.fop.fonts.CIDFont#getCidBaseFont() |
| */ |
| public String getCidBaseFont() { |
| if (isEmbeddable()) { |
| return namePrefix + super.getFontName(); |
| } else { |
| return super.getFontName(); |
| } |
| } |
| |
| /** |
| * @see org.apache.fop.fonts.FontDescriptor#isEmbeddable() |
| */ |
| public boolean isEmbeddable() { |
| return !(getEmbedFileName() == null && embedResourceName == null); |
| } |
| |
| /** |
| * @see org.apache.fop.fonts.Typeface#getEncoding() |
| */ |
| public String getEncoding() { |
| return encoding; |
| } |
| |
| /** |
| * @see org.apache.fop.fonts.FontMetrics#getFontName() |
| */ |
| public String getFontName() { |
| if (isEmbeddable()) { |
| return namePrefix + super.getFontName(); |
| } else { |
| return super.getFontName(); |
| } |
| } |
| |
| /** |
| * @see org.apache.fop.fonts.FontMetrics#getWidth(int, int) |
| */ |
| public int getWidth(int i, int size) { |
| if (isEmbeddable()) { |
| Integer idx = (Integer)usedGlyphsIndex.get(new Integer(i)); |
| return size * width[idx.intValue()]; |
| } else { |
| return size * width[i]; |
| } |
| } |
| |
| /** |
| * @see org.apache.fop.fonts.FontMetrics#getWidths() |
| */ |
| public int[] getWidths() { |
| int[] arr = new int[width.length]; |
| System.arraycopy(width, 0, arr, 0, width.length - 1); |
| /* |
| for (int i = 0; i < arr.length; i++) |
| arr[i] *= size; |
| */ |
| return arr; |
| } |
| |
| /** |
| * Remaps a codepoint based. |
| * @param i codepoint to remap |
| * @return new codepoint |
| */ |
| /* unused |
| public Integer reMap(Integer i) { |
| if (isEmbeddable()) { |
| Integer ret = (Integer)usedGlyphsIndex.get(i); |
| if (ret == null) { |
| ret = i; |
| } |
| return ret; |
| } else { |
| return i; |
| } |
| |
| } |
| */ |
| |
| private int findGlyphIndex(char c) { |
| int idx = (int)c; |
| int retIdx = 0; |
| |
| for (int i = 0; (i < bfentries.length) && retIdx == 0; i++) { |
| if (bfentries[i].getUnicodeStart() <= idx |
| && bfentries[i].getUnicodeEnd() >= idx) { |
| |
| retIdx = bfentries[i].getGlyphStartIndex() |
| + idx |
| - bfentries[i].getUnicodeStart(); |
| } |
| } |
| return retIdx; |
| } |
| |
| /** |
| * @see org.apache.fop.fonts.Typeface#mapChar(char) |
| */ |
| public char mapChar(char c) { |
| int retIdx = findGlyphIndex(c); |
| |
| if (isEmbeddable()) { |
| // Reencode to a new subset font or get |
| // the reencoded value |
| Integer newIdx = (Integer)usedGlyphs.get(new Integer(retIdx)); |
| if (newIdx == null) { |
| usedGlyphs.put(new Integer(retIdx), |
| new Integer(usedGlyphsCount)); |
| usedGlyphsIndex.put(new Integer(usedGlyphsCount), |
| new Integer(retIdx)); |
| retIdx = usedGlyphsCount; |
| // System.out.println(c+"("+(int)c+") = "+retIdx); |
| usedGlyphsCount++; |
| } else { |
| retIdx = newIdx.intValue(); |
| } |
| } |
| |
| return (char)retIdx; |
| } |
| |
| /** |
| * @see org.apache.fop.fonts.Typeface#hasChar(char) |
| */ |
| public boolean hasChar(char c) { |
| return (findGlyphIndex(c) > 0); |
| } |
| |
| |
| /** |
| * Sets the bfentries. |
| * @param bfentries The bfentries to set |
| */ |
| public void setBFEntries(BFEntry[] bfentries) { |
| this.bfentries = bfentries; |
| } |
| |
| /** |
| * Sets the defaultWidth. |
| * @param defaultWidth The defaultWidth to set |
| */ |
| public void setDefaultWidth(int defaultWidth) { |
| this.defaultWidth = defaultWidth; |
| } |
| |
| /** |
| * Returns the TrueType Collection Name. |
| * @return the TrueType Collection Name |
| */ |
| public String getTTCName() { |
| return ttcName; |
| } |
| |
| /** |
| * Sets the the TrueType Collection Name. |
| * @param ttcName the TrueType Collection Name |
| */ |
| public void setTTCName(String ttcName) { |
| this.ttcName = ttcName; |
| } |
| |
| /** |
| * Adds a new CID width entry to the font. |
| * @param cidWidthIndex index |
| * @param wds array of widths |
| */ |
| /* |
| public void addCIDWidthEntry(int cidWidthIndex, int[] wds) { |
| this.warray.addEntry(cidWidthIndex, wds); |
| }*/ |
| |
| |
| /** |
| * Sets the width array. |
| * @param wds array of widths. |
| */ |
| public void setWidthArray(int[] wds) { |
| this.width = wds; |
| } |
| |
| /** |
| * Returns a Map of used Glyphs. |
| * @return Map Map of used Glyphs |
| */ |
| public Map getUsedGlyphs() { |
| return usedGlyphs; |
| } |
| |
| } |
| |