app: support clipboard images in the clipboard brush and pattern

This commit is contained in:
Michael Natterer 2017-04-19 16:52:10 -03:00
parent c2f0226f66
commit 6eeb5c2ee2
2 changed files with 38 additions and 17 deletions

View File

@ -30,11 +30,14 @@
#include "gimpbrush-private.h"
#include "gimpbrushclipboard.h"
#include "gimpimage.h"
#include "gimppickable.h"
#include "gimptempbuf.h"
#include "gimp-intl.h"
#define BRUSH_MAX_SIZE 1024
enum
{
PROP_0,
@ -92,7 +95,6 @@ gimp_brush_clipboard_class_init (GimpBrushClipboardClass *klass)
static void
gimp_brush_clipboard_init (GimpBrushClipboard *brush)
{
brush->gimp = NULL;
}
static void
@ -177,7 +179,8 @@ static void
gimp_brush_clipboard_changed (Gimp *gimp,
GimpBrush *brush)
{
GimpBuffer *gimp_buffer;
GimpObject *paste;
GeglBuffer *buffer = NULL;
gint width;
gint height;
@ -193,16 +196,25 @@ gimp_brush_clipboard_changed (Gimp *gimp,
brush->priv->pixmap = NULL;
}
gimp_buffer = gimp_get_clipboard_buffer (gimp);
paste = gimp_get_clipboard_object (gimp);
if (gimp_buffer)
if (GIMP_IS_IMAGE (paste))
{
gimp_pickable_flush (GIMP_PICKABLE (paste));
buffer = gimp_pickable_get_buffer (GIMP_PICKABLE (paste));
}
else if (GIMP_IS_BUFFER (paste))
{
buffer = gimp_buffer_get_buffer (GIMP_BUFFER (paste));
}
if (buffer)
{
GeglBuffer *buffer = gimp_buffer_get_buffer (gimp_buffer);
const Babl *format = gegl_buffer_get_format (buffer);
GeglBuffer *dest_buffer;
width = MIN (gimp_buffer_get_width (gimp_buffer), 1024);
height = MIN (gimp_buffer_get_height (gimp_buffer), 1024);
width = MIN (gegl_buffer_get_width (buffer), BRUSH_MAX_SIZE);
height = MIN (gegl_buffer_get_height (buffer), BRUSH_MAX_SIZE);
brush->priv->mask = gimp_temp_buf_new (width, height,
babl_format ("Y u8"));

View File

@ -35,6 +35,8 @@
#include "gimp-intl.h"
#define PATTERN_MAX_SIZE 1024
enum
{
PROP_0,
@ -92,7 +94,6 @@ gimp_pattern_clipboard_class_init (GimpPatternClipboardClass *klass)
static void
gimp_pattern_clipboard_init (GimpPatternClipboard *pattern)
{
pattern->gimp = NULL;
}
static void
@ -177,7 +178,8 @@ static void
gimp_pattern_clipboard_changed (Gimp *gimp,
GimpPattern *pattern)
{
GimpBuffer *gimp_buffer;
GimpObject *paste;
GeglBuffer *buffer = NULL;
if (pattern->mask)
{
@ -185,20 +187,27 @@ gimp_pattern_clipboard_changed (Gimp *gimp,
pattern->mask = NULL;
}
gimp_buffer = gimp_get_clipboard_buffer (gimp);
paste = gimp_get_clipboard_object (gimp);
if (gimp_buffer)
if (GIMP_IS_IMAGE (paste))
{
gint width;
gint height;
gimp_pickable_flush (GIMP_PICKABLE (paste));
buffer = gimp_pickable_get_buffer (GIMP_PICKABLE (paste));
}
else if (GIMP_IS_BUFFER (paste))
{
buffer = gimp_buffer_get_buffer (GIMP_BUFFER (paste));
}
width = MIN (gimp_buffer_get_width (gimp_buffer), 1024);
height = MIN (gimp_buffer_get_height (gimp_buffer), 1024);
if (buffer)
{
gint width = MIN (gegl_buffer_get_width (buffer), PATTERN_MAX_SIZE);
gint height = MIN (gegl_buffer_get_height (buffer), PATTERN_MAX_SIZE);
pattern->mask = gimp_temp_buf_new (width, height,
gimp_buffer_get_format (gimp_buffer));
gegl_buffer_get_format (buffer));
gegl_buffer_get (gimp_buffer_get_buffer (gimp_buffer),
gegl_buffer_get (buffer,
GEGL_RECTANGLE (0, 0, width, height), 1.0,
NULL,
gimp_temp_buf_get_data (pattern->mask),