More _/- renames in the test directory.
|
|
@ -1,3 +1,8 @@
|
|||
2005-03-29 Carl Worth <cworth@cworth.org>
|
||||
|
||||
* test/Makefile.am:
|
||||
* test/*_*.c: More _/- renames in the test directory.
|
||||
|
||||
2005-03-28 Carl Worth <cworth@cworth.org>
|
||||
|
||||
* src/Makefile.am:
|
||||
|
|
|
|||
|
|
@ -2,20 +2,20 @@
|
|||
.libs
|
||||
Makefile
|
||||
Makefile.in
|
||||
clip_twice
|
||||
clip-twice
|
||||
coverage
|
||||
fill_rule
|
||||
get_and_set
|
||||
fill-rule
|
||||
get-and-set
|
||||
imagediff
|
||||
leaky_polygon
|
||||
line_width
|
||||
linear_gradient
|
||||
move_to_show_surface
|
||||
path_data
|
||||
pixman_rotate
|
||||
text_cache_crash
|
||||
text_rotate
|
||||
user_data
|
||||
leaky-polygon
|
||||
line-width
|
||||
linear-gradient
|
||||
move-to-show-surface
|
||||
path-data
|
||||
pixman-rotate
|
||||
text-cache-crash
|
||||
text-rotate
|
||||
user-data
|
||||
*-out.png
|
||||
*-diff.png
|
||||
*.la
|
||||
|
|
|
|||
|
|
@ -1,36 +1,36 @@
|
|||
# All new test cases go here
|
||||
TESTS = \
|
||||
clip_twice \
|
||||
clip-twice \
|
||||
coverage \
|
||||
fill_rule \
|
||||
get_and_set \
|
||||
leaky_polygon \
|
||||
line_width \
|
||||
linear_gradient \
|
||||
move_to_show_surface \
|
||||
path_data \
|
||||
pixman_rotate \
|
||||
text_cache_crash \
|
||||
text_rotate \
|
||||
user_data
|
||||
fill-rule \
|
||||
get-and-set \
|
||||
leaky-polygon \
|
||||
line-width \
|
||||
linear-gradient \
|
||||
move-to-show-surface \
|
||||
path-data \
|
||||
pixman-rotate \
|
||||
text-cache-crash \
|
||||
text-rotate \
|
||||
user-data
|
||||
|
||||
# And all new tests go here too. I really don't like having to repeat
|
||||
# this list. Anyone know a good way to avoid it? Can I use a wildcard
|
||||
# here?
|
||||
EXTRA_DIST = \
|
||||
fill_rule-ref.png \
|
||||
leaky_polygon-ref.png \
|
||||
line_width-ref.png \
|
||||
linear_gradient-ref.png \
|
||||
move_to_show_surface-ref.png \
|
||||
fill-rule-ref.png \
|
||||
leaky-polygon-ref.png \
|
||||
line-width-ref.png \
|
||||
linear-gradient-ref.png \
|
||||
move-to-show-surface-ref.png \
|
||||
coverage-ref.png \
|
||||
clip_twice-ref.png \
|
||||
path_data-ref.png \
|
||||
pixman_rotate-ref.png \
|
||||
clip-twice-ref.png \
|
||||
path-data-ref.png \
|
||||
pixman-rotate-ref.png \
|
||||
romedalen.png
|
||||
|
||||
# Once we can draw the text_rotate.c test case correctly, we should
|
||||
# create and add text_rotate-ref.png to the list of reference PNGs.
|
||||
# Once we can draw the text-rotate.c test case correctly, we should
|
||||
# create and add text-rotate-ref.png to the list of reference PNGs.
|
||||
|
||||
# This list is only for known bugs (not regressions). We do need to
|
||||
# fix these before the next release, but they are expected to fail for
|
||||
|
|
@ -41,9 +41,9 @@ romedalen.png
|
|||
# regression bugs that should not be listed here. Instead they should
|
||||
# be fixed before the code is committed.
|
||||
XFAIL_TESTS = \
|
||||
move_to_show_surface \
|
||||
pixman_rotate \
|
||||
text_rotate
|
||||
move-to-show-surface \
|
||||
pixman-rotate \
|
||||
text-rotate
|
||||
|
||||
check_PROGRAMS = $(TESTS)
|
||||
|
||||
|
|
@ -56,14 +56,14 @@ INCLUDES = -D_GNU_SOURCE -I$(srcdir) $(CAIRO_CFLAGS) -I$(top_srcdir)/src
|
|||
noinst_LTLIBRARIES = libcairotest.la
|
||||
|
||||
libcairotest_la_SOURCES =\
|
||||
buffer_diff.c \
|
||||
buffer_diff.h \
|
||||
cairo_test.c \
|
||||
cairo_test.h \
|
||||
read_png.c \
|
||||
read_png.h \
|
||||
write_png.c \
|
||||
write_png.h \
|
||||
buffer-diff.c \
|
||||
buffer-diff.h \
|
||||
cairo-test.c \
|
||||
cairo-test.h \
|
||||
read-png.c \
|
||||
read-png.h \
|
||||
write-png.c \
|
||||
write-png.h \
|
||||
xmalloc.c \
|
||||
xmalloc.h
|
||||
|
||||
|
|
|
|||
|
|
@ -23,7 +23,7 @@
|
|||
*
|
||||
* Author: Richard D. Worth <richard@theworths.org> */
|
||||
|
||||
#include "buffer_diff.h"
|
||||
#include "buffer-diff.h"
|
||||
|
||||
/* Image comparison code courttesy of Richard Worth.
|
||||
* Returns number of pixels changed.
|
||||
|
|
|
|||
|
|
@ -1,73 +0,0 @@
|
|||
/* imagediff - Compare two images
|
||||
*
|
||||
* Copyright © 2004 Richard D. Worth
|
||||
*
|
||||
* 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 Richard Worth
|
||||
* not be used in advertising or publicity pertaining to distribution
|
||||
* of the software without specific, written prior permission.
|
||||
* Richard Worth makes no representations about the suitability of this
|
||||
* software for any purpose. It is provided "as is" without express
|
||||
* or implied warranty.
|
||||
*
|
||||
* RICHARD WORTH DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
|
||||
* INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN
|
||||
* NO EVENT SHALL RICHARD WORTH 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: Richard D. Worth <richard@theworths.org> */
|
||||
|
||||
#include "buffer_diff.h"
|
||||
|
||||
/* Image comparison code courttesy of Richard Worth.
|
||||
* Returns number of pixels changed.
|
||||
* Also fills out a "diff" image intended to visually show where the
|
||||
* images differ.
|
||||
*/
|
||||
int
|
||||
buffer_diff (char *buf_a, char *buf_b, char *buf_diff,
|
||||
int width, int height, int stride)
|
||||
{
|
||||
int x, y;
|
||||
int total_pixels_changed = 0;
|
||||
unsigned char *row_a, *row_b, *row;
|
||||
|
||||
for (y = 0; y < height; y++)
|
||||
{
|
||||
row_a = buf_a + y * stride;
|
||||
row_b = buf_b + y * stride;
|
||||
row = buf_diff + y * stride;
|
||||
for (x = 0; x < width; x++)
|
||||
{
|
||||
int channel;
|
||||
unsigned char value_a, value_b;
|
||||
int pixel_changed = 0;
|
||||
for (channel = 0; channel < 4; channel++)
|
||||
{
|
||||
double diff;
|
||||
value_a = row_a[x * 4 + channel];
|
||||
value_b = row_b[x * 4 + channel];
|
||||
if (value_a != value_b)
|
||||
pixel_changed = 1;
|
||||
diff = value_a - value_b;
|
||||
row[x * 4 + channel] = 128 + diff / 3.0;
|
||||
}
|
||||
if (pixel_changed) {
|
||||
total_pixels_changed++;
|
||||
} else {
|
||||
row[x*4+0] = 0;
|
||||
row[x*4+1] = 0;
|
||||
row[x*4+2] = 0;
|
||||
}
|
||||
row[x * 4 + 3] = 0xff; /* Set ALPHA to 100% (opaque) */
|
||||
}
|
||||
}
|
||||
|
||||
return total_pixels_changed;
|
||||
}
|
||||
|
|
@ -1,38 +0,0 @@
|
|||
/* imagediff - Compare two images
|
||||
*
|
||||
* Copyright © 2004 Richard D. Worth
|
||||
*
|
||||
* 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 Richard Worth
|
||||
* not be used in advertising or publicity pertaining to distribution
|
||||
* of the software without specific, written prior permission.
|
||||
* Richard Worth makes no representations about the suitability of this
|
||||
* software for any purpose. It is provided "as is" without express
|
||||
* or implied warranty.
|
||||
*
|
||||
* RICHARD WORTH DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
|
||||
* INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN
|
||||
* NO EVENT SHALL RICHARD WORTH 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: Richard D. Worth <richard@theworths.org> */
|
||||
|
||||
#ifndef BUFFER_DIFF_H
|
||||
#define BUFFER_DIFF_H
|
||||
|
||||
/* Image comparison code courttesy of Richard Worth.
|
||||
* Returns number of pixels changed.
|
||||
* Also fills out a "diff" image intended to visually show where the
|
||||
* images differ.
|
||||
*/
|
||||
int
|
||||
buffer_diff (char *buf_a, char *buf_b, char *buf_diff,
|
||||
int width, int height, int stride);
|
||||
|
||||
#endif
|
||||
|
|
@ -30,11 +30,11 @@
|
|||
#include <errno.h>
|
||||
#include <string.h>
|
||||
|
||||
#include "cairo_test.h"
|
||||
#include "cairo-test.h"
|
||||
|
||||
#include "buffer_diff.h"
|
||||
#include "read_png.h"
|
||||
#include "write_png.h"
|
||||
#include "buffer-diff.h"
|
||||
#include "read-png.h"
|
||||
#include "write-png.h"
|
||||
#include "xmalloc.h"
|
||||
|
||||
#define CAIRO_TEST_LOG_SUFFIX ".log"
|
||||
|
|
|
|||
|
|
@ -1,263 +0,0 @@
|
|||
/*
|
||||
* Copyright © 2004 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: Carl D. Worth <cworth@cworth.org>
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdarg.h>
|
||||
#include <unistd.h>
|
||||
#include <errno.h>
|
||||
#include <string.h>
|
||||
|
||||
#include "cairo_test.h"
|
||||
|
||||
#include "buffer_diff.h"
|
||||
#include "read_png.h"
|
||||
#include "write_png.h"
|
||||
#include "xmalloc.h"
|
||||
|
||||
#define CAIRO_TEST_LOG_SUFFIX ".log"
|
||||
#define CAIRO_TEST_PNG_SUFFIX "-out.png"
|
||||
#define CAIRO_TEST_REF_SUFFIX "-ref.png"
|
||||
#define CAIRO_TEST_DIFF_SUFFIX "-diff.png"
|
||||
|
||||
static void
|
||||
xasprintf (char **strp, const char *fmt, ...)
|
||||
{
|
||||
#ifdef HAVE_VASPRINTF
|
||||
va_list va;
|
||||
int ret;
|
||||
|
||||
va_start (va, fmt);
|
||||
ret = vasprintf (strp, fmt, va);
|
||||
va_end (va);
|
||||
|
||||
if (ret < 0) {
|
||||
fprintf (stderr, "Out of memory\n");
|
||||
exit (1);
|
||||
}
|
||||
#else /* !HAVE_VASNPRINTF */
|
||||
#define BUF_SIZE 1024
|
||||
va_list va;
|
||||
char buffer[BUF_SIZE];
|
||||
int ret;
|
||||
|
||||
va_start (va, fmt);
|
||||
ret = vsnprintf (buffer, sizeof(buffer), fmt, va);
|
||||
va_end (va);
|
||||
|
||||
if (ret < 0) {
|
||||
fprintf (stderr, "Failure in vsnprintf\n");
|
||||
exit (1);
|
||||
}
|
||||
|
||||
if (strlen (buffer) == sizeof(buffer) - 1) {
|
||||
fprintf (stderr, "Overflowed fixed buffer\n");
|
||||
exit (1);
|
||||
}
|
||||
|
||||
*strp = strdup (buffer);
|
||||
if (!*strp) {
|
||||
fprintf (stderr, "Out of memory\n");
|
||||
exit (1);
|
||||
}
|
||||
#endif /* !HAVE_VASNPRINTF */
|
||||
}
|
||||
|
||||
static void
|
||||
xunlink (const char *pathname)
|
||||
{
|
||||
if (unlink (pathname) < 0 && errno != ENOENT) {
|
||||
fprintf (stderr, " Error: Cannot remove %s: %s\n",
|
||||
pathname, strerror (errno));
|
||||
exit (1);
|
||||
}
|
||||
}
|
||||
|
||||
cairo_test_status_t
|
||||
cairo_test (cairo_test_t *test, cairo_test_draw_function_t draw)
|
||||
{
|
||||
cairo_test_status_t status;
|
||||
cairo_t *cr;
|
||||
int stride;
|
||||
unsigned char *png_buf, *ref_buf, *diff_buf;
|
||||
char *log_name, *png_name, *ref_name, *diff_name;
|
||||
char *srcdir;
|
||||
int pixels_changed;
|
||||
int ref_width, ref_height, ref_stride;
|
||||
read_png_status_t png_status;
|
||||
cairo_test_status_t ret;
|
||||
FILE *png_file;
|
||||
FILE *log_file;
|
||||
|
||||
/* Get the strings ready that we'll need. */
|
||||
srcdir = getenv ("srcdir");
|
||||
if (!srcdir)
|
||||
srcdir = ".";
|
||||
xasprintf (&log_name, "%s%s", test->name, CAIRO_TEST_LOG_SUFFIX);
|
||||
xasprintf (&png_name, "%s%s", test->name, CAIRO_TEST_PNG_SUFFIX);
|
||||
xasprintf (&ref_name, "%s/%s%s", srcdir, test->name, CAIRO_TEST_REF_SUFFIX);
|
||||
xasprintf (&diff_name, "%s%s", test->name, CAIRO_TEST_DIFF_SUFFIX);
|
||||
|
||||
xunlink (log_name);
|
||||
|
||||
/* Run the actual drawing code. */
|
||||
cr = cairo_create ();
|
||||
|
||||
stride = 4 * test->width;
|
||||
|
||||
png_buf = xcalloc (stride * test->height, 1);
|
||||
diff_buf = xcalloc (stride * test->height, 1);
|
||||
|
||||
cairo_set_target_image (cr, png_buf, CAIRO_FORMAT_ARGB32,
|
||||
test->width, test->height, stride);
|
||||
|
||||
status = (draw) (cr, test->width, test->height);
|
||||
|
||||
/* Then, check all the different ways it could fail. */
|
||||
if (status) {
|
||||
log_file = fopen (log_name, "a");
|
||||
fprintf (log_file, "Error: Function under test failed\n");
|
||||
fclose (log_file);
|
||||
return status;
|
||||
}
|
||||
|
||||
if (cairo_status (cr) != CAIRO_STATUS_SUCCESS) {
|
||||
log_file = fopen (log_name, "a");
|
||||
fprintf (log_file, "Error: Function under test left cairo status in an error state: %s\n", cairo_status_string (cr));
|
||||
fclose (log_file);
|
||||
return CAIRO_TEST_FAILURE;
|
||||
}
|
||||
|
||||
cairo_destroy (cr);
|
||||
|
||||
/* Skip image check for tests with no image (width,height == 0,0) */
|
||||
if (test->width == 0 || test->height == 0) {
|
||||
free (png_buf);
|
||||
free (diff_buf);
|
||||
return CAIRO_TEST_SUCCESS;
|
||||
}
|
||||
|
||||
png_file = fopen (png_name, "wb");
|
||||
write_png_argb32 (png_buf, png_file, test->width, test->height, stride);
|
||||
fclose (png_file);
|
||||
|
||||
ref_buf = NULL;
|
||||
png_status = (read_png_argb32 (ref_name, &ref_buf, &ref_width, &ref_height, &ref_stride));
|
||||
if (png_status) {
|
||||
log_file = fopen (log_name, "a");
|
||||
switch (png_status)
|
||||
{
|
||||
case READ_PNG_FILE_NOT_FOUND:
|
||||
fprintf (log_file, "Error: No reference image found: %s\n", ref_name);
|
||||
break;
|
||||
case READ_PNG_FILE_NOT_PNG:
|
||||
fprintf (log_file, "Error: %s is not a png image\n", ref_name);
|
||||
break;
|
||||
default:
|
||||
fprintf (log_file, "Error: Failed to read %s\n", ref_name);
|
||||
}
|
||||
fclose (log_file);
|
||||
|
||||
ret = CAIRO_TEST_FAILURE;
|
||||
goto BAIL;
|
||||
} else {
|
||||
}
|
||||
|
||||
if (test->width != ref_width || test->height != ref_height) {
|
||||
log_file = fopen (log_name, "a");
|
||||
fprintf (log_file,
|
||||
"Error: Image size mismatch: (%dx%d) vs. (%dx%d)\n"
|
||||
" for %s vs %s\n",
|
||||
test->width, test->height,
|
||||
ref_width, ref_height,
|
||||
png_name, ref_name);
|
||||
fclose (log_file);
|
||||
|
||||
ret = CAIRO_TEST_FAILURE;
|
||||
goto BAIL;
|
||||
}
|
||||
|
||||
pixels_changed = buffer_diff (png_buf, ref_buf, diff_buf,
|
||||
test->width, test->height, stride);
|
||||
if (pixels_changed) {
|
||||
log_file = fopen (log_name, "a");
|
||||
fprintf (log_file, "Error: %d pixels differ from reference image %s\n",
|
||||
pixels_changed, ref_name);
|
||||
png_file = fopen (diff_name, "wb");
|
||||
write_png_argb32 (diff_buf, png_file, test->width, test->height, stride);
|
||||
fclose (png_file);
|
||||
fclose (log_file);
|
||||
|
||||
ret = CAIRO_TEST_FAILURE;
|
||||
goto BAIL;
|
||||
} else {
|
||||
xunlink (diff_name);
|
||||
}
|
||||
|
||||
ret = CAIRO_TEST_SUCCESS;
|
||||
|
||||
BAIL:
|
||||
free (png_buf);
|
||||
free (ref_buf);
|
||||
free (diff_buf);
|
||||
free (log_name);
|
||||
free (png_name);
|
||||
free (ref_name);
|
||||
free (diff_name);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
cairo_pattern_t *
|
||||
cairo_test_create_png_pattern (cairo_t *cr, const char *filename)
|
||||
{
|
||||
cairo_surface_t *image;
|
||||
cairo_pattern_t *pattern;
|
||||
unsigned char *buffer;
|
||||
int w, h, stride;
|
||||
read_png_status_t status;
|
||||
char *srcdir = getenv ("srcdir");
|
||||
|
||||
status = read_png_argb32 (filename, &buffer, &w,&h, &stride);
|
||||
if (status != READ_PNG_SUCCESS) {
|
||||
if (srcdir) {
|
||||
char *srcdir_filename;
|
||||
xasprintf (&srcdir_filename, "%s/%s", srcdir, filename);
|
||||
status = read_png_argb32 (srcdir_filename, &buffer, &w,&h, &stride);
|
||||
free (srcdir_filename);
|
||||
}
|
||||
}
|
||||
if (status != READ_PNG_SUCCESS)
|
||||
return NULL;
|
||||
|
||||
image = cairo_surface_create_for_image (buffer, CAIRO_FORMAT_ARGB32,
|
||||
w, h, stride);
|
||||
|
||||
cairo_surface_set_repeat (image, 1);
|
||||
|
||||
pattern = cairo_pattern_create_for_surface (image);
|
||||
|
||||
return pattern;
|
||||
}
|
||||
|
|
@ -1,55 +0,0 @@
|
|||
/*
|
||||
* Copyright © 2004 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: Carl D. Worth <cworth@cworth.org>
|
||||
*/
|
||||
|
||||
#ifndef _CAIRO_TEST_H_
|
||||
#define _CAIRO_TEST_H_
|
||||
|
||||
#include <math.h>
|
||||
#include <cairo.h>
|
||||
|
||||
typedef enum cairo_test_status {
|
||||
CAIRO_TEST_SUCCESS = 0,
|
||||
CAIRO_TEST_FAILURE
|
||||
} cairo_test_status_t;
|
||||
|
||||
typedef struct cairo_test {
|
||||
char *name;
|
||||
char *description;
|
||||
int width;
|
||||
int height;
|
||||
} cairo_test_t;
|
||||
|
||||
typedef cairo_test_status_t (*cairo_test_draw_function_t) (cairo_t *cr, int width, int height);
|
||||
|
||||
/* cairo_test.c */
|
||||
cairo_test_status_t
|
||||
cairo_test (cairo_test_t *test, cairo_test_draw_function_t draw);
|
||||
|
||||
cairo_pattern_t *
|
||||
cairo_test_create_png_pattern (cairo_t *cr, const char *filename);
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
|
|
@ -23,13 +23,13 @@
|
|||
* Author: Kristian Høgsberg <krh@redhat.com>
|
||||
*/
|
||||
|
||||
#include "cairo_test.h"
|
||||
#include "cairo-test.h"
|
||||
|
||||
#define WIDTH 64
|
||||
#define HEIGHT 64
|
||||
|
||||
cairo_test_t test = {
|
||||
"clip_twice",
|
||||
"clip-twice",
|
||||
"Verifies that the clip mask is updated correctly when it constructed by setting the clip path twice.",
|
||||
WIDTH, HEIGHT
|
||||
};
|
||||
|
|
|
|||
|
Before Width: | Height: | Size: 751 B |
|
|
@ -1,74 +0,0 @@
|
|||
/*
|
||||
* 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: Kristian Høgsberg <krh@redhat.com>
|
||||
*/
|
||||
|
||||
#include "cairo_test.h"
|
||||
|
||||
#define WIDTH 64
|
||||
#define HEIGHT 64
|
||||
|
||||
cairo_test_t test = {
|
||||
"clip_twice",
|
||||
"Verifies that the clip mask is updated correctly when it constructed by setting the clip path twice.",
|
||||
WIDTH, HEIGHT
|
||||
};
|
||||
|
||||
static cairo_test_status_t
|
||||
draw (cairo_t *cr, int width, int height)
|
||||
{
|
||||
cairo_set_alpha (cr, 1.0);
|
||||
cairo_new_path (cr);
|
||||
cairo_arc (cr, WIDTH / 2, HEIGHT / 2, WIDTH / 3, 0, 2 * M_PI);
|
||||
cairo_clip (cr);
|
||||
|
||||
cairo_new_path (cr);
|
||||
cairo_move_to (cr, 0, 0);
|
||||
cairo_line_to (cr, WIDTH / 4, HEIGHT / 2);
|
||||
cairo_line_to (cr, 0, HEIGHT);
|
||||
cairo_line_to (cr, WIDTH, HEIGHT);
|
||||
cairo_line_to (cr, 3 * WIDTH / 4, HEIGHT / 2);
|
||||
cairo_line_to (cr, WIDTH, 0);
|
||||
cairo_close_path (cr);
|
||||
cairo_clip (cr);
|
||||
|
||||
cairo_set_rgb_color (cr, 0, 0, 0.6);
|
||||
|
||||
cairo_new_path (cr);
|
||||
cairo_move_to (cr, 0, 0);
|
||||
cairo_line_to (cr, 0, HEIGHT);
|
||||
cairo_line_to (cr, WIDTH / 2, 3 * HEIGHT / 4);
|
||||
cairo_line_to (cr, WIDTH, HEIGHT);
|
||||
cairo_line_to (cr, WIDTH, 0);
|
||||
cairo_line_to (cr, WIDTH / 2, HEIGHT / 4);
|
||||
cairo_close_path (cr);
|
||||
cairo_fill (cr);
|
||||
|
||||
return CAIRO_TEST_SUCCESS;
|
||||
}
|
||||
|
||||
int
|
||||
main (void)
|
||||
{
|
||||
return cairo_test (&test, draw);
|
||||
}
|
||||
|
|
@ -24,7 +24,7 @@
|
|||
*/
|
||||
|
||||
#include <math.h>
|
||||
#include "cairo_test.h"
|
||||
#include "cairo-test.h"
|
||||
|
||||
#define WIDTH 64
|
||||
#define HEIGHT 64
|
||||
|
|
|
|||
|
|
@ -61,13 +61,13 @@
|
|||
*
|
||||
*/
|
||||
|
||||
#include "cairo_test.h"
|
||||
#include "cairo-test.h"
|
||||
|
||||
#define LITTLE_STAR_SIZE 20
|
||||
#define BIG_STAR_SIZE 80
|
||||
|
||||
cairo_test_t test = {
|
||||
"fill_rule",
|
||||
"fill-rule",
|
||||
"Tests cairo_set_full_rule with some star shapes",
|
||||
BIG_STAR_SIZE * 2 + 3, BIG_STAR_SIZE + LITTLE_STAR_SIZE + 3
|
||||
};
|
||||
|
|
|
|||
|
Before Width: | Height: | Size: 1.9 KiB |
132
test/fill_rule.c
|
|
@ -1,132 +0,0 @@
|
|||
/*
|
||||
* Copyright © 2004 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: Carl D. Worth <cworth@cworth.org>
|
||||
*/
|
||||
|
||||
/* Bug history
|
||||
*
|
||||
* 2004-10-27 Carl Worth <cworth@cworth.org>
|
||||
*
|
||||
* There's currently a regression bug in the tessellation code. This
|
||||
* causes each of these simple star shapes to be filled incorrectly.
|
||||
*
|
||||
* It looks like right now we can get this test to pass by doing:
|
||||
*
|
||||
* cvs update -r 1.16 src/cairo_traps.c
|
||||
*
|
||||
* But we don't want to revert that change permanently since it
|
||||
* really does correct some bugs. It must be that the old version of
|
||||
* the code is masking some other bugs in the tessellation code. My
|
||||
* current plan is to back this revision up for the next snapshot,
|
||||
* but not to list the test as an expected failure since I'm
|
||||
* planning on doing the new tessellator which should fix this
|
||||
* problem.
|
||||
*
|
||||
* 2005-01-11 Carl Worth <cworth@cworth.org>
|
||||
*
|
||||
* Keith committed some fixes that fix the original size-20
|
||||
* star_path:
|
||||
*
|
||||
* * src/cairo_wideint.c: (_cairo_int32x32_64_mul),
|
||||
* (_cairo_int64x64_128_mul):
|
||||
* * src/cairo_wideint.h:
|
||||
* int32x32_64_mul and int64x64_128_mul are different from their
|
||||
* unsigned compatriots
|
||||
*
|
||||
* 2005-01-12 Carl Worth <cworth@cworth.org>
|
||||
*
|
||||
* Going back to the SVG test suite, however, the original star
|
||||
* shape is still broken. Adding both shapes now as little_star_path
|
||||
* and big_star_path.
|
||||
*
|
||||
*/
|
||||
|
||||
#include "cairo_test.h"
|
||||
|
||||
#define LITTLE_STAR_SIZE 20
|
||||
#define BIG_STAR_SIZE 80
|
||||
|
||||
cairo_test_t test = {
|
||||
"fill_rule",
|
||||
"Tests cairo_set_full_rule with some star shapes",
|
||||
BIG_STAR_SIZE * 2 + 3, BIG_STAR_SIZE + LITTLE_STAR_SIZE + 3
|
||||
};
|
||||
|
||||
/* The SVG start trimmed down, but still showing the bug (originally) */
|
||||
static void
|
||||
little_star_path (cairo_t *cr)
|
||||
{
|
||||
cairo_move_to (cr, 10, 0);
|
||||
cairo_rel_line_to (cr, 6, 20);
|
||||
cairo_rel_line_to (cr, -16, -12);
|
||||
cairo_rel_line_to (cr, 20, 0);
|
||||
cairo_rel_line_to (cr, -16, 12);
|
||||
}
|
||||
|
||||
/* The star shape from the SVG test suite. This was is still buggy even after
|
||||
we got little_star_path working. */
|
||||
static void
|
||||
big_star_path (cairo_t *cr)
|
||||
{
|
||||
cairo_move_to (cr, 40, 0);
|
||||
cairo_rel_line_to (cr, 25, 80);
|
||||
cairo_rel_line_to (cr, -65, -50);
|
||||
cairo_rel_line_to (cr, 80, 0);
|
||||
cairo_rel_line_to (cr, -65, 50);
|
||||
cairo_close_path (cr);
|
||||
}
|
||||
|
||||
/* Fill the same path twice, once with each fill rule */
|
||||
static cairo_test_status_t
|
||||
draw (cairo_t *cr, int width, int height)
|
||||
{
|
||||
cairo_set_rgb_color (cr, 1, 0, 0);
|
||||
|
||||
cairo_translate (cr, 1, 1);
|
||||
little_star_path (cr);
|
||||
cairo_set_fill_rule (cr, CAIRO_FILL_RULE_WINDING);
|
||||
cairo_fill (cr);
|
||||
|
||||
cairo_translate (cr, LITTLE_STAR_SIZE + 1, 0);
|
||||
little_star_path (cr);
|
||||
cairo_set_fill_rule (cr, CAIRO_FILL_RULE_EVEN_ODD);
|
||||
cairo_fill (cr);
|
||||
|
||||
cairo_translate (cr, -(LITTLE_STAR_SIZE + 1), LITTLE_STAR_SIZE + 1);
|
||||
big_star_path (cr);
|
||||
cairo_set_fill_rule (cr, CAIRO_FILL_RULE_WINDING);
|
||||
cairo_fill (cr);
|
||||
|
||||
cairo_translate (cr, BIG_STAR_SIZE + 1, 0);
|
||||
big_star_path (cr);
|
||||
cairo_set_fill_rule (cr, CAIRO_FILL_RULE_EVEN_ODD);
|
||||
cairo_fill (cr);
|
||||
|
||||
return CAIRO_TEST_SUCCESS;
|
||||
}
|
||||
|
||||
int
|
||||
main (void)
|
||||
{
|
||||
return cairo_test (&test, draw);
|
||||
}
|
||||
|
|
@ -23,10 +23,10 @@
|
|||
* Author: Carl D. Worth <cworth@cworth.org>
|
||||
*/
|
||||
|
||||
#include "cairo_test.h"
|
||||
#include "cairo-test.h"
|
||||
|
||||
cairo_test_t test = {
|
||||
"get_and_set",
|
||||
"get-and-set",
|
||||
"Tests calls to the most trivial cairo_get and cairo_set functions",
|
||||
0, 0
|
||||
};
|
||||
|
|
|
|||
|
|
@ -1,151 +0,0 @@
|
|||
/*
|
||||
* 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: Carl D. Worth <cworth@cworth.org>
|
||||
*/
|
||||
|
||||
#include "cairo_test.h"
|
||||
|
||||
cairo_test_t test = {
|
||||
"get_and_set",
|
||||
"Tests calls to the most trivial cairo_get and cairo_set functions",
|
||||
0, 0
|
||||
};
|
||||
|
||||
typedef struct {
|
||||
cairo_operator_t operator;
|
||||
double tolerance;
|
||||
double point_x;
|
||||
double point_y;
|
||||
cairo_fill_rule_t fill_rule;
|
||||
double line_width;
|
||||
cairo_line_cap_t line_cap;
|
||||
cairo_line_join_t line_join;
|
||||
double miter_limit;
|
||||
/* XXX: Add cairo_matrix_t here when it is exposed */
|
||||
} settings_t;
|
||||
|
||||
/* Two sets of settings, no defaults */
|
||||
settings_t settings[] = {
|
||||
{
|
||||
CAIRO_OPERATOR_IN,
|
||||
2.0,
|
||||
12.3,
|
||||
4.56,
|
||||
CAIRO_FILL_RULE_EVEN_ODD,
|
||||
7.7,
|
||||
CAIRO_LINE_CAP_SQUARE,
|
||||
CAIRO_LINE_JOIN_ROUND,
|
||||
3.14
|
||||
},
|
||||
{
|
||||
CAIRO_OPERATOR_ATOP,
|
||||
5.25,
|
||||
99.99,
|
||||
0.001,
|
||||
CAIRO_FILL_RULE_WINDING,
|
||||
2.17,
|
||||
CAIRO_LINE_CAP_ROUND,
|
||||
CAIRO_LINE_JOIN_BEVEL,
|
||||
1000.0
|
||||
}
|
||||
};
|
||||
|
||||
static void
|
||||
settings_set (cairo_t *cr, settings_t *settings)
|
||||
{
|
||||
cairo_set_operator (cr, settings->operator);
|
||||
cairo_set_tolerance (cr, settings->tolerance);
|
||||
cairo_move_to (cr, settings->point_x, settings->point_y);
|
||||
cairo_set_fill_rule (cr, settings->fill_rule);
|
||||
cairo_set_line_width (cr, settings->line_width);
|
||||
cairo_set_line_cap (cr, settings->line_cap);
|
||||
cairo_set_line_join (cr, settings->line_join);
|
||||
cairo_set_miter_limit (cr, settings->miter_limit);
|
||||
}
|
||||
|
||||
static void
|
||||
settings_get (cairo_t *cr, settings_t *settings)
|
||||
{
|
||||
settings->operator = cairo_get_operator (cr);
|
||||
settings->tolerance = cairo_get_tolerance (cr);
|
||||
cairo_get_current_point (cr, &settings->point_x, &settings->point_y);
|
||||
settings->fill_rule = cairo_get_fill_rule (cr);
|
||||
settings->line_width = cairo_get_line_width (cr);
|
||||
settings->line_cap = cairo_get_line_cap (cr);
|
||||
settings->line_join = cairo_get_line_join (cr);
|
||||
settings->miter_limit = cairo_get_miter_limit (cr);
|
||||
}
|
||||
|
||||
/* Maximum error is one part of our fixed-point grid */
|
||||
#define EPSILON (1.0 / 65536.0)
|
||||
|
||||
static int
|
||||
DOUBLES_WITHIN_EPSILON(double a, double b) {
|
||||
double delta = fabs(a - b);
|
||||
return delta < EPSILON;
|
||||
}
|
||||
|
||||
static int
|
||||
settings_equal (settings_t *a, settings_t *b)
|
||||
{
|
||||
return (a->operator == b->operator &&
|
||||
a->tolerance == b->tolerance &&
|
||||
DOUBLES_WITHIN_EPSILON (a->point_x, b->point_x) &&
|
||||
DOUBLES_WITHIN_EPSILON (a->point_y, b->point_y) &&
|
||||
a->fill_rule == b->fill_rule &&
|
||||
a->line_width == b->line_width &&
|
||||
a->line_cap == b->line_cap &&
|
||||
a->line_join == b->line_join &&
|
||||
a->miter_limit == b->miter_limit);
|
||||
}
|
||||
|
||||
static cairo_test_status_t
|
||||
get_and_set (cairo_t *cr, int width, int height)
|
||||
{
|
||||
settings_t check;
|
||||
|
||||
settings_set (cr, &settings[0]);
|
||||
|
||||
cairo_save (cr);
|
||||
{
|
||||
settings_set (cr, &settings[1]);
|
||||
settings_get (cr, &check);
|
||||
|
||||
if (!settings_equal (&settings[1], &check))
|
||||
return CAIRO_TEST_FAILURE;
|
||||
}
|
||||
cairo_restore (cr);
|
||||
|
||||
settings_get (cr, &check);
|
||||
|
||||
if (!settings_equal (&settings[0], &check))
|
||||
return CAIRO_TEST_FAILURE;
|
||||
|
||||
return CAIRO_TEST_SUCCESS;
|
||||
}
|
||||
|
||||
int
|
||||
main (void)
|
||||
{
|
||||
return cairo_test (&test, get_and_set);
|
||||
}
|
||||
|
|
@ -26,9 +26,9 @@
|
|||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
#include "buffer_diff.h"
|
||||
#include "read_png.h"
|
||||
#include "write_png.h"
|
||||
#include "buffer-diff.h"
|
||||
#include "read-png.h"
|
||||
#include "write-png.h"
|
||||
#include "xmalloc.h"
|
||||
|
||||
int
|
||||
|
|
|
|||
|
|
@ -51,13 +51,13 @@
|
|||
*
|
||||
*/
|
||||
|
||||
#include "cairo_test.h"
|
||||
#include "cairo-test.h"
|
||||
|
||||
#define WIDTH 21
|
||||
#define HEIGHT 21
|
||||
|
||||
cairo_test_t test = {
|
||||
"leaky_polygon",
|
||||
"leaky-polygon",
|
||||
"Exercises a corner case in the trapezoid rasterization in which pixels outside the trapezoids received a non-zero alpha",
|
||||
WIDTH, HEIGHT
|
||||
};
|
||||
|
|
|
|||
|
Before Width: | Height: | Size: 255 B |
|
|
@ -1,84 +0,0 @@
|
|||
/*
|
||||
* 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: Carl D. Worth <cworth@cworth.org>
|
||||
*/
|
||||
|
||||
/* Bug history
|
||||
*
|
||||
* 2005-01-07 Carl Worth <cworth@cworth.org>
|
||||
*
|
||||
* Bug reported:
|
||||
*
|
||||
* From: Chris <fltk@functionalfuture.com>
|
||||
* Subject: [cairo] Render to image buffer artifacts
|
||||
* To: cairo@cairographics.org
|
||||
* Date: Fri, 07 Jan 2005 02:22:28 -0500
|
||||
*
|
||||
* I've attached the code and image that shows this off. Scaling at
|
||||
* different levels seems to change the corruption.
|
||||
*
|
||||
* For some reason there are artifacts in the alpha channel. I don't know
|
||||
* if that's the only place, but the alpha channel looks bad.
|
||||
*
|
||||
* If you run the code and parse the attached image, directing stdout to a
|
||||
* file, you can see in the lower left corner there are alpha values where
|
||||
* it should be transparent.
|
||||
* [...]
|
||||
*
|
||||
* 2005-01-11 Carl Worth <cworth@cworth.org>
|
||||
*
|
||||
* I trimmed the original test case down to the code that appears here.
|
||||
*
|
||||
*/
|
||||
|
||||
#include "cairo_test.h"
|
||||
|
||||
#define WIDTH 21
|
||||
#define HEIGHT 21
|
||||
|
||||
cairo_test_t test = {
|
||||
"leaky_polygon",
|
||||
"Exercises a corner case in the trapezoid rasterization in which pixels outside the trapezoids received a non-zero alpha",
|
||||
WIDTH, HEIGHT
|
||||
};
|
||||
|
||||
static cairo_test_status_t
|
||||
draw (cairo_t *cr, int width, int height)
|
||||
{
|
||||
cairo_scale (cr, 1.0/(1<<16), 1.0/(1<<16));
|
||||
|
||||
cairo_move_to (cr, 131072,39321);
|
||||
cairo_line_to (cr, 1103072,1288088);
|
||||
cairo_line_to (cr, 1179648,1294990);
|
||||
cairo_close_path (cr);
|
||||
|
||||
cairo_fill (cr);
|
||||
|
||||
return CAIRO_TEST_SUCCESS;
|
||||
}
|
||||
|
||||
int
|
||||
main (void)
|
||||
{
|
||||
return cairo_test (&test, draw);
|
||||
}
|
||||
|
|
@ -23,7 +23,7 @@
|
|||
* Author: Carl D. Worth <cworth@cworth.org>
|
||||
*/
|
||||
|
||||
#include "cairo_test.h"
|
||||
#include "cairo-test.h"
|
||||
|
||||
#define LINES 5
|
||||
#define LINE_LENGTH 10
|
||||
|
|
@ -31,7 +31,7 @@
|
|||
#define IMAGE_HEIGHT ((LINES+4)*LINES)/2 + 2
|
||||
|
||||
cairo_test_t test = {
|
||||
"line_width",
|
||||
"line-width",
|
||||
"Tests cairo_set_line_width",
|
||||
IMAGE_WIDTH, IMAGE_HEIGHT
|
||||
};
|
||||
|
|
|
|||
|
Before Width: | Height: | Size: 171 B |
|
|
@ -1,65 +0,0 @@
|
|||
/*
|
||||
* Copyright © 2004 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: Carl D. Worth <cworth@cworth.org>
|
||||
*/
|
||||
|
||||
#include "cairo_test.h"
|
||||
|
||||
#define LINES 5
|
||||
#define LINE_LENGTH 10
|
||||
#define IMAGE_WIDTH 2 * LINE_LENGTH + 6
|
||||
#define IMAGE_HEIGHT ((LINES+4)*LINES)/2 + 2
|
||||
|
||||
cairo_test_t test = {
|
||||
"line_width",
|
||||
"Tests cairo_set_line_width",
|
||||
IMAGE_WIDTH, IMAGE_HEIGHT
|
||||
};
|
||||
|
||||
static cairo_test_status_t
|
||||
draw (cairo_t *cr, int width, int height)
|
||||
{
|
||||
int i;
|
||||
|
||||
cairo_set_rgb_color (cr, 0, 0, 0);
|
||||
cairo_translate (cr, 2, 2);
|
||||
|
||||
for (i=0; i < LINES; i++) {
|
||||
cairo_set_line_width (cr, i+1);
|
||||
cairo_move_to (cr, 0, 0);
|
||||
cairo_rel_line_to (cr, LINE_LENGTH, 0);
|
||||
cairo_stroke (cr);
|
||||
cairo_move_to (cr, LINE_LENGTH + 2, 0.5);
|
||||
cairo_rel_line_to (cr, LINE_LENGTH, 0);
|
||||
cairo_stroke (cr);
|
||||
cairo_translate (cr, 0, i+3);
|
||||
}
|
||||
|
||||
return CAIRO_TEST_SUCCESS;
|
||||
}
|
||||
|
||||
int
|
||||
main (void)
|
||||
{
|
||||
return cairo_test (&test, draw);
|
||||
}
|
||||
|
|
@ -23,7 +23,7 @@
|
|||
* Author: Owen Taylor <otaylor@redhat.com>
|
||||
*/
|
||||
|
||||
#include "cairo_test.h"
|
||||
#include "cairo-test.h"
|
||||
#include "stdio.h"
|
||||
|
||||
/* The test matrix is
|
||||
|
|
@ -55,7 +55,7 @@ static const int n_stops[] = { 2, 3 };
|
|||
#define HEIGHT N_N_STOPS * N_ROTATE_ANGLES * UNIT_SIZE + (N_N_STOPS * N_ROTATE_ANGLES + 1) * PAD
|
||||
|
||||
cairo_test_t test = {
|
||||
"linear_gradient",
|
||||
"linear-gradient",
|
||||
"Tests the drawing of linear gradients",
|
||||
WIDTH, HEIGHT
|
||||
};
|
||||
|
|
|
|||
|
Before Width: | Height: | Size: 12 KiB |
|
|
@ -1,143 +0,0 @@
|
|||
/*
|
||||
* 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 "cairo_test.h"
|
||||
#include "stdio.h"
|
||||
|
||||
/* The test matrix is
|
||||
*
|
||||
* A) Horizontal B) 5° C) 45° D) Vertical
|
||||
* 1) Rotated 0° 2) Rotated 45° C) Rotated 90°
|
||||
* a) 2 stop b) 3 stop
|
||||
*
|
||||
* A1a B1a C1a D1a
|
||||
* A2a B2a C2a D2a
|
||||
* A3a B3a C3a D3a
|
||||
* A1b B1b C1b D1b
|
||||
* A2b B2b C2b D2b
|
||||
* A3b B3b C3b D3b
|
||||
*/
|
||||
|
||||
static const double gradient_angles[] = { 0, 45, 90 };
|
||||
#define N_GRADIENT_ANGLES 3
|
||||
static const double rotate_angles[] = { 0, 45, 90 };
|
||||
#define N_ROTATE_ANGLES 3
|
||||
static const int n_stops[] = { 2, 3 };
|
||||
#define N_N_STOPS 2
|
||||
|
||||
#define UNIT_SIZE 75
|
||||
#define UNIT_SIZE 75
|
||||
#define PAD 5
|
||||
|
||||
#define WIDTH N_GRADIENT_ANGLES * UNIT_SIZE + (N_GRADIENT_ANGLES + 1) * PAD
|
||||
#define HEIGHT N_N_STOPS * N_ROTATE_ANGLES * UNIT_SIZE + (N_N_STOPS * N_ROTATE_ANGLES + 1) * PAD
|
||||
|
||||
cairo_test_t test = {
|
||||
"linear_gradient",
|
||||
"Tests the drawing of linear gradients",
|
||||
WIDTH, HEIGHT
|
||||
};
|
||||
|
||||
static void
|
||||
draw_unit (cairo_t *cr,
|
||||
double gradient_angle,
|
||||
double rotate_angle,
|
||||
int n_stops)
|
||||
{
|
||||
cairo_pattern_t *pattern;
|
||||
|
||||
cairo_rectangle (cr, 0, 0, 1, 1);
|
||||
cairo_clip (cr);
|
||||
cairo_new_path(cr);
|
||||
|
||||
cairo_set_rgb_color (cr, 0.0, 0.0, 0.0);
|
||||
cairo_rectangle (cr, 0, 0, 1, 1);
|
||||
cairo_fill (cr);
|
||||
|
||||
cairo_translate (cr, 0.5, 0.5);
|
||||
cairo_scale (cr, 1 / 1.5, 1 / 1.5);
|
||||
cairo_rotate (cr, rotate_angle);
|
||||
|
||||
pattern = cairo_pattern_create_linear (-0.5 * cos (gradient_angle), -0.5 * sin (gradient_angle),
|
||||
0.5 * cos (gradient_angle), 0.5 * sin (gradient_angle));
|
||||
|
||||
if (n_stops == 2) {
|
||||
cairo_pattern_add_color_stop (pattern, 0.,
|
||||
0.3, 0.3, 0.3,
|
||||
1.0);
|
||||
cairo_pattern_add_color_stop (pattern, 1.,
|
||||
1.0, 1.0, 1.0,
|
||||
1.0);
|
||||
} else {
|
||||
cairo_pattern_add_color_stop (pattern, 0.,
|
||||
1.0, 0.0, 0.0,
|
||||
1.0);
|
||||
cairo_pattern_add_color_stop (pattern, 0.5,
|
||||
1.0, 1.0, 1.0,
|
||||
1.0);
|
||||
cairo_pattern_add_color_stop (pattern, 1.,
|
||||
0.0, 0.0, 1.0,
|
||||
1.0);
|
||||
}
|
||||
|
||||
cairo_set_pattern (cr, pattern);
|
||||
cairo_pattern_destroy (pattern);
|
||||
cairo_rectangle (cr, -0.5, -0.5, 1, 1);
|
||||
cairo_fill (cr);
|
||||
}
|
||||
|
||||
static cairo_test_status_t
|
||||
draw (cairo_t *cr, int width, int height)
|
||||
{
|
||||
int i, j, k;
|
||||
|
||||
cairo_set_rgb_color (cr, 0.5, 0.5, 0.5);
|
||||
cairo_rectangle (cr, 0, 0, width, height);
|
||||
cairo_fill (cr);
|
||||
|
||||
for (i = 0; i < N_GRADIENT_ANGLES; i++)
|
||||
for (j = 0; j < N_ROTATE_ANGLES; j++)
|
||||
for (k = 0; k < N_N_STOPS; k++) {
|
||||
cairo_save (cr);
|
||||
cairo_translate (cr,
|
||||
PAD + (PAD + UNIT_SIZE) * i,
|
||||
PAD + (PAD + UNIT_SIZE) * (N_ROTATE_ANGLES * k + j));
|
||||
cairo_scale (cr, UNIT_SIZE, UNIT_SIZE);
|
||||
|
||||
draw_unit (cr,
|
||||
gradient_angles[i] * M_PI / 180.,
|
||||
rotate_angles[j] * M_PI / 180.,
|
||||
n_stops[k]);
|
||||
cairo_restore (cr);
|
||||
}
|
||||
|
||||
return CAIRO_TEST_SUCCESS;
|
||||
}
|
||||
|
||||
int
|
||||
main (void)
|
||||
{
|
||||
return cairo_test (&test, draw);
|
||||
}
|
||||
|
|
@ -35,10 +35,10 @@
|
|||
*/
|
||||
|
||||
|
||||
#include "cairo_test.h"
|
||||
#include "cairo-test.h"
|
||||
|
||||
cairo_test_t test = {
|
||||
"move_to_show_surface",
|
||||
"move-to-show-surface",
|
||||
"Tests calls to cairo_show_surface after cairo_move_to",
|
||||
2, 2
|
||||
};
|
||||
|
|
|
|||
|
Before Width: | Height: | Size: 100 B |
|
|
@ -1,71 +0,0 @@
|
|||
/*
|
||||
* Copyright © 2004 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: Carl D. Worth <cworth@cworth.org>
|
||||
*/
|
||||
|
||||
/* Bug history
|
||||
*
|
||||
* 2004-10-25 Carl Worth <cworth@cworth.org>
|
||||
*
|
||||
* It looks like cairo_show_surface has no effect if it follows a
|
||||
* call to cairo_move_to to any coordinate other than 0,0. A little
|
||||
* bit of poking around suggests this isn't a regression, (at least
|
||||
* not since the last pixman snapshot).
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
#include "cairo_test.h"
|
||||
|
||||
cairo_test_t test = {
|
||||
"move_to_show_surface",
|
||||
"Tests calls to cairo_show_surface after cairo_move_to",
|
||||
2, 2
|
||||
};
|
||||
|
||||
static cairo_test_status_t
|
||||
draw (cairo_t *cr, int width, int height)
|
||||
{
|
||||
cairo_surface_t *surface;
|
||||
uint32_t colors[4] = {
|
||||
0xffffffff, 0xffff0000,
|
||||
0xff00ff00, 0xff0000ff
|
||||
};
|
||||
int i;
|
||||
|
||||
for (i=0; i < 4; i++) {
|
||||
surface = cairo_surface_create_for_image ((char *) &colors[i],
|
||||
CAIRO_FORMAT_ARGB32, 1, 1, 4);
|
||||
cairo_move_to (cr, i % 2, i / 2);
|
||||
cairo_show_surface (cr, surface, 1, 1);
|
||||
cairo_surface_destroy (surface);
|
||||
}
|
||||
|
||||
return CAIRO_TEST_SUCCESS;
|
||||
}
|
||||
|
||||
int
|
||||
main (void)
|
||||
{
|
||||
return cairo_test (&test, draw);
|
||||
}
|
||||
|
|
@ -24,10 +24,10 @@
|
|||
*/
|
||||
|
||||
#include <stdlib.h>
|
||||
#include "cairo_test.h"
|
||||
#include "cairo-test.h"
|
||||
|
||||
cairo_test_t test = {
|
||||
"path_data",
|
||||
"path-data",
|
||||
"Tests calls to path_data functions: cairo_copy_path_data, cairo_copy_path_data_flat, and cairo_append_path_data",
|
||||
45, 53
|
||||
};
|
||||
|
|
|
|||
|
Before Width: | Height: | Size: 387 B |
179
test/path_data.c
|
|
@ -1,179 +0,0 @@
|
|||
/*
|
||||
* 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: Carl D. Worth <cworth@cworth.org>
|
||||
*/
|
||||
|
||||
#include <stdlib.h>
|
||||
#include "cairo_test.h"
|
||||
|
||||
cairo_test_t test = {
|
||||
"path_data",
|
||||
"Tests calls to path_data functions: cairo_copy_path_data, cairo_copy_path_data_flat, and cairo_append_path_data",
|
||||
45, 53
|
||||
};
|
||||
|
||||
static void
|
||||
scale_by_two (double *x, double *y)
|
||||
{
|
||||
*x = *x * 2.0;
|
||||
*y = *y * 2.0;
|
||||
}
|
||||
|
||||
typedef void (*munge_func_t) (double *x, double *y);
|
||||
|
||||
static void
|
||||
munge_and_set_path (cairo_t *cr,
|
||||
cairo_path_t *path,
|
||||
munge_func_t munge)
|
||||
{
|
||||
int i;
|
||||
cairo_path_data_t *p;
|
||||
double x1, y1, x2, y2, x3, y3;
|
||||
|
||||
for (i=0; i < path->num_data; i += path->data[i].header.length) {
|
||||
p = &path->data[i];
|
||||
switch (p->header.type) {
|
||||
case CAIRO_PATH_MOVE_TO:
|
||||
x1 = p[1].point.x; y1 = p[1].point.y;
|
||||
(munge) (&x1, &y1);
|
||||
cairo_move_to (cr, x1, y1);
|
||||
break;
|
||||
case CAIRO_PATH_LINE_TO:
|
||||
x1 = p[1].point.x; y1 = p[1].point.y;
|
||||
(munge) (&x1, &y1);
|
||||
cairo_line_to (cr, x1, y1);
|
||||
break;
|
||||
case CAIRO_PATH_CURVE_TO:
|
||||
x1 = p[1].point.x; y1 = p[1].point.y;
|
||||
x2 = p[2].point.x; y2 = p[2].point.y;
|
||||
x3 = p[3].point.x; y3 = p[3].point.y;
|
||||
(munge) (&x1, &y1);
|
||||
(munge) (&x2, &y2);
|
||||
(munge) (&x3, &y3);
|
||||
cairo_curve_to (cr,
|
||||
x1, y1,
|
||||
x2, y2,
|
||||
x3, y3);
|
||||
break;
|
||||
case CAIRO_PATH_CLOSE_PATH:
|
||||
cairo_close_path (cr);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
make_path (cairo_t *cr)
|
||||
{
|
||||
cairo_rectangle (cr, 0, 0, 5, 5);
|
||||
cairo_move_to (cr, 15, 2.5);
|
||||
cairo_arc (cr, 12.5, 2.5, 2.5, 0, 2 * M_PI);
|
||||
}
|
||||
|
||||
static cairo_test_status_t
|
||||
draw (cairo_t *cr, int width, int height)
|
||||
{
|
||||
cairo_path_t *path;
|
||||
|
||||
/* copy path, munge, and fill */
|
||||
cairo_translate (cr, 5, 5);
|
||||
make_path (cr);
|
||||
path = cairo_copy_path (cr);
|
||||
|
||||
cairo_new_path (cr);
|
||||
munge_and_set_path (cr, path, scale_by_two);
|
||||
cairo_path_destroy (path);
|
||||
cairo_fill (cr);
|
||||
|
||||
/* copy flattened path, munge, and fill */
|
||||
cairo_translate (cr, 0, 15);
|
||||
make_path (cr);
|
||||
path = cairo_copy_path_flat (cr);
|
||||
|
||||
cairo_new_path (cr);
|
||||
munge_and_set_path (cr, path, scale_by_two);
|
||||
cairo_path_destroy (path);
|
||||
cairo_fill (cr);
|
||||
|
||||
/* append two copies of path, and fill */
|
||||
cairo_translate (cr, 0, 15);
|
||||
cairo_scale (cr, 2.0, 2.0);
|
||||
make_path (cr);
|
||||
path = cairo_copy_path (cr);
|
||||
|
||||
cairo_new_path (cr);
|
||||
cairo_append_path (cr, path);
|
||||
cairo_translate (cr, 2.5, 2.5);
|
||||
cairo_append_path (cr, path);
|
||||
|
||||
cairo_set_fill_rule (cr, CAIRO_FILL_RULE_EVEN_ODD);
|
||||
cairo_fill (cr);
|
||||
|
||||
cairo_path_destroy (path);
|
||||
|
||||
return CAIRO_TEST_SUCCESS;
|
||||
}
|
||||
|
||||
int
|
||||
main (void)
|
||||
{
|
||||
cairo_t *cr;
|
||||
cairo_path_data_t data;
|
||||
cairo_path_t path;
|
||||
|
||||
/* Test a few error cases for cairo_append_path_data */
|
||||
cr = cairo_create ();
|
||||
cairo_append_path (cr, NULL);
|
||||
if (cairo_status (cr) != CAIRO_STATUS_NULL_POINTER)
|
||||
return 1;
|
||||
cairo_destroy (cr);
|
||||
|
||||
cr = cairo_create ();
|
||||
path.data = NULL;
|
||||
path.num_data = 0;
|
||||
cairo_append_path (cr, &path);
|
||||
if (cairo_status (cr) != CAIRO_STATUS_NULL_POINTER)
|
||||
return 1;
|
||||
cairo_destroy (cr);
|
||||
|
||||
cr = cairo_create ();
|
||||
/* Intentionally insert bogus header.length value (otherwise would be 2) */
|
||||
data.header.type = CAIRO_PATH_MOVE_TO;
|
||||
data.header.length = 1;
|
||||
path.data = &data;
|
||||
path.num_data = 1;
|
||||
cairo_append_path (cr, &path);
|
||||
if (cairo_status (cr) != CAIRO_STATUS_INVALID_PATH_DATA)
|
||||
return 1;
|
||||
cairo_destroy (cr);
|
||||
|
||||
/* And test the degnerate case */
|
||||
cr = cairo_create ();
|
||||
path.num_data = 0;
|
||||
cairo_append_path (cr, &path);
|
||||
if (cairo_status (cr) != CAIRO_STATUS_SUCCESS)
|
||||
return 1;
|
||||
cairo_destroy (cr);
|
||||
|
||||
return cairo_test (&test, draw);
|
||||
}
|
||||
|
|
@ -7,7 +7,7 @@
|
|||
#include <cairo-png.h>
|
||||
#include <cairo-pdf.h>
|
||||
|
||||
#include "cairo_test.h"
|
||||
#include "cairo-test.h"
|
||||
|
||||
#define WIDTH 32
|
||||
#define HEIGHT WIDTH
|
||||
|
|
@ -16,7 +16,7 @@
|
|||
#define IMAGE_HEIGHT IMAGE_WIDTH
|
||||
|
||||
cairo_test_t test = {
|
||||
"pixman_rotate",
|
||||
"pixman-rotate",
|
||||
"Exposes pixman off-by-one error when rotating",
|
||||
IMAGE_WIDTH, IMAGE_HEIGHT
|
||||
};
|
||||
|
|
|
|||
|
Before Width: | Height: | Size: 260 B |
|
|
@ -1,80 +0,0 @@
|
|||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <math.h>
|
||||
|
||||
#include <cairo.h>
|
||||
#include <cairo-png.h>
|
||||
#include <cairo-pdf.h>
|
||||
|
||||
#include "cairo_test.h"
|
||||
|
||||
#define WIDTH 32
|
||||
#define HEIGHT WIDTH
|
||||
|
||||
#define IMAGE_WIDTH (3 * WIDTH)
|
||||
#define IMAGE_HEIGHT IMAGE_WIDTH
|
||||
|
||||
cairo_test_t test = {
|
||||
"pixman_rotate",
|
||||
"Exposes pixman off-by-one error when rotating",
|
||||
IMAGE_WIDTH, IMAGE_HEIGHT
|
||||
};
|
||||
|
||||
/* Draw the word cairo at NUM_TEXT different angles */
|
||||
static cairo_test_status_t
|
||||
draw (cairo_t *cr, int width, int height)
|
||||
{
|
||||
cairo_surface_t *target, *stamp;
|
||||
|
||||
target = cairo_get_target_surface (cr);
|
||||
cairo_surface_reference (target);
|
||||
|
||||
stamp = cairo_surface_create_similar (target, CAIRO_FORMAT_ARGB32,
|
||||
WIDTH, HEIGHT);
|
||||
cairo_set_target_surface (cr, stamp);
|
||||
cairo_new_path (cr);
|
||||
cairo_rectangle (cr, WIDTH / 4, HEIGHT / 4, WIDTH / 2, HEIGHT / 2);
|
||||
cairo_set_rgb_color (cr, 1, 0, 0);
|
||||
cairo_set_alpha (cr, 0.8);
|
||||
cairo_fill (cr);
|
||||
|
||||
cairo_rectangle (cr, 0, 0, WIDTH, HEIGHT);
|
||||
cairo_set_line_width (cr, 2);
|
||||
cairo_set_rgb_color (cr, 0, 0, 0);
|
||||
cairo_set_alpha (cr, 1);
|
||||
cairo_stroke (cr);
|
||||
|
||||
cairo_set_target_surface (cr, target);
|
||||
|
||||
/* Draw a translucent rectangle for reference where the rotated
|
||||
* image should be. */
|
||||
cairo_new_path (cr);
|
||||
cairo_rectangle (cr, WIDTH, HEIGHT, WIDTH, HEIGHT);
|
||||
cairo_set_rgb_color (cr, 1, 1, 0);
|
||||
cairo_set_alpha (cr, 0.3);
|
||||
cairo_fill (cr);
|
||||
|
||||
#if 1 /* Set to 0 to generate reference image */
|
||||
cairo_translate (cr, 2 * WIDTH, 2 * HEIGHT);
|
||||
cairo_rotate (cr, M_PI);
|
||||
#else
|
||||
cairo_translate (cr, WIDTH, HEIGHT);
|
||||
#endif
|
||||
|
||||
cairo_set_alpha (cr, 1);
|
||||
cairo_show_surface (cr, stamp, WIDTH + 2, HEIGHT + 2);
|
||||
|
||||
cairo_show_page (cr);
|
||||
|
||||
cairo_surface_destroy (stamp);
|
||||
cairo_surface_destroy (target);
|
||||
|
||||
return CAIRO_TEST_SUCCESS;
|
||||
}
|
||||
|
||||
int
|
||||
main (void)
|
||||
{
|
||||
return cairo_test (&test, draw);
|
||||
}
|
||||
|
|
@ -29,7 +29,7 @@
|
|||
#include <stdlib.h>
|
||||
#include <png.h>
|
||||
|
||||
#include "read_png.h"
|
||||
#include "read-png.h"
|
||||
#include "xmalloc.h"
|
||||
|
||||
static void
|
||||
|
|
|
|||
166
test/read_png.c
|
|
@ -1,166 +0,0 @@
|
|||
/*
|
||||
* Copyright © 2003 USC, Information Sciences Institute
|
||||
*
|
||||
* 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 the
|
||||
* University of Southern California not be used in advertising or
|
||||
* publicity pertaining to distribution of the software without
|
||||
* specific, written prior permission. The University of Southern
|
||||
* California makes no representations about the suitability of this
|
||||
* software for any purpose. It is provided "as is" without express
|
||||
* or implied warranty.
|
||||
*
|
||||
* THE UNIVERSITY OF SOUTHERN CALIFORNIA DISCLAIMS ALL WARRANTIES WITH
|
||||
* REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF
|
||||
* MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL THE UNIVERSITY OF
|
||||
* SOUTHERN CALIFORNIA 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: Carl D. Worth <cworth@isi.edu>
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <png.h>
|
||||
|
||||
#include "read_png.h"
|
||||
#include "xmalloc.h"
|
||||
|
||||
static void
|
||||
premultiply_data (png_structp png,
|
||||
png_row_infop row_info,
|
||||
png_bytep data)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < row_info->rowbytes; i += 4) {
|
||||
unsigned char *base = &data[i];
|
||||
unsigned char blue = base[0];
|
||||
unsigned char green = base[1];
|
||||
unsigned char red = base[2];
|
||||
unsigned char alpha = base[3];
|
||||
unsigned long p;
|
||||
|
||||
red = ((unsigned) red * (unsigned) alpha + 127) / 255;
|
||||
green = ((unsigned) green * (unsigned) alpha + 127) / 255;
|
||||
blue = ((unsigned) blue * (unsigned) alpha + 127) / 255;
|
||||
p = (alpha << 24) | (red << 16) | (green << 8) | (blue << 0);
|
||||
memcpy (base, &p, sizeof (unsigned long));
|
||||
}
|
||||
}
|
||||
|
||||
read_png_status_t
|
||||
read_png_argb32 (const char *filename,
|
||||
unsigned char **data,
|
||||
unsigned int *width,
|
||||
unsigned int *height,
|
||||
unsigned int *stride)
|
||||
{
|
||||
int i;
|
||||
FILE *file;
|
||||
static const int PNG_SIG_SIZE = 8;
|
||||
unsigned char png_sig[PNG_SIG_SIZE];
|
||||
int sig_bytes;
|
||||
png_struct *png;
|
||||
png_info *info;
|
||||
png_uint_32 png_width, png_height;
|
||||
int depth, color_type, interlace;
|
||||
unsigned int pixel_size;
|
||||
png_byte **row_pointers;
|
||||
|
||||
file = fopen (filename, "rb");
|
||||
if (file == NULL) {
|
||||
return READ_PNG_FILE_NOT_FOUND;
|
||||
}
|
||||
|
||||
sig_bytes = fread (png_sig, 1, PNG_SIG_SIZE, file);
|
||||
if (png_check_sig (png_sig, sig_bytes) == 0) {
|
||||
fclose (file);
|
||||
return READ_PNG_FILE_NOT_PNG;
|
||||
}
|
||||
|
||||
/* XXX: Perhaps we'll want some other error handlers? */
|
||||
png = png_create_read_struct (PNG_LIBPNG_VER_STRING,
|
||||
NULL,
|
||||
NULL,
|
||||
NULL);
|
||||
if (png == NULL) {
|
||||
fclose (file);
|
||||
return READ_PNG_NO_MEMORY;
|
||||
}
|
||||
|
||||
info = png_create_info_struct (png);
|
||||
if (info == NULL) {
|
||||
fclose (file);
|
||||
png_destroy_read_struct (&png, NULL, NULL);
|
||||
return READ_PNG_NO_MEMORY;
|
||||
}
|
||||
|
||||
png_init_io (png, file);
|
||||
png_set_sig_bytes (png, sig_bytes);
|
||||
|
||||
png_read_info (png, info);
|
||||
|
||||
png_get_IHDR (png, info,
|
||||
&png_width, &png_height, &depth,
|
||||
&color_type, &interlace, NULL, NULL);
|
||||
*width = png_width;
|
||||
*height = png_height;
|
||||
*stride = 4 * png_width;
|
||||
|
||||
|
||||
/* convert palette/gray image to rgb */
|
||||
if (color_type == PNG_COLOR_TYPE_PALETTE)
|
||||
png_set_palette_to_rgb (png);
|
||||
|
||||
/* expand gray bit depth if needed */
|
||||
if (color_type == PNG_COLOR_TYPE_GRAY && depth < 8)
|
||||
png_set_gray_1_2_4_to_8 (png);
|
||||
/* transform transparency to alpha */
|
||||
if (png_get_valid(png, info, PNG_INFO_tRNS))
|
||||
png_set_tRNS_to_alpha (png);
|
||||
|
||||
if (depth == 16)
|
||||
png_set_strip_16 (png);
|
||||
|
||||
if (depth < 8)
|
||||
png_set_packing (png);
|
||||
|
||||
/* convert grayscale to RGB */
|
||||
if (color_type == PNG_COLOR_TYPE_GRAY
|
||||
|| color_type == PNG_COLOR_TYPE_GRAY_ALPHA)
|
||||
png_set_gray_to_rgb (png);
|
||||
|
||||
if (interlace != PNG_INTERLACE_NONE)
|
||||
png_set_interlace_handling (png);
|
||||
|
||||
png_set_bgr (png);
|
||||
png_set_filler (png, 0xff, PNG_FILLER_AFTER);
|
||||
|
||||
png_set_read_user_transform_fn (png, premultiply_data);
|
||||
|
||||
png_read_update_info (png, info);
|
||||
|
||||
pixel_size = 4;
|
||||
*data = xmalloc (png_width * png_height * pixel_size);
|
||||
|
||||
row_pointers = malloc (png_height * sizeof(char *));
|
||||
for (i=0; i < png_height; i++)
|
||||
row_pointers[i] = (png_byte *) (*data + i * png_width * pixel_size);
|
||||
|
||||
png_read_image (png, row_pointers);
|
||||
png_read_end (png, info);
|
||||
|
||||
free (row_pointers);
|
||||
fclose (file);
|
||||
|
||||
png_destroy_read_struct (&png, &info, NULL);
|
||||
|
||||
return READ_PNG_SUCCESS;
|
||||
}
|
||||
|
|
@ -1,45 +0,0 @@
|
|||
/*
|
||||
* Copyright © 2003 USC, Information Sciences Institute
|
||||
*
|
||||
* 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 the
|
||||
* University of Southern California not be used in advertising or
|
||||
* publicity pertaining to distribution of the software without
|
||||
* specific, written prior permission. The University of Southern
|
||||
* California makes no representations about the suitability of this
|
||||
* software for any purpose. It is provided "as is" without express
|
||||
* or implied warranty.
|
||||
*
|
||||
* THE UNIVERSITY OF SOUTHERN CALIFORNIA DISCLAIMS ALL WARRANTIES WITH
|
||||
* REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF
|
||||
* MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL THE UNIVERSITY OF
|
||||
* SOUTHERN CALIFORNIA 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: Carl D. Worth <cworth@isi.edu>
|
||||
*/
|
||||
|
||||
#ifndef READ_PNG_H
|
||||
#define READ_PNG_H
|
||||
|
||||
typedef enum {
|
||||
READ_PNG_SUCCESS = 0,
|
||||
READ_PNG_FILE_NOT_FOUND,
|
||||
READ_PNG_FILE_NOT_PNG,
|
||||
READ_PNG_NO_MEMORY
|
||||
} read_png_status_t;
|
||||
|
||||
read_png_status_t
|
||||
read_png_argb32 (const char *filename,
|
||||
unsigned char **data,
|
||||
unsigned int *width,
|
||||
unsigned int *height,
|
||||
unsigned int *stride);
|
||||
|
||||
#endif
|
||||
|
|
@ -60,10 +60,10 @@
|
|||
* fixed the orginal test case.
|
||||
*/
|
||||
|
||||
#include "cairo_test.h"
|
||||
#include "cairo-test.h"
|
||||
|
||||
cairo_test_t test = {
|
||||
"text_cache_crash",
|
||||
"text-cache-crash",
|
||||
"Test case for bug causing an assertion failure in _cairo_cache_lookup",
|
||||
0, 0,
|
||||
};
|
||||
|
|
|
|||
|
|
@ -57,7 +57,7 @@
|
|||
* builtin font to cairo for pixel-perfect tests with text.
|
||||
*/
|
||||
|
||||
#include "cairo_test.h"
|
||||
#include "cairo-test.h"
|
||||
|
||||
#define WIDTH 150
|
||||
#define HEIGHT 150
|
||||
|
|
@ -65,7 +65,7 @@
|
|||
#define TEXT_SIZE 12
|
||||
|
||||
cairo_test_t test = {
|
||||
"text_rotate",
|
||||
"text-rotate",
|
||||
"Tests show_text under various rotations",
|
||||
WIDTH, HEIGHT
|
||||
};
|
||||
|
|
|
|||
|
|
@ -1,135 +0,0 @@
|
|||
/*
|
||||
* Copyright © 2004 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: Carl D. Worth <cworth@cworth.org>
|
||||
*/
|
||||
|
||||
/* Bug history
|
||||
*
|
||||
* 2004-11-04 Ned Konz <ned@squeakland.org>
|
||||
*
|
||||
* Reported bug on mailing list:
|
||||
*
|
||||
* From: Ned Konz <ned@squeakland.org>
|
||||
* To: cairo@cairographics.org
|
||||
* Date: Thu, 4 Nov 2004 09:49:38 -0800
|
||||
* Subject: [cairo] getting assertions [cairo_cache.c:143: _entry_destroy:
|
||||
* Assertion `cache->used_memory > entry->memory' failed]
|
||||
*
|
||||
* The attached program dies on me with the assert
|
||||
*
|
||||
* $ ./testCairo
|
||||
* testCairo: cairo_cache.c:143: _entry_destroy: Assertion `cache->used_memory > entry->memory' failed.
|
||||
*
|
||||
* 2004-11-04 Carl Worth <cworth@cworth.org>
|
||||
*
|
||||
* I trimmed down Ned's example to the folllowing test while still
|
||||
* maintaining the assertion.
|
||||
*
|
||||
* Oh, actually, it looks like I may have triggered something
|
||||
* slightly different:
|
||||
*
|
||||
* text_cache_crash: cairo_cache.c:422: _cairo_cache_lookup: Assertion `cache->max_memory >= (cache->used_memory + new_entry->memory)' failed.
|
||||
*
|
||||
* I'll have to go back and try the original test after I fix this.
|
||||
*
|
||||
* 2004-11-13 Carl Worth <cworth@cworth.org>
|
||||
*
|
||||
* Found the bug. cairo_gstate_select_font was noticing when the
|
||||
* same font was selected twice in a row and was erroneously failing
|
||||
* to free the old reference. Committed a fix and verified it also
|
||||
* fixed the orginal test case.
|
||||
*/
|
||||
|
||||
#include "cairo_test.h"
|
||||
|
||||
cairo_test_t test = {
|
||||
"text_cache_crash",
|
||||
"Test case for bug causing an assertion failure in _cairo_cache_lookup",
|
||||
0, 0,
|
||||
};
|
||||
#include <cairo.h>
|
||||
|
||||
static cairo_test_status_t
|
||||
draw (cairo_t *cr, int width, int height)
|
||||
{
|
||||
/* Once there was a bug that choked when selecting the same font twice. */
|
||||
cairo_select_font(cr, "sans", CAIRO_FONT_SLANT_NORMAL, CAIRO_FONT_WEIGHT_BOLD);
|
||||
cairo_scale_font(cr, 40.0);
|
||||
|
||||
cairo_select_font(cr, "sans", CAIRO_FONT_SLANT_NORMAL, CAIRO_FONT_WEIGHT_BOLD);
|
||||
cairo_scale_font(cr, 40.0);
|
||||
cairo_move_to(cr, 10, 50);
|
||||
cairo_show_text(cr, "hello");
|
||||
|
||||
/* Then there was a bug that choked when selecting a font too big
|
||||
* for the cache. */
|
||||
|
||||
/* XXX: Sometimes this leads to an assertion:
|
||||
|
||||
_cairo_cache_lookup: Assertion `cache->max_memory >= (cache->used_memory + new_entry->memory)' failed.
|
||||
Aborted
|
||||
|
||||
But other times my machine hangs completely only to return to life
|
||||
several minutes later with some programs missing. This seems like
|
||||
the out-of-memory killer to me.
|
||||
|
||||
It seems like I usually get the assertion when I run
|
||||
./text_cache_crash directly and I usually get the machine hang when
|
||||
I run "make check" but I don't know if there's a perfect
|
||||
correlation there.
|
||||
|
||||
So there's a bad bug here somewhere that really needs to be fixed.
|
||||
But in the meantime, I need "make check" not to destory work, so
|
||||
I'm commenting this test out for now.
|
||||
|
||||
cairo_scale_font (cr, 500);
|
||||
cairo_show_text (cr, "hello");
|
||||
*/
|
||||
|
||||
return CAIRO_TEST_SUCCESS;
|
||||
}
|
||||
|
||||
int
|
||||
main (void)
|
||||
{
|
||||
int ret;
|
||||
|
||||
ret = cairo_test (&test, draw);
|
||||
|
||||
/* It's convenient to be able to free all memory (including
|
||||
* statically allocated memory). This makes it quite easy to use
|
||||
* tools such as valgrind to verify that there are no memory leaks
|
||||
* whatsoever.
|
||||
*
|
||||
* But I'm not sure what would be a sensible cairo API function
|
||||
* for this. The cairo_destroy_caches call below is just something
|
||||
* I made as a local modification to cairo.
|
||||
*/
|
||||
/*
|
||||
cairo_destroy_caches ();
|
||||
FcFini ();
|
||||
*/
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
|
@ -1,119 +0,0 @@
|
|||
/*
|
||||
* Copyright © 2004 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: Carl D. Worth <cworth@cworth.org>
|
||||
*/
|
||||
|
||||
/* Bug history
|
||||
*
|
||||
* 2004-11-03 Steve Chaplin <stevech1097@yahoo.com.au>
|
||||
*
|
||||
* Reported bug on mailing list:
|
||||
*
|
||||
* From: Steve Chaplin <stevech1097@yahoo.com.au>
|
||||
* To: cairo@cairographics.org
|
||||
* Date: Thu, 04 Nov 2004 00:00:17 +0800
|
||||
* Subject: [cairo] Rotated text bug on drawable target
|
||||
*
|
||||
* The attached file draws text rotated 90 degrees first to a PNG file and
|
||||
* then to a drawable. The PNG file looks fine, the text on the drawable is
|
||||
* unreadable.
|
||||
*
|
||||
* Steve
|
||||
*
|
||||
* 2004-11-03 Carl Worth <cworth@cworth.org>
|
||||
*
|
||||
* Looks like the major problems with this bg appeared in the great
|
||||
* font rework between 0.1.23 and 0.2.0. And it looks like we need
|
||||
* to fix the regression test suite to test the xlib target (since
|
||||
* the bug does not show up in the png backend).
|
||||
*
|
||||
* Hmm... Actually, things don't look perfect even in the PNG
|
||||
* output. Look at how that 'o' moves around. It's particularly off
|
||||
* in the case where it's rotated by PI.
|
||||
*
|
||||
* And I'm still not sure about what to do for test cases with
|
||||
* text--a new version of freetype will change everything. We may
|
||||
* need to add a simple backend for stroked fonts and add a simple
|
||||
* builtin font to cairo for pixel-perfect tests with text.
|
||||
*/
|
||||
|
||||
#include "cairo_test.h"
|
||||
|
||||
#define WIDTH 150
|
||||
#define HEIGHT 150
|
||||
#define NUM_TEXT 20
|
||||
#define TEXT_SIZE 12
|
||||
|
||||
cairo_test_t test = {
|
||||
"text_rotate",
|
||||
"Tests show_text under various rotations",
|
||||
WIDTH, HEIGHT
|
||||
};
|
||||
|
||||
/* Draw the word cairo at NUM_TEXT different angles */
|
||||
static cairo_test_status_t
|
||||
draw (cairo_t *cr, int width, int height)
|
||||
{
|
||||
int i, x_off, y_off;
|
||||
cairo_text_extents_t extents;
|
||||
static char text[] = "cairo";
|
||||
|
||||
cairo_select_font (cr, "Bitstream Vera Sans",
|
||||
CAIRO_FONT_SLANT_NORMAL,
|
||||
CAIRO_FONT_WEIGHT_NORMAL);
|
||||
cairo_scale_font (cr, TEXT_SIZE);
|
||||
|
||||
cairo_set_rgb_color (cr, 0,0,0);
|
||||
|
||||
cairo_translate (cr, WIDTH/2.0, HEIGHT/2.0);
|
||||
|
||||
cairo_text_extents (cr, text, &extents);
|
||||
|
||||
if (NUM_TEXT == 1) {
|
||||
x_off = y_off = 0;
|
||||
} else {
|
||||
y_off = - round (extents.height / 2.0);
|
||||
x_off = round ((extents.height+1) / (2 * tan (M_PI/NUM_TEXT)));
|
||||
}
|
||||
|
||||
for (i=0; i < NUM_TEXT; i++) {
|
||||
cairo_save (cr);
|
||||
cairo_rotate (cr, 2*M_PI*i/NUM_TEXT);
|
||||
cairo_set_line_width (cr, 1.0);
|
||||
cairo_rectangle (cr, x_off - 0.5, y_off - 0.5, extents.width + 1, extents.height + 1);
|
||||
cairo_set_rgb_color (cr, 1, 0, 0);
|
||||
cairo_stroke (cr);
|
||||
cairo_move_to (cr, x_off - extents.x_bearing, y_off - extents.y_bearing);
|
||||
cairo_set_rgb_color (cr, 0, 0, 0);
|
||||
cairo_show_text (cr, "cairo");
|
||||
cairo_restore (cr);
|
||||
}
|
||||
|
||||
return CAIRO_TEST_SUCCESS;
|
||||
}
|
||||
|
||||
int
|
||||
main (void)
|
||||
{
|
||||
return cairo_test (&test, draw);
|
||||
}
|
||||
|
|
@ -1,78 +0,0 @@
|
|||
/*
|
||||
* 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: Kristian Høgsberg <krh@redhat.com>
|
||||
*/
|
||||
|
||||
#include <cairo.h>
|
||||
#include <assert.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
static void
|
||||
destroy_data1 (void *p)
|
||||
{
|
||||
*(int *) p = 1;
|
||||
}
|
||||
|
||||
static void
|
||||
destroy_data2 (void *p)
|
||||
{
|
||||
*(int *) p = 2;
|
||||
}
|
||||
|
||||
int
|
||||
main (void)
|
||||
{
|
||||
cairo_surface_t *surface;
|
||||
static const cairo_user_data_key_t key1, key2;
|
||||
int data1, data2;
|
||||
|
||||
data1 = 0;
|
||||
data2 = 0;
|
||||
surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, 1, 1);
|
||||
assert (cairo_surface_set_user_data (surface, &key1, &data1, destroy_data1)
|
||||
== CAIRO_STATUS_SUCCESS);
|
||||
assert (cairo_surface_set_user_data (surface, &key2, &data2, destroy_data2)
|
||||
== CAIRO_STATUS_SUCCESS);
|
||||
assert (cairo_surface_get_user_data (surface, &key1) == &data1);
|
||||
assert (cairo_surface_set_user_data (surface, &key1, NULL, NULL)
|
||||
== CAIRO_STATUS_SUCCESS);
|
||||
assert (cairo_surface_get_user_data (surface, &key1) == NULL);
|
||||
assert (data1 == 1);
|
||||
assert (data2 == 0);
|
||||
|
||||
data1 = 0;
|
||||
assert (cairo_surface_set_user_data (surface, &key1, &data1, NULL)
|
||||
== CAIRO_STATUS_SUCCESS);
|
||||
assert (cairo_surface_set_user_data (surface, &key1, NULL, NULL)
|
||||
== CAIRO_STATUS_SUCCESS);
|
||||
assert (data1 == 0);
|
||||
assert (cairo_surface_get_user_data (surface, &key1) == NULL);
|
||||
|
||||
assert (cairo_surface_set_user_data (surface, &key1, &data1, destroy_data1)
|
||||
== CAIRO_STATUS_SUCCESS);
|
||||
cairo_surface_destroy (surface);
|
||||
assert (data1 == 1);
|
||||
assert (data2 == 2);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
@ -29,7 +29,7 @@
|
|||
#include <stdlib.h>
|
||||
#include <png.h>
|
||||
|
||||
#include "write_png.h"
|
||||
#include "write-png.h"
|
||||
|
||||
static void
|
||||
unpremultiply_data (png_structp png, png_row_infop row_info, png_bytep data)
|
||||
|
|
|
|||
|
|
@ -1,99 +0,0 @@
|
|||
/*
|
||||
* Copyright © 2003 USC, Information Sciences Institute
|
||||
*
|
||||
* 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 the
|
||||
* University of Southern California not be used in advertising or
|
||||
* publicity pertaining to distribution of the software without
|
||||
* specific, written prior permission. The University of Southern
|
||||
* California makes no representations about the suitability of this
|
||||
* software for any purpose. It is provided "as is" without express
|
||||
* or implied warranty.
|
||||
*
|
||||
* THE UNIVERSITY OF SOUTHERN CALIFORNIA DISCLAIMS ALL WARRANTIES WITH
|
||||
* REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF
|
||||
* MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL THE UNIVERSITY OF
|
||||
* SOUTHERN CALIFORNIA 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: Carl D. Worth <cworth@cworth.org>
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <png.h>
|
||||
|
||||
#include "write_png.h"
|
||||
|
||||
static void
|
||||
unpremultiply_data (png_structp png, png_row_infop row_info, png_bytep data)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < row_info->rowbytes; i += 4) {
|
||||
unsigned char *b = &data[i];
|
||||
unsigned int pixel;
|
||||
unsigned char alpha;
|
||||
|
||||
memcpy (&pixel, b, sizeof (unsigned int));
|
||||
alpha = (pixel & 0xff000000) >> 24;
|
||||
if (alpha == 0) {
|
||||
b[0] = b[1] = b[2] = b[3] = 0;
|
||||
} else {
|
||||
b[0] = (((pixel & 0x0000ff) >> 0) * 255 + alpha / 2) / alpha;
|
||||
b[1] = (((pixel & 0x00ff00) >> 8) * 255 + alpha / 2) / alpha;
|
||||
b[2] = (((pixel & 0xff0000) >> 16) * 255 + alpha / 2) / alpha;
|
||||
b[3] = alpha;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
write_png_argb32 (char *buffer, FILE *file,
|
||||
int width, int height, int stride)
|
||||
{
|
||||
int i;
|
||||
png_struct *png;
|
||||
png_info *info;
|
||||
png_byte **rows;
|
||||
png_color_16 white;
|
||||
|
||||
rows = malloc (height * sizeof(png_byte*));
|
||||
|
||||
for (i = 0; i < height; i++) {
|
||||
rows[i] = buffer + i * stride;
|
||||
}
|
||||
|
||||
png = png_create_write_struct (PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
|
||||
info = png_create_info_struct (png);
|
||||
|
||||
png_init_io (png, file);
|
||||
png_set_IHDR (png, info,
|
||||
width, height, 8,
|
||||
PNG_COLOR_TYPE_RGB_ALPHA,
|
||||
PNG_INTERLACE_NONE,
|
||||
PNG_COMPRESSION_TYPE_DEFAULT,
|
||||
PNG_FILTER_TYPE_DEFAULT);
|
||||
|
||||
white.red = 0xff;
|
||||
white.blue = 0xff;
|
||||
white.green = 0xff;
|
||||
png_set_bKGD (png, info, &white);
|
||||
|
||||
png_set_write_user_transform_fn (png, unpremultiply_data);
|
||||
png_set_bgr (png);
|
||||
|
||||
png_write_info (png, info);
|
||||
png_write_image (png, rows);
|
||||
png_write_end (png, info);
|
||||
|
||||
png_destroy_write_struct (&png, &info);
|
||||
|
||||
free (rows);
|
||||
}
|
||||
|
|
@ -1,35 +0,0 @@
|
|||
/*
|
||||
* Copyright © 2003 USC, Information Sciences Institute
|
||||
*
|
||||
* 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 the
|
||||
* University of Southern California not be used in advertising or
|
||||
* publicity pertaining to distribution of the software without
|
||||
* specific, written prior permission. The University of Southern
|
||||
* California makes no representations about the suitability of this
|
||||
* software for any purpose. It is provided "as is" without express
|
||||
* or implied warranty.
|
||||
*
|
||||
* THE UNIVERSITY OF SOUTHERN CALIFORNIA DISCLAIMS ALL WARRANTIES WITH
|
||||
* REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF
|
||||
* MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL THE UNIVERSITY OF
|
||||
* SOUTHERN CALIFORNIA 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: Carl D. Worth <cworth@isi.edu>
|
||||
*/
|
||||
|
||||
#ifndef WRITE_PNG_H
|
||||
#define WRITE_PNG_H
|
||||
|
||||
void
|
||||
write_png_argb32 (char *buffer, FILE * file,
|
||||
int width, int height, int stride);
|
||||
|
||||
#endif
|
||||