diff --git a/ChangeLog b/ChangeLog index 786c1f7d78..3157a48bef 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,22 @@ +2005-07-19 Michael Natterer + + * app/widgets/Makefile.am + * app/widgets/gimprender.[ch]: new files keeping the render + acceleration check buffers. + + * app/display/gimpdisplayshell-render.[ch]: removed them here. + + * app/gui/gui.c: initialize/shutdown the new buffers. + + * app/widgets/gimpcolormapeditor.c + * app/widgets/gimpviewrenderer.c + * app/widgets/gimpviewrenderergradient.c + * app/actions/view-actions.c + * app/display/gimpdisplayshell-appearance.c + * app/display/gimpdisplayshell-draw.c + * app/display/gimpdisplayshell.c: use the new stuff. Removes + lots of broken widgets -> display dependencies. + 2005-07-19 Michael Natterer * app/widgets/gimpcolormapeditor.[ch]: renamed member "palette" diff --git a/app/actions/view-actions.c b/app/actions/view-actions.c index 89cb846f23..34f7489722 100644 --- a/app/actions/view-actions.c +++ b/app/actions/view-actions.c @@ -32,6 +32,7 @@ #include "core/gimpimage.h" #include "widgets/gimpactiongroup.h" +#include "widgets/gimprender.h" #include "widgets/gimphelp-ids.h" #include "widgets/gimpwidgets-utils.h" @@ -39,7 +40,6 @@ #include "display/gimpdisplayoptions.h" #include "display/gimpdisplayshell.h" #include "display/gimpdisplayshell-appearance.h" -#include "display/gimpdisplayshell-render.h" #include "display/gimpdisplayshell-selection.h" #include "actions.h" @@ -629,17 +629,17 @@ view_actions_check_type_notify (GimpDisplayConfig *config, GimpRGB color; gimp_rgba_set_uchar (&color, - render_blend_light_check[0], - render_blend_light_check[1], - render_blend_light_check[2], + gimp_render_blend_light_check[0], + gimp_render_blend_light_check[1], + gimp_render_blend_light_check[2], 255); gimp_action_group_set_action_color (group, "view-padding-color-light-check", &color, FALSE); gimp_rgba_set_uchar (&color, - render_blend_dark_check[0], - render_blend_dark_check[1], - render_blend_dark_check[2], + gimp_render_blend_dark_check[0], + gimp_render_blend_dark_check[1], + gimp_render_blend_dark_check[2], 255); gimp_action_group_set_action_color (group, "view-padding-color-dark-check", &color, FALSE); diff --git a/app/display/gimpdisplayshell-appearance.c b/app/display/gimpdisplayshell-appearance.c index cbbc15b477..62772201d7 100644 --- a/app/display/gimpdisplayshell-appearance.c +++ b/app/display/gimpdisplayshell-appearance.c @@ -30,6 +30,7 @@ #include "core/gimpimage.h" #include "widgets/gimpactiongroup.h" +#include "widgets/gimprender.h" #include "widgets/gimpuimanager.h" #include "widgets/gimpwidgets-utils.h" @@ -40,7 +41,6 @@ #include "gimpdisplayshell-appearance.h" #include "gimpdisplayshell-callbacks.h" #include "gimpdisplayshell-selection.h" -#include "gimpdisplayshell-render.h" #define GET_OPTIONS(shell) \ @@ -542,16 +542,16 @@ gimp_display_shell_set_padding (GimpDisplayShell *shell, case GIMP_CANVAS_PADDING_MODE_LIGHT_CHECK: gimp_rgb_set_uchar (&color, - render_blend_light_check[0], - render_blend_light_check[1], - render_blend_light_check[2]); + gimp_render_blend_light_check[0], + gimp_render_blend_light_check[1], + gimp_render_blend_light_check[2]); break; case GIMP_CANVAS_PADDING_MODE_DARK_CHECK: gimp_rgb_set_uchar (&color, - render_blend_dark_check[0], - render_blend_dark_check[1], - render_blend_dark_check[2]); + gimp_render_blend_dark_check[0], + gimp_render_blend_dark_check[1], + gimp_render_blend_dark_check[2]); break; case GIMP_CANVAS_PADDING_MODE_CUSTOM: diff --git a/app/display/gimpdisplayshell-draw.c b/app/display/gimpdisplayshell-draw.c index e72f0e8238..b739c3734d 100644 --- a/app/display/gimpdisplayshell-draw.c +++ b/app/display/gimpdisplayshell-draw.c @@ -32,6 +32,7 @@ #include "vectors/gimpstroke.h" #include "vectors/gimpvectors.h" +#include "widgets/gimprender.h" #include "widgets/gimpwidgets-utils.h" #include "gimpcanvas.h" @@ -502,14 +503,14 @@ gimp_display_shell_draw_area (GimpDisplayShell *shell, /* display the image in RENDER_BUF_WIDTH x RENDER_BUF_HEIGHT * sized chunks */ - for (i = y; i < y2; i += GIMP_DISPLAY_SHELL_RENDER_BUF_HEIGHT) + for (i = y; i < y2; i += GIMP_RENDER_BUF_HEIGHT) { - for (j = x; j < x2; j += GIMP_DISPLAY_SHELL_RENDER_BUF_WIDTH) + for (j = x; j < x2; j += GIMP_RENDER_BUF_WIDTH) { gint dx, dy; - dx = MIN (x2 - j, GIMP_DISPLAY_SHELL_RENDER_BUF_WIDTH); - dy = MIN (y2 - i, GIMP_DISPLAY_SHELL_RENDER_BUF_HEIGHT); + dx = MIN (x2 - j, GIMP_RENDER_BUF_WIDTH); + dy = MIN (y2 - i, GIMP_RENDER_BUF_HEIGHT); gimp_display_shell_render (shell, j - shell->disp_xoffset, diff --git a/app/display/gimpdisplayshell-render.c b/app/display/gimpdisplayshell-render.c index dec06f03e4..25d62a0084 100644 --- a/app/display/gimpdisplayshell-render.c +++ b/app/display/gimpdisplayshell-render.c @@ -36,6 +36,8 @@ #include "core/gimpimage-colormap.h" #include "core/gimpprojection.h" +#include "widgets/gimprender.h" + #include "gimpcanvas.h" #include "gimpdisplay.h" #include "gimpdisplayshell.h" @@ -72,25 +74,14 @@ static void render_setup_notify (gpointer config, Gimp *gimp); -/* accelerate transparency of image scaling */ -guchar *render_check_buf = NULL; -guchar *render_empty_buf = NULL; -guchar *render_white_buf = NULL; -guchar *render_temp_buf = NULL; - -guchar *render_blend_dark_check = NULL; -guchar *render_blend_light_check = NULL; -guchar *render_blend_white = NULL; - - -static guchar *tile_buf = NULL; -static guint tile_shift = 0; -static guint check_mod = 0; -static guint check_shift = 0; +static guchar *tile_buf = NULL; +static guint tile_shift = 0; +static guint check_mod = 0; +static guint check_shift = 0; void -render_init (Gimp *gimp) +gimp_display_shell_render_init (Gimp *gimp) { g_return_if_fail (GIMP_IS_GIMP (gimp)); @@ -105,7 +96,7 @@ render_init (Gimp *gimp) } void -render_exit (Gimp *gimp) +gimp_display_shell_render_exit (Gimp *gimp) { g_return_if_fail (GIMP_IS_GIMP (gimp)); @@ -118,48 +109,6 @@ render_exit (Gimp *gimp) g_free (tile_buf); tile_buf = NULL; } - - if (render_blend_dark_check) - { - g_free (render_blend_dark_check); - render_blend_dark_check = NULL; - } - - if (render_blend_light_check) - { - g_free (render_blend_light_check); - render_blend_light_check = NULL; - } - - if (render_blend_white) - { - g_free (render_blend_white); - render_blend_white = NULL; - } - - if (render_check_buf) - { - g_free (render_check_buf); - render_check_buf = NULL; - } - - if (render_empty_buf) - { - g_free (render_empty_buf); - render_empty_buf = NULL; - } - - if (render_white_buf) - { - g_free (render_white_buf); - render_white_buf = NULL; - } - - if (render_temp_buf) - { - g_free (render_temp_buf); - render_temp_buf = NULL; - } } @@ -168,13 +117,9 @@ render_setup_notify (gpointer config, GParamSpec *param_spec, Gimp *gimp) { - GimpCheckType check_type; GimpCheckSize check_size; - guchar light, dark; - gint i, j; g_object_get (config, - "transparency-type", &check_type, "transparency-size", &check_size, NULL); @@ -187,28 +132,7 @@ render_setup_notify (gpointer config, /* allocate a buffer for arranging information from a row of tiles */ if (! tile_buf) - tile_buf = g_new (guchar, - GIMP_DISPLAY_SHELL_RENDER_BUF_WIDTH * MAX_CHANNELS); - - if (! render_blend_dark_check) - render_blend_dark_check = g_new (guchar, 65536); - if (! render_blend_light_check) - render_blend_light_check = g_new (guchar, 65536); - if (! render_blend_white) - render_blend_white = g_new (guchar, 65536); - - gimp_checks_get_shades (check_type, &light, &dark); - - for (i = 0; i < 256; i++) - for (j = 0; j < 256; j++) - { - render_blend_dark_check [(i << 8) + j] = - (guchar) ((j * i + dark * (255 - i)) / 255); - render_blend_light_check [(i << 8) + j] = - (guchar) ((j * i + light * (255 - i)) / 255); - render_blend_white [(i << 8) + j] = - (guchar) ((j * i + 255 * (255 - i)) / 255); - } + tile_buf = g_new (guchar, GIMP_RENDER_BUF_WIDTH * MAX_CHANNELS); switch (check_size) { @@ -225,41 +149,6 @@ render_setup_notify (gpointer config, check_shift = 4; break; } - - g_free (render_check_buf); - g_free (render_empty_buf); - g_free (render_white_buf); - g_free (render_temp_buf); - -#define BUF_SIZE (MAX (GIMP_DISPLAY_SHELL_RENDER_BUF_WIDTH, \ - GIMP_VIEWABLE_MAX_PREVIEW_SIZE) + 4) - - render_check_buf = g_new (guchar, BUF_SIZE * 3); - render_empty_buf = g_new0 (guchar, BUF_SIZE * 3); - render_white_buf = g_new (guchar, BUF_SIZE * 3); - render_temp_buf = g_new (guchar, BUF_SIZE * 3); - - /* calculate check buffer for previews */ - - memset (render_white_buf, 255, BUF_SIZE * 3); - - for (i = 0; i < BUF_SIZE; i++) - { - if (i & 0x4) - { - render_check_buf[i * 3 + 0] = render_blend_dark_check[0]; - render_check_buf[i * 3 + 1] = render_blend_dark_check[0]; - render_check_buf[i * 3 + 2] = render_blend_dark_check[0]; - } - else - { - render_check_buf[i * 3 + 0] = render_blend_light_check[0]; - render_check_buf[i * 3 + 1] = render_blend_light_check[0]; - render_check_buf[i * 3 + 2] = render_blend_light_check[0]; - } - } - -#undef BUF_SIZE } @@ -344,7 +233,7 @@ gimp_display_shell_render (GimpDisplayShell *shell, shell->render_buf, w, h, 3, - 3 * GIMP_DISPLAY_SHELL_RENDER_BUF_WIDTH); + 3 * GIMP_RENDER_BUF_WIDTH); /* dim pixels outside the highlighted rectangle */ if (highlight) @@ -355,7 +244,7 @@ gimp_display_shell_render (GimpDisplayShell *shell, x + shell->disp_xoffset, y + shell->disp_yoffset, w, h, shell->render_buf, - 3 * GIMP_DISPLAY_SHELL_RENDER_BUF_WIDTH, + 3 * GIMP_RENDER_BUF_WIDTH, shell->offset_x, shell->offset_y); } @@ -395,7 +284,7 @@ gimp_display_shell_render_highlight (GimpDisplayShell *shell, for (x = 0; x < w; x++) GIMP_DISPLAY_SHELL_DIM_PIXEL (buf, x) - buf += 3 * GIMP_DISPLAY_SHELL_RENDER_BUF_WIDTH; + buf += 3 * GIMP_RENDER_BUF_WIDTH; } for ( ; y < rect.y + rect.height; y++) @@ -406,7 +295,7 @@ gimp_display_shell_render_highlight (GimpDisplayShell *shell, for (x += rect.width; x < w; x++) GIMP_DISPLAY_SHELL_DIM_PIXEL (buf, x) - buf += 3 * GIMP_DISPLAY_SHELL_RENDER_BUF_WIDTH; + buf += 3 * GIMP_RENDER_BUF_WIDTH; } for ( ; y < h; y++) @@ -414,7 +303,7 @@ gimp_display_shell_render_highlight (GimpDisplayShell *shell, for (x = 0; x < w; x++) GIMP_DISPLAY_SHELL_DIM_PIXEL (buf, x) - buf += 3 * GIMP_DISPLAY_SHELL_RENDER_BUF_WIDTH; + buf += 3 * GIMP_RENDER_BUF_WIDTH; } } else @@ -424,7 +313,7 @@ gimp_display_shell_render_highlight (GimpDisplayShell *shell, for (x = 0; x < w; x++) GIMP_DISPLAY_SHELL_DIM_PIXEL (buf, x) - buf += 3 * GIMP_DISPLAY_SHELL_RENDER_BUF_WIDTH; + buf += 3 * GIMP_RENDER_BUF_WIDTH; } } } @@ -540,15 +429,15 @@ render_image_indexed_a (RenderInfo *info) if (dark_light & 0x1) { - r = render_blend_dark_check[(a | cmap[val + 0])]; - g = render_blend_dark_check[(a | cmap[val + 1])]; - b = render_blend_dark_check[(a | cmap[val + 2])]; + r = gimp_render_blend_dark_check[(a | cmap[val + 0])]; + g = gimp_render_blend_dark_check[(a | cmap[val + 1])]; + b = gimp_render_blend_dark_check[(a | cmap[val + 2])]; } else { - r = render_blend_light_check[(a | cmap[val + 0])]; - g = render_blend_light_check[(a | cmap[val + 1])]; - b = render_blend_light_check[(a | cmap[val + 2])]; + r = gimp_render_blend_light_check[(a | cmap[val + 0])]; + g = gimp_render_blend_light_check[(a | cmap[val + 1])]; + b = gimp_render_blend_light_check[(a | cmap[val + 2])]; } dest[0] = r; @@ -676,9 +565,9 @@ render_image_gray_a (RenderInfo *info) guint val; if (dark_light & 0x1) - val = render_blend_dark_check[(a | src[GRAY_PIX])]; + val = gimp_render_blend_dark_check[(a | src[GRAY_PIX])]; else - val = render_blend_light_check[(a | src[GRAY_PIX])]; + val = gimp_render_blend_light_check[(a | src[GRAY_PIX])]; src += 2; @@ -794,15 +683,15 @@ render_image_rgb_a (RenderInfo *info) if (dark_light & 0x1) { - r = render_blend_dark_check[(a | src[RED_PIX])]; - g = render_blend_dark_check[(a | src[GREEN_PIX])]; - b = render_blend_dark_check[(a | src[BLUE_PIX])]; + r = gimp_render_blend_dark_check[(a | src[RED_PIX])]; + g = gimp_render_blend_dark_check[(a | src[GREEN_PIX])]; + b = gimp_render_blend_dark_check[(a | src[BLUE_PIX])]; } else { - r = render_blend_light_check[(a | src[RED_PIX])]; - g = render_blend_light_check[(a | src[GREEN_PIX])]; - b = render_blend_light_check[(a | src[BLUE_PIX])]; + r = gimp_render_blend_light_check[(a | src[RED_PIX])]; + g = gimp_render_blend_light_check[(a | src[GREEN_PIX])]; + b = gimp_render_blend_light_check[(a | src[BLUE_PIX])]; } src += 4; @@ -859,7 +748,7 @@ render_image_init_info (RenderInfo *info, info->src_bpp = gimp_projection_get_bytes (gimage->projection); info->dest = shell->render_buf; info->dest_bpp = 3; - info->dest_bpl = info->dest_bpp * GIMP_DISPLAY_SHELL_RENDER_BUF_WIDTH; + info->dest_bpl = info->dest_bpp * GIMP_RENDER_BUF_WIDTH; info->dest_width = info->w * info->dest_bpp; info->scale = render_image_accelerate_scaling (w, info->x, info->scalex); @@ -903,7 +792,7 @@ render_image_accelerate_scaling (gint width, gint i; if (! scale) - scale = g_new (guchar, GIMP_DISPLAY_SHELL_RENDER_BUF_WIDTH + 1); + scale = g_new (guchar, GIMP_RENDER_BUF_WIDTH + 1); for (i = 0; i <= width; i++) { diff --git a/app/display/gimpdisplayshell-render.h b/app/display/gimpdisplayshell-render.h index 4b059c81e3..0125414cd6 100644 --- a/app/display/gimpdisplayshell-render.h +++ b/app/display/gimpdisplayshell-render.h @@ -20,31 +20,15 @@ #define __GIMP_DISPLAY_SHELL_RENDER_H__ -#define GIMP_DISPLAY_SHELL_RENDER_BUF_WIDTH 256 -#define GIMP_DISPLAY_SHELL_RENDER_BUF_HEIGHT 256 +void gimp_display_shell_render_init (Gimp *gimp); +void gimp_display_shell_render_exit (Gimp *gimp); - -void render_init (Gimp *gimp); -void render_exit (Gimp *gimp); - -void gimp_display_shell_render (GimpDisplayShell *shell, - gint x, - gint y, - gint w, - gint h, - GdkRectangle *highlight); - -/* - * Extern variables - */ -extern guchar *render_check_buf; -extern guchar *render_empty_buf; -extern guchar *render_white_buf; -extern guchar *render_temp_buf; - -extern guchar *render_blend_dark_check; -extern guchar *render_blend_light_check; -extern guchar *render_blend_white; +void gimp_display_shell_render (GimpDisplayShell *shell, + gint x, + gint y, + gint w, + gint h, + GdkRectangle *highlight); #endif /* __GIMP_DISPLAY_SHELL_RENDER_H__ */ diff --git a/app/display/gimpdisplayshell.c b/app/display/gimpdisplayshell.c index b8e9856152..03fd2541b4 100644 --- a/app/display/gimpdisplayshell.c +++ b/app/display/gimpdisplayshell.c @@ -41,6 +41,7 @@ #include "core/gimpimage-snap.h" #include "core/gimpmarshal.h" +#include "widgets/gimprender.h" #include "widgets/gimphelp-ids.h" #include "widgets/gimpmenufactory.h" #include "widgets/gimpuimanager.h" @@ -60,7 +61,6 @@ #include "gimpdisplayshell-draw.h" #include "gimpdisplayshell-filter.h" #include "gimpdisplayshell-handlers.h" -#include "gimpdisplayshell-render.h" #include "gimpdisplayshell-scale.h" #include "gimpdisplayshell-selection.h" #include "gimpdisplayshell-title.h" @@ -270,9 +270,9 @@ gimp_display_shell_init (GimpDisplayShell *shell) shell->menubar = NULL; shell->statusbar = NULL; - shell->render_buf = g_malloc (GIMP_DISPLAY_SHELL_RENDER_BUF_WIDTH * - GIMP_DISPLAY_SHELL_RENDER_BUF_HEIGHT * - 3); + shell->render_buf = g_malloc (GIMP_RENDER_BUF_WIDTH * + GIMP_RENDER_BUF_HEIGHT * + 3); shell->title_idle_id = 0; diff --git a/app/gui/gui.c b/app/gui/gui.c index 11f8d58ee3..85d63c7d44 100644 --- a/app/gui/gui.c +++ b/app/gui/gui.c @@ -51,6 +51,7 @@ #include "widgets/gimpdevicestatus.h" #include "widgets/gimpdialogfactory.h" #include "widgets/gimpdnd.h" +#include "widgets/gimprender.h" #include "widgets/gimphelp.h" #include "widgets/gimphelp-ids.h" #include "widgets/gimpmenufactory.h" @@ -392,7 +393,8 @@ gui_restore_callback (Gimp *gimp, actions_init (gimp); menus_init (gimp, global_action_factory); - render_init (gimp); + gimp_render_init (gimp); + gimp_display_shell_render_init (gimp); dialogs_init (gimp, global_menu_factory); @@ -508,7 +510,8 @@ gui_exit_after_callback (Gimp *gimp, session_exit (gimp); menus_exit (gimp); actions_exit (gimp); - render_exit (gimp); + gimp_display_shell_render_exit (gimp); + gimp_render_exit (gimp); dialogs_exit (gimp); gimp_controllers_exit (gimp); diff --git a/app/widgets/Makefile.am b/app/widgets/Makefile.am index 024a4d93ae..f7645bbabd 100644 --- a/app/widgets/Makefile.am +++ b/app/widgets/Makefile.am @@ -207,6 +207,8 @@ libappwidgets_a_sources = \ gimpprogressdialog.h \ gimppropwidgets.c \ gimppropwidgets.h \ + gimprender.c \ + gimprender.h \ gimpsamplepointeditor.c \ gimpsamplepointeditor.h \ gimpselectiondata.c \ diff --git a/app/widgets/gimpcolormapeditor.c b/app/widgets/gimpcolormapeditor.c index 44f6b3f7ac..8af8d7d1db 100644 --- a/app/widgets/gimpcolormapeditor.c +++ b/app/widgets/gimpcolormapeditor.c @@ -36,11 +36,6 @@ #include "widgets-types.h" -#ifdef __GNUC__ -#warning FIXME #include "display/display-types.h" -#endif -#include "display/display-types.h" - #include "core/gimp.h" #include "core/gimpcontainer.h" #include "core/gimpcontext.h" @@ -48,10 +43,9 @@ #include "core/gimpimage-colormap.h" #include "core/gimpmarshal.h" -#include "display/gimpdisplayshell-render.h" - #include "gimpcolormapeditor.h" #include "gimpdnd.h" +#include "gimprender.h" #include "gimpmenufactory.h" #include "gimpuimanager.h" @@ -472,8 +466,8 @@ gimp_colormap_editor_draw (GimpColormapEditor *editor) row[l * 3 + b] = (((((i * cellsize + k) & 0x4) ? (l) : (l + 0x4)) & 0x4) ? - render_blend_light_check[0] : - render_blend_dark_check[0]); + gimp_render_blend_light_check[0] : + gimp_render_blend_dark_check[0]); gtk_preview_draw_row (GTK_PREVIEW (editor->preview), row, 0, i * cellsize + k, @@ -583,7 +577,7 @@ gimp_colormap_editor_clear (GimpColormapEditor *editor, { row[j * 3 + 0] = row[j * 3 + 1] = row[j * 3 + 2] = ((j + offset) & 0x4) ? - render_blend_dark_check[0] : render_blend_light_check[0]; + gimp_render_blend_dark_check[0] : gimp_render_blend_light_check[0]; } for (j = 0; j < (4 - (start_row & 0x3)) && start_row + j < height; j++) @@ -601,7 +595,7 @@ gimp_colormap_editor_clear (GimpColormapEditor *editor, { row[j * 3 + 0] = row[j * 3 + 1] = row[j * 3 + 2] = ((j + offset) & 0x4) ? - render_blend_dark_check[0] : render_blend_light_check[0]; + gimp_render_blend_dark_check[0] : gimp_render_blend_light_check[0]; } for (j = 0; j < 4 && i + j < height; j++) diff --git a/app/widgets/gimprender.c b/app/widgets/gimprender.c new file mode 100644 index 0000000000..0fd30aeb2d --- /dev/null +++ b/app/widgets/gimprender.c @@ -0,0 +1,183 @@ +/* The GIMP -- an image manipulation program + * 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 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 + +#include "libgimpbase/gimpbase.h" + +#include "widgets-types.h" + +#include "core/gimp.h" +#include "core/gimpviewable.h" + +#include "gimprender.h" + + +static void gimp_render_setup_notify (gpointer config, + GParamSpec *param_spec, + Gimp *gimp); + + +/* accelerate transparency of image scaling */ +guchar *gimp_render_check_buf = NULL; +guchar *gimp_render_empty_buf = NULL; +guchar *gimp_render_white_buf = NULL; +guchar *gimp_render_temp_buf = NULL; + +guchar *gimp_render_blend_dark_check = NULL; +guchar *gimp_render_blend_light_check = NULL; +guchar *gimp_render_blend_white = NULL; + + +void +gimp_render_init (Gimp *gimp) +{ + g_return_if_fail (GIMP_IS_GIMP (gimp)); + + g_signal_connect (gimp->config, "notify::transparency-type", + G_CALLBACK (gimp_render_setup_notify), + gimp); + + gimp_render_setup_notify (gimp->config, NULL, gimp); +} + +void +gimp_render_exit (Gimp *gimp) +{ + g_return_if_fail (GIMP_IS_GIMP (gimp)); + + g_signal_handlers_disconnect_by_func (gimp->config, + gimp_render_setup_notify, + gimp); + + if (gimp_render_blend_dark_check) + { + g_free (gimp_render_blend_dark_check); + gimp_render_blend_dark_check = NULL; + } + + if (gimp_render_blend_light_check) + { + g_free (gimp_render_blend_light_check); + gimp_render_blend_light_check = NULL; + } + + if (gimp_render_blend_white) + { + g_free (gimp_render_blend_white); + gimp_render_blend_white = NULL; + } + + if (gimp_render_check_buf) + { + g_free (gimp_render_check_buf); + gimp_render_check_buf = NULL; + } + + if (gimp_render_empty_buf) + { + g_free (gimp_render_empty_buf); + gimp_render_empty_buf = NULL; + } + + if (gimp_render_white_buf) + { + g_free (gimp_render_white_buf); + gimp_render_white_buf = NULL; + } + + if (gimp_render_temp_buf) + { + g_free (gimp_render_temp_buf); + gimp_render_temp_buf = NULL; + } +} + + +static void +gimp_render_setup_notify (gpointer config, + GParamSpec *param_spec, + Gimp *gimp) +{ + GimpCheckType check_type; + guchar light, dark; + gint i, j; + + g_object_get (config, + "transparency-type", &check_type, + NULL); + + if (! gimp_render_blend_dark_check) + gimp_render_blend_dark_check = g_new (guchar, 65536); + if (! gimp_render_blend_light_check) + gimp_render_blend_light_check = g_new (guchar, 65536); + if (! gimp_render_blend_white) + gimp_render_blend_white = g_new (guchar, 65536); + + gimp_checks_get_shades (check_type, &light, &dark); + + for (i = 0; i < 256; i++) + for (j = 0; j < 256; j++) + { + gimp_render_blend_dark_check [(i << 8) + j] = + (guchar) ((j * i + dark * (255 - i)) / 255); + gimp_render_blend_light_check [(i << 8) + j] = + (guchar) ((j * i + light * (255 - i)) / 255); + gimp_render_blend_white [(i << 8) + j] = + (guchar) ((j * i + 255 * (255 - i)) / 255); + } + + g_free (gimp_render_check_buf); + g_free (gimp_render_empty_buf); + g_free (gimp_render_white_buf); + g_free (gimp_render_temp_buf); + +#define BUF_SIZE (MAX (GIMP_RENDER_BUF_WIDTH, \ + GIMP_VIEWABLE_MAX_PREVIEW_SIZE) + 4) + + gimp_render_check_buf = g_new (guchar, BUF_SIZE * 3); + gimp_render_empty_buf = g_new0 (guchar, BUF_SIZE * 3); + gimp_render_white_buf = g_new (guchar, BUF_SIZE * 3); + gimp_render_temp_buf = g_new (guchar, BUF_SIZE * 3); + + /* calculate check buffer for previews */ + + memset (gimp_render_white_buf, 255, BUF_SIZE * 3); + + for (i = 0; i < BUF_SIZE; i++) + { + if (i & 0x4) + { + gimp_render_check_buf[i * 3 + 0] = gimp_render_blend_dark_check[0]; + gimp_render_check_buf[i * 3 + 1] = gimp_render_blend_dark_check[0]; + gimp_render_check_buf[i * 3 + 2] = gimp_render_blend_dark_check[0]; + } + else + { + gimp_render_check_buf[i * 3 + 0] = gimp_render_blend_light_check[0]; + gimp_render_check_buf[i * 3 + 1] = gimp_render_blend_light_check[0]; + gimp_render_check_buf[i * 3 + 2] = gimp_render_blend_light_check[0]; + } + } + +#undef BUF_SIZE +} diff --git a/app/widgets/gimprender.h b/app/widgets/gimprender.h new file mode 100644 index 0000000000..506ce78627 --- /dev/null +++ b/app/widgets/gimprender.h @@ -0,0 +1,41 @@ +/* The GIMP -- an image manipulation program + * 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 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_RENDER_H__ +#define __GIMP_RENDER_H__ + + +#define GIMP_RENDER_BUF_WIDTH 256 +#define GIMP_RENDER_BUF_HEIGHT 256 + + +extern guchar *gimp_render_check_buf; +extern guchar *gimp_render_empty_buf; +extern guchar *gimp_render_white_buf; +extern guchar *gimp_render_temp_buf; + +extern guchar *gimp_render_blend_dark_check; +extern guchar *gimp_render_blend_light_check; +extern guchar *gimp_render_blend_white; + + +void gimp_render_init (Gimp *gimp); +void gimp_render_exit (Gimp *gimp); + + +#endif /* __GIMP_RENDER_H__ */ diff --git a/app/widgets/gimpviewrenderer.c b/app/widgets/gimpviewrenderer.c index 83997ace55..1a9085b980 100644 --- a/app/widgets/gimpviewrenderer.c +++ b/app/widgets/gimpviewrenderer.c @@ -32,18 +32,12 @@ #include "widgets-types.h" -#ifdef __GNUC__ -#warning FIXME #include "display/display-types.h" -#endif -#include "display/display-types.h" - #include "base/temp-buf.h" #include "core/gimpmarshal.h" #include "core/gimpviewable.h" -#include "display/gimpdisplayshell-render.h" - +#include "gimprender.h" #include "gimpviewrenderer.h" #include "gimpviewrenderer-utils.h" #include "gimpwidgets-utils.h" @@ -941,11 +935,11 @@ gimp_view_render_to_buffer (TempBuf *temp_buf, * we render a composite view */ if (has_alpha && render_composite && outside_bg == GIMP_VIEW_BG_CHECKS) - pad_buf = render_check_buf; + pad_buf = gimp_render_check_buf; else if (outside_bg == GIMP_VIEW_BG_WHITE) - pad_buf = render_white_buf; + pad_buf = gimp_render_white_buf; else - pad_buf = render_empty_buf; + pad_buf = gimp_render_empty_buf; if (render_composite) { @@ -1001,7 +995,7 @@ gimp_view_render_to_buffer (TempBuf *temp_buf, /* Handle the leading transparency */ for (j = 0; j < x1; j++) for (b = 0; b < dest_bytes; b++) - render_temp_buf[j * dest_bytes + b] = cb[j * 3 + b]; + gimp_render_temp_buf[j * dest_bytes + b] = cb[j * 3 + b]; /* The stuff in the middle */ s = src; @@ -1015,38 +1009,38 @@ gimp_view_render_to_buffer (TempBuf *temp_buf, { if ((j + offset) & 0x4) { - render_temp_buf[j * 3 + 0] = - render_blend_dark_check [(a | s[red_component])]; - render_temp_buf[j * 3 + 1] = - render_blend_dark_check [(a | s[green_component])]; - render_temp_buf[j * 3 + 2] = - render_blend_dark_check [(a | s[blue_component])]; + gimp_render_temp_buf[j * 3 + 0] = + gimp_render_blend_dark_check [(a | s[red_component])]; + gimp_render_temp_buf[j * 3 + 1] = + gimp_render_blend_dark_check [(a | s[green_component])]; + gimp_render_temp_buf[j * 3 + 2] = + gimp_render_blend_dark_check [(a | s[blue_component])]; } else { - render_temp_buf[j * 3 + 0] = - render_blend_light_check [(a | s[red_component])]; - render_temp_buf[j * 3 + 1] = - render_blend_light_check [(a | s[green_component])]; - render_temp_buf[j * 3 + 2] = - render_blend_light_check [(a | s[blue_component])]; + gimp_render_temp_buf[j * 3 + 0] = + gimp_render_blend_light_check [(a | s[red_component])]; + gimp_render_temp_buf[j * 3 + 1] = + gimp_render_blend_light_check [(a | s[green_component])]; + gimp_render_temp_buf[j * 3 + 2] = + gimp_render_blend_light_check [(a | s[blue_component])]; } } else /* GIMP_VIEW_BG_WHITE */ { - render_temp_buf[j * 3 + 0] = - render_blend_white [(a | s[red_component])]; - render_temp_buf[j * 3 + 1] = - render_blend_white [(a | s[green_component])]; - render_temp_buf[j * 3 + 2] = - render_blend_white [(a | s[blue_component])]; + gimp_render_temp_buf[j * 3 + 0] = + gimp_render_blend_white [(a | s[red_component])]; + gimp_render_temp_buf[j * 3 + 1] = + gimp_render_blend_white [(a | s[green_component])]; + gimp_render_temp_buf[j * 3 + 2] = + gimp_render_blend_white [(a | s[blue_component])]; } } else { - render_temp_buf[j * 3 + 0] = s[red_component]; - render_temp_buf[j * 3 + 1] = s[green_component]; - render_temp_buf[j * 3 + 2] = s[blue_component]; + gimp_render_temp_buf[j * 3 + 0] = s[red_component]; + gimp_render_temp_buf[j * 3 + 1] = s[green_component]; + gimp_render_temp_buf[j * 3 + 2] = s[blue_component]; } s += temp_buf->bytes; @@ -1055,7 +1049,7 @@ gimp_view_render_to_buffer (TempBuf *temp_buf, /* Handle the trailing transparency */ for (j = x2; j < dest_width; j++) for (b = 0; b < dest_bytes; b++) - render_temp_buf[j * dest_bytes + b] = cb[j * 3 + b]; + gimp_render_temp_buf[j * dest_bytes + b] = cb[j * 3 + b]; src += rowstride; } @@ -1063,11 +1057,11 @@ gimp_view_render_to_buffer (TempBuf *temp_buf, { for (j = 0; j < dest_width; j++) for (b = 0; b < dest_bytes; b++) - render_temp_buf[j * dest_bytes + b] = cb[j * 3 + b]; + gimp_render_temp_buf[j * dest_bytes + b] = cb[j * 3 + b]; } memcpy (dest_buffer + i * dest_rowstride, - render_temp_buf, + gimp_render_temp_buf, dest_width * dest_bytes); } } diff --git a/app/widgets/gimpviewrenderergradient.c b/app/widgets/gimpviewrenderergradient.c index 44748b0877..3fe695d78e 100644 --- a/app/widgets/gimpviewrenderergradient.c +++ b/app/widgets/gimpviewrenderergradient.c @@ -30,15 +30,9 @@ #include "widgets-types.h" -#ifdef __GNUC__ -#warning FIXME #include "display/display-types.h" -#endif -#include "display/display-types.h" - #include "core/gimpgradient.h" -#include "display/gimpdisplayshell-render.h" - +#include "gimprender.h" #include "gimpviewrenderergradient.h" @@ -177,23 +171,23 @@ gimp_view_renderer_gradient_render (GimpViewRenderer *renderer, if (x & 0x4) { - *even++ = render_blend_dark_check[(a << 8) | r]; - *even++ = render_blend_dark_check[(a << 8) | g]; - *even++ = render_blend_dark_check[(a << 8) | b]; + *even++ = gimp_render_blend_dark_check[(a << 8) | r]; + *even++ = gimp_render_blend_dark_check[(a << 8) | g]; + *even++ = gimp_render_blend_dark_check[(a << 8) | b]; - *odd++ = render_blend_light_check[(a << 8) | r]; - *odd++ = render_blend_light_check[(a << 8) | g]; - *odd++ = render_blend_light_check[(a << 8) | b]; + *odd++ = gimp_render_blend_light_check[(a << 8) | r]; + *odd++ = gimp_render_blend_light_check[(a << 8) | g]; + *odd++ = gimp_render_blend_light_check[(a << 8) | b]; } else { - *even++ = render_blend_light_check[(a << 8) | r]; - *even++ = render_blend_light_check[(a << 8) | g]; - *even++ = render_blend_light_check[(a << 8) | b]; + *even++ = gimp_render_blend_light_check[(a << 8) | r]; + *even++ = gimp_render_blend_light_check[(a << 8) | g]; + *even++ = gimp_render_blend_light_check[(a << 8) | b]; - *odd++ = render_blend_dark_check[(a << 8) | r]; - *odd++ = render_blend_dark_check[(a << 8) | g]; - *odd++ = render_blend_dark_check[(a << 8) | b]; + *odd++ = gimp_render_blend_dark_check[(a << 8) | r]; + *odd++ = gimp_render_blend_dark_check[(a << 8) | g]; + *odd++ = gimp_render_blend_dark_check[(a << 8) | b]; } }