Upload Tizen2.0 source
[framework/graphics/cairo.git] / test / png.c
1 /*
2  * Copyright © 2008 Chris Wilson
3  *
4  * Permission to use, copy, modify, distribute, and sell this software
5  * and its documentation for any purpose is hereby granted without
6  * fee, provided that the above copyright notice appear in all copies
7  * and that both that copyright notice and this permission notice
8  * appear in supporting documentation, and that the name of
9  * Chris Wilson not be used in advertising or publicity pertaining to
10  * distribution of the software without specific, written prior
11  * permission. Chris Wilson makes no representations about the
12  * suitability of this software for any purpose.  It is provided "as
13  * is" without express or implied warranty.
14  *
15  * CHRIS WILSON DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS
16  * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
17  * FITNESS, IN NO EVENT SHALL CHRIS WILSON BE LIABLE FOR ANY SPECIAL,
18  * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER
19  * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
20  * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR
21  * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
22  *
23  * Author: Chris Wilson <chris@chris-wilson.co.uk>
24  */
25
26 #include "cairo-test.h"
27
28 #include <assert.h>
29
30 /* Test the idempotency of write_png->read_png */
31
32 #define RGB_MASK 0x00ffffff
33
34 static cairo_bool_t
35 image_surface_equals (cairo_surface_t *A, cairo_surface_t *B)
36 {
37     if (cairo_image_surface_get_format (A) !=
38         cairo_image_surface_get_format (B))
39         return 0;
40
41     if (cairo_image_surface_get_width (A) !=
42         cairo_image_surface_get_width (B))
43         return 0;
44
45     if (cairo_image_surface_get_height (A) !=
46         cairo_image_surface_get_height (B))
47         return 0;
48
49     return 1;
50 }
51
52 static const char *
53 format_to_string (cairo_format_t format)
54 {
55     switch (format) {
56     case CAIRO_FORMAT_A1:     return "a1";
57     case CAIRO_FORMAT_A8:     return "a8";
58     case CAIRO_FORMAT_RGB16_565:  return "rgb16";
59     case CAIRO_FORMAT_RGB24:  return "rgb24";
60     case CAIRO_FORMAT_ARGB32: return "argb32";
61     case CAIRO_FORMAT_INVALID:
62     default: return "???";
63     }
64 }
65
66 static void
67 print_surface (const cairo_test_context_t *ctx, cairo_surface_t *surface)
68 {
69     cairo_test_log (ctx,
70                     "%s (%dx%d)\n",
71                     format_to_string (cairo_image_surface_get_format (surface)),
72                     cairo_image_surface_get_width (surface),
73                     cairo_image_surface_get_height (surface));
74 }
75
76 static cairo_test_status_t
77 preamble (cairo_test_context_t *ctx)
78 {
79     const char *filename = "png.out.png";
80     cairo_surface_t *surface0, *surface1;
81     cairo_status_t status;
82     uint32_t argb32 = 0xdeadbede;
83
84     surface0 = cairo_image_surface_create_for_data ((unsigned char *) &argb32,
85                                                     CAIRO_FORMAT_ARGB32,
86                                                     1, 1, 4);
87     status = cairo_surface_write_to_png (surface0, filename);
88     if (status) {
89         cairo_test_log (ctx, "Error writing '%s': %s\n",
90                         filename, cairo_status_to_string (status));
91
92         cairo_surface_destroy (surface0);
93         return cairo_test_status_from_status (ctx, status);
94     }
95     surface1 = cairo_image_surface_create_from_png (filename);
96     status = cairo_surface_status (surface1);
97     if (status) {
98         cairo_test_log (ctx, "Error reading '%s': %s\n",
99                         filename, cairo_status_to_string (status));
100
101         cairo_surface_destroy (surface1);
102         cairo_surface_destroy (surface0);
103         return cairo_test_status_from_status (ctx, status);
104     }
105
106     if (! image_surface_equals (surface0, surface1)) {
107         cairo_test_log (ctx, "Error surface mismatch.\n");
108         cairo_test_log (ctx, "to png: "); print_surface (ctx, surface0);
109         cairo_test_log (ctx, "from png: "); print_surface (ctx, surface1);
110
111         cairo_surface_destroy (surface0);
112         cairo_surface_destroy (surface1);
113         return CAIRO_TEST_FAILURE;
114     }
115     assert (*(uint32_t *) cairo_image_surface_get_data (surface1) == argb32);
116
117     cairo_surface_destroy (surface0);
118     cairo_surface_destroy (surface1);
119
120     surface0 = cairo_image_surface_create_for_data ((unsigned char *) &argb32,
121                                                     CAIRO_FORMAT_RGB24,
122                                                     1, 1, 4);
123     status = cairo_surface_write_to_png (surface0, filename);
124     if (status) {
125         cairo_test_log (ctx, "Error writing '%s': %s\n",
126                         filename, cairo_status_to_string (status));
127         cairo_surface_destroy (surface0);
128         return cairo_test_status_from_status (ctx, status);
129     }
130     surface1 = cairo_image_surface_create_from_png (filename);
131     status = cairo_surface_status (surface1);
132     if (status) {
133         cairo_test_log (ctx, "Error reading '%s': %s\n",
134                         filename, cairo_status_to_string (status));
135
136         cairo_surface_destroy (surface1);
137         cairo_surface_destroy (surface0);
138         return cairo_test_status_from_status (ctx, status);
139     }
140
141     if (! image_surface_equals (surface0, surface1)) {
142         cairo_test_log (ctx, "Error surface mismatch.\n");
143         cairo_test_log (ctx, "to png: "); print_surface (ctx, surface0);
144         cairo_test_log (ctx, "from png: "); print_surface (ctx, surface1);
145
146         cairo_surface_destroy (surface0);
147         cairo_surface_destroy (surface1);
148         return CAIRO_TEST_FAILURE;
149     }
150     assert ((*(uint32_t *) cairo_image_surface_get_data (surface1) & RGB_MASK)
151             == (argb32 & RGB_MASK));
152
153     cairo_surface_destroy (surface0);
154     cairo_surface_destroy (surface1);
155
156     return CAIRO_TEST_SUCCESS;
157 }
158
159 CAIRO_TEST (png,
160             "Check that the png export/import is idempotent.",
161             "png, api", /* keywords */
162             NULL, /* requirements */
163             0, 0,
164             preamble, NULL)