/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You 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.
*/
package org.apache.fontbox.cff;
import java.io.IOException;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
public class CFFFontROS extends CFFFont {
private String registry;
private String ordering;
private int supplement;
private List<Map<String, Object>> fontDictionaries = new LinkedList<Map<String,Object>>();
private List<Map<String, Object>> privateDictionaries = new LinkedList<Map<String,Object>>();
private CIDKeyedFDSelect fdSelect = null;
/**
* Returns the registry value.
* @return the registry
*/
public String getRegistry() {
return registry;
}
/**
* Sets the registry value.
*
* @param registry the registry to set
*/
public void setRegistry(String registry) {
this.registry = registry;
}
/**
* Returns the ordering value.
*
* @return the ordering
*/
public String getOrdering() {
return ordering;
}
/**
* Sets the ordering value.
*
* @param ordering the ordering to set
*/
public void setOrdering(String ordering) {
this.ordering = ordering;
}
/**
* Returns the supplement value.
*
* @return the supplement
*/
public int getSupplement() {
return supplement;
}
/**
* Sets the supplement value.
*
* @param supplement the supplement to set
*/
public void setSupplement(int supplement) {
this.supplement = supplement;
}
/**
* Returns the font dictionaries.
*
* @return the fontDict
*/
public List<Map<String, Object>> getFontDict() {
return fontDictionaries;
}
/**
* Sets the font dictionaries.
*
* @param fontDict the fontDict to set
*/
public void setFontDict(List<Map<String, Object>> fontDict) {
this.fontDictionaries = fontDict;
}
/**
* Returns the private dictionary.
*
* @return the privDict
*/
public List<Map<String, Object>> getPrivDict() {
return privateDictionaries;
}
/**
* Sets the private dictionary.
*
* @param privDict the privDict to set
*/
public void setPrivDict(List<Map<String, Object>> privDict) {
this.privateDictionaries = privDict;
}
/**
* Returns the fdSelect value.
*
* @return the fdSelect
*/
public CIDKeyedFDSelect getFdSelect() {
return fdSelect;
}
/**
* Sets the fdSelect value.
*
* @param fdSelect the fdSelect to set
*/
public void setFdSelect(CIDKeyedFDSelect fdSelect) {
this.fdSelect = fdSelect;
}
/**
* Returns the Width value of the given Glyph identifier
*
* @param SID
* @return -1 if the SID is missing from the Font.
* @throws IOException
*/
public int getWidth(int SID) throws IOException {
// ---- search the right FDArray index in the FDSelect according to the Character identifier
// this index will be used to access the private dictionary which contains useful values
// to compute width.
int fdArrayIndex = this.fdSelect.getFd(SID);
if (fdArrayIndex == -1 && SID == 0 ) { // --- notdef char
return super.getWidth(SID);
} else if (fdArrayIndex == -1) {
return 1000;
}
Map<String, Object> fontDict = this.fontDictionaries.get(fdArrayIndex);
Map<String, Object> privDict = this.privateDictionaries.get(fdArrayIndex);
int nominalWidth = privDict.containsKey("nominalWidthX") ? ((Number)privDict.get("nominalWidthX")).intValue() : 0;
int defaultWidth = privDict.containsKey("defaultWidthX") ? ((Number)privDict.get("defaultWidthX")).intValue() : 1000 ;
for (Mapping m : getMappings() ){
if (m.getSID() == SID) {
CharStringRenderer csr = null;
Number charStringType = (Number)getProperty("CharstringType");
if ( charStringType.intValue() == 2 ) {
List<Object> lSeq = m.toType2Sequence();
csr = new CharStringRenderer(false);
csr.render(lSeq);
} else {
List<Object> lSeq = m.toType1Sequence();
csr = new CharStringRenderer();
csr.render(lSeq);
}
// ---- If the CharString has a Width nominalWidthX must be added,
// otherwise it is the default width.
return csr.getWidth() != 0 ? csr.getWidth() + nominalWidth : defaultWidth;
}
}
// ---- Width not found, return the default width
return defaultWidth;
}
}