Commit graph

9592 commits

Author SHA1 Message Date
Andrea Canciani
aaa10fbf12 hash: Improve handling of dead entries
When there are no free entries to terminate a search, checking that a
key is not in the table requires probing every entry in the table,
i.e. it degenerates in an O(n) operation.

Rehashing when the number of free entries is less than 25% makes the
expected lookup time O(1).

The hash-table micro benchmark become 4-6x faster.

Fixes https://bugs.freedesktop.org/show_bug.cgi?id=17399
2011-08-03 12:31:41 +02:00
Andrea Canciani
374b26ff03 perf: Add hash table benchmark
A benchmark to test the speed of hash tables when inserting and
removing a huge number of elements.

Although originally hash tables were assumed not to get many
deletions, in practice they are now being used as caches in multiple
places. This means that they often have a fixed number of live
elements and an element is evicted whenever a new element is inserted
(this happens explicitly for cairo_cache_t objects, but also, for
example, in scaled_font_map + holdovers). This access pattern is very
inefficient with the current implementation.
2011-08-03 12:31:41 +02:00
Uli Schlachter
7b5b29cc0f xcb: Handle deferred clear in _upload_image_inplace
Fixes: clip-device-offset, image-surface-source,
composite-integer-translate-source, move-to-show-surface,
source-surface-scale-paint, translate-show-surface, perhaps even more?

Signed-off-by: Uli Schlachter <psychon@znc.in>
2011-08-02 22:34:54 +02:00
Chris Wilson
d356deb182 test: Add a second ring to overlapping-dash-caps
Demonstrate a second artefact when using SQUARE.

Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
2011-08-02 15:38:49 +01:00
Adrian Johnson
3f2126f092 pdf: check if images are grayscale or monochrome and encode as such
Printing PDFs with large monochrome or grayscale images would result
in the images being blown up to 24-bit color images. Some printers are
very slow to print huge color images.
2011-08-02 23:23:50 +09:30
Chris Wilson
953a4a2e55 test: Add an test case to exercise overlapping caps between dash segments
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
2011-08-02 14:36:45 +01:00
Andrea Canciani
1e02ffd9a9 scaled-font: Make unscaled font utility functions static
They are only used within cairo-scaled-font.c
2011-08-01 19:22:51 +02:00
Andrea Canciani
daca1d999f scaled-font: Remove _cairo_ft_scaled_font_get_unscaled_font()
It is unused since 068df654da.
2011-08-01 19:21:48 +02:00
Andrea Canciani
400d055f3c hash: Compare hash values before calling keys_equal
If the hash value is different, the keys cannot be equal. Testing this
beforehand can avoid a few function calls and shares this optimization
across all cairo-hash uses.
2011-08-01 19:21:48 +02:00
Andrea Canciani
02665975d3 hash: Improve double hashing
Instead of artificially introducing collisions in the step value by
replacing 0 with 1 (which causes the value 1 to have twice the
frequency of any other value), the step value can simply be computed
as an uniformly distributed value in the range [1, rehash], extremes
included.

This is safe because any step value smaller than the hash modulus is
co-prime with it, hence induces an orbit which includes every integer
in [0, table_size - 1].
2011-08-01 19:21:31 +02:00
Chris Wilson
c5405f7324 perf: Save/restore gstate across runs
Reset the cairo_t to the initial state so that subsequent tests are not
affected by earlier tests.

Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
2011-08-01 12:59:06 +01:00
Chris Wilson
c4f4c57261 bo-rectangular: perform an incremental sort
Bucketing the rectangles together on their top-scanline and then sorting
within that scanline is significantly faster for dragon despite the extra
passes.

Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
2011-08-01 12:08:55 +01:00
Chris Wilson
fec80f1199 perf: Add a few more variations to dragon to exercise unaligned lines/spans
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
2011-08-01 12:08:55 +01:00
Chris Wilson
4a8f638c9a tor: Suppress repeated spans
Under certain circumstances we will emit identical spans for when the
edge covers the entire pixel and then for the subsequent pixels. These
can be squashed into a single span.

Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
2011-08-01 12:08:55 +01:00
Chris Wilson
c0407e84e9 test: Extend PDF blend tests to include an opacity mask
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
2011-08-01 12:08:55 +01:00
Chris Wilson
3520aecfe5 image: the boxes are already pixel-aligned so skip the extra rounding step 2011-08-01 12:08:55 +01:00
Chris Wilson
d553754706 tor: Sort the initial edge correctly
Don't assume that the initial edge on the active list has the lower
position.
2011-08-01 12:08:55 +01:00
Chris Wilson
bca402a8e3 clip: Mark __cairo_clip_all as private and do not export
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
2011-08-01 12:08:55 +01:00
Andrea Canciani
e04e368748 Remove useless checks for NULL before freeing
This patch has been generated by the following Coccinelle semantic patch:
// Remove useless checks for NULL before freeing
//
// free (NULL) is a no-op, so there is no need to avoid it

@@
expression E;
@@
+ free (E);
+ E = NULL;
- if (unlikely (E != NULL)) {
-   free(E);
(
-   E = NULL;
|
-   E = 0;
)
   ...
- }

@@
expression E;
@@
+ free (E);
- if (unlikely (E != NULL)) {
-   free (E);
- }
2011-07-31 16:46:36 +02:00
Andrea Canciani
8f8da19fd4 font-face: Cleanup backend-specific destruction code
The check for NULL and nil font faces is performed in the shared
code. There is no need to duplicate it (in fact, quartz-font and
ft-font don't do it).
2011-07-31 16:46:36 +02:00
Andrea Canciani
1f2dc2e06a pattern: Do not provide type field in cairo_pattern_union_t
The type field is accessible through the base.type field. This makes
it possible to change the layout of cairo_pattern_t and move the type
field without breaking cairo_pattern_union_t.
2011-07-31 16:46:36 +02:00
Andrea Canciani
b39d3d4b53 surface: Set errors through _cairo_surface_set_status()
The status should never be set directly. Instead, it should be set by
_cairo_surface_set_status().
2011-07-31 13:05:22 +02:00
Andrea Canciani
ed928c51fb Tighten error validation
CAIRO_STATUS_LAST_STATUS is not an error, it is just the number of
possible status values.
2011-07-31 13:05:22 +02:00
Andrea Canciani
90216cfde0 Update FSF address
I updated the Free Software Foundation address using the following script.

for i in $(git grep Temple | cut -d: -f1 )
do
  sed -e 's/59 Temple Place[, -]* Suite 330, Boston, MA *02111-1307[, ]* USA/51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA/' -i "$i"
done
2011-07-31 13:05:21 +02:00
Andrea Canciani
f6b30686ca Fix make check
This fixes multiple failures when checking if headers can be used
standalone.
2011-07-31 13:05:21 +02:00
Chris Wilson
5e223c1c73 image: Reduce compositing bounded boxes with a clip-mask to a polygon
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
2011-07-31 08:12:54 +01:00
Chris Wilson
7ca1d87645 tor: Use longjmp to throw an error whilst generating spans
Similar to the technique used by the other span converters, we can avoid
the frequent error checking by instead throwing an error from the deep
malloc.

Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
2011-07-31 08:12:54 +01:00
Chris Wilson
1c3b0ebb32 spans: fast-path common case of a single box.
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
2011-07-31 08:12:54 +01:00
Chris Wilson
b231bb0a0b test: Exercise extend modes with recording patterns
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
2011-07-31 08:12:54 +01:00
Chris Wilson
f3a3c29e2b paginated: Remove an impossible test
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
2011-07-31 08:12:54 +01:00
Andrea Canciani
c133243111 clip: Fix copy of clip rectangles list
_cairo_clip_get_region() returns NULL both for non-region clips and
for memory allocaiton failures. They must be distinguished by checking
_cairo_clip_is_region().

Fixes get-clip.
2011-07-30 10:54:07 +02:00
Andrea Canciani
6155348966 default-context: Do not allow restoring pushed gstates
The brackets defined by push/pop and save/restore are independent ad
should match properly.

This means that cairo_push()-ed gstates cannot be cairo_restore()-d
and cairo_save()-d gstates cannot be cairo_pop()-ed.

Fixes group-state.
2011-07-30 09:51:02 +02:00
Chris Wilson
0ae32437af image: Free clip_surface after use
The clip surface is no longer cached on the clip and the caller is
responsible for destroying it after use.

Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
2011-07-29 22:00:10 +01:00
Chris Wilson
2342e4da4f image: extend support of direct replay for paginated surfaces
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
2011-07-29 18:39:27 +01:00
Andrea Canciani
d2ea8bd070 build: Respect CFLAGS and LIBS env settings
The build system does not honor the flags set externally and replaces
it with the pthread-only flags when detecting pthread
availability. This breaks the configuration of cairo in some
cross-compilation environments:

conftest.c:1: note: someone does not honour COPTS correctly, passed 0 times

The test for pthread should append the new flags to the old one.
2011-07-29 19:29:53 +02:00
Chris Wilson
b2ee7d9a21 trace: Emit the content type for image surfaces
Currently we only emit the format, but if you want to later convert
the images to a normal surface for replay it is handy to have the
content.

Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
2011-07-29 17:14:42 +01:00
Chris Wilson
6448022a05 xcb: Convert the box back to integer coordinates for uploading the image
Silly bug of the day.

Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
2011-07-29 16:29:10 +01:00
Chris Wilson
0660f62fe5 gl: Rectilinear fast path
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
2011-07-29 15:40:47 +01:00
Chris Wilson
c2150b3441 gl: Rectangular fast path
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
2011-07-29 15:06:20 +01:00
Adrian Johnson
7fbe430e2a ps: remove unnecessary flush
that was preventing string of glyphs from separate calls to
cairo_show_glyphs() being merged.
2011-07-29 21:51:04 +09:30
Chris Wilson
488c94220d ps: Apply the clip reduction techniques from pdf
If the clip wholly covers the operation, we do not need to set one, and
if the current clip similarly covers the operation we do not to unset
it.

Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
2011-07-29 13:12:48 +01:00
Chris Wilson
ccf67c7d74 pdf: Don't remove the current clip if redundant
If the surface already has a clip set and that clip does not interfere
with the operation then we can leave it set.

Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
2011-07-29 13:06:49 +01:00
Chris Wilson
6ed0c6224b pdf: Remove redundant clip regions
If the extents of the operation is wholly contained within the clip
region, then we can safely not invoke any clipping.

Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
2011-07-29 13:03:59 +01:00
Chris Wilson
29a302cc4b clipper: Also need to guard against the incoming clip being NULL
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
2011-07-29 12:57:31 +01:00
Chris Wilson
fb9ed9bb0d clip: Fix clip-equal to handle one or the other being NULL/all-clipped
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
2011-07-29 12:36:21 +01:00
Chris Wilson
7c6e1b8db8 xcb: Short-circuit multiplying the alpha mask by 1.0
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
2011-07-29 12:36:21 +01:00
Chris Wilson
4032c86127 fallback: Prevent recursion when combining with the clip
We need to special case the handling of unaligned clip regions in order
to prevent the treatment of those as a general path requiring a
clip+mask...

Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
2011-07-29 12:36:21 +01:00
Andrea Canciani
2787ef4e73 pattern: Complete the list of possible pattern errors
A mesh pattern is put in CAIRO_STATUS_INVALID_MESH_CONSTRUCTION when
an invalid patch construction operation is performed.

A mesh pattern is put in CAIRO_STATUS_INVALID_INDEX when an operation
is performed with an out-of-bound index.

Any pattern is put in CAIRO_STATUS_INVALID_MATRIX when its matrix is
set to a singular matrix.
2011-07-29 13:17:17 +02:00
Chris Wilson
c1b0e73578 record: Only reduce fill+stroke if the clip doesn't change between the commands
Pointed out by Adrian Johnson.

Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
2011-07-29 12:07:09 +01:00
Andrea Canciani
6ec24760b3 device: Flush on a finished device is a no-op
In order to have a behavior which is coherent with that of surfaces,
flushing a finished devices should be a no-op and should not affect
the status of the device.
2011-07-29 13:01:59 +02:00