PDF bug in stable release

Michael Hearne <mhearne@...751...> writes:

2) Patch my current code with the fix already in SVN. I would need
someone to point me to the relevant files, and give me some pointers
on applying the patch.

The bug was fixed in revision 7900, and revision 7899 introduced a check
in the pdf backend that raises an exception instead of outputting
invalid pdf. If you can build some old revisions (and your FreeType issue
is caused by some newer changes in matplotlib) you could apply just
these changes to a buildable revision and see if it works.

moveto.patch (4.78 KB)

Jouni - When you say that the FreeType issue is caused by changes in "newer" versions of matplotlib, are those versions more recent than revision 7900, or before?

I assumed "more recent", and so I checked out revision 7901, edited make.osx to point PREFIX to a local directory, renamed it to "Makefile", and ran setup.py build and install. The resulting ftfont.so file still has the "_FT_Attach_File" symbol undefined, and I get the same error as in my bug report.

How old a revision do I need in order to avoid the FreeType issue?

Incidentally, I'm seeing the same FreeType issue on RedHat Linux. Is everybody experiencing this bug, or is it perhaps related to EPD (the Python on both my Mac and RHEL boxes).

--Mike

···

On Mar 11, 2010, at 1:24 PM, Jouni K. Seppänen wrote:

Michael Hearne <mhearne@...751...> writes:

2) Patch my current code with the fix already in SVN. I would need
someone to point me to the relevant files, and give me some pointers
on applying the patch.

The bug was fixed in revision 7900, and revision 7899 introduced a check
in the pdf backend that raises an exception instead of outputting
invalid pdf. If you can build some old revisions (and your FreeType issue
is caused by some newer changes in matplotlib) you could apply just
these changes to a buildable revision and see if it works.

Index: src/path_converters.h

--- src/path_converters.h (revision 7898)
+++ src/path_converters.h (revision 7900)
@@ -684,9 +684,15 @@
        {
            if (m_origdNorm2 != 0.0)
            {
- queue_push(agg::path_cmd_line_to, m_nextX, m_nextY);
+ queue_push((m_moveto || m_after_moveto) ?
+ agg::path_cmd_move_to : agg::path_cmd_line_to,
+ m_nextX, m_nextY);
+ m_moveto = false;
            }
- queue_push(agg::path_cmd_line_to, m_lastx, m_lasty);
+ queue_push((m_moveto || m_after_moveto) ?
+ agg::path_cmd_move_to : agg::path_cmd_line_to,
+ m_lastx, m_lasty);
+ m_moveto = false;
            queue_push(agg::path_cmd_stop, 0.0, 0.0);
        }

Index: lib/matplotlib/tests/test_simplification.py

--- lib/matplotlib/tests/test_simplification.py (revision 7898)
+++ lib/matplotlib/tests/test_simplification.py (revision 7900)
@@ -2,11 +2,10 @@
import matplotlib
from matplotlib.testing.decorators import image_comparison, knownfailureif
import matplotlib.pyplot as plt
-from matplotlib import patches, path

from pylab import *
import numpy as np
-from matplotlib import patches, path
+from matplotlib import patches, path, transforms
nan = np.nan
Path = path.Path

@@ -134,6 +133,38 @@

    assert len(simplified) == 13

+def test_start_with_moveto():
+ # Should be entirely clipped away to a single MOVETO
+ data = """
+ZwAAAAku+v9UAQAA+Tj6/z8CAADpQ/r/KAMAANlO+v8QBAAAyVn6//UEAAC6ZPr/2gUAAKpv+v+8
+BgAAm3r6/50HAACLhfr/ewgAAHyQ+v9ZCQAAbZv6/zQKAABepvr/DgsAAE+x+v/lCwAAQLz6/7wM
+AAAxx/r/kA0AACPS+v9jDgAAFN36/zQPAAAF6Pr/AxAAAPfy+v/QEAAA6f36/5wRAADbCPv/ZhIA
+AMwT+/8uEwAAvh77//UTAACwKfv/uRQAAKM0+/98FQAAlT/7/z0WAACHSvv//RYAAHlV+/+7FwAA
+bGD7/3cYAABea/v/MRkAAFF2+//pGQAARIH7/6AaAAA3jPv/VRsAACmX+/8JHAAAHKL7/7ocAAAP
+rfv/ah0AAAO4+/8YHgAA9sL7/8QeAADpzfv/bx8AANzY+/8YIAAA0OP7/78gAADD7vv/ZCEAALf5
++/8IIgAAqwT8/6kiAACeD/z/SiMAAJIa/P/oIwAAhiX8/4QkAAB6MPz/HyUAAG47/P+4JQAAYkb8
+/1AmAABWUfz/5SYAAEpc/P95JwAAPmf8/wsoAAAzcvz/nCgAACd9/P8qKQAAHIj8/7cpAAAQk/z/
+QyoAAAWe/P/MKgAA+aj8/1QrAADus/z/2isAAOO+/P9eLAAA2Mn8/+AsAADM1Pz/YS0AAMHf/P/g
+LQAAtur8/10uAACr9fz/2C4AAKEA/f9SLwAAlgv9/8ovAACLFv3/QDAAAIAh/f+1MAAAdSz9/ycx
+AABrN/3/mDEAAGBC/f8IMgAAVk39/3UyAABLWP3/4TIAAEFj/f9LMwAANm79/7MzAAAsef3/GjQA
+ACKE/f9+NAAAF4/9/+E0AAANmv3/QzUAAAOl/f+iNQAA+a/9/wA2AADvuv3/XDYAAOXF/f+2NgAA
+29D9/w83AADR2/3/ZjcAAMfm/f+7NwAAvfH9/w44AACz/P3/XzgAAKkH/v+vOAAAnxL+//04AACW
+Hf7/SjkAAIwo/v+UOQAAgjP+/905AAB5Pv7/JDoAAG9J/v9pOgAAZVT+/606AABcX/7/7zoAAFJq
+/v8vOwAASXX+/207AAA/gP7/qjsAADaL/v/lOwAALZb+/x48AAAjof7/VTwAABqs/v+LPAAAELf+
+/788AAAHwv7/8TwAAP7M/v8hPQAA9df+/1A9AADr4v7/fT0AAOLt/v+oPQAA2fj+/9E9AADQA///
++T0AAMYO//8fPgAAvRn//0M+AAC0JP//ZT4AAKsv//+GPgAAojr//6U+AACZRf//wj4AAJBQ///d
+PgAAh1v///c+AAB+Zv//Dz8AAHRx//8lPwAAa3z//zk/AABih///TD8AAFmS//9dPwAAUJ3//2w/
+AABHqP//ej8AAD6z//+FPwAANb7//48/AAAsyf//lz8AACPU//+ePwAAGt///6M/AAAR6v//pj8A
+AAj1//+nPwAA/////w=="""
+
+ verts = np.fromstring(data.decode('base64'), dtype='<i4')
+ verts = verts.reshape((len(verts) / 2, 2))
+ path = Path(verts)
+ segs = path.iter_segments(transforms.IdentityTransform, clip=(0.0, 0.0, 100.0, 100.0))
+ segs = list(segs)
+ assert len(segs) == 1
+ assert segs[0][1] == Path.MOVETO
+
if __name__=='__main__':
    import nose
    nose.runmodule(argv=['-s','--with-doctest'], exit=False)
Index: lib/matplotlib/path.py

--- lib/matplotlib/path.py (revision 7898)
+++ lib/matplotlib/path.py (revision 7900)
@@ -115,6 +115,8 @@
            codes = np.asarray(codes, self.code_type)
            assert codes.ndim == 1
            assert len(codes) == len(vertices)
+ if len(codes):
+ assert codes[0] == self.MOVETO

        assert vertices.ndim == 2
        assert vertices.shape[1] == 2
Index: lib/matplotlib/backends/backend_pdf.py

--- lib/matplotlib/backends/backend_pdf.py (revision 7898)
+++ lib/matplotlib/backends/backend_pdf.py (revision 7900)
@@ -1206,8 +1206,12 @@
        last_points = None
        for points, code in path.iter_segments(transform, clip=clip):
            if code == Path.MOVETO:
+ # This is allowed anywhere in the path
                cmds.extend(points)
                cmds.append(Op.moveto)
+ elif last_points is None:
+ # The other operations require a previous point
+ raise ValueError, 'Path lacks initial MOVETO'
            elif code == Path.LINETO:
                cmds.extend(points)
                cmds.append(Op.lineto)

--
Jouni K. Seppänen
http://www.iki.fi/jks
------------------------------------------------------------------------------
Download Intel&#174; Parallel Studio Eval
Try the new software tools for yourself. Speed compiling, find bugs
proactively, and fine-tune applications for parallel performance.
See why Intel Parallel Studio got high marks during beta.
http://p.sf.net/sfu/intel-sw-dev_______________________________________________
Matplotlib-devel mailing list
Matplotlib-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/matplotlib-devel