130 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
		
		
			
		
	
	
			130 lines
		
	
	
		
			3.8 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) 1995 Spencer Kimball and Peter Mattis
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * 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 "config.h"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#include <string.h>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#include <gdk-pixbuf/gdk-pixbuf.h>
							 | 
						||
| 
								 | 
							
								#include <gegl.h>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#include "paint-types.h"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#include "pikaink.h"
							 | 
						||
| 
								 | 
							
								#include "pikaink-blob.h"
							 | 
						||
| 
								 | 
							
								#include "pikainkundo.h"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								static void   pika_ink_undo_constructed (GObject             *object);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								static void   pika_ink_undo_pop         (PikaUndo            *undo,
							 | 
						||
| 
								 | 
							
								                                         PikaUndoMode         undo_mode,
							 | 
						||
| 
								 | 
							
								                                         PikaUndoAccumulator *accum);
							 | 
						||
| 
								 | 
							
								static void   pika_ink_undo_free        (PikaUndo            *undo,
							 | 
						||
| 
								 | 
							
								                                         PikaUndoMode         undo_mode);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								G_DEFINE_TYPE (PikaInkUndo, pika_ink_undo, PIKA_TYPE_PAINT_CORE_UNDO)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#define parent_class pika_ink_undo_parent_class
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								static void
							 | 
						||
| 
								 | 
							
								pika_ink_undo_class_init (PikaInkUndoClass *klass)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								  GObjectClass  *object_class = G_OBJECT_CLASS (klass);
							 | 
						||
| 
								 | 
							
								  PikaUndoClass *undo_class   = PIKA_UNDO_CLASS (klass);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  object_class->constructed = pika_ink_undo_constructed;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  undo_class->pop           = pika_ink_undo_pop;
							 | 
						||
| 
								 | 
							
								  undo_class->free          = pika_ink_undo_free;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								static void
							 | 
						||
| 
								 | 
							
								pika_ink_undo_init (PikaInkUndo *undo)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								  undo->last_blobs = NULL;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								static void
							 | 
						||
| 
								 | 
							
								pika_ink_undo_constructed (GObject *object)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								  PikaInkUndo *ink_undo = PIKA_INK_UNDO (object);
							 | 
						||
| 
								 | 
							
								  PikaInk     *ink;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  G_OBJECT_CLASS (parent_class)->constructed (object);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  pika_assert (PIKA_IS_INK (PIKA_PAINT_CORE_UNDO (ink_undo)->paint_core));
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  ink = PIKA_INK (PIKA_PAINT_CORE_UNDO (ink_undo)->paint_core);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  if (ink->start_blobs)
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								      gint      i;
							 | 
						||
| 
								 | 
							
								      PikaBlob *blob;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      for (i = 0; i < g_list_length (ink->start_blobs); i++)
							 | 
						||
| 
								 | 
							
								        {
							 | 
						||
| 
								 | 
							
								          blob = g_list_nth_data (ink->start_blobs, i);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								          ink_undo->last_blobs = g_list_prepend (ink_undo->last_blobs,
							 | 
						||
| 
								 | 
							
								                                                 pika_blob_duplicate (blob));
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								      ink_undo->last_blobs = g_list_reverse (ink_undo->last_blobs);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								static void
							 | 
						||
| 
								 | 
							
								pika_ink_undo_pop (PikaUndo              *undo,
							 | 
						||
| 
								 | 
							
								                   PikaUndoMode           undo_mode,
							 | 
						||
| 
								 | 
							
								                   PikaUndoAccumulator   *accum)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								  PikaInkUndo *ink_undo = PIKA_INK_UNDO (undo);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  PIKA_UNDO_CLASS (parent_class)->pop (undo, undo_mode, accum);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  if (PIKA_PAINT_CORE_UNDO (ink_undo)->paint_core)
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								      PikaInk  *ink = PIKA_INK (PIKA_PAINT_CORE_UNDO (ink_undo)->paint_core);
							 | 
						||
| 
								 | 
							
								      GList    *tmp_blobs;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      tmp_blobs = ink->last_blobs;
							 | 
						||
| 
								 | 
							
								      ink->last_blobs = ink_undo->last_blobs;
							 | 
						||
| 
								 | 
							
								      ink_undo->last_blobs = tmp_blobs;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								static void
							 | 
						||
| 
								 | 
							
								pika_ink_undo_free (PikaUndo     *undo,
							 | 
						||
| 
								 | 
							
								                    PikaUndoMode  undo_mode)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								  PikaInkUndo *ink_undo = PIKA_INK_UNDO (undo);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  if (ink_undo->last_blobs)
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								      g_list_free_full (ink_undo->last_blobs, g_free);
							 | 
						||
| 
								 | 
							
								      ink_undo->last_blobs = NULL;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  PIKA_UNDO_CLASS (parent_class)->free (undo, undo_mode);
							 | 
						||
| 
								 | 
							
								}
							 |