/** Outputs to the writer the font dictionaries and streams.
* @param writer the writer for this document
* @param ref the font indirect reference
* @param params several parameters that depend on the font type
* @throws IOException on error
* @throws DocumentException error in generating the object
*/
internal override void WriteFont(PdfWriter writer, PdfIndirectReference piref, Object[] parms)
{
int firstChar = (int)parms[0];
int lastChar = (int)parms[1];
byte[] shortTag = (byte[])parms[2];
bool subsetp = (bool)parms[3] && subset;
if (!subsetp) {
firstChar = 0;
lastChar = shortTag.Length - 1;
for (int k = 0; k < shortTag.Length; ++k)
shortTag[k] = 1;
}
PdfIndirectReference ind_font = null;
PdfObject pobj = null;
PdfIndirectObject obj = null;
string subsetPrefix = "";
if (embedded) {
if (cff) {
pobj = new StreamFont(ReadCffFont(), "Type1C", compressionLevel);
obj = writer.AddToBody(pobj);
ind_font = obj.IndirectReference;
}
else {
if (subsetp)
subsetPrefix = CreateSubsetPrefix();
Hashtable glyphs = new Hashtable();
for (int k = firstChar; k <= lastChar; ++k) {
if (shortTag[k] != 0) {
int[] metrics = null;
if (specialMap != null) {
int[] cd = GlyphList.NameToUnicode(differences[k]);
if (cd != null)
metrics = GetMetricsTT(cd[0]);
}
else {
if (fontSpecific)
metrics = GetMetricsTT(k);
else
metrics = GetMetricsTT(unicodeDifferences[k]);
}
if (metrics != null)
glyphs[metrics[0]] = null;
}
}
AddRangeUni(glyphs, false, subsetp);
byte[] b = null;
if (subsetp || directoryOffset != 0 || subsetRanges != null) {
TrueTypeFontSubSet sb = new TrueTypeFontSubSet(fileName, new RandomAccessFileOrArray(rf), glyphs, directoryOffset, true, !subsetp);
b = sb.Process();
}
else {
b = GetFullFont();
}
int[] lengths = new int[]{b.Length};
pobj = new StreamFont(b, lengths, compressionLevel);
obj = writer.AddToBody(pobj);
ind_font = obj.IndirectReference;
}
}
pobj = GetFontDescriptor(ind_font, subsetPrefix, null);
if (pobj != null){
obj = writer.AddToBody(pobj);
ind_font = obj.IndirectReference;
}
pobj = GetFontBaseType(ind_font, subsetPrefix, firstChar, lastChar, shortTag);
writer.AddToBody(pobj, piref);
}