Commit graph

454 commits

Author SHA1 Message Date
Andrea Canciani
df7829e2cc surface: Make map_to_image return cairo_image_surface_t*
This makes it easier to check that the funciton is returning the
correct type of surfaces.
2012-05-26 16:06:26 +02:00
Andrea Canciani
10c0a1c68c surface: Define private map/unmap functions
Cairo backends often need to map/unmap to a raster surface but they
don't care about the pixel format, as Pixman will be doing the format
handling.

Cairo users cannot know how to access the raw data if the format is
invalid.

The two different scenarios call for different guarantees on the
returned surface.

The private map/unmap functions also makes it possible to simply
return the status upon unmapping.
2012-05-26 16:06:21 +02:00
Uli Schlachter
3bff546ebe c_surface_set_mime_data: Remove duplicate "Since"
This fixes the following message from "make check":

./cairo-surface.c (1192): ERROR: cairo_surface_set_mime_data: Duplicate 'Since'
field

Signed-off-by: Uli Schlachter <psychon@znc.in>
2012-05-09 16:59:58 +02:00
Chris Wilson
db4ee947c3 Split finish into multiple stages
In order to handle the snapshot copy-on-write losing a race with another
thread using the snapshot as a source, we may find the target acquires a
fresh reference as we attempt to finalize it.

Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
2012-05-01 16:55:22 +01:00
Chris Wilson
7eb33099d3 snapshot: Perform the cow under a mutex
In order to prevent a race between concurrent destroy and use in another
thread, we need to acquire a reference to the snapshot->target under a
mutex. Whilst we hold that reference, it prevents the internal destroy
mechanism from freeing the memory we are using (if we have a pointer to
the original surface) and the client drops their final reference.

Oh boy, talk about opening a can of worms...

Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
2012-04-27 14:10:50 +01:00
Chris Wilson
455b4de1fc image: Allow a snapshot to steal the original memory upon finish
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
2012-04-27 11:41:41 +01:00
Chris Wilson
57cfdfd979 Split cairo-list into struct+inlines
References: https://bugs.freedesktop.org/show_bug.cgi?id=48577
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
2012-04-19 13:17:29 +01:00
Chris Wilson
306117ea7c Split cairo-recording-surface-private into struct+inlines
References: https://bugs.freedesktop.org/show_bug.cgi?id=48577
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
2012-04-19 12:51:03 +01:00
Chris Wilson
0770dda52b Split cairo-clip-privates into struct+inlines
References: https://bugs.freedesktop.org/show_bug.cgi?id=48577
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
2012-04-19 12:19:19 +01:00
Nis Martensen
bf5adaf394 doc: add returns statement to cairo_surface_supports_mime_type
Signed-off-by: Uli Schlachter <psychon@znc.in>
2012-04-12 10:23:28 +02:00
Andrea Canciani
1d3d64469f doc: Add "since" tag to documentation
The following Python script was used to compute "Since: 1.X" tags,
based on the first version where a symbol became officially supported.

This script requires a concatenation of the the cairo public headers
for the officially supported beckends to be available as
"../../includes/1.X.0.h".

from sys import argv
import re

syms = {}

def stripcomments(text):
    def replacer(match):
        s = match.group(0)
        if s.startswith('/'):
            return ""
        else:
            return s
    pattern = re.compile(
        r'//.*?$|/\*.*?\*/|\'(?:\\.|[^\\\'])*\'|"(?:\\.|[^\\"])*"',
        re.DOTALL | re.MULTILINE
    )
    return re.sub(pattern, replacer, text)

for minor in range(12,-2,-2):
    version = "1.%d" % minor
    names = re.split('([A-Za-z0-9_]+)', stripcomments(open("../../includes/%s.0.h" % version).read()))
    for s in names: syms[s] = version

for filename in argv[1:]:
    is_public = False
    lines = open(filename, "r").read().split("\n")
    newlines = []
    for i in range(len(lines)):
        if lines[i] == "/**":
            last_sym = lines[i+1][2:].strip().replace(":", "")
            is_public = last_sym.lower().startswith("cairo")
        elif is_public and lines[i] == " **/":
            if last_sym in syms:
                v = syms[last_sym]
                if re.search("Since", newlines[-1]): newlines = newlines[:-1]
                if newlines[-1].strip() != "*": newlines.append(" *")
                newlines.append(" * Since: %s" % v)
            else:
                print "%s (%d): Cannot determine the version in which '%s' was introduced" % (filename, i, last_sym)
        newlines.append(lines[i])

    out = open(filename, "w")
    out.write("\n".join(newlines))
    out.close()
2012-03-29 11:03:18 +02:00
Andrea Canciani
79740139e0 doc: Do not use the '@' prefix on some tags
Make the 'Since' and 'Returns' tags consistent by removing the '@'
prefix.

Fixes some "missing 'Since' field" warnings.
2012-03-29 11:03:18 +02:00
Andrea Canciani
7f635e4ead doc: Make doc ids more consistent my always putting ':' after them
This makes the documentations comments more consistent and fixes many
reports of 'invalid doc id'.
2012-03-29 11:03:18 +02:00
Andrea Canciani
f717341ab9 doc: Make documentation comments symmetric
Documentation comments should always start with "/**" and end with
"**/". This is not required by gtk-doc, but it makes the
documentations formatting more consistent and simplifies the checking
of documentation comments.

The following Python script tries to enforce this.

from sys import argv
from sre import search

for filename in argv[1:]:
    in_doc = False
    lines = open(filename, "r").read().split("\n")
    for i in range(len(lines)):
        ls = lines[i].strip()
        if ls == "/**":
            in_doc = True
        elif in_doc and ls == "*/":
            lines[i] = " **/"
        if ls.endswith("*/"):
            in_doc = False

    out = open(filename, "w")
    out.write("\n".join(lines))
    out.close()

This fixes most 'documentation comment not closed with **/' warnings
by check-doc-syntax.awk.
2012-03-29 11:03:18 +02:00
Chris Wilson
1952fec829 surface: Relax assertion about not rendering to a snapshot
Recently I began using the surface->snapshot_of member of a subsurface
to cache a target representation of the current subsurface. More
recently, I discovered this caused an assertion failure in epiphany, and
probably other GTK3 based programs.

Throwaway the assertion and trust that the programmer doesn't make any
mistakes...

Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
2012-03-08 15:20:21 +00:00
Chris Wilson
a49a26f961 gl: Various fixes for glyphs
Not 100% improvement, there are still a variety of failures with
GLXWindows, but getting there. At least it fixes more things than its
breaks...

Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
2012-02-29 10:27:39 +00:00
Chris Wilson
5b107587e7 xlib: Correct the device-offset applied to the map-to-image result
A typo, a typo surely, to use extents->y twice instead of the more
normal x, y.

Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
2012-02-22 15:13:26 +00:00
Chris Wilson
ae3319890e win32: Rebase on the new compositor infrastructure
Try and undo all the damage that has acrued over the years by plugging
into the compositor pipeline.

References: https://bugs.freedesktop.org/show_bug.cgi?id=42739
References: https://bugs.freedesktop.org/show_bug.cgi?id=42821
References: https://bugs.freedesktop.org/show_bug.cgi?id=33081
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
2012-02-15 14:37:11 +00:00
Chris Wilson
8bea52bb0b Add preliminary damage tracking
This is initially based around the requirements for handling internal
fallbacks to the image compositor and reducing the number of pixels
required to be transferred.

Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
2012-02-15 14:21:00 +00:00
Chris Wilson
2061cd81f2 Replace the ad-hoc surface unwrappers with a function pointer
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
2012-02-09 13:01:17 +00:00
Adrian Johnson
0f40cdea1b api: add cairo_surface_supports_mime_type
to allow querying if a surface supports a particular mime type.
2012-01-19 19:09:10 +10:30
Andrea Canciani
a2f419b546 rectangle: Implement _cairo_rectangle_contains_rectangle()
And reuse it.
2012-01-15 18:25:57 +01:00
Uli Schlachter
9ec5e9fee6 xcb: Fixup some internal state in set_{drawable,size}
Signed-off-by: Uli Schlachter <psychon@znc.in>
2011-12-05 22:48:56 +01:00
Chris Wilson
763d98071e surface: Bump reference count around finish
In order to handle reference cycles during finish (through snapshots) we
need to bump the reference on the surface first.

Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
2011-11-23 17:35:39 +00:00
Chris Wilson
b2aa687de6 spans: Propagate internal status when retrieving the clip surface
Including the information that there is nothing to do due to being
all-clipped-out.

Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
2011-10-12 14:50:41 +01:00
Uli Schlachter
a419d00fbe flush: Detach mime data
Drawing directly to a surface has to be surrounded with cairo_surface_flush()
and cairo_surface_mark_dirty().

However, if the surface has mime data associated, this would hit the following
assert:

lt-cairo-test-suite: cairo-surface.c:1381: cairo_surface_mark_dirty_rectangle:
Assertion `! _cairo_surface_has_mime_data (surface)' failed.

This is now fixed by detaching all mime data in cairo_surface_flush().

Buzilla: https://bugs.freedesktop.org/show_bug.cgi?id=41409

Fixes: create-from-png, create-from-png-stream

Signed-off-by: Uli Schlachter <psychon@znc.in>
2011-10-09 09:22:26 +02:00
Uli Schlachter
960ae5ab2e Make the new mime-surface-api succeed
When removing mime data, _cairo_user_data_array_set_data () is called with a
NULL argument. This leaves behind an entry with key == NULL in the user data
array. Skip those entries instead of dereferencing NULL.

(The NULL entry in the array let's us avoid moving data around and/or doing a
memory allocation later, so I guess it might be a good idea to keep that)

Signed-off-by: Uli Schlachter <psychon@znc.in>
2011-10-04 21:00:23 +02:00
Chris Wilson
af9fbd176b Introduce a new compositor architecture
Having spent the last dev cycle looking at how we could specialize the
compositors for various backends, we once again look for the
commonalities in order to reduce the duplication. In part this is
motivated by the idea that spans is a good interface for both the
existent GL backend and pixman, and so they deserve a dedicated
compositor. xcb/xlib target an identical rendering system and so they
should be using the same compositor, and it should be possible to run
that same compositor locally against pixman to generate reference tests.

Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>

P.S. This brings massive upheaval (read breakage) I've tried delaying in
order to fix as many things as possible but now this one patch does far,
far, far too much. Apologies in advance for breaking your favourite
backend, but trust me in that the end result will be much better. :)
2011-09-12 08:29:48 +01:00
Andrea Canciani
04a7bad923 surface: Fix make check
cairo_surface_map_to_image() and cairo_surface_unmap_image() are
called by cairo-surface-observer but they are not slim_hidden:

Checking .libs/libcairo.so for local PLT entries
00000000002e27a8  0000019d00000007 R_X86_64_JUMP_SLOT
     000000000005df30 cairo_surface_unmap_image + 0
00000000002e2b90  0000026100000007 R_X86_64_JUMP_SLOT
     000000000005f5c0 cairo_surface_map_to_image + 0
2011-09-02 12:45:49 +02:00
Chris Wilson
c715d52af5 snapshot: restore the order of detach vs callback
Mucking around in 99fa5ff6c2, I tweaked the order to mark the
snapshot as detached before calling the callback. xcb relies on the old
ordering so that it can correctly update its fallbacks.

Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
2011-08-15 12:08:27 +01:00
Chris Wilson
eee66899cd Introduce cairo_surface_observer_t for performance analysis
Another logging passthrough surface that records the style of operations
performed trying to categorise what is slow/fast/important.

In combination with perf/cairo-analyse-trace it is very useful for
understanding what a trace does. The next steps for this tool would be
to identify the slow operations that the trace does. Baby steps.

This should be generally useful in similar situations outside of perf/
and should be extensible to become an online performance probe.

Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
2011-08-14 20:54:53 +01:00
Chris Wilson
d4a32baed1 surface: Rearrange nothing_to_do? to catch OVER + clear source
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
2011-08-14 14:49:56 +01:00
Chris Wilson
99fa5ff6c2 snapshot: Defer acquisition
Fixes 'xlib-expose-event' but triggers an infinite loop in self-copy.

Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
2011-08-14 12:37:56 +01:00
Chris Wilson
73b87334a4 surface: Don't modify operator
Specifically don't transform SOURCE into a CLEAR as the paginated
backends may not be able to handle the new operator.

Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
2011-08-13 11:50:27 +01:00
Chris Wilson
dea24ef012 surface: propagate internal statuses
They are internal and used as such, but we still need to prevent them
from escaping into the public domain.

Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
2011-08-13 11:34:31 +01:00
Chris Wilson
e849e7c929 image: move surface definition to new header for subclassing
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
2011-08-13 09:54:28 +01:00
Uli Schlachter
5a26018313 map_to_image: Verify the given extents
User shouldn't be able to use extents that are not completely inside of the
surface's extents.

Signed-off-by: Uli Schlachter <psychon@znc.in>
2011-08-08 21:06:09 +02:00
Nis Martensen
0e135d9f5a Mark the new API as such
cairo_surface_create_similar_image, cairo_surface_map_to_image and
cairo_surface_unmap_image were added in
a69335a84e.
2011-08-05 08:47:52 +02:00
Uli Schlachter
95d6235bbe Clarify the API docs for the newest functions
Recently cairo_surface_create_similar_image(), cairo_surface_map_to_image() and
cairo_surface_unmap_image() were introduced. However, the documentation was
slightly misleading and recommended a wrong usage.

Signed-off-by: Uli Schlachter <psychon@znc.in>
2011-08-04 21:18:13 +02:00
Uli Schlachter
51faa5a1c2 surface_unmap_image: Fix fallback
The fallback code assumed that the caller mapped the complete surface to an
image. If only parts of a surface were mapped, the code didn't correctly
translate and clip its operations.

Fixes map-bit-to-image for xlib-xcb and improves the result for recording.

Thanks to Chris Wilson for some simplifications.

Signed-off-by: Uli Schlachter <psychon@znc.in>
2011-08-04 21:10:09 +02:00
Andrea Canciani
e04e368748 Remove useless checks for NULL before freeing
This patch has been generated by the following Coccinelle semantic patch:
// Remove useless checks for NULL before freeing
//
// free (NULL) is a no-op, so there is no need to avoid it

@@
expression E;
@@
+ free (E);
+ E = NULL;
- if (unlikely (E != NULL)) {
-   free(E);
(
-   E = NULL;
|
-   E = 0;
)
   ...
- }

@@
expression E;
@@
+ free (E);
- if (unlikely (E != NULL)) {
-   free (E);
- }
2011-07-31 16:46:36 +02:00
Andrea Canciani
b39d3d4b53 surface: Set errors through _cairo_surface_set_status()
The status should never be set directly. Instead, it should be set by
_cairo_surface_set_status().
2011-07-31 13:05:22 +02:00
Andrea Canciani
2fd20e5c1e surface: Check image parameter in cairo_surface_unmap_image()
The image argument must be a cairo-image surface.
2011-07-27 09:44:26 +02:00
Chris Wilson
a69335a84e API: map-to-image and create-similar-image
A common requirement is the fast upload of pixel data. In order to
allocate the most appropriate image buffer, we need knowledge of the
destination. The most obvious example is that we could use a
shared-memory region for the image to avoid the transfer cost of
uploading the pixels to the X server. Similarly, gl, win32, quartz...

The other side of the equation is that for manual modification of a
remote surface, it would be more efficient if we can create a similar
image to reduce the transfer costs. This strategy is already followed
for the destination fallbacks and this merely exposes the same
capability for the application fallbacks.

Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
2011-07-26 14:55:58 +01:00
Chris Wilson
b132fae5e8 clip: Rudimentary support for clip-polygon extraction
Step 1, fix the failings sighted recently by tracking clip-boxes as an
explicit property of the clipping and of composition.

Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
2011-07-19 21:14:34 +01:00
Uli Schlachter
cc3e4c6ec9 Handle CAIRO_STATUS_DEVICE_FINISHED in switches
Fixes all warnings that looked like this:

warning: enumeration value 'CAIRO_STATUS_DEVICE_FINISHED' not handled in switch

Signed-off-by: Uli Schlachter <psychon@znc.in>
2011-07-09 11:19:49 +02:00
Uli Schlachter
d938e74446 xcb,xlib,surface: Check for too small sizes
This adds checks for negative sizes in cairo_surface_create_similar() and for
non-positive sizes in all public surface-creation functions in the xcb and xlib
backends.

X11 doesn't allow 0 as width/height, so if anyone claims to have a drawable of
that size, he can't be right. However, cairo allows such sizes which is why
create_similar doesn't reject 0.

Signed-off-by: Uli Schlachter <psychon@znc.in>
2011-06-24 15:24:09 +02:00
Chris Wilson
9669b300a0 surface: Don't pass INT_UNSUPPORTED to _cairo_surface_set_error
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
2011-03-02 18:31:28 +00:00
Benjamin Otte
ea0595c5ec surface: Actually return a value from _cairo_surface_set_error()
This is what happens when there's too many warnings on the screen: I
don't see the important ones. Oops.
2011-02-18 19:06:16 +01:00
Benjamin Otte
056250775f surface: Allow NOTHING_TO_DO as a valid error for now
Lots of code relies on it, so we'd better not break that immediately. ;)
2011-02-18 18:52:11 +01:00