[luatex] subtle bug in generating PDF outlines
luigi scarso
luigi.scarso at gmail.com
Sun Jan 5 20:23:32 CET 2025
On Sun, 5 Jan 2025 at 17:03, Werner LEMBERG <wl at gnu.org> wrote:
>
> > The key point is that with qpdf one can edit the *qdf* file (i.e
> > notation.qdf in our case) and call
> >
> > fix-qdf notation.qdf > notation-edited.pdf
> >
> > to have a pdf.
>
> OK – I hope you can find and fix the problem easily. If this doesn't
> work I can provide a large tarball with all of the necessary LilyPond
> input files.
>
hm, iiuc this is the problem
45201 0 obj
<<
/Names [ (Gregorian accidentals and key signatures) 1731 0 R
(Gregorian articulation signs) 1733 0 R (Gregorian chant contexts)
1729 0 R (Gregorian clefs) 1730 0 R (Gregorian square neume ligatures)
1840 0 R (Grid lines) 1231 0 R (Grouping staves) 1206 0 R
(Guile predicates) 2649 0 R (Guitar) 1542 0 R (Harmonics)
1530 0 R (Harp) 1523 0 R (Harp pedals) 1525 0 R (Hidden notes)
1223 0 R (Hiding staves) 1212 0 R (Horizontal spacing) 2190 0 R
(Horizontal spacing overview) 2191 0 R (Horizontal spacing paper
variables)
2158 0 R (How to prevent sharing of music expressions) 2012 0 R
(Hufnagel glyphs) 2509 0 R (Improvisation) 905 0 R (Incipits)
1849 0 R (Including LilyPond files) 2004 0 R (Indicating harmonics
and dampened notes)
1544 0 R (Indicating position and barring) 1543 0 R (Indicating power
chords)
1545 0 R (Input modes) 1875 0 R (Input structure) 1876 0 R
(Inside the staff) 1219 0 R (Instantiating new staves) 1205 0 R
(Instrument-specific markup) 2623 0 R (Instrument-specific scripts)
2633 0 R (Instrument names) 1214 0 R ]
/Limits [ (Gregorian accidentals and key signatures) (Instrument names) ]
>>
endobj
the keys of /Names are not correctly sorted,
/*tex Sort |dest_names| by names: */
static int dest_cmp(const void *a, const void *b)
{
dest_name_entry aa = *(const dest_name_entry *) a;
dest_name_entry bb = *(const dest_name_entry *) b;
return strcmp(aa.objname, bb.objname);
}
void sort_dest_names(PDF pdf)
{
qsort(pdf->dest_names, (size_t) pdf->dest_names_ptr,
sizeof(dest_name_entry), dest_cmp);
}
/*tex
Output the name tree. The tree nature of the destination list forces the
storing of intermediate data in |obj_info| and |obj_aux| fields, which
is
further uglified by the fact that |obj_tab| entries do not accept char
pointers.
*/
int output_name_tree(PDF pdf)
{
/*tex A flag for name tree output: is it |/Names| or |/Kids|: */
boolean is_names = true;
/*tex
The index of current child of |l|; if |k < pdf_dest_names_ptr| then
this
is pointer to |dest_names| array; otherwise it is the pointer to
|obj_tab| (object number).
*/
int k = 0;
int b = 0;
int m, j, l;
int dests = 0;
int names_head = 0;
int names_tail = 0;
if (pdf->dest_names_ptr == 0) {
goto DONE;
}
sort_dest_names(pdf);
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://tug.org/pipermail/luatex/attachments/20250105/299c587d/attachment-0001.htm>
More information about the luatex
mailing list.