diff options
Diffstat (limited to 'libs/cairo-1.16.0/test/operator-alpha-alpha.c')
-rw-r--r-- | libs/cairo-1.16.0/test/operator-alpha-alpha.c | 166 |
1 files changed, 166 insertions, 0 deletions
diff --git a/libs/cairo-1.16.0/test/operator-alpha-alpha.c b/libs/cairo-1.16.0/test/operator-alpha-alpha.c new file mode 100644 index 0000000..2cef858 --- /dev/null +++ b/libs/cairo-1.16.0/test/operator-alpha-alpha.c @@ -0,0 +1,166 @@ +/* -*- Mode: c; c-basic-offset: 4; indent-tabs-mode: t; tab-width: 8; -*- */ +/* cairo - a vector graphics library with display and print output + * + * Copyright 2002 University of Southern California + * Copyright 2005 Red Hat, Inc. + * Copyright 2007 Emmanuel Pacaud + * Copyright 2008 Benjamin Otte + * Copyright 2008 Chris Wilson + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is University of Southern + * California. + * + * Contributor(s): + * Owen Taylor <otaylor@redhat.com> + * Kristian Høgsberg <krh@redhat.com> + * Emmanuel Pacaud <emmanuel.pacaud@lapp.in2p3.fr> + * Chris Wilson <chris@chris-wilson.co.uk> + * Andrea Canciani <ranma42@gmail.com> + */ + +#include "cairo-test.h" + +#define STEPS 16 +#define START_OPERATOR CAIRO_OPERATOR_CLEAR +#define STOP_OPERATOR CAIRO_OPERATOR_HSL_LUMINOSITY + +#define SIZE 3 +#define COUNT 6 +#define FULL_WIDTH ((STEPS + 1) * COUNT - 1) +#define FULL_HEIGHT ((COUNT + STOP_OPERATOR - START_OPERATOR) / COUNT) * (STEPS + 1) + +static void +create_patterns (cairo_t *bg, cairo_t *fg) +{ + int x; + + for (x = 0; x < STEPS; x++) { + double i = (double) x / (STEPS - 1); + cairo_set_source_rgba (bg, 0, 0, 0, i); + cairo_rectangle (bg, x, 0, 1, STEPS); + cairo_fill (bg); + + cairo_set_source_rgba (fg, 0, 0, 0, i); + cairo_rectangle (fg, 0, x, STEPS, 1); + cairo_fill (fg); + } +} + +/* expects a STEP*STEP pixel rectangle */ +static void +do_composite (cairo_t *cr, cairo_operator_t op, cairo_surface_t *bg, cairo_surface_t *fg) +{ + cairo_set_operator (cr, CAIRO_OPERATOR_SOURCE); + cairo_set_source_surface (cr, bg, 0, 0); + cairo_paint (cr); + + cairo_set_operator (cr, op); + cairo_set_source_surface (cr, fg, 0, 0); + cairo_paint (cr); +} + +static void +subdraw (cairo_t *cr, int width, int height) +{ + size_t i = 0; + cairo_operator_t op; + cairo_t *bgcr, *fgcr; + cairo_surface_t *bg, *fg; + + bg = cairo_surface_create_similar (cairo_get_target (cr), + CAIRO_CONTENT_ALPHA, SIZE * STEPS, SIZE * STEPS); + fg = cairo_surface_create_similar (cairo_get_target (cr), + CAIRO_CONTENT_ALPHA, SIZE * STEPS, SIZE * STEPS); + bgcr = cairo_create (bg); + fgcr = cairo_create (fg); + cairo_scale (bgcr, SIZE, SIZE); + cairo_scale (fgcr, SIZE, SIZE); + create_patterns (bgcr, fgcr); + cairo_destroy (bgcr); + cairo_destroy (fgcr); + + for (op = START_OPERATOR; op <= STOP_OPERATOR; op++, i++) { + cairo_save (cr); + cairo_translate (cr, + SIZE * (STEPS + 1) * (i % COUNT), + SIZE * (STEPS + 1) * (i / COUNT)); + cairo_rectangle (cr, 0, 0, SIZE * (STEPS + 1), SIZE * (STEPS+1)); + cairo_clip (cr); + do_composite (cr, op, bg, fg); + cairo_restore (cr); + } + + cairo_surface_destroy (fg); + cairo_surface_destroy (bg); +} + + +static cairo_surface_t * +create_source (cairo_surface_t *target, int width, int height) +{ + cairo_surface_t *similar; + cairo_t *cr; + + similar = cairo_surface_create_similar (target, + CAIRO_CONTENT_ALPHA, + width, height); + cr = cairo_create (similar); + cairo_surface_destroy (similar); + + subdraw (cr, width, height); + + similar = cairo_surface_reference (cairo_get_target (cr)); + cairo_destroy (cr); + + return similar; +} + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + cairo_surface_t *source; + + cairo_set_source_rgb (cr, 1, 1, 1); + cairo_paint (cr); + + source = create_source (cairo_get_target (cr), width, height); + cairo_set_source_surface (cr, source, 0, 0); + cairo_surface_destroy (source); + + cairo_paint (cr); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (operator_alpha_alpha, + "Tests result of compositing pure-alpha surfaces" + "\nCompositing of pure-alpha sources is inconsistent across backends.", + "alpha, similar, operator", /* keywords */ + NULL, /* requirements */ + FULL_WIDTH * SIZE, FULL_HEIGHT * SIZE, + NULL, draw) |