From c450ca1858ece5e27aaaa31ea3d4e783431c91ce Mon Sep 17 00:00:00 2001 From: Michael Natterer Date: Tue, 14 Sep 2004 12:06:28 +0000 Subject: [PATCH] app/widgets/Makefile.am app/widgets/widgets-types.h added a view renderer 2004-09-14 Michael Natterer * app/widgets/Makefile.am * app/widgets/widgets-types.h * app/widgets/gimpviewrendererbuffer.[ch]: added a view renderer which knows how to preserve a GimpBuffer's aspect ratio if the view's aspect ratio is different. * app/widgets/gimpviewrenderer-utils.c (gimp_view_renderer_type_from_viewable_type): use it for viewables of type GimpBuffer. Fixes bug #152531 --- ChangeLog | 12 +++ app/widgets/Makefile.am | 2 + app/widgets/gimpviewrenderer-utils.c | 6 ++ app/widgets/gimpviewrendererbuffer.c | 140 +++++++++++++++++++++++++++ app/widgets/gimpviewrendererbuffer.h | 51 ++++++++++ app/widgets/widgets-types.h | 1 + 6 files changed, 212 insertions(+) create mode 100644 app/widgets/gimpviewrendererbuffer.c create mode 100644 app/widgets/gimpviewrendererbuffer.h diff --git a/ChangeLog b/ChangeLog index 4136a9c637..4a2ce9ff43 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,15 @@ +2004-09-14 Michael Natterer + + * app/widgets/Makefile.am + * app/widgets/widgets-types.h + * app/widgets/gimpviewrendererbuffer.[ch]: added a view renderer + which knows how to preserve a GimpBuffer's aspect ratio if the + view's aspect ratio is different. + + * app/widgets/gimpviewrenderer-utils.c + (gimp_view_renderer_type_from_viewable_type): use it for viewables + of type GimpBuffer. Fixes bug #152531 + 2004-09-14 Sven Neumann * plug-ins/common/flarefx.c diff --git a/app/widgets/Makefile.am b/app/widgets/Makefile.am index b9e378f876..3ce1826133 100644 --- a/app/widgets/Makefile.am +++ b/app/widgets/Makefile.am @@ -252,6 +252,8 @@ libappwidgets_a_sources = \ gimpviewrenderer-utils.h \ gimpviewrendererbrush.c \ gimpviewrendererbrush.h \ + gimpviewrendererbuffer.c \ + gimpviewrendererbuffer.h \ gimpviewrendererdrawable.c \ gimpviewrendererdrawable.h \ gimpviewrenderergradient.c \ diff --git a/app/widgets/gimpviewrenderer-utils.c b/app/widgets/gimpviewrenderer-utils.c index 6dd09278ce..821d811069 100644 --- a/app/widgets/gimpviewrenderer-utils.c +++ b/app/widgets/gimpviewrenderer-utils.c @@ -26,6 +26,7 @@ #include "widgets-types.h" #include "core/gimpbrush.h" +#include "core/gimpbuffer.h" #include "core/gimpdrawable.h" #include "core/gimpgradient.h" #include "core/gimplayer.h" @@ -34,6 +35,7 @@ #include "vectors/gimpvectors.h" #include "gimpviewrendererbrush.h" +#include "gimpviewrendererbuffer.h" #include "gimpviewrendererlayer.h" #include "gimpviewrenderergradient.h" #include "gimpviewrendererimage.h" @@ -53,6 +55,10 @@ gimp_view_renderer_type_from_viewable_type (GType viewable_type) { type = GIMP_TYPE_VIEW_RENDERER_BRUSH; } + else if (g_type_is_a (viewable_type, GIMP_TYPE_BUFFER)) + { + type = GIMP_TYPE_VIEW_RENDERER_BUFFER; + } else if (g_type_is_a (viewable_type, GIMP_TYPE_IMAGE)) { type = GIMP_TYPE_VIEW_RENDERER_IMAGE; diff --git a/app/widgets/gimpviewrendererbuffer.c b/app/widgets/gimpviewrendererbuffer.c new file mode 100644 index 0000000000..58ba806b9f --- /dev/null +++ b/app/widgets/gimpviewrendererbuffer.c @@ -0,0 +1,140 @@ +/* The GIMP -- an image manipulation program + * Copyright (C) 1995 Spencer Kimball and Peter Mattis + * + * gimpviewrendererbuffer.c + * Copyright (C) 2004 Michael Natterer + * + * 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 2 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, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#include "config.h" + +#include + +#include "libgimpwidgets/gimpwidgets.h" + +#include "widgets-types.h" + +#include "base/temp-buf.h" + +#include "core/gimpbuffer.h" + +#include "gimpviewrendererbuffer.h" + + +static void gimp_view_renderer_buffer_class_init (GimpViewRendererBufferClass *klass); + +static void gimp_view_renderer_buffer_render (GimpViewRenderer *renderer, + GtkWidget *widget); + + +static GimpViewRendererClass *parent_class = NULL; + + +GType +gimp_view_renderer_buffer_get_type (void) +{ + static GType renderer_type = 0; + + if (! renderer_type) + { + static const GTypeInfo renderer_info = + { + sizeof (GimpViewRendererBufferClass), + NULL, /* base_init */ + NULL, /* base_finalize */ + (GClassInitFunc) gimp_view_renderer_buffer_class_init, + NULL, /* class_finalize */ + NULL, /* class_data */ + sizeof (GimpViewRendererBuffer), + 0, /* n_preallocs */ + NULL /* instance_init */ + }; + + renderer_type = g_type_register_static (GIMP_TYPE_VIEW_RENDERER, + "GimpViewRendererBuffer", + &renderer_info, 0); + } + + return renderer_type; +} + +static void +gimp_view_renderer_buffer_class_init (GimpViewRendererBufferClass *klass) +{ + GimpViewRendererClass *renderer_class = GIMP_VIEW_RENDERER_CLASS (klass); + + parent_class = g_type_class_peek_parent (klass); + + renderer_class->render = gimp_view_renderer_buffer_render; +} + +static void +gimp_view_renderer_buffer_render (GimpViewRenderer *renderer, + GtkWidget *widget) +{ + GimpBuffer *buffer; + gint view_width; + gint view_height; + gboolean scaling_up; + TempBuf *render_buf = NULL; + + buffer = GIMP_BUFFER (renderer->viewable); + + gimp_viewable_calc_preview_size (gimp_buffer_get_width (buffer), + gimp_buffer_get_height (buffer), + renderer->width, + renderer->height, + TRUE, 1.0, 1.0, + &view_width, + &view_height, + &scaling_up); + + if (scaling_up) + { + TempBuf *temp_buf; + + temp_buf = gimp_viewable_get_new_preview (renderer->viewable, + gimp_buffer_get_width (buffer), + gimp_buffer_get_height (buffer)); + + if (temp_buf) + { + render_buf = temp_buf_scale (temp_buf, view_width, view_height); + + temp_buf_free (temp_buf); + } + } + else + { + render_buf = gimp_viewable_get_new_preview (renderer->viewable, + view_width, view_height); + } + + if (render_buf) + { + gimp_view_renderer_default_render_buffer (renderer, widget, render_buf); + + temp_buf_free (render_buf); + } + else /* no preview available */ + { + const gchar *stock_id; + + stock_id = gimp_viewable_get_stock_id (renderer->viewable); + + gimp_view_renderer_default_render_stock (renderer, widget, stock_id); + } +} diff --git a/app/widgets/gimpviewrendererbuffer.h b/app/widgets/gimpviewrendererbuffer.h new file mode 100644 index 0000000000..8370aeb87b --- /dev/null +++ b/app/widgets/gimpviewrendererbuffer.h @@ -0,0 +1,51 @@ +/* The GIMP -- an image manipulation program + * Copyright (C) 1995 Spencer Kimball and Peter Mattis + * + * gimpviewrendererbuffer.h + * Copyright (C) 2004 Michael Natterer + * + * 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 2 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, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#ifndef __GIMP_VIEW_RENDERER_BUFFER_H__ +#define __GIMP_VIEW_RENDERER_BUFFER_H__ + +#include "gimpviewrenderer.h" + +#define GIMP_TYPE_VIEW_RENDERER_BUFFER (gimp_view_renderer_buffer_get_type ()) +#define GIMP_VIEW_RENDERER_BUFFER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GIMP_TYPE_VIEW_RENDERER_BUFFER, GimpViewRendererBuffer)) +#define GIMP_VIEW_RENDERER_BUFFER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GIMP_TYPE_VIEW_RENDERER_BUFFER, GimpViewRendererBufferClass)) +#define GIMP_IS_VIEW_RENDERER_BUFFER(obj) (G_TYPE_CHECK_INSTANCE_TYPE (obj, GIMP_TYPE_VIEW_RENDERER_BUFFER)) +#define GIMP_IS_VIEW_RENDERER_BUFFER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GIMP_TYPE_VIEW_RENDERER_BUFFER)) +#define GIMP_VIEW_RENDERER_BUFFER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GIMP_TYPE_VIEW_RENDERER_BUFFER, GimpViewRendererBufferClass)) + + +typedef struct _GimpViewRendererBufferClass GimpViewRendererBufferClass; + +struct _GimpViewRendererBuffer +{ + GimpViewRenderer parent_instance; +}; + +struct _GimpViewRendererBufferClass +{ + GimpViewRendererClass parent_class; +}; + + +GType gimp_view_renderer_buffer_get_type (void) G_GNUC_CONST; + + +#endif /* __GIMP_VIEW_RENDERER_BUFFER_H__ */ diff --git a/app/widgets/widgets-types.h b/app/widgets/widgets-types.h index 97b997754f..3a7009a5cd 100644 --- a/app/widgets/widgets-types.h +++ b/app/widgets/widgets-types.h @@ -172,6 +172,7 @@ typedef struct _GimpNavigationView GimpNavigationView; typedef struct _GimpViewRenderer GimpViewRenderer; typedef struct _GimpViewRendererBrush GimpViewRendererBrush; +typedef struct _GimpViewRendererBuffer GimpViewRendererBuffer; typedef struct _GimpViewRendererDrawable GimpViewRendererDrawable; typedef struct _GimpViewRendererGradient GimpViewRendererGradient; typedef struct _GimpViewRendererLayer GimpViewRendererLayer;