|
From: <md...@us...> - 2007-09-11 17:57:48
|
Revision: 3831
http://matplotlib.svn.sourceforge.net/matplotlib/?rev=3831&view=rev
Author: mdboom
Date: 2007-09-11 10:57:47 -0700 (Tue, 11 Sep 2007)
Log Message:
-----------
Merged revisions 3824-3830 via svnmerge from
http://matplotlib.svn.sf.net/svnroot/matplotlib/trunk/matplotlib
........
r3825 | pkienzle | 2007-09-10 14:45:32 -0400 (Mon, 10 Sep 2007) | 1 line
Windows needs binary open flag for font files
........
r3827 | jouni | 2007-09-10 16:31:01 -0400 (Mon, 10 Sep 2007) | 2 lines
Better bounding boxes for pdf usetex, including descents.
........
r3828 | jouni | 2007-09-10 16:55:29 -0400 (Mon, 10 Sep 2007) | 2 lines
Bugfixes in pdf usetex
........
r3829 | mdboom | 2007-09-11 08:46:27 -0400 (Tue, 11 Sep 2007) | 3 lines
Fix bug in PDF clip routine that resulted in the cryptic error message
"There are too many arguments" in Adobe Acrobat.
........
Modified Paths:
--------------
branches/transforms/lib/matplotlib/backends/backend_pdf.py
branches/transforms/lib/matplotlib/dviread.py
branches/transforms/ttconv/pprdrv_tt.cpp
Property Changed:
----------------
branches/transforms/
Property changes on: branches/transforms
___________________________________________________________________
Name: svnmerge-integrated
- /trunk/matplotlib:1-3823
+ /trunk/matplotlib:1-3830
Modified: branches/transforms/lib/matplotlib/backends/backend_pdf.py
===================================================================
--- branches/transforms/lib/matplotlib/backends/backend_pdf.py 2007-09-11 17:56:13 UTC (rev 3830)
+++ branches/transforms/lib/matplotlib/backends/backend_pdf.py 2007-09-11 17:57:47 UTC (rev 3831)
@@ -519,12 +519,13 @@
ul_position, ul_thickness = font.get_ps_font_info()
if fontinfo.encodingfile is not None:
- differencesArray = [ Name(ch) for ch in
- dviread.Encoding(fontinfo.encodingfile) ]
+ enc = dviread.Encoding(fontinfo.encodingfile)
+ widths = [ afmdata.get_width_from_char_name(ch)
+ for ch in enc ]
+ differencesArray = [ Name(ch) for ch in enc ]
differencesArray = [ 0 ] + differencesArray
firstchar = 0
lastchar = len(differencesArray) - 2
- widths = [ 100 for x in range(firstchar,lastchar+1) ] # XXX TODO
else:
widths = [ None for i in range(256) ]
for ch in range(256):
@@ -1434,7 +1435,7 @@
fontsize = prop.get_size_in_points()
dvifile = texmanager.make_dvi(s, fontsize)
dvi = dviread.Dvi(dvifile, 72)
- text, boxes = iter(dvi).next()
+ page = iter(dvi).next()
dvi.close()
if angle == 0: # avoid rounding errors in common case
@@ -1448,7 +1449,7 @@
# Gather font information and do some setup for combining
# characters into strings.
oldfontnum, seq = None, []
- for x1, y1, fontnum, glyph, width in text:
+ for x1, y1, fontnum, glyph, width in page.text:
if fontnum != oldfontnum:
texname, fontsize = dvi.fontinfo(fontnum)
fontinfo = self.tex_font_mapping(texname)
@@ -1462,8 +1463,8 @@
seq += [('end',)]
# Find consecutive text strings with constant x coordinate and
- # combine into one string (if needed kern would be less than
- # 0.1 points) or several strings interspersed with kerns.
+ # combine into a sequence of strings and kerns, or just one
+ # string (if any kerns would be less than 0.1 points).
i, curx = 0, 0
while i < len(seq)-1:
elt, next = seq[i:i+2]
@@ -1503,7 +1504,7 @@
boxgc = self.new_gc()
boxgc.copy_properties(gc)
boxgc.set_linewidth(0)
- for x1, y1, h, w in boxes:
+ for x1, y1, h, w in page.boxes:
(x1, y1), (x2, y2), (x3, y3), (x4, y4) = \
mytrans(x1, y1), mytrans(x1+w, y1), \
mytrans(x1+w, y1+h), mytrans(x1, y1+h)
@@ -1653,14 +1654,9 @@
fontsize = prop.get_size_in_points()
dvifile = texmanager.make_dvi(s, fontsize)
dvi = dviread.Dvi(dvifile, 72)
- text, boxes = iter(dvi).next()
- # TODO: better bounding box -- this is not quite right:
- l = min(p[0] for p in text+boxes)
- r = max(p[0] for p in text+boxes) + fontsize
- b = min(p[1] for p in text+boxes)
- t = max(p[1] for p in text+boxes) + fontsize
- # (not to even mention finding the baseline)
- return r-l, t-b, t-b
+ page = iter(dvi).next()
+ dvi.close()
+ return page.width, page.height, page.descent
if ismath:
w, h, d, glyphs, rects, used_characters = \
self.mathtext_parser.parse(s, 72, prop)
@@ -1837,7 +1833,7 @@
cmds.extend(self.pop())
# Unless we hit the right one, set the clip polygon
if (self._cliprect, self._clippath) != (cliprect, clippath):
- cmds.append(self.push())
+ cmds.extend(self.push())
if self._cliprect != cliprect:
cmds.extend([t for t in cliprect] +
[Op.rectangle, Op.clip, Op.endpath])
Modified: branches/transforms/lib/matplotlib/dviread.py
===================================================================
--- branches/transforms/lib/matplotlib/dviread.py 2007-09-11 17:56:13 UTC (rev 3830)
+++ branches/transforms/lib/matplotlib/dviread.py 2007-09-11 17:57:47 UTC (rev 3831)
@@ -6,19 +6,21 @@
Interface:
dvi = Dvi(filename, 72)
- for text, boxes in dvi: # iterate over pages
- text, boxes = dvi.output(72)
- for x,y,font,glyph,width in text:
+ for page in dvi: # iterate over pages
+ w, h, d = page.width, page.height, page.descent
+ for x,y,font,glyph,width in page.text:
fontname, pointsize = dvi.fontinfo(font)
...
- for x,y,height,width in boxes:
+ for x,y,height,width in page.boxes:
...
"""
-# TODO: support for TeX virtual fonts (*.vf) which are a dvi-like format
+# TODO: support TeX virtual fonts (*.vf) which are a sort of
+# subroutine collections for dvi files
import matplotlib
import matplotlib.cbook as mpl_cbook
+import numpy as npy
import os
import struct
@@ -74,21 +76,34 @@
def _output(self):
"""
Output the text and boxes belonging to the most recent page.
- text, boxes = dvi._output()
+ page = dvi._output()
"""
- t0 = self.text[0]
- minx, miny, maxx, maxy = t0[0], t0[1], t0[0], t0[1]
+ minx, miny, maxx, maxy = npy.inf, npy.inf, -npy.inf, -npy.inf
+ maxy_pure = -npy.inf
for elt in self.text + self.boxes:
- x,y = elt[:2]
- if x < minx: minx = x
- if y < miny: miny = y
- if x > maxx: maxx = x
- if y > maxy: maxy = y
+ if len(elt) == 4: # box
+ x,y,h,w = elt
+ e = 0 # zero depth
+ else: # glyph
+ x,y,f,g,w = elt
+ font = self.fonts[f]
+ h = (font.scale * font.tfm.height[g]) >> 20
+ e = (font.scale * font.tfm.depth[g]) >> 20
+ minx = min(minx, x)
+ miny = min(miny, y - h)
+ maxx = max(maxx, x + w)
+ maxy = max(maxy, y + e)
+ maxy_pure = max(maxy_pure, y)
+
d = self.dpi / (72.27 * 2**16) # from TeX's "scaled points" to dpi units
text = [ ((x-minx)*d, (maxy-y)*d, f, g, w*d) for (x,y,f,g,w) in self.text ]
boxes = [ ((x-minx)*d, (maxy-y)*d, h*d, w*d) for (x,y,h,w) in self.boxes ]
- return text, boxes
+ return mpl_cbook.Bunch(text=text, boxes=boxes,
+ width=(maxx-minx)*d,
+ height=(maxy_pure-miny)*d,
+ descent=(maxy-maxy_pure)*d)
+
def fontinfo(self, f):
"""
texname, pointsize = dvi.fontinfo(fontnum)
@@ -361,6 +376,7 @@
width[i]: width of character #i, needs to be scaled
by the factor specified in the dvi file
(this is a dict because indexing may not start from 0)
+ height[i], depth[i]: height and depth of character #i
"""
def __init__(self, filename):
@@ -368,22 +384,29 @@
try:
header1 = file.read(24)
- lh, bc, ec, nw = \
- struct.unpack('!4H', header1[2:10])
+ lh, bc, ec, nw, nh, nd = \
+ struct.unpack('!6H', header1[2:14])
header2 = file.read(4*lh)
self.checksum, self.design_size = \
struct.unpack('!2I', header2[:8])
# there is also encoding information etc.
char_info = file.read(4*(ec-bc+1))
widths = file.read(4*nw)
+ heights = file.read(4*nh)
+ depths = file.read(4*nd)
finally:
file.close()
- widths = struct.unpack('!%dI' % nw, widths)
- self.width = {}
+ self.width, self.height, self.depth = {}, {}, {}
+ widths, heights, depths = \
+ [ struct.unpack('!%dI' % n, x)
+ for n,x in [(nw, widths), (nh, heights), (nd, depths)] ]
for i in range(ec-bc):
self.width[bc+i] = widths[ord(char_info[4*i])]
+ self.height[bc+i] = heights[ord(char_info[4*i+1]) >> 4]
+ self.depth[bc+i] = depths[ord(char_info[4*i+1]) & 0xf]
+
class PsfontsMap(object):
"""
A psfonts.map formatted file, mapping TeX fonts to PS fonts.
Modified: branches/transforms/ttconv/pprdrv_tt.cpp
===================================================================
--- branches/transforms/ttconv/pprdrv_tt.cpp 2007-09-11 17:56:13 UTC (rev 3830)
+++ branches/transforms/ttconv/pprdrv_tt.cpp 2007-09-11 17:57:47 UTC (rev 3831)
@@ -1088,7 +1088,7 @@
font.filename=filename;
/* Open the font file */
- if( (font.file = fopen(filename,"r")) == (FILE*)NULL )
+ if( (font.file = fopen(filename,"rb")) == (FILE*)NULL )
throw TTException("Failed to open TrueType font");
/* Allocate space for the unvarying part of the offset table. */
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|