1
/* GIMP - The GNU Image Manipulation Program
2
* Copyright (C) 1995 Spencer Kimball and Peter Mattis
4
* gimppatternclipboard.c
5
* Copyright (C) 2006 Michael Natterer <mitch@gimp.org>
7
* This program is free software; you can redistribute it and/or modify
8
* it under the terms of the GNU General Public License as published by
9
* the Free Software Foundation; either version 2 of the License, or
10
* (at your option) any later version.
12
* This program is distributed in the hope that it will be useful,
13
* but WITHOUT ANY WARRANTY; without even the implied warranty of
14
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15
* GNU General Public License for more details.
17
* You should have received a copy of the GNU General Public License
18
* along with this program; if not, write to the Free Software
19
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
24
#include <glib-object.h>
26
#include "core-types.h"
28
#include "base/temp-buf.h"
29
#include "base/pixel-region.h"
31
#include "paint-funcs/paint-funcs.h"
34
#include "gimpbuffer.h"
35
#include "gimppatternclipboard.h"
36
#include "gimpimage.h"
37
#include "gimppickable.h"
39
#include "gimp-intl.h"
49
/* local function prototypes */
51
static GObject * gimp_pattern_clipboard_constructor (GType type,
53
GObjectConstructParam *params);
54
static void gimp_pattern_clipboard_set_property (GObject *object,
58
static void gimp_pattern_clipboard_get_property (GObject *object,
63
static GimpData * gimp_pattern_clipboard_duplicate (GimpData *data);
66
static void gimp_pattern_clipboard_buffer_changed (Gimp *gimp,
67
GimpPattern *pattern);
70
G_DEFINE_TYPE (GimpPatternClipboard, gimp_pattern_clipboard, GIMP_TYPE_PATTERN)
72
#define parent_class gimp_pattern_clipboard_parent_class
76
gimp_pattern_clipboard_class_init (GimpPatternClipboardClass *klass)
78
GObjectClass *object_class = G_OBJECT_CLASS (klass);
80
GimpDataClass *data_class = GIMP_DATA_CLASS (klass);
83
object_class->constructor = gimp_pattern_clipboard_constructor;
84
object_class->set_property = gimp_pattern_clipboard_set_property;
85
object_class->get_property = gimp_pattern_clipboard_get_property;
88
data_class->duplicate = gimp_pattern_clipboard_duplicate;
91
g_object_class_install_property (object_class, PROP_GIMP,
92
g_param_spec_object ("gimp", NULL, NULL,
94
GIMP_PARAM_READWRITE |
95
G_PARAM_CONSTRUCT_ONLY));
99
gimp_pattern_clipboard_init (GimpPatternClipboard *pattern)
101
pattern->gimp = NULL;
105
gimp_pattern_clipboard_constructor (GType type,
107
GObjectConstructParam *params)
110
GimpPatternClipboard *pattern;
112
object = G_OBJECT_CLASS (parent_class)->constructor (type, n_params, params);
114
pattern = GIMP_PATTERN_CLIPBOARD (object);
116
g_assert (GIMP_IS_GIMP (pattern->gimp));
118
g_signal_connect_object (pattern->gimp, "buffer-changed",
119
G_CALLBACK (gimp_pattern_clipboard_buffer_changed),
122
gimp_pattern_clipboard_buffer_changed (pattern->gimp, GIMP_PATTERN (pattern));
128
gimp_pattern_clipboard_set_property (GObject *object,
133
GimpPatternClipboard *pattern = GIMP_PATTERN_CLIPBOARD (object);
138
pattern->gimp = g_value_get_object (value);
141
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
147
gimp_pattern_clipboard_get_property (GObject *object,
152
GimpPatternClipboard *pattern = GIMP_PATTERN_CLIPBOARD (object);
157
g_value_set_object (value, pattern->gimp);
160
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
167
gimp_pattern_clipboard_duplicate (GimpData *data)
169
GimpPatternClipboard *pattern = GIMP_PATTERN_CLIPBOARD (data);
171
return gimp_pattern_clipboard_new (pattern->gimp);
176
gimp_pattern_clipboard_new (Gimp *gimp)
178
g_return_val_if_fail (GIMP_IS_GIMP (gimp), NULL);
180
return g_object_new (GIMP_TYPE_PATTERN_CLIPBOARD,
181
"name", _("Clipboard"),
187
/* private functions */
190
gimp_pattern_clipboard_buffer_changed (Gimp *gimp,
191
GimpPattern *pattern)
195
temp_buf_free (pattern->mask);
196
pattern->mask = NULL;
199
if (gimp->global_buffer)
204
PixelRegion bufferPR;
207
width = MIN (gimp_buffer_get_width (gimp->global_buffer), 512);
208
height = MIN (gimp_buffer_get_height (gimp->global_buffer), 512);
209
bytes = gimp_buffer_get_bytes (gimp->global_buffer);
211
pattern->mask = temp_buf_new (width, height, bytes, 0, 0, NULL);
213
pixel_region_init (&bufferPR, gimp->global_buffer->tiles,
214
0, 0, width, height, FALSE);
215
pixel_region_init_temp_buf (&maskPR, pattern->mask,
216
0, 0, width, height);
218
copy_region (&bufferPR, &maskPR);
222
guchar color[3] = { 255, 255, 255 };
224
pattern->mask = temp_buf_new (16, 16, 3, 0, 0, color);
227
gimp_data_dirty (GIMP_DATA (pattern));