cairo/test/self-copy.c

90 lines
2.7 KiB
C
Raw Normal View History

/*
* Copyright © 2005 Red Hat, Inc.
*
* Permission to use, copy, modify, distribute, and sell this software
* and its documentation for any purpose is hereby granted without
* fee, provided that the above copyright notice appear in all copies
* and that both that copyright notice and this permission notice
* appear in supporting documentation, and that the name of
* Red Hat, Inc. not be used in advertising or publicity pertaining to
* distribution of the software without specific, written prior
* permission. Red Hat, Inc. makes no representations about the
* suitability of this software for any purpose. It is provided "as
* is" without express or implied warranty.
*
* RED HAT, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS
* SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
* FITNESS, IN NO EVENT SHALL RED HAT, INC. BE LIABLE FOR ANY SPECIAL,
* INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER
* RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
* OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR
* IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*
* Author: Owen Taylor <otaylor@redhat.com>
*/
#include <math.h>
#include "cairo-test.h"
#include <stdio.h>
#define SIZE 40
cairo_test_t test = {
"self-copy",
"Test copying from a surface to itself with a clip",
SIZE, SIZE
};
static cairo_test_status_t
draw (cairo_t *cr, int width, int height)
{
cairo_pattern_t *pattern;
cairo_matrix_t matrix;
/* Paint a diagonal division as a test image */
cairo_set_source_rgb (cr, 1, 1, 1); /* White */
cairo_paint (cr);
cairo_move_to (cr, SIZE, 0);
cairo_line_to (cr, SIZE, SIZE);
cairo_line_to (cr, 0, SIZE);
cairo_set_source_rgb (cr, 0, 0, 0);
cairo_fill (cr);
/* Create a pattern with the target surface as the source,
* offset by SIZE/2
*/
pattern = cairo_pattern_create_for_surface (cairo_get_target (cr));
cairo_matrix_init_translate (&matrix, - SIZE / 2, - SIZE / 2);
cairo_pattern_set_matrix (pattern, &matrix);
cairo_set_source (cr, pattern);
cairo_pattern_destroy (pattern);
/* Copy two rectangles from the upper-left quarter of the image to
* the lower right. It will work if we use cairo_fill(), but the
* cairo_clip() cairo_paint() combination fails because the clip
* on the surface as a destination affects it as the source as
* well.
*/
cairo_rectangle (cr,
2 * SIZE / 4, 2 * SIZE / 4,
SIZE / 4, SIZE / 4);
cairo_rectangle (cr,
3 * SIZE / 4, 3 * SIZE / 4,
SIZE / 4, SIZE / 4);
cairo_clip (cr);
cairo_paint (cr);
return CAIRO_TEST_SUCCESS;
}
int
main (void)
{
Replace nesting-only surface clipping with gstate contained serial-number tracked clipping sets that are loaded into the surface on demand just before each rendering operation. This permits multiple cairo_t contexts to reference a surface without regard to ordering of operations among the contexts. Also in this patch is a change to the xlib surface that creates two separate Pictures, one for source and one for destination operands which separates the source clipping from destination clipping. Cairo now specifies that sources are never clipped by any clipping applied to them as destinations. Move cairo_clip_t (renamed from cairo_clip_rec_t) from cairoint.h to cairo-gstate-private.h. Eliminate stack of clip state from surfaces. Add new surface clipping API. Manage clip objects entirely within the gstate, loading the whole thing into the surface just before drawing. Source surfaces need not have clipping modified as the surface interface now specifies that source surfaces are always unclipped. Eliminate nested clipping contexts, leaving clip management entirely to the gstate. Create new clip API for the gstate which uses per-surface serial numbers to match gstate clipping against current surface clipping values. Surfaces no longer track clipping regions at all, so the old _cairo_surface_get_clip_extents has been replaced with _cairo_surface_get_extents. For PDF/PS surfaces, this function is expected to return a rectangle covering the entire fixed point coordinate space to leave rendering unclipped by the surface. Region clipping capability is now signalled by a non-NULL function pointer in set_clip_region. Each surface now contains two Pictures, one for source and one for destination operands so that source operands are never clipped by destination clipping. CAIRO_STATUS_BAD_NESTING removed self-copy now passes (Xlib only, until libpixman changes land) reviewed by: krh, otaylor, cworth
2005-05-26 11:35:44 +00:00
return cairo_test (&test, draw);
}