From 3a0e874522d4b157a49b7e7e3b59b7651e7f4c64 Mon Sep 17 00:00:00 2001 From: Sven Neumann Date: Wed, 1 Sep 2004 01:18:19 +0000 Subject: [PATCH] added new function gimp_preview_area_set_offsets(). 2004-09-01 Sven Neumann * libgimpwidgets/gimppreviewarea.[ch]: added new function gimp_preview_area_set_offsets(). * libgimpwidgets/gimppreview.c: use the new function to let the checkerboard scroll with the preview. --- ChangeLog | 8 +++ .../libgimpwidgets-sections.txt | 1 + .../libgimpwidgets/tmpl/gimppreviewarea.sgml | 10 ++++ libgimpwidgets/gimppreview.c | 16 ++++-- libgimpwidgets/gimppreviewarea.c | 48 ++++++++++++----- libgimpwidgets/gimppreviewarea.h | 51 ++++++++++--------- 6 files changed, 92 insertions(+), 42 deletions(-) diff --git a/ChangeLog b/ChangeLog index 3b4ecd8bb6..db323a5c8c 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,11 @@ +2004-09-01 Sven Neumann + + * libgimpwidgets/gimppreviewarea.[ch]: added new function + gimp_preview_area_set_offsets(). + + * libgimpwidgets/gimppreview.c: use the new function to let the + checkerboard scroll with the preview. + 2004-09-01 Sven Neumann * libgimpwidgets/gimppreview.[ch]: delay the emission of the diff --git a/devel-docs/libgimpwidgets/libgimpwidgets-sections.txt b/devel-docs/libgimpwidgets/libgimpwidgets-sections.txt index 5775cec80a..3ba99be0ea 100644 --- a/devel-docs/libgimpwidgets/libgimpwidgets-sections.txt +++ b/devel-docs/libgimpwidgets/libgimpwidgets-sections.txt @@ -781,6 +781,7 @@ GimpPreviewArea gimp_preview_area_new gimp_preview_area_draw gimp_preview_area_fill +gimp_preview_area_set_offsets gimp_preview_area_set_cmap GimpPreviewAreaClass diff --git a/devel-docs/libgimpwidgets/tmpl/gimppreviewarea.sgml b/devel-docs/libgimpwidgets/tmpl/gimppreviewarea.sgml index 75118046d5..5a5bcd340a 100644 --- a/devel-docs/libgimpwidgets/tmpl/gimppreviewarea.sgml +++ b/devel-docs/libgimpwidgets/tmpl/gimppreviewarea.sgml @@ -60,6 +60,16 @@ GimpPreviewArea @blue: + + + + + +@area: +@x: +@y: + + diff --git a/libgimpwidgets/gimppreview.c b/libgimpwidgets/gimppreview.c index 6fbc33e521..902052b2ba 100644 --- a/libgimpwidgets/gimppreview.c +++ b/libgimpwidgets/gimppreview.c @@ -371,6 +371,9 @@ gimp_preview_h_scroll (GtkAdjustment *hadj, { preview->xoff = hadj->value; + gimp_preview_area_set_offsets (GIMP_PREVIEW_AREA (preview->area), + preview->xoff, preview->yoff); + if (! preview->in_drag) gimp_preview_draw (preview); @@ -383,6 +386,9 @@ gimp_preview_v_scroll (GtkAdjustment *vadj, { preview->yoff = vadj->value; + gimp_preview_area_set_offsets (GIMP_PREVIEW_AREA (preview->area), + preview->xoff, preview->yoff); + if (! preview->in_drag) gimp_preview_draw (preview); @@ -434,11 +440,13 @@ gimp_preview_area_event (GtkWidget *area, yoff = CLAMP (preview->drag_yoff - dy, 0, preview->ymax - preview->ymin - preview->height); - gtk_adjustment_set_value (GTK_ADJUSTMENT (preview->hadj), xoff); - gtk_adjustment_set_value (GTK_ADJUSTMENT (preview->vadj), yoff); + if (preview->xoff != xoff || preview->yoff != yoff) + { + gtk_adjustment_set_value (GTK_ADJUSTMENT (preview->hadj), xoff); + gtk_adjustment_set_value (GTK_ADJUSTMENT (preview->vadj), yoff); - gimp_preview_draw (preview); - gimp_preview_invalidate (preview); + gimp_preview_draw (preview); + } } break; diff --git a/libgimpwidgets/gimppreviewarea.c b/libgimpwidgets/gimppreviewarea.c index 4f98a0cd54..c858720dee 100644 --- a/libgimpwidgets/gimppreviewarea.c +++ b/libgimpwidgets/gimppreviewarea.c @@ -30,9 +30,10 @@ #include "gimppreviewarea.h" -#define CHECK_COLOR(row,col) \ - ((((row) & GIMP_CHECK_SIZE) ^ ((col) & GIMP_CHECK_SIZE)) ? \ - (GIMP_CHECK_LIGHT * 255) : \ +#define CHECK_COLOR(area, row, col) \ + (((((area)->offset_x + (row)) & GIMP_CHECK_SIZE) ^ \ + (((area)->offset_y + (col)) & GIMP_CHECK_SIZE)) ? \ + (GIMP_CHECK_LIGHT * 255) : \ (GIMP_CHECK_DARK * 255)) @@ -97,8 +98,8 @@ gimp_preview_area_init (GimpPreviewArea *area) { area->buf = NULL; area->cmap = NULL; - area->dither_x = 0; - area->dither_y = 0; + area->offset_x = 0; + area->offset_y = 0; area->width = 0; area->height = 0; area->rowstride = 0; @@ -173,8 +174,8 @@ gimp_preview_area_expose (GtkWidget *widget, GDK_RGB_DITHER_MAX, buf, area->rowstride, - area->dither_x - event->area.x, - area->dither_y - event->area.y); + area->offset_x - event->area.x, + area->offset_y - event->area.y); return FALSE; } @@ -310,7 +311,7 @@ gimp_preview_area_draw (GimpPreviewArea *area, switch (s[3]) { case 0: - d[0] = d[1] = d[2] = CHECK_COLOR (row, col); + d[0] = d[1] = d[2] = CHECK_COLOR (area, row, col); break; case 255: @@ -322,7 +323,7 @@ gimp_preview_area_draw (GimpPreviewArea *area, default: { register guint alpha = s[3] + 1; - register guint check = CHECK_COLOR (row, col); + register guint check = CHECK_COLOR (area, row, col); d[0] = ((check << 8) + (s[0] - check) * alpha) >> 8; d[1] = ((check << 8) + (s[1] - check) * alpha) >> 8; @@ -364,7 +365,7 @@ gimp_preview_area_draw (GimpPreviewArea *area, switch (s[1]) { case 0: - d[0] = d[1] = d[2] = CHECK_COLOR (row, col); + d[0] = d[1] = d[2] = CHECK_COLOR (area, row, col); break; case 255: @@ -374,7 +375,7 @@ gimp_preview_area_draw (GimpPreviewArea *area, default: { register guint alpha = s[1] + 1; - register guint check = CHECK_COLOR (row, col); + register guint check = CHECK_COLOR (area, row, col); d[0] = d[1] = d[2] = ((check << 8) + (s[0] - check) * alpha) >> 8; @@ -423,7 +424,7 @@ gimp_preview_area_draw (GimpPreviewArea *area, switch (s[1]) { case 0: - d[0] = d[1] = d[2] = CHECK_COLOR (row, col); + d[0] = d[1] = d[2] = CHECK_COLOR (area, row, col); break; case 255: @@ -435,7 +436,7 @@ gimp_preview_area_draw (GimpPreviewArea *area, default: { register guint alpha = s[3] + 1; - register guint check = CHECK_COLOR (row, col); + register guint check = CHECK_COLOR (area, row, col); d[0] = ((check << 8) + (cmap[0] - check) * alpha) >> 8; d[1] = ((check << 8) + (cmap[1] - check) * alpha) >> 8; @@ -535,6 +536,27 @@ gimp_preview_area_fill (GimpPreviewArea *area, gtk_widget_queue_draw_area (GTK_WIDGET (area), x, y, width, height); } +/** + * gimp_preview_area_set_offsets: + * @area: a #GimpPreviewArea + * @x: horizontal offset + * @y: vertical offset + * + * Sets the offsets of the previewed area. This information is used + * when drawing the checkerboard and to determine the dither offsets. + * + * Since: GIMP 2.2 + **/ +void +gimp_preview_area_set_offsets (GimpPreviewArea *area, + gint x, + gint y) +{ + g_return_if_fail (GIMP_IS_PREVIEW_AREA (area)); + + area->offset_x = x; + area->offset_y = y; +} /** * gimp_preview_area_set_cmap: diff --git a/libgimpwidgets/gimppreviewarea.h b/libgimpwidgets/gimppreviewarea.h index 50ccffe833..2dcddb4ac2 100644 --- a/libgimpwidgets/gimppreviewarea.h +++ b/libgimpwidgets/gimppreviewarea.h @@ -40,8 +40,8 @@ struct _GimpPreviewArea gint width; gint height; gint rowstride; - gint dither_x; - gint dither_y; + gint offset_x; + gint offset_y; guchar *buf; guchar *cmap; }; @@ -52,31 +52,32 @@ struct _GimpPreviewAreaClass }; -GType gimp_preview_area_get_type (void) G_GNUC_CONST; +GType gimp_preview_area_get_type (void) G_GNUC_CONST; -GtkWidget * gimp_preview_area_new (void); +GtkWidget * gimp_preview_area_new (void); -void gimp_preview_area_draw (GimpPreviewArea *area, - gint x, - gint y, - gint width, - gint height, - GimpImageType type, - const guchar *buf, - gint rowstride); - -void gimp_preview_area_fill (GimpPreviewArea *area, - gint x, - gint y, - gint width, - gint height, - guchar red, - guchar green, - guchar blue); - -void gimp_preview_area_set_cmap (GimpPreviewArea *area, - const guchar *cmap, - gint num_colors); +void gimp_preview_area_draw (GimpPreviewArea *area, + gint x, + gint y, + gint width, + gint height, + GimpImageType type, + const guchar *buf, + gint rowstride); +void gimp_preview_area_fill (GimpPreviewArea *area, + gint x, + gint y, + gint width, + gint height, + guchar red, + guchar green, + guchar blue); +void gimp_preview_area_set_offsets (GimpPreviewArea *area, + gint x, + gint y); +void gimp_preview_area_set_cmap (GimpPreviewArea *area, + const guchar *cmap, + gint num_colors); #endif /* __GIMP_PREVIEW_AREA_H__ */