From: <jo...@us...> - 2008-12-29 13:49:02
|
Revision: 6706 http://matplotlib.svn.sourceforge.net/matplotlib/?rev=6706&view=rev Author: jouni Date: 2008-12-29 13:48:51 +0000 (Mon, 29 Dec 2008) Log Message: ----------- Fix a bug in pdf usetex support Modified Paths: -------------- trunk/matplotlib/CHANGELOG trunk/matplotlib/lib/matplotlib/backends/backend_pdf.py Modified: trunk/matplotlib/CHANGELOG =================================================================== --- trunk/matplotlib/CHANGELOG 2008-12-28 16:07:10 UTC (rev 6705) +++ trunk/matplotlib/CHANGELOG 2008-12-29 13:48:51 UTC (rev 6706) @@ -1,3 +1,7 @@ +2008-12-29 Fix a bug in pdf usetex support, which occurred if the same + Type-1 font was used with different encodings, e.g. with + Minion Pro and MnSymbol. - JKS + 2008-12-20 fix the dpi-dependent offset of Shadow. - JJL 2008-12-20 fix the hatch bug in the pdf backend. minor update Modified: trunk/matplotlib/lib/matplotlib/backends/backend_pdf.py =================================================================== --- trunk/matplotlib/lib/matplotlib/backends/backend_pdf.py 2008-12-28 16:07:10 UTC (rev 6705) +++ trunk/matplotlib/lib/matplotlib/backends/backend_pdf.py 2008-12-29 13:48:51 UTC (rev 6706) @@ -394,10 +394,11 @@ 'Contents': contentObject } self.writeObject(thePageObject, thePage) - # self.fontNames maps filenames to internal font names - self.fontNames = {} + self.fontNames = {} # maps filenames to internal font names self.nextFont = 1 # next free internal font name - self.fontInfo = {} # information on fonts: metrics, encoding + self.dviFontInfo = {} # information on dvi fonts + self.type1Descriptors = {} # differently encoded Type-1 fonts may + # share the same descriptor self.alphaStates = {} # maps alpha values to graphics state objects self.nextAlphaState = 1 @@ -474,7 +475,7 @@ """ Select a font based on fontprop and return a name suitable for Op.selectfont. If fontprop is a string, it will be interpreted - as the filename of the font. + as the filename (or dvi name) of the font. """ if is_string_like(fontprop): @@ -496,17 +497,18 @@ fonts = {} for filename, Fx in self.fontNames.items(): if filename.endswith('.afm'): + # from pdf.use14corefonts fontdictObject = self._write_afm_font(filename) - elif filename.endswith('.pfb') or filename.endswith('.pfa'): - # a Type 1 font; limited support for now - fontdictObject = self.embedType1(filename, self.fontInfo[Fx]) + elif self.dviFontInfo.has_key(filename): + # a Type 1 font from a dvi file + fontdictObject = self.embedType1(filename, self.dviFontInfo[filename]) else: + # a normal TrueType font realpath, stat_key = get_realpath_and_stat(filename) chars = self.used_characters.get(stat_key) if chars is not None and len(chars[1]): fontdictObject = self.embedTTF(realpath, chars[1]) fonts[Fx] = fontdictObject - #print >>sys.stderr, filename self.writeObject(self.fontObject, fonts) def _write_afm_font(self, filename): @@ -522,36 +524,40 @@ self.writeObject(fontdictObject, fontdict) return fontdictObject - def embedType1(self, filename, fontinfo): + def embedType1(self, texname, fontinfo): # TODO: font effects such as SlantFont - fh = open(filename, 'rb') matplotlib.verbose.report( - 'Embedding Type 1 font ' + filename, 'debug') - try: - fontdata = fh.read() - finally: - fh.close() + 'Embedding Type 1 font ' + fontinfo.fontfile + + ' with encoding ' + fontinfo.encodingfile, 'debug') - font = FT2Font(filename) + # Use FT2Font to get several font properties + font = FT2Font(fontinfo.fontfile) - widthsObject, fontdescObject, fontdictObject, fontfileObject = \ - [ self.reserveObject(n) for n in - ('font widths', 'font descriptor', - 'font dictionary', 'font file') ] + # Font descriptors may be shared between differently encoded + # Type-1 fonts, so only create a new descriptor if there is no + # existing descriptor for this font. + fontdesc = self.type1Descriptors.get(fontinfo.fontfile) + if fontdesc is None: + fontdesc = self.createType1Descriptor(font, fontinfo.fontfile) + self.type1Descriptors[fontinfo.fontfile] = fontdesc - firstchar = 0 - lastchar = len(fontinfo.widths) - 1 + # Widths + widthsObject = self.reserveObject('font widths') + self.writeObject(widthsObject, fontinfo.widths) + # Font dictionary + fontdictObject = self.reserveObject('font dictionary') fontdict = { 'Type': Name('Font'), 'Subtype': Name('Type1'), 'BaseFont': Name(font.postscript_name), 'FirstChar': 0, - 'LastChar': lastchar, + 'LastChar': len(fontinfo.widths) - 1, 'Widths': widthsObject, - 'FontDescriptor': fontdescObject, + 'FontDescriptor': fontdesc, } + # Encoding (if needed) if fontinfo.encodingfile is not None: enc = dviread.Encoding(fontinfo.encodingfile) differencesArray = [ Name(ch) for ch in enc ] @@ -561,6 +567,15 @@ 'Differences': differencesArray }, }) + self.writeObject(fontdictObject, fontdict) + return fontdictObject + + def createType1Descriptor(self, font, fontfile): + # Create and write the font descriptor and the font file + # of a Type-1 font + fontdescObject = self.reserveObject('font descriptor') + fontfileObject = self.reserveObject('font file') + _, _, fullname, familyname, weight, italic_angle, fixed_pitch, \ ul_position, ul_thickness = font.get_ps_font_info() @@ -591,11 +606,9 @@ #'FontWeight': a number where 400 = Regular, 700 = Bold } - self.writeObject(fontdictObject, fontdict) - self.writeObject(widthsObject, fontinfo.widths) self.writeObject(fontdescObject, descriptor) - t1font = type1font.Type1Font(filename) + t1font = type1font.Type1Font(fontfile) self.beginStream(fontfileObject.id, None, { 'Length1': len(t1font.parts[0]), 'Length2': len(t1font.parts[1]), @@ -604,7 +617,7 @@ self.currentstream.write(t1font.parts[1]) self.endStream() - return fontdictObject + return fontdescObject def _get_xobject_symbol_name(self, filename, symbol_name): return "%s-%s" % ( @@ -1362,13 +1375,15 @@ oldfont, seq = None, [] for x1, y1, dvifont, glyph, width in page.text: if dvifont != oldfont: - psfont = self.tex_font_mapping(dvifont.texname) - pdfname = self.file.fontName(psfont.filename) - if self.file.fontInfo.get(pdfname, None) is None: - self.file.fontInfo[pdfname] = Bunch( + pdfname = self.file.fontName(dvifont.texname) + if not self.file.dviFontInfo.has_key(dvifont.texname): + psfont = self.tex_font_mapping(dvifont.texname) + self.file.dviFontInfo[dvifont.texname] = Bunch( + fontfile=psfont.filename, encodingfile=psfont.encoding, widths=dvifont.widths, dvifont=dvifont) + # TODO: font effects seq += [['font', pdfname, dvifont.size]] oldfont = dvifont seq += [['text', x1, y1, [chr(glyph)], x1+width]] This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |