1
/*
2
 * Copyright © 2007 Björn Lindqvist
3
 *
4
 * Permission is hereby granted, free of charge, to any person
5
 * obtaining a copy of this software and associated documentation
6
 * files (the "Software"), to deal in the Software without
7
 * restriction, including without limitation the rights to use, copy,
8
 * modify, merge, publish, distribute, sublicense, and/or sell copies
9
 * of the Software, and to permit persons to whom the Software is
10
 * furnished to do so, subject to the following conditions:
11
 *
12
 * The above copyright notice and this permission notice shall be
13
 * included in all copies or substantial portions of the Software.
14
 *
15
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
16
 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
17
 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
18
 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
19
 * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
20
 * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
21
 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22
 * SOFTWARE.
23
 *
24
 * Author: Björn Lindqvist <bjourne@gmail.com>
25
 */
26

            
27
#include "cairo-perf.h"
28

            
29
/* This test case measures how much time cairo takes to render the
30
 * equivalent of the following gdk-pixbuf operation:
31
 *
32
 *    gdk_pixbuf_composite_color(dest,
33
 *                               0, 0, DST_SIZE, DST_SIZE,
34
 *                               0, 0,
35
 *                               SCALE, SCALE,
36
 *                               gdk.INTERP_NEAREST,
37
 *                               255,
38
 *                               0, 0,
39
 *                               8, 0x33333333, 0x88888888);
40
 *
41
 * Cairo is (at the time of writing) about 2-3 times as slow as
42
 * gdk-pixbuf.
43
 */
44
#define PAT_SIZE    16
45
#define SRC_SIZE    64
46

            
47
static cairo_pattern_t *checkerboard = NULL;
48
static cairo_pattern_t *src_pattern = NULL;
49

            
50
static cairo_time_t
51
do_composite_checker (cairo_t *cr,
52
                      int      width,
53
                      int      height,
54
		      int loops)
55
{
56
    /* Compute zoom so that the src_pattern covers the whole output image. */
57
    double xscale = width / (double) SRC_SIZE;
58
    double yscale = height / (double) SRC_SIZE;
59

            
60
    cairo_perf_timer_start ();
61

            
62
    while (loops--) {
63
	/* Fill the surface with our background. */
64
	cairo_identity_matrix (cr);
65
	cairo_set_source (cr, checkerboard);
66
	cairo_paint (cr);
67

            
68
	/* Draw the scaled image on top. */
69
	cairo_scale (cr, xscale, yscale);
70
	cairo_set_source (cr, src_pattern);
71
	cairo_paint (cr);
72
    }
73

            
74
    cairo_perf_timer_stop ();
75
    return cairo_perf_timer_elapsed ();
76
}
77

            
78
cairo_bool_t
79
composite_checker_enabled (cairo_perf_t *perf)
80
{
81
    return cairo_perf_can_run (perf, "composite-checker", NULL);
82
}
83

            
84
void
85
composite_checker (cairo_perf_t *perf,
86
                   cairo_t      *cr,
87
                   int           width,
88
                   int           height)
89
{
90
    cairo_surface_t *image;
91

            
92
    /* Create the checker pattern. We don't actually need to draw
93
     * anything on it since that wouldn't affect performance.
94
     */
95
    image = cairo_image_surface_create (CAIRO_FORMAT_ARGB32,
96
                                        PAT_SIZE,
97
                                        PAT_SIZE);
98
    checkerboard = cairo_pattern_create_for_surface (image);
99
    cairo_pattern_set_filter (checkerboard, CAIRO_FILTER_NEAREST);
100
    cairo_pattern_set_extend (checkerboard, CAIRO_EXTEND_REPEAT);
101
    cairo_surface_destroy (image);
102

            
103
    /* Create the image source pattern. Again we use the NEAREST
104
     * filtering which should be fastest.
105
    */
106
    image = cairo_image_surface_create (CAIRO_FORMAT_ARGB32,
107
                                        SRC_SIZE,
108
                                        SRC_SIZE);
109
    src_pattern = cairo_pattern_create_for_surface (image);
110
    cairo_pattern_set_filter (src_pattern, CAIRO_FILTER_NEAREST);
111
    cairo_surface_destroy (image);
112

            
113
    cairo_perf_run (perf, "composite-checker", do_composite_checker, NULL);
114

            
115
    cairo_pattern_destroy (checkerboard);
116
    cairo_pattern_destroy (src_pattern);
117
}