Age | Commit message (Collapse) | Author |
|
When reallocing set the rawsize before attempting to write
the post guard block.
|
|
Including: Bug 697134: Tweak MEMENTO_GS_HACKS inclusion.
Rather than rolling our own memset prototype in this case, use
the one that gs provides.
And, bug 697133: Fix typo in Memento.
Causing a significant slowdown. Thanks to George Burgess IV
for spotting this.
|
|
|
|
|
|
Cope with circles, rounded rects, etc. Not the worlds best
approximation to a circular arc, but it's better than nothing.
|
|
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.
|
|
fz_parse_xml() assumes a null-terminated xml string.
|
|
|
|
|
|
|
|
Applications must be able to run e.g. Document.destroy() and later
set that reference to null and have the JVM successfully run the
finalizer an arbitrary time later. Previously the JVM would fail
to do so because the finalizer would throw an exception since the
native pointer was null.
|
|
|
|
The separation class had a member renamed. Rename it here too.
|
|
|
|
|
|
We can use names as keys for colorspaces. These are not bound to
a particular document.
|
|
|
|
If USE_GS_API is defined, we use the gsapi interface to call
gs.
The gsapi interface is defined in iapi.h, which is not included
in the mupdf source code. We therefore include a potted version
of this API inline.
To use the original, pass HAVE_IAPI_H at compile time.
|
|
Its output directory was set differently.
|
|
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).
|
|
As reasonable a place to call it as we can hope for. If we
ever have 2 documents open and we close 1 then it will dump
more blocks than we like, but when we get to that stage we
can worry about it then.
|
|
|
|
Not used, other than for the convenience of editing/searching.
|
|
In the JNI code, we attach a cloned context onto each thread
we encounter in thread local storage. When the thread shuts
down, we should destroy that context.
This can theoretically be achieved on pthreads by using the
destructor registered to the tls slot. I have yet to see
Android ever actually call this destructor yet though.
No such mechanism exists for windows thread, so we'll just leak
here for now. There is a potential fix for this, but it's
hairy, so details are left in a comment in the code.
|
|
Now linear time rather than n^2.
|
|
When we destroy a PDF document, currently we bin everything
from the store. Instead, drop just the objects that are
specifically tied to that document.
Any object tied to the document has a pdf_obj with the
required document pointer in it as the key.
|
|
|
|
If Java code creates e.g. a Document object and later calls
Document.destroy() and then keeps using the Document object
the library would end up crashing because the native pointer
was null. This case rather special case is now handled.
|
|
The underlying pdf_dict_put() converts into a null object.
|
|
But do not check it twice.
|
|
|
|
|
|
This case can be handled gracefully since commit
2d3eca6dec6b8fc7a169b3fc357904069df6b6c4.
|
|
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.
|
|
When invoking gs, pass in -gWIDTHxHEIGHT -dFitPage.
This avoids any possible mismatch betwen the page size we
expect and the page size that gs returns.
|
|
This is useful when a TIFF image is grayscale but
supplies more than a single component per sample.
|
|
|
|
|
|
The JNI interface throws exceptions of its own,
keep those instead of replacing them.
|
|
|
|
|
|
Page_getSeparation() does the corresponding conversion.
|
|
Also there is no need to check self pointer since JVM does not
even call the JNI binding for null pointers.
|