func (dw *DocWriter) fontKey(f *Font, cpi codepage.CodepageIndex) string { if f == nil { panic("fontKey: No font specified.") } if f.metrics == nil { panic("fontKey: font missing metrics.") } name := fmt.Sprintf("%s/%s-%s", f.metrics.PostScriptName(), cpi, f.subType) if key, ok := dw.fontKeys[name]; ok { return key } descriptor := newFontDescriptor( dw.nextSeq(), 0, f.metrics.PostScriptName(), f.metrics.Family(), f.metrics.Flags(), f.metrics.BoundingBox(), 0, // missingWidth f.metrics.StemV(), 0, // stemH f.metrics.ItalicAngle(), f.metrics.CapHeight(), f.metrics.XHeight(), f.metrics.Ascent(), f.metrics.Descent(), f.metrics.Leading(), 0, 0) // maxWidth, avgWidth dw.file.body.add(descriptor) key := fmt.Sprintf("F%d", len(dw.fontKeys)) dw.fontKeys[name] = key widths := dw.widthsForFontCodepage(f, cpi) dw.file.body.add(widths) var font *simpleFont switch f.subType { case "Type1": encoding, ok := dw.fontEncodings[cpi.String()] if !ok { differences := glyphDiffs(codepage.Idx_CP1252, cpi, 32, 255) encoding = newFontEncoding(dw.nextSeq(), 0, "WinAnsiEncoding", differences) dw.file.body.add(encoding) dw.fontEncodings[cpi.String()] = encoding } font = newType1Font( dw.nextSeq(), 0, f.metrics.PostScriptName(), 32, 255, widths, descriptor, &indirectObjectRef{encoding}) case "TrueType": font = newTrueTypeFont( dw.nextSeq(), 0, f.metrics.PostScriptName(), 32, 255, widths, descriptor) } dw.file.body.add(font) dw.resources.fonts[key] = &indirectObjectRef{font} return key }