Commit graph

9088 commits

Author SHA1 Message Date
Andrea Canciani
6472864b2c test: Huge means more than MAX_INT
Cairo makes it possible to create gradients whose extreme objects are
defined with double precision coordinates, but it internally
represents them with 24.8 fixed point precision.

This shows that coordinates that don't fit the valid range are
mishandled and don't even trigger an error status.
2011-01-02 18:32:46 +01:00
Andrea Canciani
38dce5d144 pattern: Factor out pattern rescaling
The same code was duplicated (incorrectly and with some minor
differences) in pattern, image, xlib and xcb.

_cairo_gradient_pattern_max_val() abstracts that code in a function
that can be used whenever a gradients extremes need to be rescaled to
fit within a given range.

Fixes huge-linear, huge-radial.

Fixes part of https://bugs.freedesktop.org/show_bug.cgi?id=32215
2011-01-02 18:32:13 +01:00
Andrea Canciani
7b188f852e test: Make huge-* test gradients not within pixed_fixed_t range
Cairo represents gradients coordinate with 24.8 fixed point precision,
but pixman uses 16.16 fixed point coordinates.

This shows that cairo is currently unable to handle gradients with
coordinates which are valid for cairo but not for pixman.
2011-01-02 18:31:50 +01:00
Andrea Canciani
51594d9787 matrix: Cairo matrix to pixman transform/offset conversion
Xlib, XCB and image use the same code to convert a cairo_matrix_t to a
backend-specific transform.

The code did not handle correctly some matrices, thus a new function
that performs the conversion in a more generic way was added and used
in the backends instead of fixing the repeated code.

Fixes part of https://bugs.freedesktop.org/show_bug.cgi?id=32215
2011-01-02 18:31:42 +01:00
Andrea Canciani
ada6057b8c test: New radial-gradient tests
The old radial gradient tests were actually drawing the same gradients
with different operators (OVER/SOURCE) and operations (paint/mask).

It is possible to refactor them to share the gradient construction
code. This makes it easy to change the gradient shape in all of them
to test more interesting combinations.

Instead of testing 16 generic positions we are now testing just 7
cases, which correspond to every possible combination of the relative
size and position of the two circles defining the gradient. In
particular we are now testing a constant radius gradient and gradients
with tangent circles.
2011-01-02 18:31:35 +01:00
Andrea Canciani
b4aa01f72f pattern: Make functions not used elsewhere static
_cairo_pattern_init_linear() and _cairo_pattern_init_radial() are only
called from within cairo-pattern.c
2011-01-02 18:31:25 +01:00
Andrea Canciani
b0aef7202d pattern: Use cairo_color_stop_t when hashing gradient stops
Since 18b48a6ebc the color of each
gradient stop is stored in a cairo_color_stop_t, but
_cairo_gradient_color_stops_hash() was not updated accordingly.
2011-01-02 18:31:07 +01:00
Andrea Canciani
0501777598 pattern: Remove unused 'opaque' variable
opaque is never read, thus it can be removed.
2011-01-02 18:31:03 +01:00
Andrea Canciani
5d5d24c6a2 doc: Add documentation for the mesh API
The documentation content is in the comments of the functions.
2011-01-01 13:05:14 +01:00
Adrian Johnson
a8344f98e7 test: Add tests for mesh patterns
mesh-pattern tests a mesh pattern with non-opaque two overlapping
patches.

mesh-pattern-accuracy tests the accuracy of the color computed in each
point of a patch. It can point out defects in rasterizers which rely
on mesh subdivision only use the mesh shape instead of both shape and
color to decide when the tensor-product patches can be approximated
with Gouraud-shaded triangles.

mesh-pattern-conical is an example of how a conical gradient can be
approximated with a mesh pattern.

mesh-pattern-control-points tests a mesh pattern with control points
in non-default position to verify that their position affects the
color as expected.

mesh-pattern-fold tests a mesh pattern with a patch which folds along
both sides.

mesh-pattern-overlap tests a mesh pattern with a patch which folds
along just one side.

mesh-pattern-transformed tests a mesh pattern with non-identity
transform matrix.
2011-01-01 13:05:14 +01:00
Andrea Canciani
b164187ff6 test: Extend pattern-get-type and pattern-getters for mesh patterns
Add testing for mesh patterns to pattern-get-type and pattern-getters.
2011-01-01 13:05:13 +01:00
Andrea Canciani
96426fdf01 script: Add support for mesh patterns
Extend CairoScript with operators based on the mesh pattern API.
2011-01-01 13:05:13 +01:00
Adrian Johnson
c243f3ac9c pattern: Add public mesh pattern API
Add public funcions to create and define mesh patterns and getters to
examine their definition.
2011-01-01 13:05:13 +01:00
Adrian Johnson
30636206b0 pdf,ps: Add native mesh pattern support
PS and PDF have native support for mesh patterns, but they have encode
mesh points and colors in an appropriate binary stream.

cairo_pdf_shading_* functions implement the encoding, which is the
same for PDF and PS.
2011-01-01 13:05:13 +01:00
Andrea Canciani
8df122cb4b Add mesh gradient rasterizer
Add an implementation of a fast and reasonably accurate
non-antialiased mesh gradient rasterizer.
2011-01-01 13:05:12 +01:00
Andrea Canciani
f3c34887bd gstate: Disallow incomplete mesh gradient sources
Mesh gradients are constructed using multiple commands, bracketed by
explicit begin/end pairs. Using a mesh gradient inside a begin/end
pair is not allowed.
2011-01-01 13:05:12 +01:00
Adrian Johnson
ed24deaa2e mesh: Add mesh pattern type and enum values
Add the mesh pattern type and an error status to be used to report an
incorrect construction of the pattern.

Update the backends to make them ready to handle the new pattern type,
even if it cannot be created yet.
2011-01-01 13:05:12 +01:00
Andrea Canciani
19b840a904 Keep makefiles in alphabetical order
Recording surfaces were at first called meta surfaces. When the name
was changed, makefiles were not updated to keep alphabetical order.
2011-01-01 13:05:12 +01:00
Andrea Canciani
8f598dd69d quartz: Use native PDF blend modes
Quartz supports PDF blend modes since 10.4 and exposes Porter-Duff
compositing operators through the public API since 10.5.
2011-01-01 12:54:32 +01:00
Andrea Canciani
fabbc16253 quartz: Don't dynamically load unused functions
Remove an unused variable.
2011-01-01 12:54:32 +01:00
Andrea Canciani
1bc7d948c7 quartz: Clean up dynamically loaded functions
README indicates MacOSX 10.4 as a requirement for quartz and we are
directly using some functions that have been added to the public
CoreGraphics API in 10.4.

rop 10.3-specific workarounds and link to 10.4 API functions instead
of loading them at runtime.
2011-01-01 12:54:15 +01:00
Uli Schlachter
7f68461e0b Detach snapshots after flushing in cairo_surface_finish()
Flushing a surface can attach snapshots to it, thus we have to detach
the snapshots after the flush, to make sure they aren't leaked.

Signed-off-by: Uli Schlachter <psychon@znc.in>
2010-12-29 17:44:07 +01:00
Uli Schlachter
59ac884c60 Verify that surfaces leak no snapshots
Finished surfaces should own no snapshots, because finished surfaces
can't be used as sources, thus their snapshots would never be used.

When free'ing the surface in cairo_surface_destroy(), it should have
no snapshots, or they will be leaked.

Signed-off-by: Uli Schlachter <psychon@znc.in>
2010-12-29 17:16:51 +01:00
Chris Wilson
a4ae7d59be gl: Enable PLT symbol hiding for dispatch entries
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
2010-12-25 09:50:34 +00:00
Uli Schlachter
109fcb3950 XCB: Stop taking the xcb socket
This makes the xcb backend use the auto-generated xcb API instead of
hand-writing each request. This should also improve parallelism with non-cairo
threads that use the same xcb connection.

Big thanks to Andrea Canciani for taking a look at this and finding lots of good
improvements (especially finding xcb_send_request was great).

cairo-perf-trace and cairo-perf-diff-files between master
(6732dbf299) and this change:

 $ ./cairo-perf-diff-files ../master_perf ../xcb_no_socket_perf
old: master_perf
new: xcb_no_socket_perf
Speedups
========
  xcb-rgba                  evolution-0    23558.86 (23558.86 0.00%) -> 19338.78 (19338.78 0.00%):  1.22x speedup
▎
  xcb-rgba          poppler-bug-12266-0     98.43 (98.43 0.00%) ->  82.36 (82.36 0.00%):  1.20x speedup
▎
  xcb-rgba         gnome-terminal-vim-0    5518.08 (5518.08 0.00%) -> 4905.92 (4905.92 0.00%):  1.12x speedup
▏
  xcb-rgba    gnome-terminal-20090601-0    45648.46 (45648.46 0.00%) -> 41231.25 (41231.25 0.00%):  1.11x speedup
▏
  xcb-rgba         evolution-20090607-0    71643.69 (71643.69 0.00%) -> 66314.95 (66314.95 0.00%):  1.08x speedup
▏
  xcb-rgba                    poppler-0    3501.69 (3501.69 0.00%) -> 3322.26 (3322.26 0.00%):  1.05x speedup

Slowdowns
=========
  xcb-rgba       gnome-system-monitor-0    7500.01 (7500.01 0.00%) -> 7923.70 (7923.70 0.00%):  1.06x slowdown

  xcb-rgba        swfdec-youtube-full-0    26409.89 (26409.89 0.00%) -> 28430.76 (28430.76 0.00%):  1.08x slowdown
▏
  xcb-rgba gnome-system-monitor-20090821-0    34801.61 (34801.61 0.00%) -> 37891.14 (37891.14 0.00%):  1.09x slowdown

Signed-off-by: Uli Schlachter <psychon@znc.in>
2010-12-25 09:50:34 +00:00
Uli Schlachter
cf0a4ed862 xcb: Remove a wrong optimization
Clear surfaces with an alpha channel are already replaced with a
transparent color in gstate, so this code was never hit.

Clear surfaces without an alpha channel, can be replaced with solid
black only if the surface pattern has an extend other than
CAIRO_EXTEND_NONE.

Fixes the clear-source test for xcb.

Signed-off-by: Uli Schlachter <psychon@znc.in>
Reviewed-by: Andrea Canciani <ranma42@gmail.com>
2010-12-18 15:50:29 +01:00
Uli Schlachter
e6c3efdd65 xcb: Work around wrong extent computation in the X server
The X server calculates the bounding box for traps and then allocates
a temporary picture for this. When the X server calculates different
values than cairo got in extents->bounded, unbounded operators will
have wrong results. The X server only ever calculates bounds that are
larger than the correct values.

Fix this by explicitly clipping the drawing to the expected bounds.

Fixes clip-fill-{eo,nz}-unbounded and clip-stroke-unbounded.

Signed-off-by: Uli Schlachter <psychon@znc.in>
Reviewed-by: Andrea Canciani <ranma42@gmail.com>
2010-12-18 15:48:53 +01:00
Andrea Canciani
4e3eb5e8ed gl: Fix #include's to pass 'make check'
'make check' complains that:
Checking that private header files #include "some cairo header" first (or none)
cairo-gl-dispatch-private.h:#include <stddef.h>
Checking that source files #include "cairoint.h" first (or none)
cairo-gl-dispatch.c:#include "cairo-gl-private.h"
cairo-gl-info.c:#include "cairo-gl-private.h"
2010-12-17 19:41:57 +01:00
Uli Schlachter
10e58a4a16 Avoid some unneeded 'is_clear = FALSE'
When a drawing operator doesn't actually have any effect, we don't have to set
the surface's is_clear flag to FALSE.

Signed-off-by: Uli Schlachter <psychon@znc.in>
2010-12-15 15:38:36 +00:00
Alexandros Frantzis
2a632b1f54 gl: Remove GLEW from the build system and the source tree 2010-12-15 15:32:20 +00:00
Alexandros Frantzis
7cf9893546 gl: Replace GLEW by using the facilities provided by cairo-gl-info 2010-12-15 15:32:20 +00:00
Alexandros Frantzis
6373db8441 gl: Remove GL 1.x ARB shader implementation
Shaders for GL 1.x ARB are served by the same implementation as GL 2.x and therefore
a dedicated ARB implementation is not needed any more.
2010-12-15 15:32:20 +00:00
Alexandros Frantzis
a6facced8d gl: Use the GL core 2.0 shader implementation for both GL 1.x ARB and GL 2.x
The GL core 2.0 shader implementation can be used by both GL 1.x and 2.x
thanks to the dispatch table.
2010-12-15 15:32:20 +00:00
Alexandros Frantzis
cf518b29e0 gl: Use the dispatch table for calling ARB/EXT functions
Use the dispatch table for calling GL functions that can have multiple name
variants. Also, always use the core variant names for GL constants.
2010-12-15 15:32:20 +00:00
Alexandros Frantzis
ed862d3f7b gl: Add definitions for the core variant names of used GL constants
This allows us to use the core variant of the needed GL constants regardless of the
GL header version that is being used for compilation.
2010-12-15 15:32:20 +00:00
Alexandros Frantzis
e0ab932c61 gl: Embed the GL dispatch table in the cairo-gl context and initialize it. 2010-12-15 15:32:20 +00:00
Alexandros Frantzis
357c2f46a7 gl: Add infrastructure for calling GL functions using a dispatch table
Some GL functions can be called using different names depending on the
GL version and available extensions (ARB, EXT). The dispatch table
abstracts these differences and provides a uniform API for dealing with
these functions.
2010-12-15 15:32:20 +00:00
Alexandros Frantzis
cd7c0df2bb gl: Add functions to query GL version and extensions 2010-12-15 15:32:19 +00:00
Chris Wilson
07abd21a03 test/arc-infinite-loop: Random return value fun. 2010-12-15 15:32:19 +00:00
Andrea Canciani
65040d3e3f test: Add bug-extents
Add a test for the computation of approximate extents used by most
backends to esimate the region affected by drawing operations.

Based on:
http://lists.cairographics.org/archives/cairo/2010-December/021331.html
2010-12-14 22:18:27 +01:00
Chris Wilson
f10b3105d3 scaled-font: assert that we hold the scaled-font mutex when looking up glyphs
Holding the mutex over glyph lookup not only prevents multi-threaded
races between insertion and deletion that spell disaster for memory
integrity, but also implies that the glyph cache is frozen.

Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
2010-12-13 16:30:15 +00:00
Andrea Canciani
5eadc286d8 path: Silence warnings
gcc complains that:

cairo-path-fixed.c:400: warning: inlining failed in call to
  '_cairo_path_fixed_drop_line_to': call is unlikely and code size
  would grow
2010-12-13 11:09:20 +01:00
Andrea Canciani
c05135a348 test: Update ref images
The recent (and not-so-recent) changes in gradient code changed the
results of some tests involving gradients.

radial-gradient-* tests are marked XFAIL for pdf because poppler is
not sampling the color function with a sufficient frequency, but they
look correct in Adobe Reader.
2010-12-13 10:05:42 +01:00
Andrea Canciani
3cbe82fe58 ps,pdf: Deal with empty domain gradients.
If all the stops of the gradient have the same offset and the
pattern's extend mode is EXTEND_PAD, then we cannot use the stops'
domain as the interpolation parameter range because this would produce
a gradient with the same start and end objects.  Such ranges tickle
bad behaviour in rasterisers.

We replace the color function with an appropriate step function
defined on [0 1].

Fixes radial-gradient-one-stop for pdf and ps3.

Reviewed-by: M Joonas Pihlaja <jpihlaja@cc.helsinki.fi>
2010-12-13 10:05:11 +01:00
Andrea Canciani
36e58aea51 ps: Unify gradient emitters and support all extend modes.
To draw repeated gradients in ps, which only supports none and pad
extended gradients, we need an appropriate reparametrization of the
gradients that will cover the whole clip region without needing
repeats.

This commit adds support for the drawing of reflect/repeat-extended
radial gradients through native ps patterns, using pad-extension and
no fallbacks.

Reviewed-by: M Joonas Pihlaja <jpihlaja@cc.helsinki.fi>
2010-12-13 10:05:03 +01:00
Andrea Canciani
20ef062511 pdf: Unify gradient emitters and support all extend modes.
To draw repeated gradients in pdf, which only supports none and pad
extended gradients, we need an appropriate reparametrization of the
gradients that will cover the whole clip region without needing
repeats.

This commit adds support for the drawing of reflect/repeat-extended
radial gradients through native pdf patterns using pad-extension and
no fallbacks.

This fixes https://bugs.freedesktop.org/show_bug.cgi?id=28870

Reviewed-by: M Joonas Pihlaja <jpihlaja@cc.helsinki.fi>
2010-12-13 09:46:09 +01:00
Andrea Canciani
ca7f141dd7 quartz: Unify gradient construction and fix radial gradients.
Share code between linear and radial gradients, using
_cairo_gradient_pattern_box_to_parameter() instead of open coding the
parameter range computation.

As a side effect this fixes parameter range computation for radial
gradients, because the previous code assumed that the focal point was
inside the circles.

Reviewed-by: M Joonas Pihlaja <jpihlaja@cc.helsinki.fi>
2010-12-13 09:46:09 +01:00
Andrea Canciani
341e5b3246 pattern: Add a function to interpolate gradient objects.
This will be a common function used by the quartz, ps, and pdf
backends when rewriting EXTEND_REFLECT/REPEAT gradients in terms
of EXTEND_PAD gradients.

Reviewed-by: M Joonas Pihlaja <jpihlaja@cc.helsinki.fi>
2010-12-13 09:46:09 +01:00
Andrea Canciani
08cb6db520 pattern: Use pattern parameter range when analysing all gradients.
This patch adds support for analysing the transparency of a
radial gradient within some area of interest.  Before the code
would ignore the extents for radial gradients.  Linear gradients
now use _cairo_linear_pattern_box_to_parameter() allowing us
to remove the superfluous _extents_to_linear_parameter().

Reviewed-by: M Joonas Pihlaja <jpihlaja@cc.helsinki.fi>
2010-12-13 09:46:09 +01:00
Andrea Canciani
790837ac68 pattern: Compute a covering parameter range of a gradient for a box.
This makes it possible to compute the interpolation range needed to
correctly draw a gradient so that it covers an area of interest.

Reviewed-by: M Joonas Pihlaja <jpihlaja@cc.helsinki.fi>
2010-12-13 09:46:09 +01:00