Commit graph

7823 commits

Author SHA1 Message Date
Chris Wilson
ca02b51ef6 test: Add an xcb surface source test 2010-01-22 23:01:51 +00:00
Chris Wilson
f0678fb70c test: Tweak aligned of text-rotate
Reset the rotation for every quadrant so that the starting rectangles
are pixel-aligned.
2010-01-22 23:01:51 +00:00
Chris Wilson
2edd2adafc test: Exercise scan converters with large rounded rectangles.
Having added a specialised scan converter on the premise that it should
be better at handling rounded rectangles, ensure that they are indeed
rendered correctly.
2010-01-22 23:01:51 +00:00
Chris Wilson
5187501e99 test: Add --track-origins=yes to valgrind flags.
Enable origin tracking by default for make check-valgrind. This is
slower and consumes more memory than regular valgrind, but the
additional information provided about the source of the uninitialised
data is often invaluable.
2010-01-22 23:01:51 +00:00
Chris Wilson
3a5d71c431 pattern: An EXTEND_NONE surface is not opaque if we sample outside
Fixes test/clear-source as proposed by Benjamin Otte.
2010-01-22 23:01:51 +00:00
Chris Wilson
b07de014eb spans: Add a rectangular scan converter
This is a highly specialised scan converter for the relatively common
case of where the input geometry is known to be a series of rectangles.
Generally not device aligned (or else we would most likely have chosen
an even higher performance path that does not require a coverage mask),
this optimised converter can simply compute the analytical coverage by
utilising a special case Bentley-Ottmann intersection finder.
2010-01-22 23:01:51 +00:00
Chris Wilson
e49855497e spans: Add a Bentley-Ottmann variant on the Tor scan converter
This variant uses the Bentley-Ottmann algorithm to only maintain the
active edge list upon edge events and so can efficiently skip areas
where no change occurs. This means that it can be much quicker than the
Tor algorithm (which is still used to compute the coverages from the
active edges) for geometries consisting of long straight lines with few
intersections. However due to the computational overhead of the
Bentley-Ottmann event processing, for dense curvy paths, simply updating
the active edge list in sync with computing the coverages is a win. Due
to advantageous adaptive step size, the scan converter can be run at a
much higher subsampling with little extra overhead compared with Tor,
currently it uses a 256x256 subsampling grid to avoid any impedance
mismatch with path precision.

Given the current status of implementations, this scan converter [botor]
is likely to be advantage where detecting large regions of unchanged
span data will result in improved performance, for instance the drm
backends which convert the scan data into rectangles.
2010-01-22 23:01:51 +00:00
Chris Wilson
424dcf2963 boxes: Enable generation of boxes from rectilinear polygons.
Extend the special case rectilinear tessellator to also produce boxes.
2010-01-22 23:01:51 +00:00
Chris Wilson
b83f1c347d boxes: Enable tessellation
Extend the special case rectangular tessellator to handle generation of
cairo_boxes_t.
2010-01-22 23:01:51 +00:00
Chris Wilson
43beaa5873 boxes: Efficient storage for an array of cairo_box_t.
Currently we use cairo_traps_t to also pass around arrays of boxes. This
is woefully inefficient in terms of storage, but also means that we
repeatedly have to verify that the traps are a set of boxes. By
explicitly passing around a cairo_boxes_t we avoid the semantic loss.

This will be heavily used in pending commits.
2010-01-22 23:01:51 +00:00
Chris Wilson
ae25f1c360 Alter definition of cairo_composite_rectangles_t
This is a more useful definition that is able to individually track the
rectangles that compose the composite operation. This will be used by
the specialist compositors as a means to perform the common extents
determination for an operation.
2010-01-22 23:01:51 +00:00
Chris Wilson
9cd9137843 spans: Pass multiple rows of identical spans to the renders.
It is quite common amongst our geometry to have rows of repeated span
data, for example a rounded rectangle will have repeating data between
the top and bottom rounded corners. By passing the repeat length to the
renderers, they may be able to use that information more efficiently,
and the scan converters can avoid recomputing the same span data.
2010-01-22 23:01:51 +00:00
Chris Wilson
a04873c077 qt: Trivial compile fix for boilerplate. 2010-01-22 23:01:51 +00:00
Chris Wilson
0f09349dd8 gl: Exercise Window destinations with boilerplate
Add a gl-window boilerplate target to exercise using GL to render to a
visible Drawable -- for instance, a window has a different coordinate
system to a framebuffer...
2010-01-22 23:01:51 +00:00
Chris Wilson
ccea7fd7c1 gl: Port to cairo_device_t 2010-01-22 23:01:50 +00:00
Chris Wilson
3acd520c9d xml: Port to cairo_device_t 2010-01-22 23:01:50 +00:00
Chris Wilson
49ab86772a script: Port cairo_script_context_t to cairo_device_t
Use the unifying cairo_device_t for cairo_script_context_t and replace.
2010-01-22 23:01:50 +00:00
Chris Wilson
f617d5fc98 Add cairo_device_t
The device is a generic method for accessing the underlying interface
with the native graphics subsystem, typically the X connection or
perhaps the GL context. By exposing a cairo_device_t on a surface and
its various methods we enable finer control over interoperability with
external interactions of the device by applications. The use case in
mind is, for example, a multi-threaded gstreamer which needs to serialise
its own direct access to the device along with Cairo's across many
threads.

Secondly, the cairo_device_t is a unifying API for the mismash of
backend specific methods for controlling creation of surfaces with
explicit devices and a convenient hook for debugging and introspection.

The principal components of the API are the memory management of:

  cairo_device_reference(),
  cairo_device_finish() and
  cairo_device_destroy();

along with a pair of routines for serialising interaction:

  cairo_device_acquire() and
  cairo_device_release()

and a method to flush any outstanding accesses:

  cairo_device_flush().

The device for a particular surface may be retrieved using:

  cairo_surface_get_device().

The device returned is owned by the surface.
2010-01-22 23:01:50 +00:00
Chris Wilson
82f8aa548d Recursive mutex.
Implement a recursive mutex which will be needed for cairo_device_t.
In particular only pthreads by default is a non-recursive mutex (to my
knowledge) - both win32 critical sections and mutexes on Quartz are
recursive.
2010-01-22 23:01:50 +00:00
Chris Wilson
d2f251f84b configure: Globally define AC_GNU_SOURCE
We were using _GNU_SOURCE throughout the codebase, so simply define it
once during configure. This is the easiest method to enable recursive
mutexes using pthreads, as required in a pending patch.
2010-01-22 23:01:50 +00:00
Chris Wilson
934d0d0d65 Real zero-copy cow snapshotting
The first iteration of COW snapshotting always made an initial copy when
the snapshot was requested (and reused that copy until the surface was
modified). However, in a few circumstances we can avoid even that copy
so long as the surface is still alive and unmodified between the
snapshotting and its use. In order to do so, we need a new proxy surface
that can automatically perform the copy if the target should disappear
prior to use.
2010-01-22 23:01:50 +00:00
Chris Wilson
6b3e19aa43 Remove content matching from snapshot lookup.
This was never used, so remove the complexity from the interface.
2010-01-22 23:01:50 +00:00
Chris Wilson
dc8290814c Add subsurface.
A subsurface is a region of another surface that may be used either to
restrict the writable area of a context or the readable extents of a
source. Whilst writing, access to the exterior of the subsurface is
prevented via clipping and when used as a source reads from the exterior
of the subsurface are governed via the extend mechanism of the pattern.
2010-01-22 23:01:50 +00:00
Chris Wilson
b8eacbfae1 Add surface-offset internal API.
This is a simplified version of the wrapping surface where the target
surface is just a subsurface onto which we wish to draw the current
operation. In particular this is useful for the subsurface API as well
as fallbacks.
2010-01-22 23:01:50 +00:00
Chris Wilson
f2c32d0183 Unify the two freed object pools
Discard some duplicate code and shared a single freed object pointer
pool between the pattern and clip.
2010-01-22 23:01:50 +00:00
Chris Wilson
cfd204824f Constify stroke style and matrices.
As a simple step to ensure that we do not inadvertently modify (or at least
generate compiler warns if we try) user data, mark the incoming style
and matrices as constant.
2010-01-22 23:01:49 +00:00
Benjamin Otte
3e17c559b0 [test] Add pthread-same-source test
Multiple threads render using the same source surface, but with
different extend and filter.
2010-01-22 23:01:49 +00:00
Benjamin Otte
30a12f802f [test] Add a simple multithreading test 2010-01-22 23:01:49 +00:00
Benjamin Otte
038829eb84 [test] Add new test checking is_clear is handled properly
This test does various operations with a clear source surface with
various content types.
The idea is to make sure optimizations done when surface->is_clear ==
TRUE only happen in the proper cases.
2010-01-22 23:01:49 +00:00
Chris Wilson
bf7fb4e0e0 script: Handle cache allocation failure more gracefully
Instead of bailing out if we cannot store the glyph cache on the font,
simply do not store the glyph cache on the font...
2010-01-22 23:01:49 +00:00
Chris Wilson
2b312806f1 script: Free the correct pattern after failure.
The error path attempted to free the resolved pattern which it had just
discovered was NULL and not the locally allocated pattern...
2010-01-22 23:01:49 +00:00
Chris Wilson
bc2d0ad114 script: Permit surface operations on the context
By implicitly reference the target of the context instead, i.e.
this reduces the use of:

  /target get (example.png) write-to-png pop

as a common idiom where the context is kept on the stack and the surface
forgotten.
2010-01-22 23:01:49 +00:00
Chris Wilson
411c09eed7 perf: Enable a surface cache for perf-trace
Real applications that control their Drawable externally to Cairo are
'disadvantaged' by cairo-perf-trace when it creates a similar surface
for each new instance of the same Drawable. The difficulty in
maintaining one perf surface for every application surface is that the
traces do not track lifetimes for the application surfaces, so we would
just accumulate stale surfaces. The surface cache takes a different
approach and returns the same surface for each active Drawable, and
maintains a hold-over of the MRU 16 surfaces. This achieves 60-80% hit
rate with firefox, which is probably as good as can be expected.
Obviously for double-buffered applications we only every draw to freshly
created surfaces (and Gtk+ bypasses cairo to do the final copy -- the
ideal application would just use a push-group for double buffering, in
which case we would capture and replay the entire expose event).

To enable use of the surface cache whilst replaying use -c:

  ./cairo-perf-trace -c firefox-talos-gfx
2010-01-22 23:01:46 +00:00
Chris Wilson
c50c8b90c0 Move _cairo_error() to a standalone header
A pending commit will want to include some utility code from cairo and
so we need to extricate the error handling from the PLT symbol hiding.
2010-01-22 22:30:43 +00:00
Chris Wilson
558f950170 surface-wrapper: Avoid copying patterns and clips unless transformed.
An older variant of the fixes for moving the device transformation out
of the surface layer, but languished in a side branch. The only benefit
of this patch is that it avoids the copy where possible.
2010-01-22 22:30:43 +00:00
Chris Wilson
8f69481722 gitignore: refresh
Add forgotten local targets to .gitignore
2010-01-22 22:30:43 +00:00
Eric Anholt
5914e99572 [gl] Cache a temporary glyph compositing mask for reuse later.
Cuts firefox-talos-gfx time from 56 seconds to 43 seconds.
2010-01-22 09:21:36 -08:00
Eric Anholt
1bf0f64ee7 [gl] Composite component-alpha glyphs directly instead of through a mask.
Cuts gnome-terminal-vim time from 58 seconds to 20.
2010-01-22 09:00:29 -08:00
Eric Anholt
12d521df8a [gl] Use GL_RGBA textures even for CAIRO_CONTENT_COLOR.
When the texture is GL_RGB, GL_CLAMP_TO_BORDER (EXTEND_NONE) fills the
border color alpha channel with 1, when the whole reason we were using
the border color was to get a color and alpha of 0.  We're forced to
use GL_RGBA textures and do extra work to fill in the alpha channel of
them to 1 to get cairo's desired behavior.

This fixes a failure in rotate-image-surface-paint and 4 other
testcases.  No performance difference in firefox-talos-gfx.
2010-01-21 13:19:17 -08:00
Eric Anholt
e316cb9db5 [gl] Add support for component-alpha glyph rendering.
This is done using a mask and the two-pass trick I did for EXA.  Fixes
text-antialias-subpixel.
2010-01-21 12:43:20 -08:00
Eric Anholt
ceeb7e7e70 [gl] Use the UNSUPPORTED() macro in more places for fallback debugging. 2010-01-20 11:23:20 -08:00
Andrea Canciani
5d9e2fd84b [quartz] Leftbehind change from a39075c88f
This commit completes the change in a39075c88f.
It removes unused variables and corrects the extents rect computation.
2010-01-15 16:30:07 +01:00
Chris Wilson
6950b233e4 qt: Make flush() robust.
Hanno Meyer-Thurow reported in

  http://bugs.freedesktop.org/show_bug.cgi?id=26063
  [PATCH] various fixes to cairo-qt

a few issues related to _cairo_qt_surface_flush() where firefox was
crashing after being built to use cairo-qt.

This is an amalgam of those patches that hopefully address the issue.
2010-01-15 14:27:58 +00:00
Chris Wilson
4e315d8472 pattern: Premultiply color-stop when converting to solid
Fixes: test/linear-uniform
       https://bugzilla.mozilla.org/show_bug.cgi?id=539165
       Bug 539165 - gradients with a single stop do not have their color
                    multiplied by the alpha.

As reported by Jeff Muizelaar, we regressed in 2d790daa as the
color-stops are not premultiplied and so could not be treated as an
ordinary cairo_color_t. Instead we have to create a intermediate
cairo_color_t from the original values in order for the
premultiplication to be performed.
2010-01-15 12:25:53 +00:00
Chris Wilson
f40560a9bb test: Add linear-uniform
Jeff reported a regression found by Mozilla whereby a uniform gradient
was not being premultiplied on conversion to a solid pattern.

  https://bugzilla.mozilla.org/show_bug.cgi?id=539165
  [Bug 539165] gradients with a single stop do not have their color
               multiplied by the alpha.
2010-01-15 12:25:53 +00:00
Chris Wilson
e22c02dbae test: Add degenerate-arcs
A simple test to ensure that using degenerate-arcs such as when drawing
a rounded rectangle with radii=0 construct a proper path.
2010-01-15 12:25:53 +00:00
Andrea Canciani
a39075c88f [quartz] Fix generic masking
Masking with unbounded operators was broken because an incorrect
transformation was applied to inverted mask used for the fixup.
2010-01-15 11:04:28 +01:00
Andrea Canciani
27701ed844 [quartz] Approximate dense dashing patterns
Quartz doesn't try to approximate dash pattern even if they are well
beyond suface sampling frequency. Approximating dash patterns when their
density is too high avoids looping indefinitely in these degenerate cases.
2010-01-15 11:04:27 +01:00
Andrea Canciani
ad7ab00c10 [quartz] Improve A8 and A1 support
Use A8 images as alpha-only masks intread of greyscale images.
Add support to A1 images (they were ignored before).
2010-01-15 11:04:27 +01:00
Adrian Johnson
f3b3a5c43f Fix bug in _cairo_ft_index_to_ucs4
Previously it would miss the first character causing the space glyph to
return 0x00A0 instead of 0x0020.
2010-01-15 07:47:30 +10:30