Revision: 3775
          http://matplotlib.svn.sourceforge.net/matplotlib/?rev=3775&view=rev
Author:   jouni
Date:     2007-09-04 11:19:16 -0700 (Tue, 04 Sep 2007)

Log Message:
-----------
More work on supporting Type 1 fonts in PDF,
still doesn't produce usable files.

Modified Paths:
--------------
    trunk/matplotlib/API_CHANGES
    trunk/matplotlib/lib/matplotlib/afm.py
    trunk/matplotlib/lib/matplotlib/backends/backend_pdf.py
    trunk/matplotlib/lib/matplotlib/dviread.py

Modified: trunk/matplotlib/API_CHANGES
===================================================================
--- trunk/matplotlib/API_CHANGES        2007-09-04 14:52:03 UTC (rev 3774)
+++ trunk/matplotlib/API_CHANGES        2007-09-04 18:19:16 UTC (rev 3775)
@@ -15,7 +15,8 @@
     to read an afm file in addition to a pfa/pfb file, to get metrics
     and kerning information for a Type 1 font.
 
-    The AFM class now supports querying CapHeight and stem widths.
+    The AFM class now supports querying CapHeight and stem widths. The
+    get_name_char method now has an isord kwarg like get_width_char.
 
     Changed pcolor default to shading='flat'; but as noted now in the
     docstring, it is preferable to simply use the edgecolor kwarg.

Modified: trunk/matplotlib/lib/matplotlib/afm.py
===================================================================
--- trunk/matplotlib/lib/matplotlib/afm.py      2007-09-04 14:52:03 UTC (rev 
3774)
+++ trunk/matplotlib/lib/matplotlib/afm.py      2007-09-04 18:19:16 UTC (rev 
3775)
@@ -378,11 +378,12 @@
         """
         return self.get_str_bbox_and_descent(s)[:4]
     
-    def get_name_char(self, c):
+    def get_name_char(self, c, isord=False):
         """
         Get the name of the character, ie, ';' is 'semicolon'
         """
-        wx, name, bbox = self._metrics[ord(c)]
+        if not isord: c=ord(c)
+        wx, name, bbox = self._metrics[c]
         return name
 
     def get_width_char(self, c, isord=False):

Modified: trunk/matplotlib/lib/matplotlib/backends/backend_pdf.py
===================================================================
--- trunk/matplotlib/lib/matplotlib/backends/backend_pdf.py     2007-09-04 
14:52:03 UTC (rev 3774)
+++ trunk/matplotlib/lib/matplotlib/backends/backend_pdf.py     2007-09-04 
18:19:16 UTC (rev 3775)
@@ -18,6 +18,7 @@
 from math import ceil, cos, floor, pi, sin
 from sets import Set
 
+import matplotlib
 from matplotlib import __version__, rcParams, agg, get_data_path
 from matplotlib._pylab_helpers import Gcf
 from matplotlib.backend_bases import RendererBase, GraphicsContextBase,\
@@ -493,12 +494,16 @@
 
     def embedType1(self, filename, fontinfo):
         fh = open(filename, 'rb')
+        matplotlib.verbose.report(
+            'Embedding Type 1 font ' + filename, 'debug')
         try:
             fontdata = fh.read()
         finally:
             fh.close()
 
         fh = open(fontinfo.afmfile, 'rb')
+        matplotlib.verbose.report(
+            'Reading metrics from ' + fontinfo.afmfile, 'debug')
         try:
             afmdata = AFM(fh)
         finally:
@@ -519,9 +524,26 @@
             differencesArray = [ Name(ch) for ch in  
                                  dviread.Encoding(fontinfo.encodingfile) ]
             differencesArray = [ 0 ] + differencesArray
+            firstchar = 0
             lastchar = len(differencesArray) - 2
+            widths = [ 100 for x in range(firstchar,lastchar+1) ] # XXX TODO
         else:
-            lastchar = 255 # ?
+            widths = [ None for i in range(256) ]
+            for ch in range(256):
+                try:
+                    widths[ch] = afmdata.get_width_char(ch, isord=True)
+                except KeyError:
+                    pass
+            not_None = (ch for ch in range(256) 
+                        if widths[ch] is not None)
+            firstchar = not_None.next()
+            lastchar = max(not_None)
+            widths = widths[firstchar:lastchar+1]
+
+            differencesArray = [ firstchar ]
+            for ch in range(firstchar, lastchar+1):
+                differencesArray.append(Name(
+                        afmdata.get_name_char(ch, isord=True)))
         
         fontdict = {
             'Type':           Name('Font'),
@@ -533,16 +555,15 @@
             'FontDescriptor': fontdescObject,
             }
 
-        if fontinfo.encodingfile is not None:
-            fontdict.update({
-                    'Encoding': { 'Type': Name('Encoding'),
-                                  'Differences': differencesArray },
-                    })
+        fontdict.update({
+                'Encoding': { 'Type': Name('Encoding'),
+                              'Differences': differencesArray },
+                })
 
         flags = 0
         if fixed_pitch:   flags |= 1 << 0  # fixed width
         if 0:             flags |= 1 << 1  # TODO: serif
-        if 0:             flags |= 1 << 2  # TODO: symbolic
+        if 1:             flags |= 1 << 2  # TODO: symbolic
         else:             flags |= 1 << 5  # non-symbolic
         if italic_angle:  flags |= 1 << 6  # italic
         if 0:             flags |= 1 << 16 # TODO: all caps
@@ -557,12 +578,16 @@
             'ItalicAngle': italic_angle,
             'Ascent':      font.ascender,
             'Descent':     font.descender,
-            'CapHeight':   afmdata.get_capheight(),
+            'CapHeight':   1000, # default guess if missing from AFM file
             'XHeight':     afmdata.get_xheight(),
             'FontFile':    fontfileObject,
             'FontFamily':  Name(familyname),
             #'FontWeight': a number where 400 = Regular, 700 = Bold
             }
+        try:
+            descriptor['CapHeight'] = afmdata.get_capheight()
+        except KeyError:
+            pass
 
         # StemV is obligatory in PDF font descriptors but optional in
         # AFM files. The collection of AFM files in my TeX Live 2007
@@ -579,7 +604,7 @@
             descriptor['StemH'] = StemH
 
         self.writeObject(fontdictObject, fontdict)
-        self.writeObject(widthsObject, [ 100 for i in range(256)]) # XXX TODO
+        self.writeObject(widthsObject, widths)
         self.writeObject(fontdescObject, descriptor)
 
         fontdata = type1font.Type1Font(filename)
@@ -591,6 +616,8 @@
         self.currentstream.write(fontdata.data)
         self.endStream()
 
+        return fontdictObject
+
     def _get_xobject_symbol_name(self, filename, symbol_name):
         return "%s-%s" % (
             os.path.splitext(os.path.basename(filename))[0],

Modified: trunk/matplotlib/lib/matplotlib/dviread.py
===================================================================
--- trunk/matplotlib/lib/matplotlib/dviread.py  2007-09-04 14:52:03 UTC (rev 
3774)
+++ trunk/matplotlib/lib/matplotlib/dviread.py  2007-09-04 18:19:16 UTC (rev 
3775)
@@ -35,6 +35,7 @@
         opens the file; actually reading the file happens when
         iterating through the pages of the file.
         """
+        matplotlib.verbose.report('Dvi: ' + filename, 'debug')
         self.file = open(filename, 'rb')
         self.dpi = dpi
         self.fonts = {}
@@ -57,7 +58,7 @@
         while True:
             have_page = self._read()
             if have_page:
-                yield self.text, self.boxes
+                yield self._output()
             else:
                 break
 


This was sent by the SourceForge.net collaborative development platform, the 
world's largest Open Source development site.

-------------------------------------------------------------------------
This SF.net email is sponsored by: Splunk Inc.
Still grepping through log files to find problems?  Stop.
Now Search log events and configuration files using AJAX and a browser.
Download your FREE copy of Splunk now >>  http://get.splunk.com/
_______________________________________________
Matplotlib-checkins mailing list
Matplotlib-checkins@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/matplotlib-checkins

Reply via email to