Commit graph

4706 commits

Author SHA1 Message Date
Chris Wilson
c2ef45226d gstate: Check for an invalid matrix before cairo_transform()
Similar to the other checks that will generate an invalid matrix prior
to performing the operation.
2010-01-22 23:01:52 +00:00
Chris Wilson
22316a0c17 gstate: White space.
A couple of minor coding style violations.
2010-01-22 23:01:52 +00:00
Chris Wilson
29bedde904 pattern: Add convenience patterns for stock colours
By preallocating in our data segment a couple of solid patterns for the
stock colours, it becomes more convenient when using those in surface
operations, such as when clearing.
2010-01-22 23:01:51 +00:00
Chris Wilson
9eb98e1dc5 scaled-font: Use tight glyph bounds when determining overlap.
An issue that we currently have is that we have a pessimistic
false-positive rate when determining whether glyphs within a string
overlap. By using the tight bounds, the overlap detection is arguably
less accurate presuming pixel-aligned opacity masks but we make the
trade-off for performance.
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
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
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
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
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
Eric Anholt
e26e2c8cc4 [gl] Fix the color bits of CAIRO_CONTENT_ALPHA surface patterns to be 0.
Fixes surface-pattern-operator and alpha-similar.
2010-01-14 10:07:46 -08:00
Eric Anholt
520945603c [gl] Remove the special-casing of acquiring a pattern surface.
_cairo_pattern_acquire_surface() should do fine at it, and matches
what cairo-drm-i915 does.
2010-01-14 10:00:37 -08:00
Eric Anholt
dbf9faf823 [gl] Use GLSL for fill_rectangles when available.
Ultimately, we want all of our paths to use shaders when they are
exposed -- it brings us closer to GL 3.0 compatibility and it should
reduce the work that GL drivers have to do per operation to compute
the required hardware state.
2010-01-14 09:28:58 -08:00
Eric Anholt
57341cf5ac [gl] Use ADD instead of SOURCE when making a mask for overlapping glyphs.
The whole point of making the mask was to avoid overwriting one glyph
with the data from another.  Whoops.

Fixes ft-show-glyphs-positioning, text-rotate, overlapping-glyphs,
clip-text.
2010-01-13 14:28:23 -08:00
Eric Anholt
6e0a63102e [gl] Clear the current_target cache when binding a framebuffer in creation.
Failing to do so meant that we might not re-bind the framebuffer to
the correct one if we didn't follow up surface creation with drawing
to it.

Fixes many testcases.  Thanks to T. Zachary Laine for tracking down
that the current_target was the source of these issues.
2010-01-13 14:28:22 -08:00
T. Zachary Laine
ad0f4bee19 [gl] Clear the is_clear flag on the temporary glyph mask we create.
Normally is_clear is cleared by the caller of one of the 5 basic
entrypoints, but in this temporary surface usage nobody else can do it
for us.

Fixes ft-show-glyphs-table, user-font-rescale, and select-font-face.
2010-01-13 14:28:22 -08:00
T. Zachary Laine
384e50d858 [gl] Removed repeated lines of source
The two removed lines are redundant with code a few lines above them.
2010-01-13 14:28:22 -08:00
Eric Anholt
515ccb63a6 [gl] Fix the glyph cache full flush to really try again.
Previously, the initial error handling would dump through to software
fallback instead of retrying in the following code.
2010-01-13 14:28:22 -08:00
Chris Wilson
74ea4c9080 path: Do not remove anti-parallel line segments in case we are stroking
Bug 26010 - cairo_line_to optimizes away path segments
  http://bugs.freedesktop.org/show_bug.cgi?id=26010

As exercised by path-stroke-twice, we incorrectly optimise away a line
segment if the path doubled back upon itself. This is very reminiscent
of the optimisation bug for replacing curve-to with line-to.
2010-01-12 17:07:30 +00:00
Chris Wilson
4204605813 type1: Destroy the output stream.
mpsuzuki spotted that the output stream for the subset was not being
destroyed on the error path - on closer inspection, it wasn't destroyed
along the normal path either and may never have been correctly
initialised to NULL on an earlier error.

Reported-by: mpsuzuki@hiroshima-u.ac.jp
2010-01-08 11:58:15 +00:00
M Joonas Pihlaja
3ae9d04c6d [stroker] Fix off-by-one memory allocation in _tessellate_fan().
The number of points in a triangle fan was miscomputed because
it was computing the number of line segments rather than points
in the fan.  Now we include the final point of the fan correctly
in the count.

This fixes https://bugs.webkit.org/show_bug.cgi?id=33071 as
reported by Benjamin Otte.  A derived test case was not added
to the cairo test suite since the bug is difficult to trigger in
a reliable way which causes visible results (as opposed to
silent heap corruption.)

The easiest way of triggering the bug is to stroke a line
using a large line width and round caps or joins.
2010-01-01 20:13:33 +02:00
Chris Wilson
a0ea0b63fd arc: Just emit a line-to if radius is zero.
In order to be consistent with the semantics of cairo_arc() using a
radius of 0 should simply degenerate into a line-to.

Reported-by: Benjamin Berg
2009-12-30 16:21:50 +00:00