Commit graph

9697 commits

Author SHA1 Message Date
Chris Wilson
52e3814824 clip: Skip processing of rectangle-intersection if it wholly subsumes the clip
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
2011-07-24 17:31:39 +01:00
Chris Wilson
4c72c4df66 wrapper: Correct translation of clip for wrapper extents
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
2011-07-24 16:27:07 +01:00
Chris Wilson
cc745f5c2f wrapper: show-text-glyphs can now operate on constant array of glyphs
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
2011-07-24 15:48:27 +01:00
Chris Wilson
415d5d8fce wrapper: Use the stack for small glyph allocations
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
2011-07-24 15:45:57 +01:00
Chris Wilson
8102bd8681 wrapper: Factor out the common clip handling
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
2011-07-24 15:33:21 +01:00
Chris Wilson
87e9c8a5ea recording: Move the glyph allocation into the wrapper after checking clip status
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
2011-07-24 15:10:18 +01:00
Chris Wilson
59612847e3 xcb: set the right members of cairo_color_t for generating the opacity mask
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
2011-07-24 15:08:03 +01:00
Chris Wilson
080f81bf5c image: Fix clip-intersect
Explicitly convert the clearing of the unbounded area.

Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
2011-07-24 13:12:55 +01:00
Chris Wilson
e4b3f84d4c test: Add clip-intersect
Exercises a bug in the unbounded drawing of an empty polygon...

Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
2011-07-24 13:05:24 +01:00
Chris Wilson
4d5c95f629 test: Exercise replaying basic painting paths
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
2011-07-24 11:50:48 +01:00
Chris Wilson
2b19dd3fbd recording: Only look for a fill-stroke operation if the target supports one
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
2011-07-24 11:50:48 +01:00
Chris Wilson
dc67d8e7f9 composite: Perform a quick is-clipped for glyphs
Computing the exact bbox of the glyphs and whether they are overlapped
is expensive. However, we can often check whether they are visible just
by looking at the maximal extents of the fonts along with the bbox of
the positions; much cheaper.

Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
2011-07-24 11:50:48 +01:00
Chris Wilson
05bed4c574 scaled-font: Single glyph extent computations are worryingly frequent
But easy to optimise.

Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
2011-07-24 10:42:14 +01:00
Chris Wilson
5ac9e3e281 freed-pool: Enlarge the freed cache
Clips end up recursing more than 4 levels and so we need a larger stash
to avoid mallocs.

Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
2011-07-24 10:42:14 +01:00
Chris Wilson
04ef07ee3b clip: Embed a single box to avoid a common allocation
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
2011-07-24 10:42:14 +01:00
Chris Wilson
926287aeea surface-wrapper: Fix use of uninitialised variable
Introduced recently in a30a7402f7,

==32234== Conditional jump or move depends on uninitialised value(s)
==32234==    at 0x6BCA326: _cairo_surface_wrapper_needs_device_transform (cairo-surface-wrapper.c:549)
==32234==    by 0x6BCB47D: _cairo_surface_wrapper_set_inverse_transform (cairo-surface-wrapper.c:579)
==32234==    by 0x6BCB55A: _cairo_surface_wrapper_init (cairo-surface-wrapper.c:621)
==32234==    by 0x6BB87A6: _cairo_recording_surface_replay_internal (cairo-recording-surface.c:854)

Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
2011-07-23 22:58:55 +01:00
Chris Wilson
7f77e2f36a trace: Create a new opcode for recording surface
During replay we want to handle recording surfaces specially, and not
redirect the creation of those to the target surface. This is similar to
the need to keep image surfaces as images during replay.

Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
2011-07-23 22:50:25 +01:00
Chris Wilson
1578530557 region: Directly handle single rectangle creation in create_rectangles()
In order to avoid the copy and transformation of the single rectangle,
we can simply pass it to pixman and create the region from it.

Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
2011-07-23 20:02:35 +01:00
Chris Wilson
69e52c6707 tests: Another missing ref, this time clip-disjoint-hatching
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
2011-07-23 15:51:49 +01:00
Chris Wilson
9b039a65a6 tests: Missing ref images for new recording-surface test
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
2011-07-23 15:48:10 +01:00
Chris Wilson
7e42276ffc image: Apply mask-opacity to clip boxes
In the simple condition where the user is applying an opacity mask to a
misaligned rectangle, we can treat it as a series of simpler composites
by combining the opacity with the coverage of the box.

Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
2011-07-23 15:33:14 +01:00
Chris Wilson
a30a7402f7 image: replay the recording surface directly onto the target
백현기 reported a use-case where he was recording an entire web-page
onto the recording surface, in order to facilitate panning. In this
scenario, where there may be lots of similar surfaces within the
recording we generate thousands of unused snapshot-images bloating
memory usage and impairing performance.

Under the right conditions we can replay directly onto the destination
which not only bypasses the snapshots but also skips the following
resampling.

Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
2011-07-23 15:33:14 +01:00
Chris Wilson
bff8e22eb6 image: Fix partial clipping of text
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
2011-07-23 15:33:14 +01:00
Chris Wilson
c2dada9722 test: Add a paint-with-alpha variant to test clip-boxes fast path
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
2011-07-23 15:33:14 +01:00
Chris Wilson
5de0232937 test: Extend recording-surface-pattern to include a SOURCE operator test
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
2011-07-23 14:42:17 +01:00
Chris Wilson
abd8fcc833 test: Expand partial-clip-text
Test partial clipping along each edge.

Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
2011-07-23 14:42:17 +01:00
Adrian Johnson
abf97c8874 Check glyph_index range in _index_to_glyph_name
A broken font such as the PDF file at
https://bugzilla.gnome.org/show_bug.cgi?id=638011 can mean there are
less glyph names in the array than there should be.
2011-07-22 21:53:33 +09:30
Andrea Canciani
aa646e47f3 Use new pixman formats
b132fae5e8 introduced the usage of two
new pixman formats. This requires pixman 0.22, but makes it possible
to fix some TODO's left behind in gl and vg.
2011-07-21 20:15:50 +02:00
Uli Schlachter
b60694cbc7 xcb: Work around wrong extent computation in the X server
This is basically the same fix as e6c3efdd65. However, this was lost in
b132fae5e8 and thus had to be fixed again.

Fixes: clip-fill-eo-unbounded clip-fill-nz-unbounded

Signed-off-by: Uli Schlachter <psychon@znc.in>
2011-07-21 19:39:25 +02:00
Uli Schlachter
e2150185fc xcb: Unset the deferred_clear flag on fallback
Signed-off-by: Uli Schlachter <psychon@znc.in>
2011-07-21 19:24:38 +02:00
Uli Schlachter
de686f1938 xcb: Handle deferred_clear in _get_image
Fixes: arc-infinite-loop clip-all clip-empty-group clip-fill-no-op
pattern-getters

Signed-off-by: Uli Schlachter <psychon@znc.in>
2011-07-21 19:24:38 +02:00
Uli Schlachter
adf026fffe xcb: Fix a NULL dereference
This fixes a crash in the hatchings test case.

Signed-off-by: Uli Schlachter <psychon@znc.in>
2011-07-21 19:24:37 +02:00
Andrea Canciani
1aa077e129 xcb,xlib: Cleanup GC cache handling
Device mutexes guarantee the consistency between multiple threads,
hence GC cache does not rely anymore on atomic operations.

This makes it possible to avoid bit twiddling and to use a simple
array.
2011-07-21 19:16:42 +02:00
Chris Wilson
5eb8eacde0 xcb: Always send a clip region along with clipped glyphs
As we do not control the geometry used for the individual glyphs, we
must always send a clip-region so that X can trim the glyph
appropriately. However, in order to avoid sending unnecessary data we
only do so if the clip extents is less than the ink extents of the
glyphs.

Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
2011-07-21 18:07:17 +01:00
Uli Schlachter
93ab2171d0 xcb: Parse $CAIRO_DEBUG just like cairo-xlib does
Signed-off-by: Uli Schlachter <psychon@znc.in>
2011-07-21 16:51:26 +02:00
Uli Schlachter
0858533419 Xlib,xcb: Make *_debug_[sg]et_precision() more robust
This adds checks for NULL pointers, devices in an error state and devices which
aren't owned by the right backend.

Signed-off-by: Uli Schlachter <psychon@znc.in>
2011-07-21 16:51:26 +02:00
Uli Schlachter
7c2ccef3eb xcb: Make it possible to undo _cairo_xcb_device_debug_cap_*
We now remember the original flags before any call to
cairo_xcb_device_debug_cap_xshm_version() or
cairo_xcb_device_debug_cap_xrender_version() was done and re-set these flags on
any new call to these functions. This makes it possible to raise e.g. the used
RENDER version again.

Signed-off-by: Uli Schlachter <psychon@znc.in>
2011-07-21 16:51:26 +02:00
Uli Schlachter
83df0ab2b6 XCB: Store the flags per-connection only
Every xcb surface had its own copy of the flags from the time that it was
created. This means that, if you want to make use of
cairo_xcb_device_debug_cap_xrender_version() and
cairo_xcb_device_debug_cap_xshm_version(), you first had to create a dummy xcb
surface, use that to get access to the cairo_device_t so that you can use these
functions and only then create your real surface, because the change only
affected new surfaces.

This commit changes everything to use the connection's flag and removes the
per-surface flags. This avoids the dummy surfaces completely.

Signed-off-by: Uli Schlachter <psychon@znc.in>
2011-07-21 16:51:26 +02:00
Chris Wilson
99628d06cd gstate: Handle NULL clip for in_clip()
A NULL clip implies no clipping at all, and therefore every point is
inside.

Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
2011-07-21 15:38:12 +01:00
Chris Wilson
69cc802e61 Fix proxying of ->context_create()
Adrian Johnson found that I had broken show_page() and pinpointed the
cause to being that cairo_show_page() was being called on the recording
surface and not the pagination surface after my overhaul for
cairo_backend_t. In fact, the problem was far more severe as the mistake
caused the created context to point to the wrong surface entirely,
bypassing the surface proxy.

What is desired is for the proxy's target surface to choose what manner
of context is should use, but for all calls into the surface backend to
go through the proxy surface.

Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
2011-07-21 13:45:58 +01:00
Adrian Johnson
8938f58e70 type1-subset: Subset the subroutines 2011-07-21 21:50:29 +09:30
Adrian Johnson
f6043b06d6 Add support for subsetting bare CFF fonts
This avoids fallback when using poppler cairo for printing PDFs with
CFF fonts.

The current CFF subsetting only works with Opentype/CFF fonts. CFF
fonts inside PDF files are usually embedded as a bare CFF font without
the Opentype wrapper.

Making the CFF subset work with bare CFF fonts requires doing a bit of
extra work to extract the fontname, font bbox, and glyph widths from
the CFF data instead of using the Opentype tables.
2011-07-21 21:17:18 +09:30
Chris Wilson
6b3e5cd39c xcb: Reduce one pass for masking, now just 2 passes required!
Another 10% off fishbowl for both snb and pnv.

[Note this exposes the bugs in the polygon clipper; naive *and* broken.]

Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
2011-07-20 19:56:27 +01:00
Chris Wilson
a585a092ee xcb: squash initial ChangePicture request for precision
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
2011-07-20 19:53:12 +01:00
Chris Wilson
d5d4a0f240 xcb: Take advantage of clip-boxes
A demonstration of step 2, improves performance for selected benchmarks
on selected GPUs by up to 30%.

firefox-fishbowl on snb {i5-2520m): 42s -> 29s.
firefox-talos-gfx on snb: 7.6 -> 5.2s.
firefox-fishbowl on pnv (n450): 380 -> 360s.

Whist this looks like it is getting close to as good as we can achieve,
we are constrained by both our API and Xrender and fishbowl is about 50%
slower than peak performance (on snb).

And it fixes the older performance regression in firefox-planet-gnome.

Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
2011-07-20 13:19:38 +01:00
Chris Wilson
b419fdcacd clip-boxes: Intersection with 0 boxes means clip-all
Fixes clip-fill-no-op

Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
2011-07-20 10:58:37 +01:00
Chris Wilson
41190afacf win32: Fixup clip-mask fallback after API changes
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
2011-07-20 10:58:37 +01:00
Adrian Johnson
3d1ee0e22d analysis: CAIRO_INT_STATUS_NOTHING_TO_DO should not cause fallback 2011-07-20 19:08:38 +09:30
Adrian Johnson
12b27778e2 ps: Don't return CAIRO_INT_STATUS_NOTHING_TO_DO for empty glyphs 2011-07-20 19:05:33 +09:30
Adrian Johnson
aaa1ed81c2 win32: Fix build breakage 2011-07-20 18:39:53 +09:30