150 lines
		
	
	
		
			4.4 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			150 lines
		
	
	
		
			4.4 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /* This file is part of GTK+
 | |
|  *
 | |
|  * AUTHORS
 | |
|  *     Sven Herzberg
 | |
|  *
 | |
|  * Copyright (C) 2008  Sven Herzberg
 | |
|  *
 | |
|  * This work is provided "as is"; redistribution and modification
 | |
|  * in whole or in part, in any medium, physical or electronic is
 | |
|  * permitted without restriction.
 | |
|  *
 | |
|  * This work is distributed in the hope that it will be useful,
 | |
|  * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | |
|  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 | |
|  *
 | |
|  * In no event shall the authors or contributors be liable for any
 | |
|  * direct, indirect, incidental, special, exemplary, or consequential
 | |
|  * damages (including, but not limited to, procurement of substitute
 | |
|  * goods or services; loss of use, data, or profits; or business
 | |
|  * interruption) however caused and on any theory of liability, whether
 | |
|  * in contract, strict liability, or tort (including negligence or
 | |
|  * otherwise) arising in any way out of the use of this software, even
 | |
|  * if advised of the possibility of such damage.
 | |
|  */
 | |
| 
 | |
| #include <glib/gstdio.h>
 | |
| #include <gdk/gdk.h>
 | |
| #ifdef CAIRO_HAS_QUARTZ_SURFACE
 | |
| #include <cairo-quartz.h>
 | |
| #endif
 | |
| 
 | |
| static void
 | |
| test (cairo_t* cr)
 | |
| {
 | |
| 	cairo_save (cr);
 | |
| 	 cairo_set_source_rgb (cr, 1.0, 1.0, 1.0);
 | |
| 	 cairo_paint (cr);
 | |
| 	cairo_restore (cr);
 | |
| 
 | |
| 	cairo_move_to (cr, 10.0, 20.0);
 | |
| 	cairo_line_to (cr, 10.0, 30.0);
 | |
| 	cairo_stroke (cr);
 | |
| 
 | |
| 	cairo_set_source_rgba (cr, 0.0, 0.0, 0.0, 0.5);
 | |
| 	cairo_arc (cr, 0.0, 0.0, 10.0, 0.0, G_PI/2);
 | |
| 	cairo_stroke (cr);
 | |
| }
 | |
| 
 | |
| static void
 | |
| test_surface_orientation (void)
 | |
| {
 | |
| 	cairo_surface_t *surface;
 | |
| 	GdkPixbuf* pixbuf;
 | |
| 	GdkPixbuf* pbuf_platform;
 | |
| 	GdkPixbuf* pbuf_imagesrf;
 | |
| 	GError   * error = NULL;
 | |
| 	cairo_surface_t* surface;
 | |
| 	cairo_t* cr;
 | |
| 	guchar* data_platform;
 | |
| 	guchar* data_imagesrf;
 | |
| 	guint i;
 | |
| 
 | |
| 	/* create "platform.png" via native cairo surface */
 | |
| 	surface = gdk_window_create_similar_surface (gdk_get_default_root_window (),
 | |
|                                                      CAIRO_CONTENT_COLOR,
 | |
|                                                      100,
 | |
|                                                      80);
 | |
| 	cr = cairo_create (surface);
 | |
| 	test (cr);
 | |
| 	cairo_destroy (cr);
 | |
| 
 | |
| 	pixbuf = gdk_pixbuf_get_from_surface (NULL,
 | |
| 					      surface,
 | |
| 					      0, 0,
 | |
| 					      0, 0,
 | |
| 					      100, 80);
 | |
| 	if (!gdk_pixbuf_save (pixbuf, "gdksurface.png", "png", NULL, NULL)) {
 | |
| 		g_error ("Eeek! Couldn't save the file \"gdksurface.png\"");
 | |
| 	}
 | |
| 	g_object_unref (pixbuf);
 | |
| 
 | |
| 	cairo_surface_destroy (surface);
 | |
| 
 | |
| 	/* create "cairosurface.png" via pure cairo */
 | |
| #ifndef CAIRO_HAS_QUARTZ_SURFACE
 | |
| 	surface = cairo_image_surface_create (CAIRO_FORMAT_RGB24, 100, 80);
 | |
| #else
 | |
| 	surface = cairo_quartz_surface_create (CAIRO_FORMAT_RGB24, 100, 80);
 | |
| #endif
 | |
| 	cr = cairo_create (surface);
 | |
| 	test (cr);
 | |
| 	cairo_destroy (cr);
 | |
| 	if (CAIRO_STATUS_SUCCESS != cairo_surface_write_to_png (surface, "cairosurface.png")) {
 | |
| 		g_error ("Eeek! Couldn't save the file \"cairosurface.png\"");
 | |
| 	}
 | |
| 	cairo_surface_destroy (surface);
 | |
| 
 | |
| 	/* compare the images */
 | |
| 	pbuf_platform = gdk_pixbuf_new_from_file ("gdksurface.png", &error);
 | |
| 	if (!pbuf_platform || error) {
 | |
| 		g_error ("Eeek! Error loading \"gdksurface.png\"");
 | |
| 	}
 | |
| 	pbuf_imagesrf = gdk_pixbuf_new_from_file ("cairosurface.png", &error);
 | |
| 	if (!pbuf_imagesrf || error) {
 | |
| 		g_object_unref (pbuf_platform);
 | |
| 		g_error ("Eeek! Error loading \"cairosurface.png\"");
 | |
| 	}
 | |
| 
 | |
| 	g_assert (gdk_pixbuf_get_width (pbuf_platform) ==
 | |
| 		  gdk_pixbuf_get_width (pbuf_imagesrf));
 | |
| 	g_assert (gdk_pixbuf_get_height (pbuf_platform) ==
 | |
| 		  gdk_pixbuf_get_height (pbuf_imagesrf));
 | |
| 	g_assert (gdk_pixbuf_get_rowstride (pbuf_platform) ==
 | |
| 		  gdk_pixbuf_get_rowstride (pbuf_imagesrf));
 | |
| 	g_assert (gdk_pixbuf_get_n_channels (pbuf_platform) ==
 | |
| 		  gdk_pixbuf_get_n_channels (pbuf_imagesrf));
 | |
| 
 | |
| 	data_platform = gdk_pixbuf_get_pixels (pbuf_platform);
 | |
| 	data_imagesrf = gdk_pixbuf_get_pixels (pbuf_imagesrf);
 | |
| 
 | |
| 	for (i = 0; i < gdk_pixbuf_get_height (pbuf_platform) * gdk_pixbuf_get_rowstride (pbuf_platform); i++) {
 | |
| 		if (data_platform[i] != data_imagesrf[i]) {
 | |
| 			g_warning ("Eeek! Images are differing at byte %d", i);
 | |
| 			g_object_unref (pbuf_platform);
 | |
| 			g_object_unref (pbuf_imagesrf);
 | |
| 			g_assert_not_reached ();
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	g_object_unref (pbuf_platform);
 | |
| 	g_object_unref (pbuf_imagesrf);
 | |
| 
 | |
| 	g_unlink ("gdksurface.png");
 | |
| 	g_unlink ("cairosurface.png");
 | |
| }
 | |
| 
 | |
| int
 | |
| main (int   argc,
 | |
|       char**argv)
 | |
| {
 | |
| 	g_test_init (&argc, &argv, NULL);
 | |
| 	gdk_init (&argc, &argv);
 | |
| 
 | |
| 	g_test_add_func ("/gdk/surface/orientation",
 | |
| 			 test_surface_orientation);
 | |
| 
 | |
| 	return g_test_run ();
 | |
| }
 | |
| 
 | 
