Commit graph

8536 commits

Author SHA1 Message Date
Chris Wilson
7f227ec8d3 Revert "test/pdf2png: Don't use DEST_OVER as poppler starts using subpixel text."
This reverts commit 506b2ebe71.

We have conflicting requirements here. In order to support extended
blend modes correctly we need to use DEST_OVER, at the expense of
supporting subpixel text. More thought required.
2010-06-11 12:54:15 +01:00
Chris Wilson
c761e0c5bb test: Restrict the coverage tests to raster targets.
Typo inside the requirements failed to prevent the tests running on the
vector backends.
2010-06-11 12:40:36 +01:00
Chris Wilson
b49c944fe4 test: Add a convenience script to disable the screensaver when testing
If the screensaver activates, it can cause failures when attempting to
render into an xlib window, so inhibit if we know how.
2010-06-11 12:38:17 +01:00
Chris Wilson
4e4724d48c gl: make check insists "cairoint.h" is first. 2010-06-11 12:19:56 +01:00
Chris Wilson
4edbcf1b1d color: Mark _cairo_color_get_content() as private. 2010-06-11 12:17:19 +01:00
Chris Wilson
506b2ebe71 test/pdf2png: Don't use DEST_OVER as poppler starts using subpixel text.
Using DEST_OVER in this form to paint the background white fails in the
presence of subpixel geometry (particular text), so remove the hack and
simply paint the background white prior to passing the surface to
poppler. KISS.
2010-06-11 12:07:21 +01:00
Chris Wilson
edb73b6dcf xlib: Adjust trapezoid precision based on antialias.
Render supports two modes of precision when rendering trapezoids.
Precise specifies points sampling on a 15x17 grid, ala pixman. Imprecise
allows the driver more freedom in the methods used, which may be more
amenable to acceleration. Choose to use the imprecise mode by default,
but still allow users to force the more rigidly specified precision by
changing the antialias mode.
2010-06-11 11:16:42 +01:00
Chris Wilson
290749bdb5 polygon: Reorder conditionals based on likelihood.
The vast majority of edges will be unclipped, so process those first.
2010-06-11 10:59:17 +01:00
Karl Tomlinson
55037bfb24 xlib: Find matching Visual for XRenderFormat
Not only is this useful for users to know which Visual matches any
particular Cairo surface, it should also close a few obscure bugs of not
converting images correctly on upload.

Fixes:

  Bug 28492 - cairo_xlib_surface_create_with_xrender_format does not
              create visual for resulting surface
  https://bugs.freedesktop.org/show_bug.cgi?id=28492

  Mozilla Bug 567065 - Try to create offscreen Xlib surface from existing
                       visual if possible
  https://bugzilla.mozilla.org/show_bug.cgi?id=567065

  Mozilla Bug 445250 - cairo_draw_with_xlib should provide a non-NULL visual
                       to callback
  https://bugzilla.mozilla.org/show_bug.cgi?id=445250

Reported-by: Oleg Romashin <romaxa@gmail.com>
2010-06-11 10:42:15 +01:00
Chris Wilson
cf426bce8e test: Add a simple coverage test.
This test case should be much clearer than half-coverage over what it
purports to actually test. In each pixel, it draws a single geometric
primitive that coverages a known percentage of the pixel and then we
measure how close the rasterisers are to that ideal.
2010-06-11 10:05:09 +01:00
Chris Wilson
bd3d9ef3d1 test: Distinguish tests that throw an error from a normal fail.
Hitting an error in a test case is almost as bad as crashing, and the
severity may be lost amidst "normal" failures. So introduce a new class
of ERROR so that we can immediately spot these during a test run, and
appropriately log them afterwards.
2010-06-11 09:14:16 +01:00
Chris Wilson
eeafeebd2e path: Exponentially grow buffer based on populated points and ops.
Instead of simply doubling the buffer size every time we overflow a point
or an op, enlarge the buffer to fit twice the number of used points and
ops.  We expect paths to be fairly consistent in the mix of operations,
and this allows the buffer size to tune itself to actual usage and reduce
wastage.
2010-06-11 09:06:20 +01:00
Chris Wilson
b0056a86b4 test: Exercise partial coverage some more.
Add some overlapping triangles (coarse enough for them to be resolved
using Cairo's 24.8 fixed point without loss of precision) to exercise
handling of overlapping subpixel geometry.
2010-06-10 18:30:26 +01:00
Andrea Canciani
836f616659 gl: support single stop gradients 2010-06-10 16:07:42 +02:00
Andrea Canciani
d17e2c5e23 ps: support single stop gradients 2010-06-10 16:07:42 +02:00
Andrea Canciani
eb7fc35115 pdf: support single stop gradients 2010-06-10 16:07:42 +02:00
Andrea Canciani
e2660a0eac pattern: improve single stop gradients handling
None-extended single stop gradients are now explicitly made clear.
2010-06-10 16:07:42 +02:00
Andrea Canciani
7a024bc206 test: exercise ps crash with single stop gradients
PS crashes only when using the source operator, as it will otherwise
fallback to rasterization of the gradients.
2010-06-10 16:07:42 +02:00
Andrea Canciani
a0f8cfe646 pattern: improve degenerate gradients handling
Degenerate radial gradients are now considered clear.
2010-06-10 16:07:42 +02:00
Andrea Canciani
bccd89b417 gstate: correct optimizations
Gradient were previously hand-optimized (without properly checking
for extend modes). By properly using _cairo_pattern functions we
avoid code duplication and bugs.

Fixes linear-gradient-extend, radial-gradient-extend.
2010-06-10 16:07:42 +02:00
Andrea Canciani
06c6207ad4 pattern: add gradient_is_solid function
It contains in a single place the logic needed to check if a gradient
pattern is solid (within a specified region).
2010-06-10 16:07:42 +02:00
Andrea Canciani
561625ee3b pattern: improve clear/opaque check functions
_cairo_pattern_is_opaque was missing some checks about the extend type.
Conversely _cairo_pattern_is_clear was being too strict about gradients.
2010-06-10 16:07:42 +02:00
Andrea Canciani
baaf312e04 pattern: remove content field from solid patterns
The content field in solid patterns had ill-defined semantic (or no
semantic at all), thus it can be removed.
2010-06-10 16:07:41 +02:00
Andrea Canciani
7461947eb1 surface: remove content argument from is_similar
The content argument was basically unuses.

Xlib change extracted from ickle's wip/compositor branch.
2010-06-10 16:07:41 +02:00
Chris Wilson
ef5f9b5c61 test: Update partial coverage.
Gah, no wonder the output looked wrong for the triangles, they only
covered half the pixel. So separate triangles into two cases.
2010-06-10 14:18:11 +01:00
Chris Wilson
8d67186cb2 gstate: Track whether the combination of ctm * device is identity.
In the fairly common condition that both the ctm and the device
transforms are identity, the function overhead of calling the matrix
multiplication on the point overwhelmingly dominates.
2010-06-10 13:13:12 +01:00
Chris Wilson
1349728d1e test: Add partial coverage.
Another experiment in measuring consistency of rasterisation stratagems
across the backends.
2010-06-10 13:13:12 +01:00
Chris Wilson
486118361a test: Fix half-coverage colouration.
Hmm, red over red makes the test pointless. The test still remains of
highly dubious quality, as it primarily serves as a rendercheck more
than a test of Cairo. The best hope for this test is that it inspires a
better one.

And incorporate the notes made by Joonas.
2010-06-10 12:05:41 +01:00
Dmitri Vorobiev
5cb764850f scaled-font: optimize cairo_scaled_font_text_to_glyphs()
This patch serves two purposes. First, it factors out the heavy part
of the cairo_scaled_font_text_to_glyphs() routine thus allowing GCC
to better optimize the cache cleanup loop. Keeping the look-up table
indices in a separate array speeds up array initialization even further.

Second, this patch introduces a shortcut for the case when the string
to be rendered consists of a single character. In this case, caching is
not necessary at all.

We have a benchmark that uses Cairo to render a large amount of random
strings of consisting of printable ASCII characters. Below are Oprofile
results collected while running this benchmark. It is easy to see that
the heavy part becomes noticeably lighter.

Before:

Profiling through timer interrupt
samples  %        app name                 symbol name
198755   13.5580  libcairo.so.2.10907.0    cairo_scaled_font_text_to_glyphs
88580     6.0424  libcairo.so.2.10907.0    _cairo_scaled_glyph_lookup
81127     5.5340  libcairo.so.2.10907.0    _cairo_hash_table_lookup
68186     4.6513  libcairo.so.2.10907.0    cairo_scaled_font_glyph_extents
47145     3.2160  libcairo.so.2.10907.0    _composite_glyphs_via_mask
46327     3.1602  libcairo.so.2.10907.0    _cairo_scaled_font_glyph_device_extents
44817     3.0572  libcairo.so.2.10907.0    _composite_glyphs
40431     2.7580  libcairo.so.2.10907.0    .plt

After (note that cairo_scaled_font_text_to_glyphs_internal_single() was inlined):

Profiling through timer interrupt
samples  %        app name                 symbol name
107264    7.6406  libcairo.so.2.10907.0    cairo_scaled_font_text_to_glyphs_internal_multiple
87888     6.2604  libcairo.so.2.10907.0    _cairo_scaled_glyph_lookup
79011     5.6281  libcairo.so.2.10907.0    _cairo_hash_table_lookup
71723     5.1090  libcairo.so.2.10907.0    cairo_scaled_font_glyph_extents
48084     3.4251  libcairo.so.2.10907.0    _composite_glyphs_via_mask
46636     3.3220  libcairo.so.2.10907.0    _cairo_scaled_font_glyph_device_extents
44740     3.1869  libcairo.so.2.10907.0    _composite_glyphs
42472     3.0254  libc-2.8.so              _int_malloc
39194     2.7919  libcairo.so.2.10907.0    _cairo_gstate_transform_glyphs_to_backend
38614     2.7506  libcairo.so.2.10907.0    .plt
37063     2.6401  libcairo.so.2.10907.0    _cairo_ft_ucs4_to_index
36856     2.6253  libc-2.8.so              random
36376     2.5911  libcairo.so.2.10907.0    _cairo_scaled_glyphs_equal
34545     2.4607  libcairo.so.2.10907.0    cairo_matrix_transform_point
31690     2.2573  libc-2.8.so              malloc
29395     2.0939  libcairo.so.2.10907.0    _cairo_matrix_is_identity
26142     1.8621  libcairo.so.2.10907.0    _cairo_utf8_to_ucs4
24406     1.7385  libc-2.8.so              free
24059     1.7138  libcairo.so.2.10907.0    cairo_scaled_font_text_to_glyphs

[ickle: slightly amended for stylistic consistency.]
2010-06-10 12:05:41 +01:00
Andrea Canciani
c43399fa68 gl: fix compilation on MacOS X
MacOS X uses different defines to avoid multiple inclusion of GL
header files. Adding them to glew.h fixes the compilation when GL is
enabled.
2010-06-09 17:53:09 +02:00
Chris Wilson
6eb5f859f1 bo: And disable DEBUG_TRAPS again.
Meh. I'm going back to bed. Thanks Joonas for catching this.
2010-06-09 10:40:32 +01:00
Chris Wilson
85af0ec374 test: Add half-coverage to exercise the rasteriser with subpixel geometry. 2010-06-09 10:34:06 +01:00
Chris Wilson
56c081bdc6 bo: Fix debugging for changes in internal traps api. 2010-06-09 10:33:01 +01:00
Benjamin Otte
a946d39555 gl: Add support for clip regions to the span renderer
Clip surface support is still missing, but i suppose that'd need a tiny
bit more code...
2010-06-08 22:23:12 +02:00
Benjamin Otte
f61b3f25af gl: Add an assertion that we always have a texture
When painting, the sources must be textures and not windows, and we did
that wrong previously. This assertion makes sure that never happens
again.
2010-06-08 22:23:12 +02:00
Benjamin Otte
c6c9a24a1d gl: Use CAIRO_COLOR_BLACK
... instead of creating black on our own - and wrong, too.
2010-06-08 22:23:12 +02:00
Benjamin Otte
19bc6793d1 gl: Only clone texture surfaces
Using non-texture surfaces as source or mask will fail, so we need to
fallback.
Caught by the subsurface-modify-child test.
2010-06-08 22:23:12 +02:00
Benjamin Otte
44483d843e gl: Fix argument order
oops...
2010-06-08 22:23:12 +02:00
Benjamin Otte
72bf1a5367 Update my copyright notices to preferred version
No more copyright headers containing my name.
2010-06-08 22:23:12 +02:00
Andrea Canciani
10d95c7020 test: add/update reference images
Add missing reference images and update one-stop references according
to current subset policy (outside the defined range, the gradient
is clear).
2010-06-08 20:53:31 +02:00
Andrea Canciani
dd0f887271 test: fix typo 2010-06-08 16:42:44 +02:00
Andrea Canciani
9b88b5dce5 test: add degenerate gradient and single stop tests
Add tests for degeneratate linear gradients (with start point equal
to the end point), degenerate radial gradients (start radius and end
radius equal to zero, same start and end circle) and gradients (both
linear and radial) with just a single stop.
2010-06-08 16:37:01 +02:00
Benjamin Otte
7d8359721b gl: Fix span renderer doing bad stuff for CLEAR and SOURCE
SOURCE will fallback now, CLEAR is identical to DEST_OUT with white.
2010-06-07 16:46:46 +02:00
Benjamin Otte
ef8fd1355e gl: Fix span renderer for unbounded spans
The span renderer used to not output rects for the top and bottom rows
when they didn't contain any spans.
2010-06-07 15:03:37 +02:00
Benjamin Otte
1d11af083f gl: Add a simple spans renderer for stroke/fill
It's very simple as clipped polygons or ANTIALIAS_NONE still return
UNSUPPORTED. Also, no optimizations are done, so even pixel-aligned
rectangles use the full span rendering.

Still, there are no performance regressions in the benchmark traces and
firefox-talos-svg and swfdec-giant-steps both got ~15% faster.
2010-06-07 13:37:49 +02:00
Benjamin Otte
550335efed Remove _cairo_surface_composite_trapezoids_as_polygon()
The function computed the composite rectangles wrong and was only used
in a gl fallback anyway. So instead of trying to fix it, just remove it
and make sure gl doesn't fallback.
2010-06-07 13:37:49 +02:00
Benjamin Otte
1e003fce8f gl: Fix vertex size changes not causing updates of the operands
Check vertex size stays identical when setting up vertices.
2010-06-07 13:37:49 +02:00
Benjamin Otte
39143400dd gl: Add a gradient texture cache
For firefox-planet-gnome, 19135 times a gradient gets rendered using
only 10 different gradients. So we get a 100% hit rate in the cache.
Unfortunately, texture upload is not the biggest problem of this test,
as the performance increase is only moderate - at least on i965:
34.3s => 33.5s
2010-06-07 13:37:49 +02:00
Benjamin Otte
932ab2641e device: flush before setting finished
Otherwise APIs critical for flushing - in particular acquiring the
device - do not work.
2010-06-07 13:37:49 +02:00
Benjamin Otte
35e219d08f gl: Make gradient textures a separate object
This is necessary so we can do proper refcounting and don't delete the
gradient texture prematurely.
2010-06-07 13:37:49 +02:00