298 lines
		
	
	
		
			8.3 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
		
		
			
		
	
	
			298 lines
		
	
	
		
			8.3 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| 
								 | 
							
								/* PIKA - Photo and Image Kooker Application
							 | 
						||
| 
								 | 
							
								 * a rebranding of The GNU Image Manipulation Program (created with heckimp)
							 | 
						||
| 
								 | 
							
								 * A derived work which may be trivial. However, any changes may be (C)2023 by Aldercone Studio
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * Original copyright, applying to most contents (license remains unchanged): 
							 | 
						||
| 
								 | 
							
								 * Copyright (C) 2009 Martin Nordholts
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * This program is free software: you can redistribute it and/or modify
							 | 
						||
| 
								 | 
							
								 * it under the terms of the GNU General Public License as published by
							 | 
						||
| 
								 | 
							
								 * the Free Software Foundation; either version 3 of the License, or
							 | 
						||
| 
								 | 
							
								 * (at your option) any later version.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * This program 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.  See the
							 | 
						||
| 
								 | 
							
								 * GNU General Public License for more details.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * You should have received a copy of the GNU General Public License
							 | 
						||
| 
								 | 
							
								 * along with this program.  If not, see <https://www.gnu.org/licenses/>.
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#include <gegl.h>
							 | 
						||
| 
								 | 
							
								#include <gtk/gtk.h>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#include "widgets/widgets-types.h"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#include "widgets/pikauimanager.h"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#include "core/pika.h"
							 | 
						||
| 
								 | 
							
								#include "core/pikacontext.h"
							 | 
						||
| 
								 | 
							
								#include "core/pikaimage.h"
							 | 
						||
| 
								 | 
							
								#include "core/pikalayer.h"
							 | 
						||
| 
								 | 
							
								#include "core/pikalayer-new.h"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#include "operations/pikalevelsconfig.h"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#include "tests.h"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#include "pika-app-test-utils.h"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#define PIKA_TEST_IMAGE_SIZE 100
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#define ADD_IMAGE_TEST(function) \
							 | 
						||
| 
								 | 
							
								  g_test_add ("/pika-core/" #function, \
							 | 
						||
| 
								 | 
							
								              PikaTestFixture, \
							 | 
						||
| 
								 | 
							
								              pika, \
							 | 
						||
| 
								 | 
							
								              pika_test_image_setup, \
							 | 
						||
| 
								 | 
							
								              function, \
							 | 
						||
| 
								 | 
							
								              pika_test_image_teardown);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#define ADD_TEST(function) \
							 | 
						||
| 
								 | 
							
								  g_test_add ("/pika-core/" #function, \
							 | 
						||
| 
								 | 
							
								              PikaTestFixture, \
							 | 
						||
| 
								 | 
							
								              pika, \
							 | 
						||
| 
								 | 
							
								              NULL, \
							 | 
						||
| 
								 | 
							
								              function, \
							 | 
						||
| 
								 | 
							
								              NULL);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								typedef struct
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								  PikaImage *image;
							 | 
						||
| 
								 | 
							
								} PikaTestFixture;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								static void pika_test_image_setup    (PikaTestFixture *fixture,
							 | 
						||
| 
								 | 
							
								                                      gconstpointer    data);
							 | 
						||
| 
								 | 
							
								static void pika_test_image_teardown (PikaTestFixture *fixture,
							 | 
						||
| 
								 | 
							
								                                      gconstpointer    data);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/**
							 | 
						||
| 
								 | 
							
								 * pika_test_image_setup:
							 | 
						||
| 
								 | 
							
								 * @fixture:
							 | 
						||
| 
								 | 
							
								 * @data:
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * Test fixture setup for a single image.
							 | 
						||
| 
								 | 
							
								 **/
							 | 
						||
| 
								 | 
							
								static void
							 | 
						||
| 
								 | 
							
								pika_test_image_setup (PikaTestFixture *fixture,
							 | 
						||
| 
								 | 
							
								                       gconstpointer    data)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								  Pika *pika = PIKA (data);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  fixture->image = pika_image_new (pika,
							 | 
						||
| 
								 | 
							
								                                   PIKA_TEST_IMAGE_SIZE,
							 | 
						||
| 
								 | 
							
								                                   PIKA_TEST_IMAGE_SIZE,
							 | 
						||
| 
								 | 
							
								                                   PIKA_RGB,
							 | 
						||
| 
								 | 
							
								                                   PIKA_PRECISION_FLOAT_LINEAR);
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/**
							 | 
						||
| 
								 | 
							
								 * pika_test_image_teardown:
							 | 
						||
| 
								 | 
							
								 * @fixture:
							 | 
						||
| 
								 | 
							
								 * @data:
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * Test fixture teardown for a single image.
							 | 
						||
| 
								 | 
							
								 **/
							 | 
						||
| 
								 | 
							
								static void
							 | 
						||
| 
								 | 
							
								pika_test_image_teardown (PikaTestFixture *fixture,
							 | 
						||
| 
								 | 
							
								                          gconstpointer    data)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								  g_object_unref (fixture->image);
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/**
							 | 
						||
| 
								 | 
							
								 * rotate_non_overlapping:
							 | 
						||
| 
								 | 
							
								 * @fixture:
							 | 
						||
| 
								 | 
							
								 * @data:
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * Super basic test that makes sure we can add a layer
							 | 
						||
| 
								 | 
							
								 * and call pika_item_rotate with center at (0, -10)
							 | 
						||
| 
								 | 
							
								 * without triggering a failed assertion .
							 | 
						||
| 
								 | 
							
								 **/
							 | 
						||
| 
								 | 
							
								static void
							 | 
						||
| 
								 | 
							
								rotate_non_overlapping (PikaTestFixture *fixture,
							 | 
						||
| 
								 | 
							
								                        gconstpointer    data)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								  Pika        *pika    = PIKA (data);
							 | 
						||
| 
								 | 
							
								  PikaImage   *image   = fixture->image;
							 | 
						||
| 
								 | 
							
								  PikaLayer   *layer;
							 | 
						||
| 
								 | 
							
								  PikaContext *context = pika_context_new (pika, "Test", NULL /*template*/);
							 | 
						||
| 
								 | 
							
								  gboolean     result;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  g_assert_cmpint (pika_image_get_n_layers (image), ==, 0);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  layer = pika_layer_new (image,
							 | 
						||
| 
								 | 
							
								                          PIKA_TEST_IMAGE_SIZE,
							 | 
						||
| 
								 | 
							
								                          PIKA_TEST_IMAGE_SIZE,
							 | 
						||
| 
								 | 
							
								                          babl_format ("R'G'B'A u8"),
							 | 
						||
| 
								 | 
							
								                          "Test Layer",
							 | 
						||
| 
								 | 
							
								                          PIKA_OPACITY_OPAQUE,
							 | 
						||
| 
								 | 
							
								                          PIKA_LAYER_MODE_NORMAL);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  g_assert_cmpint (PIKA_IS_LAYER (layer), ==, TRUE);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  result = pika_image_add_layer (image,
							 | 
						||
| 
								 | 
							
								                                 layer,
							 | 
						||
| 
								 | 
							
								                                 PIKA_IMAGE_ACTIVE_PARENT,
							 | 
						||
| 
								 | 
							
								                                 0,
							 | 
						||
| 
								 | 
							
								                                 FALSE);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  pika_item_rotate (PIKA_ITEM (layer), context, PIKA_ROTATE_90, 0., -10., TRUE);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  g_assert_cmpint (result, ==, TRUE);
							 | 
						||
| 
								 | 
							
								  g_assert_cmpint (pika_image_get_n_layers (image), ==, 1);
							 | 
						||
| 
								 | 
							
								  g_object_unref (context);
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/**
							 | 
						||
| 
								 | 
							
								 * add_layer:
							 | 
						||
| 
								 | 
							
								 * @fixture:
							 | 
						||
| 
								 | 
							
								 * @data:
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * Super basic test that makes sure we can add a layer.
							 | 
						||
| 
								 | 
							
								 **/
							 | 
						||
| 
								 | 
							
								static void
							 | 
						||
| 
								 | 
							
								add_layer (PikaTestFixture *fixture,
							 | 
						||
| 
								 | 
							
								           gconstpointer    data)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								  PikaImage *image = fixture->image;
							 | 
						||
| 
								 | 
							
								  PikaLayer *layer;
							 | 
						||
| 
								 | 
							
								  gboolean   result;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  g_assert_cmpint (pika_image_get_n_layers (image), ==, 0);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  layer = pika_layer_new (image,
							 | 
						||
| 
								 | 
							
								                          PIKA_TEST_IMAGE_SIZE,
							 | 
						||
| 
								 | 
							
								                          PIKA_TEST_IMAGE_SIZE,
							 | 
						||
| 
								 | 
							
								                          babl_format ("R'G'B'A u8"),
							 | 
						||
| 
								 | 
							
								                          "Test Layer",
							 | 
						||
| 
								 | 
							
								                          PIKA_OPACITY_OPAQUE,
							 | 
						||
| 
								 | 
							
								                          PIKA_LAYER_MODE_NORMAL);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  g_assert_cmpint (PIKA_IS_LAYER (layer), ==, TRUE);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  result = pika_image_add_layer (image,
							 | 
						||
| 
								 | 
							
								                                 layer,
							 | 
						||
| 
								 | 
							
								                                 PIKA_IMAGE_ACTIVE_PARENT,
							 | 
						||
| 
								 | 
							
								                                 0,
							 | 
						||
| 
								 | 
							
								                                 FALSE);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  g_assert_cmpint (result, ==, TRUE);
							 | 
						||
| 
								 | 
							
								  g_assert_cmpint (pika_image_get_n_layers (image), ==, 1);
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/**
							 | 
						||
| 
								 | 
							
								 * remove_layer:
							 | 
						||
| 
								 | 
							
								 * @fixture:
							 | 
						||
| 
								 | 
							
								 * @data:
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * Super basic test that makes sure we can remove a layer.
							 | 
						||
| 
								 | 
							
								 **/
							 | 
						||
| 
								 | 
							
								static void
							 | 
						||
| 
								 | 
							
								remove_layer (PikaTestFixture *fixture,
							 | 
						||
| 
								 | 
							
								              gconstpointer    data)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								  PikaImage *image = fixture->image;
							 | 
						||
| 
								 | 
							
								  PikaLayer *layer;
							 | 
						||
| 
								 | 
							
								  gboolean   result;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  g_assert_cmpint (pika_image_get_n_layers (image), ==, 0);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  layer = pika_layer_new (image,
							 | 
						||
| 
								 | 
							
								                          PIKA_TEST_IMAGE_SIZE,
							 | 
						||
| 
								 | 
							
								                          PIKA_TEST_IMAGE_SIZE,
							 | 
						||
| 
								 | 
							
								                          babl_format ("R'G'B'A u8"),
							 | 
						||
| 
								 | 
							
								                          "Test Layer",
							 | 
						||
| 
								 | 
							
								                          PIKA_OPACITY_OPAQUE,
							 | 
						||
| 
								 | 
							
								                          PIKA_LAYER_MODE_NORMAL);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  g_assert_cmpint (PIKA_IS_LAYER (layer), ==, TRUE);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  result = pika_image_add_layer (image,
							 | 
						||
| 
								 | 
							
								                                 layer,
							 | 
						||
| 
								 | 
							
								                                 PIKA_IMAGE_ACTIVE_PARENT,
							 | 
						||
| 
								 | 
							
								                                 0,
							 | 
						||
| 
								 | 
							
								                                 FALSE);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  g_assert_cmpint (result, ==, TRUE);
							 | 
						||
| 
								 | 
							
								  g_assert_cmpint (pika_image_get_n_layers (image), ==, 1);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  pika_image_remove_layer (image,
							 | 
						||
| 
								 | 
							
								                           layer,
							 | 
						||
| 
								 | 
							
								                           FALSE,
							 | 
						||
| 
								 | 
							
								                           NULL);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  g_assert_cmpint (pika_image_get_n_layers (image), ==, 0);
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/**
							 | 
						||
| 
								 | 
							
								 * white_graypoint_in_red_levels:
							 | 
						||
| 
								 | 
							
								 * @fixture:
							 | 
						||
| 
								 | 
							
								 * @data:
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * Makes sure the levels algorithm can handle when the graypoint is
							 | 
						||
| 
								 | 
							
								 * white. It's easy to get a divide by zero problem when trying to
							 | 
						||
| 
								 | 
							
								 * calculate what gamma will give a white graypoint.
							 | 
						||
| 
								 | 
							
								 **/
							 | 
						||
| 
								 | 
							
								static void
							 | 
						||
| 
								 | 
							
								white_graypoint_in_red_levels (PikaTestFixture *fixture,
							 | 
						||
| 
								 | 
							
								                               gconstpointer    data)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								  PikaRGB              black   = { 0, 0, 0, 0 };
							 | 
						||
| 
								 | 
							
								  PikaRGB              gray    = { 1, 1, 1, 1 };
							 | 
						||
| 
								 | 
							
								  PikaRGB              white   = { 1, 1, 1, 1 };
							 | 
						||
| 
								 | 
							
								  PikaHistogramChannel channel = PIKA_HISTOGRAM_RED;
							 | 
						||
| 
								 | 
							
								  PikaLevelsConfig    *config;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  config = g_object_new (PIKA_TYPE_LEVELS_CONFIG, NULL);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  pika_levels_config_adjust_by_colors (config,
							 | 
						||
| 
								 | 
							
								                                       channel,
							 | 
						||
| 
								 | 
							
								                                       &black,
							 | 
						||
| 
								 | 
							
								                                       &gray,
							 | 
						||
| 
								 | 
							
								                                       &white);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  /* Make sure we didn't end up with an invalid gamma value */
							 | 
						||
| 
								 | 
							
								  g_object_set (config,
							 | 
						||
| 
								 | 
							
								                "gamma", config->gamma[channel],
							 | 
						||
| 
								 | 
							
								                NULL);
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								int
							 | 
						||
| 
								 | 
							
								main (int    argc,
							 | 
						||
| 
								 | 
							
								      char **argv)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								  Pika *pika;
							 | 
						||
| 
								 | 
							
								  int   result;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  g_test_init (&argc, &argv, NULL);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  pika_test_utils_set_pika3_directory ("PIKA_TESTING_ABS_TOP_SRCDIR",
							 | 
						||
| 
								 | 
							
								                                       "app/tests/pikadir");
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  /* We share the same application instance across all tests */
							 | 
						||
| 
								 | 
							
								  pika = pika_init_for_testing ();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  /* Add tests */
							 | 
						||
| 
								 | 
							
								  ADD_IMAGE_TEST (add_layer);
							 | 
						||
| 
								 | 
							
								  ADD_IMAGE_TEST (remove_layer);
							 | 
						||
| 
								 | 
							
								  ADD_IMAGE_TEST (rotate_non_overlapping);
							 | 
						||
| 
								 | 
							
								  ADD_TEST (white_graypoint_in_red_levels);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  /* Run the tests */
							 | 
						||
| 
								 | 
							
								  result = g_test_run ();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  /* Don't write files to the source dir */
							 | 
						||
| 
								 | 
							
								  pika_test_utils_set_pika3_directory ("PIKA_TESTING_ABS_TOP_BUILDDIR",
							 | 
						||
| 
								 | 
							
								                                       "app/tests/pikadir-output");
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  /* Exit so we don't break script-fu plug-in wire */
							 | 
						||
| 
								 | 
							
								  pika_exit (pika, TRUE);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  return result;
							 | 
						||
| 
								 | 
							
								}
							 |