From 251f6b04830cbeb9feb71fab458c8b26dac21377 Mon Sep 17 00:00:00 2001 From: Michael Natterer Date: Sat, 1 Mar 2003 12:55:43 +0000 Subject: [PATCH] added "gint bytes" to the GimpPreviewRenderer struct and pass it to 2003-03-01 Michael Natterer * app/widgets/gimppreviewrenderer.[ch]: added "gint bytes" to the GimpPreviewRenderer struct and pass it to gimp_preview_render_to_buffer(). * app/widgets/gimppreviewrendererbrush.[ch]: render the indicators to the renderer's buffer, not to the TempBuf so they always appear in the corner again. Misc cleanups: * app/core/gimpbuffer.c (gimp_buffer_get_new_preview) * app/core/gimppattern.c (gimp_pattern_get_new_preview): no need to center the TempBuf if smaller than requested because GimpPreviewRenderer::render()'s default implementation adjusts the offsets itself. * app/widgets/gimppreview.c (gimp_preview_set_viewable): no need to update ourselves after we changed the renderer because the renderer's signal will update us. * app/widgets/gimppreviewrenderer.c (gimp_preview_renderer_draw): replaced my stupid buf_rect calculation overkill by something simple that does the same. --- ChangeLog | 26 +++++++++++++ app/core/gimpbuffer.c | 6 --- app/core/gimppattern-load.c | 6 --- app/core/gimppattern.c | 6 --- app/widgets/gimppreview.c | 2 - app/widgets/gimppreviewrenderer.c | 43 +++++++++------------ app/widgets/gimppreviewrenderer.h | 4 +- app/widgets/gimppreviewrendererbrush.c | 52 +++++++++++++------------- app/widgets/gimpview.c | 2 - app/widgets/gimpviewrenderer.c | 43 +++++++++------------ app/widgets/gimpviewrenderer.h | 4 +- app/widgets/gimpviewrendererbrush.c | 52 +++++++++++++------------- 12 files changed, 122 insertions(+), 124 deletions(-) diff --git a/ChangeLog b/ChangeLog index d9573d052d..a6a1e78a59 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,29 @@ +2003-03-01 Michael Natterer + + * app/widgets/gimppreviewrenderer.[ch]: added "gint bytes" to the + GimpPreviewRenderer struct and pass it to + gimp_preview_render_to_buffer(). + + * app/widgets/gimppreviewrendererbrush.[ch]: render the indicators + to the renderer's buffer, not to the TempBuf so they always appear + in the corner again. + + Misc cleanups: + + * app/core/gimpbuffer.c (gimp_buffer_get_new_preview) + * app/core/gimppattern.c (gimp_pattern_get_new_preview): no need + to center the TempBuf if smaller than requested because + GimpPreviewRenderer::render()'s default implementation adjusts the + offsets itself. + + * app/widgets/gimppreview.c (gimp_preview_set_viewable): no need + to update ourselves after we changed the renderer because the + renderer's signal will update us. + + * app/widgets/gimppreviewrenderer.c (gimp_preview_renderer_draw): + replaced my stupid buf_rect calculation overkill by something + simple that does the same. + 2003-03-01 Michael Natterer * app/core/gimpbuffer.c: don't scale the preview up if the diff --git a/app/core/gimpbuffer.c b/app/core/gimpbuffer.c index 6875a75c87..1b382cbb48 100644 --- a/app/core/gimpbuffer.c +++ b/app/core/gimpbuffer.c @@ -269,12 +269,6 @@ gimp_buffer_get_new_preview (GimpViewable *viewable, copy_region (&srcPR, &destPR); } - if (buffer_width < width) - temp_buf->x = (width - buffer_width) / 2; - - if (buffer_height < height) - temp_buf->y = (height - buffer_height) / 2; - return temp_buf; } diff --git a/app/core/gimppattern-load.c b/app/core/gimppattern-load.c index 2d2b2b7b49..0b54eda3c8 100644 --- a/app/core/gimppattern-load.c +++ b/app/core/gimppattern-load.c @@ -213,12 +213,6 @@ gimp_pattern_get_new_preview (GimpViewable *viewable, temp_buf_copy_area (pattern->mask, temp_buf, 0, 0, copy_width, copy_height, 0, 0); - if (width > copy_width) - temp_buf->x = (width - copy_width) / 2; - - if (height > copy_height) - temp_buf->y = (height - copy_height) / 2; - return temp_buf; } diff --git a/app/core/gimppattern.c b/app/core/gimppattern.c index 2d2b2b7b49..0b54eda3c8 100644 --- a/app/core/gimppattern.c +++ b/app/core/gimppattern.c @@ -213,12 +213,6 @@ gimp_pattern_get_new_preview (GimpViewable *viewable, temp_buf_copy_area (pattern->mask, temp_buf, 0, 0, copy_width, copy_height, 0, 0); - if (width > copy_width) - temp_buf->x = (width - copy_width) / 2; - - if (height > copy_height) - temp_buf->y = (height - copy_height) / 2; - return temp_buf; } diff --git a/app/widgets/gimppreview.c b/app/widgets/gimppreview.c index a86e0752f3..ab62dffcd5 100644 --- a/app/widgets/gimppreview.c +++ b/app/widgets/gimppreview.c @@ -590,8 +590,6 @@ gimp_preview_set_viewable (GimpPreview *preview, { g_object_add_weak_pointer (G_OBJECT (preview->viewable), (gpointer *) &preview->viewable); - - gimp_preview_update (preview); } } diff --git a/app/widgets/gimppreviewrenderer.c b/app/widgets/gimppreviewrenderer.c index 7f5cc99e3b..77c6070e80 100644 --- a/app/widgets/gimppreviewrenderer.c +++ b/app/widgets/gimppreviewrenderer.c @@ -48,9 +48,6 @@ #include "gimppreviewrenderer-utils.h" -#define PREVIEW_BYTES 3 - - enum { UPDATE, @@ -143,6 +140,7 @@ gimp_preview_renderer_init (GimpPreviewRenderer *renderer) renderer->buffer = NULL; renderer->rowstride = 0; + renderer->bytes = 3; renderer->no_preview_pixbuf = NULL; @@ -392,7 +390,7 @@ gimp_preview_renderer_set_size_full (GimpPreviewRenderer *renderer, renderer->height = height; renderer->border_width = border_width; - renderer->rowstride = (renderer->width * PREVIEW_BYTES + 3) & ~3; + renderer->rowstride = (renderer->width * renderer->bytes + 3) & ~3; if (renderer->buffer) { @@ -543,17 +541,10 @@ gimp_preview_renderer_draw (GimpPreviewRenderer *renderer, } else if (renderer->buffer) { - if (renderer->border_width > 0) - { - buf_rect.x = border_rect.x + renderer->border_width; - buf_rect.y = border_rect.y + renderer->border_width; - buf_rect.width = border_rect.width - 2 * renderer->border_width; - buf_rect.height = border_rect.height - 2 * renderer->border_width; - } - else - { - buf_rect = border_rect; - } + buf_rect.x = border_rect.x + renderer->border_width; + buf_rect.y = border_rect.y + renderer->border_width; + buf_rect.width = renderer->width; + buf_rect.height = renderer->height; if (gdk_rectangle_intersect (&buf_rect, expose_area, &render_rect)) { @@ -561,7 +552,7 @@ gimp_preview_renderer_draw (GimpPreviewRenderer *renderer, buf = (renderer->buffer + (render_rect.y - buf_rect.y) * renderer->rowstride + - (render_rect.x - buf_rect.x) * PREVIEW_BYTES); + (render_rect.x - buf_rect.x) * renderer->bytes); gdk_draw_rgb_image_dithalign (window, widget->style->black_gc, @@ -762,7 +753,8 @@ gimp_preview_render_to_buffer (TempBuf *temp_buf, guchar *dest_buffer, gint dest_width, gint dest_height, - gint dest_rowstride) + gint dest_rowstride, + gint dest_bytes) { guchar *src, *s; guchar *cb; @@ -860,8 +852,8 @@ gimp_preview_render_to_buffer (TempBuf *temp_buf, { /* Handle the leading transparency */ for (j = 0; j < x1; j++) - for (b = 0; b < PREVIEW_BYTES; b++) - render_temp_buf[j * PREVIEW_BYTES + b] = cb[j * 3 + b]; + for (b = 0; b < dest_bytes; b++) + render_temp_buf[j * dest_bytes + b] = cb[j * 3 + b]; /* The stuff in the middle */ s = src; @@ -914,21 +906,21 @@ gimp_preview_render_to_buffer (TempBuf *temp_buf, /* Handle the trailing transparency */ for (j = x2; j < dest_width; j++) - for (b = 0; b < PREVIEW_BYTES; b++) - render_temp_buf[j * PREVIEW_BYTES + b] = cb[j * 3 + b]; + for (b = 0; b < dest_bytes; b++) + render_temp_buf[j * dest_bytes + b] = cb[j * 3 + b]; src += rowstride; } else { for (j = 0; j < dest_width; j++) - for (b = 0; b < PREVIEW_BYTES; b++) - render_temp_buf[j * PREVIEW_BYTES + b] = cb[j * 3 + b]; + for (b = 0; b < dest_bytes; b++) + render_temp_buf[j * dest_bytes + b] = cb[j * 3 + b]; } memcpy (dest_buffer + i * dest_rowstride, render_temp_buf, - dest_width * PREVIEW_BYTES); + dest_width * dest_bytes); } } @@ -949,7 +941,8 @@ gimp_preview_renderer_render_preview (GimpPreviewRenderer *renderer, renderer->buffer, renderer->width, renderer->height, - renderer->rowstride); + renderer->rowstride, + renderer->bytes); renderer->needs_render = FALSE; } diff --git a/app/widgets/gimppreviewrenderer.h b/app/widgets/gimppreviewrenderer.h index de02f72736..2c14df26ef 100644 --- a/app/widgets/gimppreviewrenderer.h +++ b/app/widgets/gimppreviewrenderer.h @@ -55,6 +55,7 @@ struct _GimpPreviewRenderer /*< private >*/ guchar *buffer; gint rowstride; + gint bytes; GdkPixbuf *no_preview_pixbuf; @@ -124,7 +125,8 @@ void gimp_preview_render_to_buffer (TempBuf *temp_buf, guchar *dest_buffer, gint dest_width, gint dest_height, - gint dest_rowstride); + gint dest_rowstride, + gint dest_bytes); void gimp_preview_renderer_render_preview (GimpPreviewRenderer *renderer, TempBuf *temp_buf, gint channel, diff --git a/app/widgets/gimppreviewrendererbrush.c b/app/widgets/gimppreviewrendererbrush.c index 2f6764517e..f81024a395 100644 --- a/app/widgets/gimppreviewrendererbrush.c +++ b/app/widgets/gimppreviewrendererbrush.c @@ -174,11 +174,17 @@ gimp_preview_renderer_brush_render (GimpPreviewRenderer *renderer, return; } + gimp_preview_renderer_render_preview (renderer, temp_buf, -1, + GIMP_PREVIEW_BG_WHITE, + GIMP_PREVIEW_BG_WHITE); + + temp_buf_free (temp_buf); + #define INDICATOR_WIDTH 7 #define INDICATOR_HEIGHT 7 - if (temp_buf->width >= INDICATOR_WIDTH && - temp_buf->height >= INDICATOR_HEIGHT && + if (renderer->width >= INDICATOR_WIDTH * 2 && + renderer->height >= INDICATOR_HEIGHT * 2&& (renderer->width < brush_width || renderer->height < brush_height || GIMP_IS_BRUSH_PIPE (brush))) @@ -225,6 +231,7 @@ gimp_preview_renderer_brush_render (GimpPreviewRenderer *renderer, #undef RED guchar *buf; + guchar *b; gint x, y; gint offset_x; gint offset_y; @@ -232,60 +239,55 @@ gimp_preview_renderer_brush_render (GimpPreviewRenderer *renderer, gboolean pipe; gboolean scale; - buf = temp_buf_data (temp_buf); + offset_x = renderer->width - INDICATOR_WIDTH; + offset_y = renderer->height - INDICATOR_HEIGHT; - offset_x = temp_buf->width - INDICATOR_WIDTH; - offset_y = temp_buf->height - INDICATOR_HEIGHT; - - buf += (offset_y * temp_buf->width + offset_x) * temp_buf->bytes; + buf = renderer->buffer + (offset_y * renderer->rowstride + + offset_x * renderer->bytes); pipe = GIMP_IS_BRUSH_PIPE (brush); scale = (renderer->width < brush_width || renderer->height < brush_height); - alpha = (temp_buf->bytes == 4); + alpha = (renderer->bytes == 4); for (y = 0; y < INDICATOR_HEIGHT; y++) { + b = buf; + for (x = 0; x < INDICATOR_WIDTH; x++) { if (scale) { if (pipe) { - *buf++ = scale_pipe_indicator_bits[y][x][0]; - *buf++ = scale_pipe_indicator_bits[y][x][1]; - *buf++ = scale_pipe_indicator_bits[y][x][2]; + *b++ = scale_pipe_indicator_bits[y][x][0]; + *b++ = scale_pipe_indicator_bits[y][x][1]; + *b++ = scale_pipe_indicator_bits[y][x][2]; } else { - *buf++ = scale_indicator_bits[y][x][0]; - *buf++ = scale_indicator_bits[y][x][1]; - *buf++ = scale_indicator_bits[y][x][2]; + *b++ = scale_indicator_bits[y][x][0]; + *b++ = scale_indicator_bits[y][x][1]; + *b++ = scale_indicator_bits[y][x][2]; } } else if (pipe) { - *buf++ = pipe_indicator_bits[y][x][0]; - *buf++ = pipe_indicator_bits[y][x][1]; - *buf++ = pipe_indicator_bits[y][x][2]; + *b++ = pipe_indicator_bits[y][x][0]; + *b++ = pipe_indicator_bits[y][x][1]; + *b++ = pipe_indicator_bits[y][x][2]; } if (alpha) - *buf++ = 255; + *b++ = 255; } - buf += (temp_buf->width - INDICATOR_WIDTH) * temp_buf->bytes; + buf += renderer->rowstride; } } #undef INDICATOR_WIDTH #undef INDICATOR_HEIGHT - - gimp_preview_renderer_render_preview (renderer, temp_buf, -1, - GIMP_PREVIEW_BG_WHITE, - GIMP_PREVIEW_BG_WHITE); - - temp_buf_free (temp_buf); } static gboolean diff --git a/app/widgets/gimpview.c b/app/widgets/gimpview.c index a86e0752f3..ab62dffcd5 100644 --- a/app/widgets/gimpview.c +++ b/app/widgets/gimpview.c @@ -590,8 +590,6 @@ gimp_preview_set_viewable (GimpPreview *preview, { g_object_add_weak_pointer (G_OBJECT (preview->viewable), (gpointer *) &preview->viewable); - - gimp_preview_update (preview); } } diff --git a/app/widgets/gimpviewrenderer.c b/app/widgets/gimpviewrenderer.c index 7f5cc99e3b..77c6070e80 100644 --- a/app/widgets/gimpviewrenderer.c +++ b/app/widgets/gimpviewrenderer.c @@ -48,9 +48,6 @@ #include "gimppreviewrenderer-utils.h" -#define PREVIEW_BYTES 3 - - enum { UPDATE, @@ -143,6 +140,7 @@ gimp_preview_renderer_init (GimpPreviewRenderer *renderer) renderer->buffer = NULL; renderer->rowstride = 0; + renderer->bytes = 3; renderer->no_preview_pixbuf = NULL; @@ -392,7 +390,7 @@ gimp_preview_renderer_set_size_full (GimpPreviewRenderer *renderer, renderer->height = height; renderer->border_width = border_width; - renderer->rowstride = (renderer->width * PREVIEW_BYTES + 3) & ~3; + renderer->rowstride = (renderer->width * renderer->bytes + 3) & ~3; if (renderer->buffer) { @@ -543,17 +541,10 @@ gimp_preview_renderer_draw (GimpPreviewRenderer *renderer, } else if (renderer->buffer) { - if (renderer->border_width > 0) - { - buf_rect.x = border_rect.x + renderer->border_width; - buf_rect.y = border_rect.y + renderer->border_width; - buf_rect.width = border_rect.width - 2 * renderer->border_width; - buf_rect.height = border_rect.height - 2 * renderer->border_width; - } - else - { - buf_rect = border_rect; - } + buf_rect.x = border_rect.x + renderer->border_width; + buf_rect.y = border_rect.y + renderer->border_width; + buf_rect.width = renderer->width; + buf_rect.height = renderer->height; if (gdk_rectangle_intersect (&buf_rect, expose_area, &render_rect)) { @@ -561,7 +552,7 @@ gimp_preview_renderer_draw (GimpPreviewRenderer *renderer, buf = (renderer->buffer + (render_rect.y - buf_rect.y) * renderer->rowstride + - (render_rect.x - buf_rect.x) * PREVIEW_BYTES); + (render_rect.x - buf_rect.x) * renderer->bytes); gdk_draw_rgb_image_dithalign (window, widget->style->black_gc, @@ -762,7 +753,8 @@ gimp_preview_render_to_buffer (TempBuf *temp_buf, guchar *dest_buffer, gint dest_width, gint dest_height, - gint dest_rowstride) + gint dest_rowstride, + gint dest_bytes) { guchar *src, *s; guchar *cb; @@ -860,8 +852,8 @@ gimp_preview_render_to_buffer (TempBuf *temp_buf, { /* Handle the leading transparency */ for (j = 0; j < x1; j++) - for (b = 0; b < PREVIEW_BYTES; b++) - render_temp_buf[j * PREVIEW_BYTES + b] = cb[j * 3 + b]; + for (b = 0; b < dest_bytes; b++) + render_temp_buf[j * dest_bytes + b] = cb[j * 3 + b]; /* The stuff in the middle */ s = src; @@ -914,21 +906,21 @@ gimp_preview_render_to_buffer (TempBuf *temp_buf, /* Handle the trailing transparency */ for (j = x2; j < dest_width; j++) - for (b = 0; b < PREVIEW_BYTES; b++) - render_temp_buf[j * PREVIEW_BYTES + b] = cb[j * 3 + b]; + for (b = 0; b < dest_bytes; b++) + render_temp_buf[j * dest_bytes + b] = cb[j * 3 + b]; src += rowstride; } else { for (j = 0; j < dest_width; j++) - for (b = 0; b < PREVIEW_BYTES; b++) - render_temp_buf[j * PREVIEW_BYTES + b] = cb[j * 3 + b]; + for (b = 0; b < dest_bytes; b++) + render_temp_buf[j * dest_bytes + b] = cb[j * 3 + b]; } memcpy (dest_buffer + i * dest_rowstride, render_temp_buf, - dest_width * PREVIEW_BYTES); + dest_width * dest_bytes); } } @@ -949,7 +941,8 @@ gimp_preview_renderer_render_preview (GimpPreviewRenderer *renderer, renderer->buffer, renderer->width, renderer->height, - renderer->rowstride); + renderer->rowstride, + renderer->bytes); renderer->needs_render = FALSE; } diff --git a/app/widgets/gimpviewrenderer.h b/app/widgets/gimpviewrenderer.h index de02f72736..2c14df26ef 100644 --- a/app/widgets/gimpviewrenderer.h +++ b/app/widgets/gimpviewrenderer.h @@ -55,6 +55,7 @@ struct _GimpPreviewRenderer /*< private >*/ guchar *buffer; gint rowstride; + gint bytes; GdkPixbuf *no_preview_pixbuf; @@ -124,7 +125,8 @@ void gimp_preview_render_to_buffer (TempBuf *temp_buf, guchar *dest_buffer, gint dest_width, gint dest_height, - gint dest_rowstride); + gint dest_rowstride, + gint dest_bytes); void gimp_preview_renderer_render_preview (GimpPreviewRenderer *renderer, TempBuf *temp_buf, gint channel, diff --git a/app/widgets/gimpviewrendererbrush.c b/app/widgets/gimpviewrendererbrush.c index 2f6764517e..f81024a395 100644 --- a/app/widgets/gimpviewrendererbrush.c +++ b/app/widgets/gimpviewrendererbrush.c @@ -174,11 +174,17 @@ gimp_preview_renderer_brush_render (GimpPreviewRenderer *renderer, return; } + gimp_preview_renderer_render_preview (renderer, temp_buf, -1, + GIMP_PREVIEW_BG_WHITE, + GIMP_PREVIEW_BG_WHITE); + + temp_buf_free (temp_buf); + #define INDICATOR_WIDTH 7 #define INDICATOR_HEIGHT 7 - if (temp_buf->width >= INDICATOR_WIDTH && - temp_buf->height >= INDICATOR_HEIGHT && + if (renderer->width >= INDICATOR_WIDTH * 2 && + renderer->height >= INDICATOR_HEIGHT * 2&& (renderer->width < brush_width || renderer->height < brush_height || GIMP_IS_BRUSH_PIPE (brush))) @@ -225,6 +231,7 @@ gimp_preview_renderer_brush_render (GimpPreviewRenderer *renderer, #undef RED guchar *buf; + guchar *b; gint x, y; gint offset_x; gint offset_y; @@ -232,60 +239,55 @@ gimp_preview_renderer_brush_render (GimpPreviewRenderer *renderer, gboolean pipe; gboolean scale; - buf = temp_buf_data (temp_buf); + offset_x = renderer->width - INDICATOR_WIDTH; + offset_y = renderer->height - INDICATOR_HEIGHT; - offset_x = temp_buf->width - INDICATOR_WIDTH; - offset_y = temp_buf->height - INDICATOR_HEIGHT; - - buf += (offset_y * temp_buf->width + offset_x) * temp_buf->bytes; + buf = renderer->buffer + (offset_y * renderer->rowstride + + offset_x * renderer->bytes); pipe = GIMP_IS_BRUSH_PIPE (brush); scale = (renderer->width < brush_width || renderer->height < brush_height); - alpha = (temp_buf->bytes == 4); + alpha = (renderer->bytes == 4); for (y = 0; y < INDICATOR_HEIGHT; y++) { + b = buf; + for (x = 0; x < INDICATOR_WIDTH; x++) { if (scale) { if (pipe) { - *buf++ = scale_pipe_indicator_bits[y][x][0]; - *buf++ = scale_pipe_indicator_bits[y][x][1]; - *buf++ = scale_pipe_indicator_bits[y][x][2]; + *b++ = scale_pipe_indicator_bits[y][x][0]; + *b++ = scale_pipe_indicator_bits[y][x][1]; + *b++ = scale_pipe_indicator_bits[y][x][2]; } else { - *buf++ = scale_indicator_bits[y][x][0]; - *buf++ = scale_indicator_bits[y][x][1]; - *buf++ = scale_indicator_bits[y][x][2]; + *b++ = scale_indicator_bits[y][x][0]; + *b++ = scale_indicator_bits[y][x][1]; + *b++ = scale_indicator_bits[y][x][2]; } } else if (pipe) { - *buf++ = pipe_indicator_bits[y][x][0]; - *buf++ = pipe_indicator_bits[y][x][1]; - *buf++ = pipe_indicator_bits[y][x][2]; + *b++ = pipe_indicator_bits[y][x][0]; + *b++ = pipe_indicator_bits[y][x][1]; + *b++ = pipe_indicator_bits[y][x][2]; } if (alpha) - *buf++ = 255; + *b++ = 255; } - buf += (temp_buf->width - INDICATOR_WIDTH) * temp_buf->bytes; + buf += renderer->rowstride; } } #undef INDICATOR_WIDTH #undef INDICATOR_HEIGHT - - gimp_preview_renderer_render_preview (renderer, temp_buf, -1, - GIMP_PREVIEW_BG_WHITE, - GIMP_PREVIEW_BG_WHITE); - - temp_buf_free (temp_buf); } static gboolean