Age | Commit message (Collapse) | Author |
|
|
|
A few commits back, we introduced the fz_key_storable concept
to allow us to cope with objects that were used both as values
within the store and as parts of keys within the store.
This commit worked, but showed up performance problems; when the
store has several million PDF objects in it, bulk changes (such
as dropping a display list or document) could trigger many passes
across the store.
We therefore introduce a mechanism to ameliorate this. These
passes, now known as "reap passes", can be batched together using
fz_defer_reap_start and fz_defer_reap_end.
We trigger this start/end around display list dropping, and around
PDF content stream processing. This should be fine, as deferral
will be interrupted if we ever run our of memory during mallocing.
|
|
|
|
|
|
|
|
|
|
This is used at several places in mupdf.
|
|
|
|
|
|
|
|
If the same image is used repeatedly, then we currently send
the data again and again. Instead, send each image as a
reusable symbol and reuse it as required.
This reduces the size of the output by over 50% for the example
file, but unfortunately results in the example file killing
both Firefox and Edge when we attempt to load it. The file
seems entirely valid though, and this is a saving on sane files.
There is a #define that can be made to revert to the old
behaviour (SVG_SEND_REPEATED_IMAGES).
|
|
Now linear time rather than n^2.
|
|
The store is effectively a list of items, where each item is a
(key, value) pair. The design is such that we can easily get
into the state where the only reference to a value is that held
by the store. Subsequent references can then be generated by
things being 'found' from within the store.
While the only reference to an object is that held by it being
a value in the store, the store is free to evict it to save
memory.
Images present a complication to this design; images are stored
both as values within the store (by the pdf agent, so that we
do not regenerate images each time we meet them in the file),
and as parts of the keys within the store.
For example, once an image is decoded to give a pixmap, the
pixmap is cached in the store. The key to look that pixmap up
again includes a reference to the image from which the pixmap
was generated.
This means, that for document handlers such as gproof that do
not place images in the store, we can end up with images that
are kept around purely by dint of being used as references in
store keys. There is no chance of the value (the decoded pixmap)
ever being 'found' from the store as no one other than the
key is holding a reference to the image required. Thus the
images/pixmaps are never freed until the store is emptied.
This commit offers a fix for this situation.
Standard store items are based on an fz_storable type. Here we
introduce a new fz_key_storable type derived from that. As well
as keeping track of the number of references a given item has
to it, it keeps a separate count of the number of references a
given item has to it from keys in the store.
On dropping a reference, we check to see if the number of
references has become the same as the number of references from
keys in the store. If it has, then we know that these keys can
never be 'found' again. So we filter them out of the store,
which drops the items.
|
|
This is useful when a TIFF image is grayscale but
supplies more than a single component per sample.
|
|
This makes debugging much simpler.
|
|
We call Memento_addRef etc in fz_keep_impXX functions, so
don't call them in the callers too.
|
|
Getting a backtrace out with missing functions makes the
backtrace much less useful. Some backtrace routines (such
as that used by Memento on Android) are incapable of
resolving static functions.
We therefore provide 2 scripts (scripts/destatic.sh and
scripts/restatic.sh) that respectively remove and replace
the 'static' from function definitions.
The scripts do not affect "static inline" or "static const"
definitions, and they are are restricted to working in the
source directory (excluding source/tools), thirdparty/mujs
and the platform/{java,android} directories.
The transformed source should NOT be checked in.
To avoid problems with clashing symbols, some functions are
renamed or tweaked slightly in this patch.
|
|
Work around the problems in that androids logging only works
in whole lines by buffering until we have one.
Also, androids logging goes to a circular buffer that loses
data when it overflows. Hack around this by adding a 1ms sleep
after every line output.
|
|
|
|
Thanks to Sebastian for pointing out that the demangling code
wants a malloced block, cos it might realloc it. Drop back to
the dumber version.
|
|
Add backtrace abilities, and fix missing return value from
android logging.
|
|
The upshot of debugging this is that:
1) We can't trust the FontBBox. Certainly it appears that no
one else trusts it.
2) We can't trust the d1 values in all cases, as it can lead to
use rendering glyphs far larger than we'd want to.
So we have the compromise used here.
1) We never clip to the FontBBox.
2) If the FontBBox is invalid, then we calculate the bbox
from the contents of the data streams.
3) If the FontBBox is valid, and the d1 rectangle given
does not fit inside it, then we calculate the bbox from
the contents of the data streams.
This could theoretically produce problems with glyphs that have
much more content than they actually need, and rely on the d1
rect to clip it down to sanity. If the FontBBox is invalid in
such fonts, we will go wrong.
It's not clear to me that this will actually work in Acrobat/
Foxit/gs etc either, so we defer handling this better until we
actually have an example.
Tested with bug 694952, and bug 695843 which were the last 2 in
this area.
|
|
|
|
|
|
|
|
Previously it was inherently tied to zip archives and directories.
Now these are separated out into distinct subclasses. This prepares
for support for further archive formats.
|
|
|
|
In preference to colorspace internal to_rgb() function pointer.
|
|
|
|
|
|
The size listed in the central directory can be used to allocate an
output buffer and inflate can be told to not write more than this
number of bytes. The listed size cannot be assumed to be the size
of the output data however as the zip file may be corrupted. Instead
the size of the output data must be given by inflate and must be
less than or equal to the listed size.
The same reasoning goes for uncompressed entries and simply reading
the uncompressed data from the archive file (which may terminate
early).
Fixes indeterminism broken_png_image.xps.
|
|
Previously we might and up with prints such as:
error: malloc of array (%zu x %zu bytes) failed
because %zu was never interpreted on 32-bit platforms
where sizeof(size_t) < 8. After this fix we now get:
error: malloc of array (14445 x 118800 bytes) failed
|
|
|
|
The type3 font(s) in the file have an invalid (0 sized) bbox, hence
the clipping of the chars goes wrong.
We now spot the invalid bbox, and suppress the clipping.
|
|
Try to reduce contention on the glyphcache lock.
|
|
Stops a warning with the validator.
|
|
|
|
Spotted with:
mutool draw -A0 -r600 -o out.ppm J11_acrobat.pdf
|
|
Broken by alpha changes.
|
|
|
|
|
|
|
|
Since the removal of the begin_page device function, structured
text extraction has been unable to correctly establish the
mediabox for extracted pages.
Update the fz_new_stext_page call to take this mediabox
information. This is an API change, but hopefully most people
are calling fz_new_stext_page_from_page or
fz_new_stext_page_from_display_list which are updated here to
cope.
Update all the apps/tools to behave properly.
|
|
|
|
This has been broken since fz_text was changed to be multiple
fz_text_spans.
|
|
When we are rendering a knockout group, we set the knockout flag.
Do NOT carry this forward into the renderings of any softmasks.
This fixes Bug 696870 and 696872.
|
|
|
|
Fix for bug 696913.
|
|
Short circuit any attempt to paint a pixmap with zero alpha.
|
|
|