On Thu, 3 Apr 2008 17:28:37 +0200, Davide Viti wrote:
> I get the following error when creating pdf (or ps) charts for
> FreeSerifItalic.ttf
>
> [EMAIL PROTECTED]:~/dejavu/freefont$ fntsample -f FreeSerifItalic.ttf -o 
> test.pdf
> fntsample: /home/dajobe/dev/debian/cairo/cairo-1.4.14/src/cairo-array.c:301:
> _cairo_array_allocate: Assertion `array->num_elements + num_elements
> <= array->size' failed.

Davide,

Thanks so much for the bug report, (particularly with the nice easy
recipe for replicating the bug).

I've done some git-bisect guided exploration of the issue along the
1.5.x branch. Here's what I found:

    * First, 1.4.10 doesn't appear to have the assertion bug

    * Along the 1.5 branch, the assertion failure first occurs here:

        commit b20e08999e2f6e7a72ee75a7c3fd865bf0368794
        Author: Adrian Johnson <[EMAIL PROTECTED]>
        Date:   Sun Sep 23 11:37:02 2007 +0930

            Truetype Subsetting: Avoid failing when fonts are missing optional
            tables

    * Then, the assertion failure disappears again here:

        commit e0187ad49b754c4024f1999155ed248616028582
        Author: Chris Wilson <[EMAIL PROTECTED]>
        Date:   Thu Dec 27 12:46:13 2007 +0000

            [cairo-path-fixed] Ensure the points array is naturally aligned,
            take 2.

            By enlarging buf_size to ensure the correct alignment of the points
            array with the cairo_path_buf_t block, we can efficiently use the
            padding bytes to store more ops.

I shared the above with Chris Wilson and he seemed quite mystified.

Davide's original report was about an assertion failure in cairo
1.4.14, so the bug may have been introduced and not subsequently fixed
in that branch. I haven't explored that issue at all.

Meanwhile, there's an independent bug that's perhaps even more
concerning. Namely, with cairo 1.5.16 (or current git master), the
results of running fntsample are totally wrong, (with the large glyphs
all misplaced by a consistent offset). The incorrect output can be
seen here:

        http://people.debian.org/~eugen/strange-output.pdf

Eugeniy Meshcheryakov, (the fntsample author), pointed out that the
assertion failure can be avoided with the following command line:

        fntsample -f FreeSerifItalic.ttf -o output.pdf -i -0xFFFFF

So I bisected with that command and found that the misplaced-glyphs
bug first shows up in the pdf-operators commit:

        commit 26c6159b1e2f5481fb18f5f06f01063002dd6c98
        Author: Adrian Johnson <[EMAIL PROTECTED]>
        Date:   Mon Jan 7 20:36:32 2008 +1030

            Move the PDF drawing operators into cairo-pdf-operators.c

            By defining PostScript functions the same as the PDF drawing
            operators, this code can be shared by both the PDF and PS
            backends.

The purpose of this commit was to allow the cairo-ps backend to share
code with cairo-pdf, but it wasn't intended to change the cairo-pdf
output. There's a lot of code movement here, and unfortunately some
code changes at the same time. For example, comparing the old
_cairo_pdf_surface_show_glyphs with the new
_cairo_pdf_operators_show_glyphs I see things like this:

-            _cairo_output_stream_printf (surface->output,
+            _cairo_output_stream_printf (pdf_operators->stream,
                                          "%f %f %f %f %f %f Tm\r\n",
                                          scaled_font->scale.xx,
                                          -scaled_font->scale.yx,
                                          -scaled_font->scale.xy,
                                          scaled_font->scale.yy,
                                          glyphs[i].x,
-                                         surface->height - glyphs[i].y);
+                                         glyphs[i].y);

...

-                        _cairo_output_stream_printf (surface->output,
+                        _cairo_output_stream_printf (pdf_operators->stream,
                                                      "%f %f Td\r\n",
                                                      (glyphs[i].x - 
Tlm_x)/scaled_font->scale.xx,
-                                                     -(glyphs[i].y - 
Tlm_y)/scaled_font->scale.yy);
+                                                     (glyphs[i].y - 
Tlm_y)/scaled_font->scale.yy);

So it looks like there's a semantic change in the coordinate-space of
the Y values happening at the same time this code is moving from one
file to another. So I'm left with a bit too much changing at once to
be able to identify any obvious problem here.

Hopefully Adrian will have some more insight, (and ideally a quick
fix).

-Carl

Attachment: pgpg0mMyOoQbq.pgp
Description: PGP signature

Reply via email to