Opensource Compliance Issue.
[platform/core/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 #define BASENAME "png.out"
34
35 static cairo_bool_t
36 image_surface_equals (cairo_surface_t *A, cairo_surface_t *B)
37 {
38     if (cairo_image_surface_get_format (A) !=
39         cairo_image_surface_get_format (B))
40         return 0;
41
42     if (cairo_image_surface_get_width (A) !=
43         cairo_image_surface_get_width (B))
44         return 0;
45
46     if (cairo_image_surface_get_height (A) !=
47         cairo_image_surface_get_height (B))
48         return 0;
49
50     return 1;
51 }
52
53 static const char *
54 format_to_string (cairo_format_t format)
55 {
56     switch (format) {
57     case CAIRO_FORMAT_A1:     return "a1";
58     case CAIRO_FORMAT_A8:     return "a8";
59     case CAIRO_FORMAT_RGB16_565:  return "rgb16";
60     case CAIRO_FORMAT_RGB24:  return "rgb24";
61     case CAIRO_FORMAT_RGB30:  return "rgb30";
62     case CAIRO_FORMAT_ARGB32: return "argb32";
63     case CAIRO_FORMAT_INVALID:
64     default: return "???";
65     }
66 }
67
68 static void
69 print_surface (const cairo_test_context_t *ctx, cairo_surface_t *surface)
70 {
71     cairo_test_log (ctx,
72                     "%s (%dx%d)\n",
73                     format_to_string (cairo_image_surface_get_format (surface)),
74                     cairo_image_surface_get_width (surface),
75                     cairo_image_surface_get_height (surface));
76 }
77
78 static cairo_test_status_t
79 preamble (cairo_test_context_t *ctx)
80 {
81     cairo_surface_t *surface0, *surface1;
82     cairo_status_t status;
83     uint32_t argb32 = 0xdeadbede;
84     char *filename;
85     const char *path = cairo_test_mkdir (CAIRO_TEST_OUTPUT_DIR) ? CAIRO_TEST_OUTPUT_DIR : ".";
86
87     xasprintf (&filename, "%s/%s.png", path, BASENAME);
88     surface0 = cairo_image_surface_create_for_data ((unsigned char *) &argb32,
89                                                     CAIRO_FORMAT_ARGB32,
90                                                     1, 1, 4);
91     status = cairo_surface_write_to_png (surface0, filename);
92     if (status) {
93         cairo_test_log (ctx, "Error writing '%s': %s\n",
94                         filename, cairo_status_to_string (status));
95
96         cairo_surface_destroy (surface0);
97         free (filename);
98         return cairo_test_status_from_status (ctx, status);
99     }
100     surface1 = cairo_image_surface_create_from_png (filename);
101     status = cairo_surface_status (surface1);
102     if (status) {
103         cairo_test_log (ctx, "Error reading '%s': %s\n",
104                         filename, cairo_status_to_string (status));
105
106         cairo_surface_destroy (surface1);
107         cairo_surface_destroy (surface0);
108         free (filename);
109         return cairo_test_status_from_status (ctx, status);
110     }
111
112     if (! image_surface_equals (surface0, surface1)) {
113         cairo_test_log (ctx, "Error surface mismatch.\n");
114         cairo_test_log (ctx, "to png: "); print_surface (ctx, surface0);
115         cairo_test_log (ctx, "from png: "); print_surface (ctx, surface1);
116
117         cairo_surface_destroy (surface0);
118         cairo_surface_destroy (surface1);
119         free (filename);
120         return CAIRO_TEST_FAILURE;
121     }
122     assert (*(uint32_t *) cairo_image_surface_get_data (surface1) == argb32);
123
124     cairo_surface_destroy (surface0);
125     cairo_surface_destroy (surface1);
126
127     surface0 = cairo_image_surface_create_for_data ((unsigned char *) &argb32,
128                                                     CAIRO_FORMAT_RGB24,
129                                                     1, 1, 4);
130     status = cairo_surface_write_to_png (surface0, filename);
131     if (status) {
132         cairo_test_log (ctx, "Error writing '%s': %s\n",
133                         filename, cairo_status_to_string (status));
134         cairo_surface_destroy (surface0);
135         return cairo_test_status_from_status (ctx, status);
136     }
137     surface1 = cairo_image_surface_create_from_png (filename);
138     status = cairo_surface_status (surface1);
139     free (filename);
140     if (status) {
141         cairo_test_log (ctx, "Error reading '%s': %s\n",
142                         filename, cairo_status_to_string (status));
143
144         cairo_surface_destroy (surface1);
145         cairo_surface_destroy (surface0);
146         return cairo_test_status_from_status (ctx, status);
147     }
148
149     if (! image_surface_equals (surface0, surface1)) {
150         cairo_test_log (ctx, "Error surface mismatch.\n");
151         cairo_test_log (ctx, "to png: "); print_surface (ctx, surface0);
152         cairo_test_log (ctx, "from png: "); print_surface (ctx, surface1);
153
154         cairo_surface_destroy (surface0);
155         cairo_surface_destroy (surface1);
156         return CAIRO_TEST_FAILURE;
157     }
158     assert ((*(uint32_t *) cairo_image_surface_get_data (surface1) & RGB_MASK)
159             == (argb32 & RGB_MASK));
160
161     cairo_surface_destroy (surface0);
162     cairo_surface_destroy (surface1);
163
164     return CAIRO_TEST_SUCCESS;
165 }
166
167 CAIRO_TEST (png,
168             "Check that the png export/import is idempotent.",
169             "png, api", /* keywords */
170             NULL, /* requirements */
171             0, 0,
172             preamble, NULL)