Ejemplo n.º 1
0
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
}