app/nav_window.c app/nav_window.h app/gimppreviewcache.h app/layer.c
Fri Aug 27 18:57:50 BST 1999 Andy Thomas <alt@gimp.org> * app/nav_window.c * app/nav_window.h * app/gimppreviewcache.h * app/layer.c * app/channel.c * app/commands.c Added some controls to the nav window. Yep. I know that the buttons are toooo biGGG. Preview cache changes. Now prime preview cache with a image so that later we have a better chance of a hit. Still needs to be more intelligent at doing this (needs to pick largest out of the cache & use its size as the size to prime with).
This commit is contained in:

committed by
Andy Thomas

parent
73656bee68
commit
df7ad092f4
17
ChangeLog
17
ChangeLog
@ -1,3 +1,20 @@
|
|||||||
|
Fri Aug 27 18:57:50 BST 1999 Andy Thomas <alt@gimp.org>
|
||||||
|
|
||||||
|
* app/nav_window.c
|
||||||
|
* app/nav_window.h
|
||||||
|
* app/gimppreviewcache.h
|
||||||
|
* app/layer.c
|
||||||
|
* app/channel.c
|
||||||
|
* app/commands.c
|
||||||
|
|
||||||
|
Added some controls to the nav window. Yep. I know that the
|
||||||
|
buttons are toooo biGGG.
|
||||||
|
|
||||||
|
Preview cache changes. Now prime preview cache with a image
|
||||||
|
so that later we have a better chance of a hit. Still
|
||||||
|
needs to be more intelligent at doing this (needs to pick largest
|
||||||
|
out of the cache & use its size as the size to prime with).
|
||||||
|
|
||||||
Fri Aug 27 02:16:02 EDT 1999 Adrian Likins <alikins@redhat.com>
|
Fri Aug 27 02:16:02 EDT 1999 Adrian Likins <alikins@redhat.com>
|
||||||
|
|
||||||
* app/gimpbrushpipe.c: paint_line_pixmap_mask, finally
|
* app/gimpbrushpipe.c: paint_line_pixmap_mask, finally
|
||||||
|
@ -546,7 +546,7 @@ view_window_nav_cmd_callback (GtkWidget *widget,
|
|||||||
if (! gdisp->window_nav_dialog)
|
if (! gdisp->window_nav_dialog)
|
||||||
gdisp->window_nav_dialog = nav_window_create ((void *) gdisp);
|
gdisp->window_nav_dialog = nav_window_create ((void *) gdisp);
|
||||||
|
|
||||||
info_dialog_popup (gdisp->window_nav_dialog);
|
nav_dialog_popup (gdisp->window_nav_dialog);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -477,8 +477,8 @@ channel_toggle_visibility (Channel *channel)
|
|||||||
return GIMP_DRAWABLE (channel)->visible;
|
return GIMP_DRAWABLE (channel)->visible;
|
||||||
}
|
}
|
||||||
|
|
||||||
TempBuf *
|
static TempBuf *
|
||||||
channel_preview (Channel *channel,
|
channel_preview_private (Channel *channel,
|
||||||
gint width,
|
gint width,
|
||||||
gint height)
|
gint height)
|
||||||
{
|
{
|
||||||
@ -530,6 +530,31 @@ channel_preview (Channel *channel,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TempBuf *
|
||||||
|
channel_preview (Channel *channel,
|
||||||
|
gint width,
|
||||||
|
gint height)
|
||||||
|
{
|
||||||
|
/* Ok prime the cache with a large preview if the cache is invalid */
|
||||||
|
if(!GIMP_DRAWABLE(channel)->preview_valid &&
|
||||||
|
width <= PREVIEW_CACHE_PRIME_WIDTH &&
|
||||||
|
height <= PREVIEW_CACHE_PRIME_HEIGHT)
|
||||||
|
{
|
||||||
|
TempBuf * tb = channel_preview_private(channel,
|
||||||
|
PREVIEW_CACHE_PRIME_WIDTH,
|
||||||
|
PREVIEW_CACHE_PRIME_HEIGHT);
|
||||||
|
|
||||||
|
/* Save the 2nd call */
|
||||||
|
if(width == PREVIEW_CACHE_PRIME_WIDTH &&
|
||||||
|
height == PREVIEW_CACHE_PRIME_HEIGHT)
|
||||||
|
return tb;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Second call - should NOT visit the tile cache...*/
|
||||||
|
return channel_preview_private(channel,width,height);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
channel_invalidate_previews (GimpImage* gimage)
|
channel_invalidate_previews (GimpImage* gimage)
|
||||||
{
|
{
|
||||||
|
@ -546,7 +546,7 @@ view_window_nav_cmd_callback (GtkWidget *widget,
|
|||||||
if (! gdisp->window_nav_dialog)
|
if (! gdisp->window_nav_dialog)
|
||||||
gdisp->window_nav_dialog = nav_window_create ((void *) gdisp);
|
gdisp->window_nav_dialog = nav_window_create ((void *) gdisp);
|
||||||
|
|
||||||
info_dialog_popup (gdisp->window_nav_dialog);
|
nav_dialog_popup (gdisp->window_nav_dialog);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -477,8 +477,8 @@ channel_toggle_visibility (Channel *channel)
|
|||||||
return GIMP_DRAWABLE (channel)->visible;
|
return GIMP_DRAWABLE (channel)->visible;
|
||||||
}
|
}
|
||||||
|
|
||||||
TempBuf *
|
static TempBuf *
|
||||||
channel_preview (Channel *channel,
|
channel_preview_private (Channel *channel,
|
||||||
gint width,
|
gint width,
|
||||||
gint height)
|
gint height)
|
||||||
{
|
{
|
||||||
@ -530,6 +530,31 @@ channel_preview (Channel *channel,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TempBuf *
|
||||||
|
channel_preview (Channel *channel,
|
||||||
|
gint width,
|
||||||
|
gint height)
|
||||||
|
{
|
||||||
|
/* Ok prime the cache with a large preview if the cache is invalid */
|
||||||
|
if(!GIMP_DRAWABLE(channel)->preview_valid &&
|
||||||
|
width <= PREVIEW_CACHE_PRIME_WIDTH &&
|
||||||
|
height <= PREVIEW_CACHE_PRIME_HEIGHT)
|
||||||
|
{
|
||||||
|
TempBuf * tb = channel_preview_private(channel,
|
||||||
|
PREVIEW_CACHE_PRIME_WIDTH,
|
||||||
|
PREVIEW_CACHE_PRIME_HEIGHT);
|
||||||
|
|
||||||
|
/* Save the 2nd call */
|
||||||
|
if(width == PREVIEW_CACHE_PRIME_WIDTH &&
|
||||||
|
height == PREVIEW_CACHE_PRIME_HEIGHT)
|
||||||
|
return tb;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Second call - should NOT visit the tile cache...*/
|
||||||
|
return channel_preview_private(channel,width,height);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
channel_invalidate_previews (GimpImage* gimage)
|
channel_invalidate_previews (GimpImage* gimage)
|
||||||
{
|
{
|
||||||
|
@ -477,8 +477,8 @@ channel_toggle_visibility (Channel *channel)
|
|||||||
return GIMP_DRAWABLE (channel)->visible;
|
return GIMP_DRAWABLE (channel)->visible;
|
||||||
}
|
}
|
||||||
|
|
||||||
TempBuf *
|
static TempBuf *
|
||||||
channel_preview (Channel *channel,
|
channel_preview_private (Channel *channel,
|
||||||
gint width,
|
gint width,
|
||||||
gint height)
|
gint height)
|
||||||
{
|
{
|
||||||
@ -530,6 +530,31 @@ channel_preview (Channel *channel,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TempBuf *
|
||||||
|
channel_preview (Channel *channel,
|
||||||
|
gint width,
|
||||||
|
gint height)
|
||||||
|
{
|
||||||
|
/* Ok prime the cache with a large preview if the cache is invalid */
|
||||||
|
if(!GIMP_DRAWABLE(channel)->preview_valid &&
|
||||||
|
width <= PREVIEW_CACHE_PRIME_WIDTH &&
|
||||||
|
height <= PREVIEW_CACHE_PRIME_HEIGHT)
|
||||||
|
{
|
||||||
|
TempBuf * tb = channel_preview_private(channel,
|
||||||
|
PREVIEW_CACHE_PRIME_WIDTH,
|
||||||
|
PREVIEW_CACHE_PRIME_HEIGHT);
|
||||||
|
|
||||||
|
/* Save the 2nd call */
|
||||||
|
if(width == PREVIEW_CACHE_PRIME_WIDTH &&
|
||||||
|
height == PREVIEW_CACHE_PRIME_HEIGHT)
|
||||||
|
return tb;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Second call - should NOT visit the tile cache...*/
|
||||||
|
return channel_preview_private(channel,width,height);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
channel_invalidate_previews (GimpImage* gimage)
|
channel_invalidate_previews (GimpImage* gimage)
|
||||||
{
|
{
|
||||||
|
@ -1089,8 +1089,8 @@ layer_linked (Layer *layer)
|
|||||||
return layer->linked;
|
return layer->linked;
|
||||||
}
|
}
|
||||||
|
|
||||||
TempBuf *
|
static TempBuf *
|
||||||
layer_preview (Layer *layer,
|
layer_preview_private (Layer *layer,
|
||||||
gint w,
|
gint w,
|
||||||
gint h)
|
gint h)
|
||||||
{
|
{
|
||||||
@ -1161,7 +1161,31 @@ layer_preview (Layer *layer,
|
|||||||
}
|
}
|
||||||
|
|
||||||
TempBuf *
|
TempBuf *
|
||||||
layer_mask_preview (Layer *layer,
|
layer_preview (Layer *layer,
|
||||||
|
gint w,
|
||||||
|
gint h)
|
||||||
|
{
|
||||||
|
/* Ok prime the cache with a large preview if the cache is invalid */
|
||||||
|
if(!GIMP_DRAWABLE(layer)->preview_valid &&
|
||||||
|
w <= PREVIEW_CACHE_PRIME_WIDTH &&
|
||||||
|
h <= PREVIEW_CACHE_PRIME_HEIGHT)
|
||||||
|
{
|
||||||
|
TempBuf * tb = layer_preview_private(layer,
|
||||||
|
PREVIEW_CACHE_PRIME_WIDTH,
|
||||||
|
PREVIEW_CACHE_PRIME_HEIGHT);
|
||||||
|
|
||||||
|
/* Save the 2nd call */
|
||||||
|
if(w == PREVIEW_CACHE_PRIME_WIDTH &&
|
||||||
|
h == PREVIEW_CACHE_PRIME_HEIGHT)
|
||||||
|
return tb;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Second call - should NOT visit the tile cache...*/
|
||||||
|
return layer_preview_private(layer,w,h);
|
||||||
|
}
|
||||||
|
|
||||||
|
static TempBuf *
|
||||||
|
layer_mask_preview_private (Layer *layer,
|
||||||
gint w,
|
gint w,
|
||||||
gint h)
|
gint h)
|
||||||
{
|
{
|
||||||
@ -1213,6 +1237,31 @@ layer_mask_preview (Layer *layer,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TempBuf *
|
||||||
|
layer_mask_preview (Layer *layer,
|
||||||
|
gint w,
|
||||||
|
gint h)
|
||||||
|
{
|
||||||
|
/* Ok prime the cache with a large preview if the cache is invalid */
|
||||||
|
if(!GIMP_DRAWABLE(layer->mask)->preview_valid &&
|
||||||
|
w <= PREVIEW_CACHE_PRIME_WIDTH &&
|
||||||
|
h <= PREVIEW_CACHE_PRIME_HEIGHT)
|
||||||
|
{
|
||||||
|
TempBuf * tb = layer_mask_preview_private(layer,
|
||||||
|
PREVIEW_CACHE_PRIME_WIDTH,
|
||||||
|
PREVIEW_CACHE_PRIME_HEIGHT);
|
||||||
|
|
||||||
|
/* Save the 2nd call */
|
||||||
|
if(w == PREVIEW_CACHE_PRIME_WIDTH &&
|
||||||
|
h == PREVIEW_CACHE_PRIME_HEIGHT)
|
||||||
|
return tb;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Second call - should NOT visit the tile cache...*/
|
||||||
|
return layer_mask_preview_private(layer,w,h);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
Tattoo
|
Tattoo
|
||||||
layer_get_tattoo (const Layer *layer)
|
layer_get_tattoo (const Layer *layer)
|
||||||
{
|
{
|
||||||
|
@ -34,6 +34,9 @@ typedef struct _PreviewNearest {
|
|||||||
} PreviewNearest;
|
} PreviewNearest;
|
||||||
|
|
||||||
#define MAX_CACHE_PREVIEWS 5
|
#define MAX_CACHE_PREVIEWS 5
|
||||||
|
#define PREVIEW_CACHE_PRIME_WIDTH 112
|
||||||
|
#define PREVIEW_CACHE_PRIME_HEIGHT 112
|
||||||
|
|
||||||
TempBuf * gimp_preview_cache_get(GSList **,gint,gint);
|
TempBuf * gimp_preview_cache_get(GSList **,gint,gint);
|
||||||
void gimp_preview_cache_add(GSList **,TempBuf *);
|
void gimp_preview_cache_add(GSList **,TempBuf *);
|
||||||
void gimp_preview_cache_invalidate(GSList **);
|
void gimp_preview_cache_invalidate(GSList **);
|
||||||
|
@ -34,6 +34,9 @@
|
|||||||
#include "libgimp/gimpintl.h"
|
#include "libgimp/gimpintl.h"
|
||||||
#include "libgimp/gimpunit.h"
|
#include "libgimp/gimpunit.h"
|
||||||
|
|
||||||
|
#include "pixmaps/zoom_in.xpm"
|
||||||
|
#include "pixmaps/zoom_out.xpm"
|
||||||
|
|
||||||
|
|
||||||
#define MAX_BUF 256
|
#define MAX_BUF 256
|
||||||
|
|
||||||
@ -47,6 +50,12 @@
|
|||||||
#define NAV_PREVIEW_HEIGHT 112
|
#define NAV_PREVIEW_HEIGHT 112
|
||||||
#define BORDER_PEN_WIDTH 3
|
#define BORDER_PEN_WIDTH 3
|
||||||
|
|
||||||
|
#define MAX_SCALE_BUF 20
|
||||||
|
|
||||||
|
|
||||||
|
/* Timeout before preview is updated */
|
||||||
|
#define PREVIEW_UPDATE_TIMEOUT 1100
|
||||||
|
|
||||||
typedef struct _NavWinData NavWinData;
|
typedef struct _NavWinData NavWinData;
|
||||||
struct _NavWinData
|
struct _NavWinData
|
||||||
{
|
{
|
||||||
@ -57,6 +66,9 @@ struct _NavWinData
|
|||||||
void *gdisp_ptr; /* I'm not happy 'bout this one */
|
void *gdisp_ptr; /* I'm not happy 'bout this one */
|
||||||
GtkWidget *previewBox;
|
GtkWidget *previewBox;
|
||||||
GtkWidget *previewAlign;
|
GtkWidget *previewAlign;
|
||||||
|
GtkWidget *zoom_label;
|
||||||
|
GtkWidget *zoom_scale;
|
||||||
|
GtkObject *zoom_adjustment;
|
||||||
gdouble ratio;
|
gdouble ratio;
|
||||||
GdkGC *gc;
|
GdkGC *gc;
|
||||||
gint dispx; /* x pos of top left corner of display area */
|
gint dispx; /* x pos of top left corner of display area */
|
||||||
@ -74,6 +86,7 @@ struct _NavWinData
|
|||||||
gboolean block_window_marker; /* Block redraws of window marker */
|
gboolean block_window_marker; /* Block redraws of window marker */
|
||||||
gint nav_preview_width;
|
gint nav_preview_width;
|
||||||
gint nav_preview_height;
|
gint nav_preview_height;
|
||||||
|
gboolean block_adj_sig;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
@ -95,7 +108,10 @@ nav_window_preview_resized (GtkWidget *,
|
|||||||
#endif /* 0 */
|
#endif /* 0 */
|
||||||
|
|
||||||
static void
|
static void
|
||||||
nav_window_update_preview (NavWinData *,gboolean);
|
nav_window_update_preview (NavWinData *);
|
||||||
|
|
||||||
|
static void
|
||||||
|
nav_window_update_preview_blank(NavWinData *iwd);
|
||||||
|
|
||||||
static void
|
static void
|
||||||
destroy_preview_widget (NavWinData *);
|
destroy_preview_widget (NavWinData *);
|
||||||
@ -117,6 +133,10 @@ nav_window_draw_sqr(NavWinData *,
|
|||||||
static void
|
static void
|
||||||
set_size_data(NavWinData *);
|
set_size_data(NavWinData *);
|
||||||
|
|
||||||
|
static gint
|
||||||
|
nav_preview_update_do_timer(NavWinData *);
|
||||||
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
nav_window_destroy_callback (GtkWidget *widget,
|
nav_window_destroy_callback (GtkWidget *widget,
|
||||||
gpointer client_data)
|
gpointer client_data)
|
||||||
@ -137,7 +157,7 @@ nav_window_close_callback (GtkWidget *widget,
|
|||||||
info_win = (InfoDialog *)client_data;
|
info_win = (InfoDialog *)client_data;
|
||||||
iwd = (NavWinData *)info_win->user_data;
|
iwd = (NavWinData *)info_win->user_data;
|
||||||
|
|
||||||
/* iwd->showingPreview = FALSE; ALT. Needs to be sorted out */
|
iwd->showingPreview = FALSE;
|
||||||
info_dialog_popdown ((InfoDialog *) client_data);
|
info_dialog_popdown ((InfoDialog *) client_data);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -177,13 +197,17 @@ nav_window_disp_area(NavWinData *iwd,GDisplay *gdisp)
|
|||||||
iwd->imageheight = newheight;
|
iwd->imageheight = newheight;
|
||||||
|
|
||||||
/* Normalise */
|
/* Normalise */
|
||||||
|
iwd->dispwidth = MAX(iwd->dispwidth, 2);
|
||||||
|
iwd->dispheight = MAX(iwd->dispheight, 2);
|
||||||
|
|
||||||
iwd->dispwidth = MIN(iwd->dispwidth, iwd->pwidth/*-BORDER_PEN_WIDTH*/);
|
iwd->dispwidth = MIN(iwd->dispwidth, iwd->pwidth/*-BORDER_PEN_WIDTH*/);
|
||||||
iwd->dispheight = MIN(iwd->dispheight, iwd->pheight/*-BORDER_PEN_WIDTH*/);
|
iwd->dispheight = MIN(iwd->dispheight, iwd->pheight/*-BORDER_PEN_WIDTH*/);
|
||||||
|
|
||||||
if(need_update == TRUE)
|
if(need_update == TRUE)
|
||||||
{
|
{
|
||||||
gtk_widget_hide(iwd->previewAlign);
|
gtk_widget_hide(iwd->previewAlign);
|
||||||
nav_window_update_preview(iwd,FALSE);
|
/* ALT nav_window_update_preview(iwd);*/
|
||||||
|
nav_window_update_preview_blank(iwd);
|
||||||
gtk_widget_show(iwd->preview);
|
gtk_widget_show(iwd->preview);
|
||||||
gtk_widget_draw(iwd->preview, NULL);
|
gtk_widget_draw(iwd->preview, NULL);
|
||||||
gtk_widget_show(iwd->previewAlign);
|
gtk_widget_show(iwd->previewAlign);
|
||||||
@ -191,6 +215,7 @@ nav_window_disp_area(NavWinData *iwd,GDisplay *gdisp)
|
|||||||
iwd->dispx,iwd->dispy,
|
iwd->dispx,iwd->dispy,
|
||||||
iwd->dispwidth,iwd->dispheight);
|
iwd->dispwidth,iwd->dispheight);
|
||||||
gtk_window_set_focus(GTK_WINDOW (iwd->info_win->shell),iwd->preview);
|
gtk_window_set_focus(GTK_WINDOW (iwd->info_win->shell),iwd->preview);
|
||||||
|
gtk_timeout_add(PREVIEW_UPDATE_TIMEOUT,(GtkFunction)nav_preview_update_do_timer,(gpointer)iwd);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -328,30 +353,6 @@ create_preview_widget(NavWinData *iwd)
|
|||||||
GTK_WIDGET_SET_FLAGS (image, GTK_CAN_FOCUS);
|
GTK_WIDGET_SET_FLAGS (image, GTK_CAN_FOCUS);
|
||||||
}
|
}
|
||||||
|
|
||||||
#if 0
|
|
||||||
static void
|
|
||||||
info_window_page_switch (GtkWidget *widget,
|
|
||||||
GtkNotebookPage *page,
|
|
||||||
gint page_num)
|
|
||||||
{
|
|
||||||
InfoDialog *info_win;
|
|
||||||
InfoWinData *iwd;
|
|
||||||
|
|
||||||
info_win = (InfoDialog *)gtk_object_get_user_data(GTK_OBJECT (widget));
|
|
||||||
iwd = (InfoWinData *)info_win->user_data;
|
|
||||||
|
|
||||||
/* Only deal with the second page */
|
|
||||||
if(page_num != 1)
|
|
||||||
{
|
|
||||||
iwd->showingPreview = FALSE;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
iwd->showingPreview = TRUE;
|
|
||||||
|
|
||||||
}
|
|
||||||
#endif /* 0 */
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
update_real_view(NavWinData *iwd,gint tx,gint ty)
|
update_real_view(NavWinData *iwd,gint tx,gint ty)
|
||||||
{
|
{
|
||||||
@ -387,10 +388,7 @@ update_real_view(NavWinData *iwd,gint tx,gint ty)
|
|||||||
iwd->block_window_marker = FALSE;
|
iwd->block_window_marker = FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void nav_window_update_preview(NavWinData *iwd)
|
||||||
nav_window_update_preview
|
|
||||||
(NavWinData *iwd,
|
|
||||||
gboolean invalidated)
|
|
||||||
{
|
{
|
||||||
GDisplay *gdisp;
|
GDisplay *gdisp;
|
||||||
TempBuf * preview_buf;
|
TempBuf * preview_buf;
|
||||||
@ -399,6 +397,8 @@ nav_window_update_preview
|
|||||||
gint pwidth, pheight;
|
gint pwidth, pheight;
|
||||||
GimpImage *gimage;
|
GimpImage *gimage;
|
||||||
gdouble r,g,b,a,chk;
|
gdouble r,g,b,a,chk;
|
||||||
|
gint xoff = 0;
|
||||||
|
gint yoff = 0;
|
||||||
|
|
||||||
gimp_add_busy_cursors();
|
gimp_add_busy_cursors();
|
||||||
|
|
||||||
@ -411,79 +411,98 @@ nav_window_update_preview
|
|||||||
pwidth = iwd->pwidth;
|
pwidth = iwd->pwidth;
|
||||||
pheight = iwd->pheight;
|
pheight = iwd->pheight;
|
||||||
|
|
||||||
|
|
||||||
preview_buf = gimp_image_construct_composite_preview (gimage,
|
preview_buf = gimp_image_construct_composite_preview (gimage,
|
||||||
MAX (pwidth, 2),
|
MAX (pwidth, 2),
|
||||||
MAX (pheight, 2));
|
MAX (pheight, 2));
|
||||||
|
|
||||||
|
|
||||||
buf = g_new (gchar, iwd->nav_preview_width * 3);
|
buf = g_new (gchar, iwd->nav_preview_width * 3);
|
||||||
src = (gchar *) temp_buf_data (preview_buf);
|
src = (gchar *) temp_buf_data (preview_buf);
|
||||||
has_alpha = (preview_buf->bytes == 2 || preview_buf->bytes == 4);
|
has_alpha = (preview_buf->bytes == 2 || preview_buf->bytes == 4);
|
||||||
|
|
||||||
for (y = 0; y <preview_buf->height ; y++)
|
for (y = 0; y <pheight ; y++)
|
||||||
{
|
{
|
||||||
dest = buf;
|
dest = buf;
|
||||||
switch (preview_buf->bytes)
|
switch (preview_buf->bytes)
|
||||||
{
|
{
|
||||||
case 4:
|
case 4:
|
||||||
for (x = 0; x < preview_buf->width; x++)
|
for (x = 0; x < pwidth; x++)
|
||||||
{
|
{
|
||||||
r = ((gdouble)(*(src++)))/255.0;
|
r = ((gdouble)(*(src++)))/255.0;
|
||||||
g = ((gdouble)(*(src++)))/255.0;
|
g = ((gdouble)(*(src++)))/255.0;
|
||||||
b = ((gdouble)(*(src++)))/255.0;
|
b = ((gdouble)(*(src++)))/255.0;
|
||||||
a = ((gdouble)(*(src++)))/255.0;
|
a = ((gdouble)(*(src++)))/255.0;
|
||||||
chk = ((gdouble)((( (x^y) & 4 ) << 4) | 128))/255.0;
|
chk = ((gdouble)((( (x^y) & 4 ) << 4) | 128))/255.0;
|
||||||
if(!invalidated)
|
|
||||||
{
|
|
||||||
*(dest++) = (guchar)((chk + (r - chk)*a)*255.0);
|
*(dest++) = (guchar)((chk + (r - chk)*a)*255.0);
|
||||||
*(dest++) = (guchar)((chk + (g - chk)*a)*255.0);
|
*(dest++) = (guchar)((chk + (g - chk)*a)*255.0);
|
||||||
*(dest++) = (guchar)((chk + (b - chk)*a)*255.0);
|
*(dest++) = (guchar)((chk + (b - chk)*a)*255.0);
|
||||||
}
|
}
|
||||||
else
|
|
||||||
{
|
|
||||||
chk *= 128.0;
|
|
||||||
*(dest++) = (guchar)chk;
|
|
||||||
*(dest++) = (guchar)chk;
|
|
||||||
*(dest++) = (guchar)chk;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
case 2:
|
case 2:
|
||||||
for (x = 0; x < preview_buf->width; x++)
|
for (x = 0; x < pwidth; x++)
|
||||||
{
|
{
|
||||||
r = ((gdouble)(*(src++)))/255.0;
|
r = ((gdouble)(*(src++)))/255.0;
|
||||||
a = ((gdouble)(*(src++)))/255.0;
|
a = ((gdouble)(*(src++)))/255.0;
|
||||||
chk = ((gdouble)((( (x^y) & 4 ) << 4) | 128))/255.0;
|
chk = ((gdouble)((( (x^y) & 4 ) << 4) | 128))/255.0;
|
||||||
if(!invalidated)
|
|
||||||
{
|
|
||||||
*(dest++) = (guchar)((chk + (r - chk)*a)*255.0);
|
*(dest++) = (guchar)((chk + (r - chk)*a)*255.0);
|
||||||
*(dest++) = (guchar)((chk + (r - chk)*a)*255.0);
|
*(dest++) = (guchar)((chk + (r - chk)*a)*255.0);
|
||||||
*(dest++) = (guchar)((chk + (r - chk)*a)*255.0);
|
*(dest++) = (guchar)((chk + (r - chk)*a)*255.0);
|
||||||
}
|
}
|
||||||
else
|
|
||||||
{
|
|
||||||
chk *= 255.0;
|
|
||||||
*(dest++) = (guchar)chk;
|
|
||||||
*(dest++) = (guchar)chk;
|
|
||||||
*(dest++) = (guchar)chk;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
g_warning("UNKNOWN TempBuf bpp in nav_window_update_preview()");
|
g_warning("UNKNOWN TempBuf bpp in nav_window_update_preview()");
|
||||||
}
|
}
|
||||||
|
|
||||||
gtk_preview_draw_row (GTK_PREVIEW (iwd->preview),
|
gtk_preview_draw_row (GTK_PREVIEW (iwd->preview),
|
||||||
(guchar *)buf, 0, y, preview_buf->width);
|
(guchar *)buf, xoff, yoff+y, preview_buf->width);
|
||||||
}
|
}
|
||||||
|
|
||||||
g_free (buf);
|
g_free (buf);
|
||||||
temp_buf_free (preview_buf);
|
temp_buf_free (preview_buf);
|
||||||
|
|
||||||
nav_window_disp_area(iwd,gdisp);
|
/* nav_window_disp_area(iwd,gdisp); */
|
||||||
|
|
||||||
gimp_remove_busy_cursors (NULL);
|
gimp_remove_busy_cursors (NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void nav_window_update_preview_blank(NavWinData *iwd)
|
||||||
|
{
|
||||||
|
GDisplay *gdisp;
|
||||||
|
guchar *buf, *dest;
|
||||||
|
gint x,y;
|
||||||
|
GimpImage *gimage;
|
||||||
|
gdouble chk;
|
||||||
|
|
||||||
|
gdisp = (GDisplay *) iwd->gdisp_ptr;
|
||||||
|
|
||||||
|
/* Calculate preview size */
|
||||||
|
gimage = ((GDisplay *)(iwd->gdisp_ptr))->gimage;
|
||||||
|
|
||||||
|
buf = g_new (gchar, iwd->pwidth * 3);
|
||||||
|
|
||||||
|
for (y = 0; y < iwd->pheight ; y++)
|
||||||
|
{
|
||||||
|
dest = buf;
|
||||||
|
for (x = 0; x < iwd->pwidth; x++)
|
||||||
|
{
|
||||||
|
chk = ((gdouble)((( (x^y) & 4 ) << 4) | 128))/255.0;
|
||||||
|
chk *= 128.0;
|
||||||
|
*(dest++) = (guchar)chk;
|
||||||
|
*(dest++) = (guchar)chk;
|
||||||
|
*(dest++) = (guchar)chk;
|
||||||
|
}
|
||||||
|
|
||||||
|
gtk_preview_draw_row (GTK_PREVIEW (iwd->preview),
|
||||||
|
(guchar *)buf, 0, y, iwd->pwidth);
|
||||||
|
}
|
||||||
|
|
||||||
|
g_free (buf);
|
||||||
|
|
||||||
|
gdk_flush();
|
||||||
|
/* nav_window_disp_area(iwd,gdisp);*/
|
||||||
|
}
|
||||||
|
|
||||||
static gint
|
static gint
|
||||||
inside_preview_square(NavWinData *iwd, gint x, gint y)
|
inside_preview_square(NavWinData *iwd, gint x, gint y)
|
||||||
{
|
{
|
||||||
@ -496,55 +515,42 @@ inside_preview_square(NavWinData *iwd, gint x, gint y)
|
|||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if 0
|
static void
|
||||||
static gint
|
update_zoom_label(NavWinData *iwd)
|
||||||
nav_window_preview_resized (GtkWidget *widget,
|
|
||||||
GtkAllocation *alloc,
|
|
||||||
gpointer *data)
|
|
||||||
{
|
{
|
||||||
NavWinData *iwd;
|
gchar scale_str[MAX_SCALE_BUF];
|
||||||
|
|
||||||
iwd = (NavWinData *)data;
|
/* Update the zoom scale string */
|
||||||
|
g_snprintf (scale_str, MAX_SCALE_BUF, "%d:%d",
|
||||||
|
SCALEDEST (((GDisplay *)iwd->gdisp_ptr)),
|
||||||
|
SCALESRC (((GDisplay *)iwd->gdisp_ptr)));
|
||||||
|
|
||||||
if(!iwd || !iwd->preview)
|
gtk_label_set_text(GTK_LABEL(iwd->zoom_label),scale_str);
|
||||||
return FALSE;
|
}
|
||||||
|
|
||||||
printf("Now at [x,y] = [%d,%d] [w,h] = [%d,%d]\n",
|
static void
|
||||||
alloc->x,alloc->y,
|
update_zoom_adjustment(NavWinData *iwd)
|
||||||
alloc->width,alloc->height);
|
{
|
||||||
|
GtkAdjustment *adj = GTK_ADJUSTMENT(iwd->zoom_adjustment);
|
||||||
if(iwd->nav_preview_width == alloc->width &&
|
gdouble f = ((gdouble)SCALEDEST (((GDisplay *)iwd->gdisp_ptr)))/((gdouble)SCALESRC (((GDisplay *)iwd->gdisp_ptr)));
|
||||||
iwd->nav_preview_height == alloc->height)
|
gdouble val;
|
||||||
return FALSE;
|
|
||||||
|
if(f < 1.0)
|
||||||
iwd->nav_preview_width = alloc->width;
|
{
|
||||||
iwd->nav_preview_height = alloc->height;
|
val = -1/f;
|
||||||
set_size_data(iwd);
|
}
|
||||||
gtk_preview_size(GTK_PREVIEW(iwd->preview),alloc->width,alloc->height);
|
else
|
||||||
nav_window_update_preview(iwd,FALSE);
|
{
|
||||||
nav_window_draw_sqr(iwd,FALSE,
|
val = f;
|
||||||
iwd->dispx,iwd->dispy,
|
}
|
||||||
iwd->dispwidth,iwd->dispheight);
|
|
||||||
|
if(abs((gint)adj->value) != (gint)(val - 1) && iwd->block_adj_sig != TRUE)
|
||||||
#if 0
|
{
|
||||||
destroy_preview_widget(iwd);
|
adj->value = val;
|
||||||
create_preview_widget(iwd);
|
gtk_signal_emit_by_name (GTK_OBJECT (iwd->zoom_adjustment), "changed");
|
||||||
nav_window_update_preview(iwd,FALSE);
|
}
|
||||||
|
|
||||||
|
|
||||||
nav_window_update_preview(iwd,FALSE);
|
|
||||||
gtk_widget_show(iwd->preview);
|
|
||||||
gtk_widget_draw(iwd->preview, NULL);
|
|
||||||
gtk_widget_show(iwd->previewAlign);
|
|
||||||
nav_window_draw_sqr(iwd,FALSE,
|
|
||||||
iwd->dispx,iwd->dispy,
|
|
||||||
iwd->dispwidth,iwd->dispheight);
|
|
||||||
|
|
||||||
#endif /* 0 */
|
|
||||||
return FALSE;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif /* 0 */
|
|
||||||
static void
|
static void
|
||||||
move_to_point(NavWinData *iwd,
|
move_to_point(NavWinData *iwd,
|
||||||
gint tx,
|
gint tx,
|
||||||
@ -616,9 +622,9 @@ nav_window_preview_events (GtkWidget *widget,
|
|||||||
{
|
{
|
||||||
case GDK_EXPOSE:
|
case GDK_EXPOSE:
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case GDK_MAP:
|
case GDK_MAP:
|
||||||
nav_window_update_preview(iwd,FALSE);
|
nav_window_update_preview_blank(iwd);
|
||||||
|
gtk_timeout_add(PREVIEW_UPDATE_TIMEOUT,(GtkFunction)nav_preview_update_do_timer,(gpointer)iwd);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case GDK_BUTTON_PRESS:
|
case GDK_BUTTON_PRESS:
|
||||||
@ -798,7 +804,8 @@ nav_window_expose_events (GtkWidget *widget,
|
|||||||
static gint
|
static gint
|
||||||
nav_preview_update_do(NavWinData *iwd)
|
nav_preview_update_do(NavWinData *iwd)
|
||||||
{
|
{
|
||||||
nav_window_update_preview(iwd,FALSE);
|
nav_window_update_preview(iwd);
|
||||||
|
nav_window_disp_area(iwd,iwd->gdisp_ptr);
|
||||||
gtk_widget_draw(iwd->preview, NULL);
|
gtk_widget_draw(iwd->preview, NULL);
|
||||||
iwd->installedDirtyTimer = FALSE;
|
iwd->installedDirtyTimer = FALSE;
|
||||||
return FALSE;
|
return FALSE;
|
||||||
@ -826,16 +833,165 @@ nav_image_need_update (GtkObject *obj,
|
|||||||
iwd->installedDirtyTimer = TRUE;
|
iwd->installedDirtyTimer = TRUE;
|
||||||
|
|
||||||
/* Update preview at a less busy time */
|
/* Update preview at a less busy time */
|
||||||
nav_window_update_preview(iwd,TRUE);
|
nav_window_update_preview_blank(iwd);
|
||||||
gtk_widget_draw(iwd->preview, NULL);
|
gtk_widget_draw(iwd->preview, NULL);
|
||||||
gtk_timeout_add(2000,(GtkFunction)nav_preview_update_do_timer,(gpointer)iwd);
|
gtk_timeout_add(PREVIEW_UPDATE_TIMEOUT,(GtkFunction)nav_preview_update_do_timer,(gpointer)iwd);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
navwindow_zoomin (GtkWidget *widget,
|
||||||
|
gpointer data)
|
||||||
|
{
|
||||||
|
NavWinData *iwd;
|
||||||
|
GDisplay *gdisp;
|
||||||
|
|
||||||
|
iwd = (NavWinData *)data;
|
||||||
|
|
||||||
|
if(!iwd)
|
||||||
|
return;
|
||||||
|
|
||||||
|
gdisp = (GDisplay *) iwd->gdisp_ptr;
|
||||||
|
|
||||||
|
change_scale(gdisp,ZOOMIN);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
navwindow_zoomout (GtkWidget *widget,
|
||||||
|
gpointer data)
|
||||||
|
{
|
||||||
|
NavWinData *iwd;
|
||||||
|
GDisplay *gdisp;
|
||||||
|
|
||||||
|
iwd = (NavWinData *)data;
|
||||||
|
|
||||||
|
if(!iwd)
|
||||||
|
return;
|
||||||
|
|
||||||
|
gdisp = (GDisplay *) iwd->gdisp_ptr;
|
||||||
|
|
||||||
|
change_scale(gdisp,ZOOMOUT);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
zoom_adj_changed (GtkAdjustment *adj,
|
||||||
|
gpointer data)
|
||||||
|
{
|
||||||
|
NavWinData *iwd;
|
||||||
|
GDisplay *gdisp;
|
||||||
|
gint scalesrc, scaledest;
|
||||||
|
|
||||||
|
iwd = (NavWinData *)data;
|
||||||
|
|
||||||
|
if(!iwd)
|
||||||
|
return;
|
||||||
|
|
||||||
|
gdisp = (GDisplay *) iwd->gdisp_ptr;
|
||||||
|
|
||||||
|
if(adj->value < 0.0)
|
||||||
|
{
|
||||||
|
scalesrc = abs((gint)adj->value-1);
|
||||||
|
scaledest = 1;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
scaledest = abs((gint)adj->value+1);
|
||||||
|
scalesrc = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
iwd->block_adj_sig = TRUE;
|
||||||
|
change_scale(gdisp,(scaledest*100)+scalesrc);
|
||||||
|
iwd->block_adj_sig = FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
static GtkWidget *
|
||||||
|
nav_create_button_area(InfoDialog *info_win)
|
||||||
|
{
|
||||||
|
GtkWidget *hbox1;
|
||||||
|
GtkWidget *vbox1;
|
||||||
|
GtkWidget *button;
|
||||||
|
GtkWidget *hscale1;
|
||||||
|
GtkWidget *label1;
|
||||||
|
GtkObject *adjustment;
|
||||||
|
GdkPixmap *pixmap;
|
||||||
|
GtkWidget *pixmapwid;
|
||||||
|
GdkBitmap *mask;
|
||||||
|
GtkStyle *style;
|
||||||
|
NavWinData *iwd;
|
||||||
|
gchar scale_str[MAX_SCALE_BUF];
|
||||||
|
|
||||||
|
iwd = (NavWinData *)info_win->user_data;
|
||||||
|
|
||||||
|
hbox1 = gtk_hbox_new (FALSE, 0);
|
||||||
|
gtk_widget_show (hbox1);
|
||||||
|
|
||||||
|
style = gtk_widget_get_style (info_win->shell);
|
||||||
|
|
||||||
|
button = gtk_button_new ();
|
||||||
|
GTK_WIDGET_UNSET_FLAGS (button, GTK_RECEIVES_DEFAULT);
|
||||||
|
gtk_signal_connect (GTK_OBJECT (button), "clicked",
|
||||||
|
GTK_SIGNAL_FUNC (navwindow_zoomout), (gpointer) info_win->user_data);
|
||||||
|
gtk_box_pack_start (GTK_BOX (hbox1), button, FALSE, FALSE, 0);
|
||||||
|
|
||||||
|
pixmap = gdk_pixmap_create_from_xpm_d (info_win->shell->window, &mask,
|
||||||
|
&style->bg[GTK_STATE_NORMAL],
|
||||||
|
zoom_out_xpm);
|
||||||
|
pixmapwid = gtk_pixmap_new (pixmap, mask);
|
||||||
|
gtk_container_add (GTK_CONTAINER (button), pixmapwid);
|
||||||
|
gtk_widget_show (pixmapwid);
|
||||||
|
gtk_widget_show (button);
|
||||||
|
|
||||||
|
vbox1 = gtk_vbox_new (FALSE, 0);
|
||||||
|
gtk_widget_show (vbox1);
|
||||||
|
gtk_box_pack_start (GTK_BOX (vbox1), hbox1, TRUE, TRUE, 0);
|
||||||
|
|
||||||
|
/* user zoom ratio */
|
||||||
|
g_snprintf (scale_str, MAX_SCALE_BUF, "%d:%d",
|
||||||
|
SCALEDEST (((GDisplay *)iwd->gdisp_ptr)),
|
||||||
|
SCALESRC (((GDisplay *)iwd->gdisp_ptr)));
|
||||||
|
|
||||||
|
label1 = gtk_label_new (scale_str);
|
||||||
|
gtk_widget_show (label1);
|
||||||
|
iwd->zoom_label = label1;
|
||||||
|
gtk_box_pack_start (GTK_BOX (hbox1), label1, TRUE, TRUE, 0);
|
||||||
|
|
||||||
|
adjustment = gtk_adjustment_new (0.0, -15.0, 16.0, 1.0, 1.0, 1.0);
|
||||||
|
hscale1 = gtk_hscale_new (GTK_ADJUSTMENT (adjustment));
|
||||||
|
gtk_scale_set_digits (GTK_SCALE (hscale1), 0);
|
||||||
|
iwd->zoom_adjustment = adjustment;
|
||||||
|
iwd->zoom_scale = hscale1;
|
||||||
|
gtk_widget_show (hscale1);
|
||||||
|
|
||||||
|
gtk_signal_connect (GTK_OBJECT (adjustment), "value_changed",
|
||||||
|
GTK_SIGNAL_FUNC (zoom_adj_changed),
|
||||||
|
iwd);
|
||||||
|
|
||||||
|
gtk_box_pack_start (GTK_BOX (vbox1), hscale1, TRUE, TRUE, 0);
|
||||||
|
gtk_scale_set_draw_value (GTK_SCALE (hscale1), FALSE);
|
||||||
|
|
||||||
|
button = gtk_button_new ();
|
||||||
|
GTK_WIDGET_UNSET_FLAGS (button, GTK_RECEIVES_DEFAULT);
|
||||||
|
gtk_signal_connect (GTK_OBJECT (button), "clicked",
|
||||||
|
GTK_SIGNAL_FUNC (navwindow_zoomin), (gpointer) info_win->user_data);
|
||||||
|
gtk_box_pack_start (GTK_BOX (hbox1), button, FALSE, FALSE, 0);
|
||||||
|
|
||||||
|
pixmap = gdk_pixmap_create_from_xpm_d (info_win->shell->window, &mask,
|
||||||
|
&style->bg[GTK_STATE_NORMAL],
|
||||||
|
zoom_in_xpm);
|
||||||
|
pixmapwid = gtk_pixmap_new (pixmap, mask);
|
||||||
|
gtk_container_add (GTK_CONTAINER (button), pixmapwid);
|
||||||
|
gtk_widget_show (pixmapwid);
|
||||||
|
gtk_widget_show (button);
|
||||||
|
|
||||||
|
return vbox1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static GtkWidget *
|
static GtkWidget *
|
||||||
info_window_image_preview_new(InfoDialog *info_win)
|
info_window_image_preview_new(InfoDialog *info_win)
|
||||||
{
|
{
|
||||||
GtkWidget *hbox1;
|
GtkWidget *hbox1;
|
||||||
|
GtkWidget *vbox1;
|
||||||
GtkWidget *alignment;
|
GtkWidget *alignment;
|
||||||
|
GtkWidget *button_area;
|
||||||
|
|
||||||
NavWinData *iwd;
|
NavWinData *iwd;
|
||||||
|
|
||||||
@ -844,6 +1000,9 @@ info_window_image_preview_new(InfoDialog *info_win)
|
|||||||
hbox1 = gtk_hbox_new (FALSE, 0);
|
hbox1 = gtk_hbox_new (FALSE, 0);
|
||||||
gtk_widget_show (hbox1);
|
gtk_widget_show (hbox1);
|
||||||
|
|
||||||
|
vbox1 = gtk_vbox_new (FALSE, 0);
|
||||||
|
gtk_widget_show (vbox1);
|
||||||
|
|
||||||
gtk_widget_realize(info_win->shell);
|
gtk_widget_realize(info_win->shell);
|
||||||
|
|
||||||
/* need gc to draw the preview sqr with */
|
/* need gc to draw the preview sqr with */
|
||||||
@ -861,8 +1020,12 @@ info_window_image_preview_new(InfoDialog *info_win)
|
|||||||
create_preview_widget(iwd);
|
create_preview_widget(iwd);
|
||||||
|
|
||||||
gtk_box_pack_start (GTK_BOX (hbox1), alignment, TRUE, TRUE, 0);
|
gtk_box_pack_start (GTK_BOX (hbox1), alignment, TRUE, TRUE, 0);
|
||||||
|
gtk_box_pack_start (GTK_BOX (vbox1), hbox1, TRUE, TRUE, 0);
|
||||||
|
|
||||||
return hbox1;
|
button_area = nav_create_button_area(info_win);
|
||||||
|
gtk_box_pack_start (GTK_BOX (vbox1), button_area, TRUE, TRUE, 0);
|
||||||
|
|
||||||
|
return vbox1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static ActionAreaItem action_items[] =
|
static ActionAreaItem action_items[] =
|
||||||
@ -915,6 +1078,8 @@ nav_window_create (void *gdisp_ptr)
|
|||||||
iwd->block_window_marker = FALSE;
|
iwd->block_window_marker = FALSE;
|
||||||
iwd->nav_preview_width = NAV_PREVIEW_WIDTH;
|
iwd->nav_preview_width = NAV_PREVIEW_WIDTH;
|
||||||
iwd->nav_preview_height = NAV_PREVIEW_HEIGHT;
|
iwd->nav_preview_height = NAV_PREVIEW_HEIGHT;
|
||||||
|
iwd->block_adj_sig = FALSE;
|
||||||
|
|
||||||
|
|
||||||
/* Add preview */
|
/* Add preview */
|
||||||
container = info_window_image_preview_new(info_win);
|
container = info_window_image_preview_new(info_win);
|
||||||
@ -968,6 +1133,30 @@ nav_window_update_window_marker(InfoDialog *info_win)
|
|||||||
iwd->dispx,
|
iwd->dispx,
|
||||||
iwd->dispy,
|
iwd->dispy,
|
||||||
iwd->dispwidth,iwd->dispheight);
|
iwd->dispwidth,iwd->dispheight);
|
||||||
|
|
||||||
|
update_zoom_label(iwd);
|
||||||
|
|
||||||
|
update_zoom_adjustment(iwd);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
nav_dialog_popup (InfoDialog *idialog)
|
||||||
|
{
|
||||||
|
NavWinData *iwd;
|
||||||
|
|
||||||
|
if (!idialog)
|
||||||
|
return;
|
||||||
|
|
||||||
|
iwd = (NavWinData *)idialog->user_data;
|
||||||
|
iwd->showingPreview = TRUE;
|
||||||
|
|
||||||
|
if (! GTK_WIDGET_VISIBLE (idialog->shell))
|
||||||
|
{
|
||||||
|
gtk_widget_show (idialog->shell);
|
||||||
|
nav_window_update_preview_blank(iwd);
|
||||||
|
nav_window_update_window_marker(idialog);
|
||||||
|
gtk_timeout_add(PREVIEW_UPDATE_TIMEOUT,(GtkFunction)nav_preview_update_do_timer,(gpointer)iwd);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -34,6 +34,9 @@
|
|||||||
#include "libgimp/gimpintl.h"
|
#include "libgimp/gimpintl.h"
|
||||||
#include "libgimp/gimpunit.h"
|
#include "libgimp/gimpunit.h"
|
||||||
|
|
||||||
|
#include "pixmaps/zoom_in.xpm"
|
||||||
|
#include "pixmaps/zoom_out.xpm"
|
||||||
|
|
||||||
|
|
||||||
#define MAX_BUF 256
|
#define MAX_BUF 256
|
||||||
|
|
||||||
@ -47,6 +50,12 @@
|
|||||||
#define NAV_PREVIEW_HEIGHT 112
|
#define NAV_PREVIEW_HEIGHT 112
|
||||||
#define BORDER_PEN_WIDTH 3
|
#define BORDER_PEN_WIDTH 3
|
||||||
|
|
||||||
|
#define MAX_SCALE_BUF 20
|
||||||
|
|
||||||
|
|
||||||
|
/* Timeout before preview is updated */
|
||||||
|
#define PREVIEW_UPDATE_TIMEOUT 1100
|
||||||
|
|
||||||
typedef struct _NavWinData NavWinData;
|
typedef struct _NavWinData NavWinData;
|
||||||
struct _NavWinData
|
struct _NavWinData
|
||||||
{
|
{
|
||||||
@ -57,6 +66,9 @@ struct _NavWinData
|
|||||||
void *gdisp_ptr; /* I'm not happy 'bout this one */
|
void *gdisp_ptr; /* I'm not happy 'bout this one */
|
||||||
GtkWidget *previewBox;
|
GtkWidget *previewBox;
|
||||||
GtkWidget *previewAlign;
|
GtkWidget *previewAlign;
|
||||||
|
GtkWidget *zoom_label;
|
||||||
|
GtkWidget *zoom_scale;
|
||||||
|
GtkObject *zoom_adjustment;
|
||||||
gdouble ratio;
|
gdouble ratio;
|
||||||
GdkGC *gc;
|
GdkGC *gc;
|
||||||
gint dispx; /* x pos of top left corner of display area */
|
gint dispx; /* x pos of top left corner of display area */
|
||||||
@ -74,6 +86,7 @@ struct _NavWinData
|
|||||||
gboolean block_window_marker; /* Block redraws of window marker */
|
gboolean block_window_marker; /* Block redraws of window marker */
|
||||||
gint nav_preview_width;
|
gint nav_preview_width;
|
||||||
gint nav_preview_height;
|
gint nav_preview_height;
|
||||||
|
gboolean block_adj_sig;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
@ -95,7 +108,10 @@ nav_window_preview_resized (GtkWidget *,
|
|||||||
#endif /* 0 */
|
#endif /* 0 */
|
||||||
|
|
||||||
static void
|
static void
|
||||||
nav_window_update_preview (NavWinData *,gboolean);
|
nav_window_update_preview (NavWinData *);
|
||||||
|
|
||||||
|
static void
|
||||||
|
nav_window_update_preview_blank(NavWinData *iwd);
|
||||||
|
|
||||||
static void
|
static void
|
||||||
destroy_preview_widget (NavWinData *);
|
destroy_preview_widget (NavWinData *);
|
||||||
@ -117,6 +133,10 @@ nav_window_draw_sqr(NavWinData *,
|
|||||||
static void
|
static void
|
||||||
set_size_data(NavWinData *);
|
set_size_data(NavWinData *);
|
||||||
|
|
||||||
|
static gint
|
||||||
|
nav_preview_update_do_timer(NavWinData *);
|
||||||
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
nav_window_destroy_callback (GtkWidget *widget,
|
nav_window_destroy_callback (GtkWidget *widget,
|
||||||
gpointer client_data)
|
gpointer client_data)
|
||||||
@ -137,7 +157,7 @@ nav_window_close_callback (GtkWidget *widget,
|
|||||||
info_win = (InfoDialog *)client_data;
|
info_win = (InfoDialog *)client_data;
|
||||||
iwd = (NavWinData *)info_win->user_data;
|
iwd = (NavWinData *)info_win->user_data;
|
||||||
|
|
||||||
/* iwd->showingPreview = FALSE; ALT. Needs to be sorted out */
|
iwd->showingPreview = FALSE;
|
||||||
info_dialog_popdown ((InfoDialog *) client_data);
|
info_dialog_popdown ((InfoDialog *) client_data);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -177,13 +197,17 @@ nav_window_disp_area(NavWinData *iwd,GDisplay *gdisp)
|
|||||||
iwd->imageheight = newheight;
|
iwd->imageheight = newheight;
|
||||||
|
|
||||||
/* Normalise */
|
/* Normalise */
|
||||||
|
iwd->dispwidth = MAX(iwd->dispwidth, 2);
|
||||||
|
iwd->dispheight = MAX(iwd->dispheight, 2);
|
||||||
|
|
||||||
iwd->dispwidth = MIN(iwd->dispwidth, iwd->pwidth/*-BORDER_PEN_WIDTH*/);
|
iwd->dispwidth = MIN(iwd->dispwidth, iwd->pwidth/*-BORDER_PEN_WIDTH*/);
|
||||||
iwd->dispheight = MIN(iwd->dispheight, iwd->pheight/*-BORDER_PEN_WIDTH*/);
|
iwd->dispheight = MIN(iwd->dispheight, iwd->pheight/*-BORDER_PEN_WIDTH*/);
|
||||||
|
|
||||||
if(need_update == TRUE)
|
if(need_update == TRUE)
|
||||||
{
|
{
|
||||||
gtk_widget_hide(iwd->previewAlign);
|
gtk_widget_hide(iwd->previewAlign);
|
||||||
nav_window_update_preview(iwd,FALSE);
|
/* ALT nav_window_update_preview(iwd);*/
|
||||||
|
nav_window_update_preview_blank(iwd);
|
||||||
gtk_widget_show(iwd->preview);
|
gtk_widget_show(iwd->preview);
|
||||||
gtk_widget_draw(iwd->preview, NULL);
|
gtk_widget_draw(iwd->preview, NULL);
|
||||||
gtk_widget_show(iwd->previewAlign);
|
gtk_widget_show(iwd->previewAlign);
|
||||||
@ -191,6 +215,7 @@ nav_window_disp_area(NavWinData *iwd,GDisplay *gdisp)
|
|||||||
iwd->dispx,iwd->dispy,
|
iwd->dispx,iwd->dispy,
|
||||||
iwd->dispwidth,iwd->dispheight);
|
iwd->dispwidth,iwd->dispheight);
|
||||||
gtk_window_set_focus(GTK_WINDOW (iwd->info_win->shell),iwd->preview);
|
gtk_window_set_focus(GTK_WINDOW (iwd->info_win->shell),iwd->preview);
|
||||||
|
gtk_timeout_add(PREVIEW_UPDATE_TIMEOUT,(GtkFunction)nav_preview_update_do_timer,(gpointer)iwd);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -328,30 +353,6 @@ create_preview_widget(NavWinData *iwd)
|
|||||||
GTK_WIDGET_SET_FLAGS (image, GTK_CAN_FOCUS);
|
GTK_WIDGET_SET_FLAGS (image, GTK_CAN_FOCUS);
|
||||||
}
|
}
|
||||||
|
|
||||||
#if 0
|
|
||||||
static void
|
|
||||||
info_window_page_switch (GtkWidget *widget,
|
|
||||||
GtkNotebookPage *page,
|
|
||||||
gint page_num)
|
|
||||||
{
|
|
||||||
InfoDialog *info_win;
|
|
||||||
InfoWinData *iwd;
|
|
||||||
|
|
||||||
info_win = (InfoDialog *)gtk_object_get_user_data(GTK_OBJECT (widget));
|
|
||||||
iwd = (InfoWinData *)info_win->user_data;
|
|
||||||
|
|
||||||
/* Only deal with the second page */
|
|
||||||
if(page_num != 1)
|
|
||||||
{
|
|
||||||
iwd->showingPreview = FALSE;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
iwd->showingPreview = TRUE;
|
|
||||||
|
|
||||||
}
|
|
||||||
#endif /* 0 */
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
update_real_view(NavWinData *iwd,gint tx,gint ty)
|
update_real_view(NavWinData *iwd,gint tx,gint ty)
|
||||||
{
|
{
|
||||||
@ -387,10 +388,7 @@ update_real_view(NavWinData *iwd,gint tx,gint ty)
|
|||||||
iwd->block_window_marker = FALSE;
|
iwd->block_window_marker = FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void nav_window_update_preview(NavWinData *iwd)
|
||||||
nav_window_update_preview
|
|
||||||
(NavWinData *iwd,
|
|
||||||
gboolean invalidated)
|
|
||||||
{
|
{
|
||||||
GDisplay *gdisp;
|
GDisplay *gdisp;
|
||||||
TempBuf * preview_buf;
|
TempBuf * preview_buf;
|
||||||
@ -399,6 +397,8 @@ nav_window_update_preview
|
|||||||
gint pwidth, pheight;
|
gint pwidth, pheight;
|
||||||
GimpImage *gimage;
|
GimpImage *gimage;
|
||||||
gdouble r,g,b,a,chk;
|
gdouble r,g,b,a,chk;
|
||||||
|
gint xoff = 0;
|
||||||
|
gint yoff = 0;
|
||||||
|
|
||||||
gimp_add_busy_cursors();
|
gimp_add_busy_cursors();
|
||||||
|
|
||||||
@ -411,79 +411,98 @@ nav_window_update_preview
|
|||||||
pwidth = iwd->pwidth;
|
pwidth = iwd->pwidth;
|
||||||
pheight = iwd->pheight;
|
pheight = iwd->pheight;
|
||||||
|
|
||||||
|
|
||||||
preview_buf = gimp_image_construct_composite_preview (gimage,
|
preview_buf = gimp_image_construct_composite_preview (gimage,
|
||||||
MAX (pwidth, 2),
|
MAX (pwidth, 2),
|
||||||
MAX (pheight, 2));
|
MAX (pheight, 2));
|
||||||
|
|
||||||
|
|
||||||
buf = g_new (gchar, iwd->nav_preview_width * 3);
|
buf = g_new (gchar, iwd->nav_preview_width * 3);
|
||||||
src = (gchar *) temp_buf_data (preview_buf);
|
src = (gchar *) temp_buf_data (preview_buf);
|
||||||
has_alpha = (preview_buf->bytes == 2 || preview_buf->bytes == 4);
|
has_alpha = (preview_buf->bytes == 2 || preview_buf->bytes == 4);
|
||||||
|
|
||||||
for (y = 0; y <preview_buf->height ; y++)
|
for (y = 0; y <pheight ; y++)
|
||||||
{
|
{
|
||||||
dest = buf;
|
dest = buf;
|
||||||
switch (preview_buf->bytes)
|
switch (preview_buf->bytes)
|
||||||
{
|
{
|
||||||
case 4:
|
case 4:
|
||||||
for (x = 0; x < preview_buf->width; x++)
|
for (x = 0; x < pwidth; x++)
|
||||||
{
|
{
|
||||||
r = ((gdouble)(*(src++)))/255.0;
|
r = ((gdouble)(*(src++)))/255.0;
|
||||||
g = ((gdouble)(*(src++)))/255.0;
|
g = ((gdouble)(*(src++)))/255.0;
|
||||||
b = ((gdouble)(*(src++)))/255.0;
|
b = ((gdouble)(*(src++)))/255.0;
|
||||||
a = ((gdouble)(*(src++)))/255.0;
|
a = ((gdouble)(*(src++)))/255.0;
|
||||||
chk = ((gdouble)((( (x^y) & 4 ) << 4) | 128))/255.0;
|
chk = ((gdouble)((( (x^y) & 4 ) << 4) | 128))/255.0;
|
||||||
if(!invalidated)
|
|
||||||
{
|
|
||||||
*(dest++) = (guchar)((chk + (r - chk)*a)*255.0);
|
*(dest++) = (guchar)((chk + (r - chk)*a)*255.0);
|
||||||
*(dest++) = (guchar)((chk + (g - chk)*a)*255.0);
|
*(dest++) = (guchar)((chk + (g - chk)*a)*255.0);
|
||||||
*(dest++) = (guchar)((chk + (b - chk)*a)*255.0);
|
*(dest++) = (guchar)((chk + (b - chk)*a)*255.0);
|
||||||
}
|
}
|
||||||
else
|
|
||||||
{
|
|
||||||
chk *= 128.0;
|
|
||||||
*(dest++) = (guchar)chk;
|
|
||||||
*(dest++) = (guchar)chk;
|
|
||||||
*(dest++) = (guchar)chk;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
case 2:
|
case 2:
|
||||||
for (x = 0; x < preview_buf->width; x++)
|
for (x = 0; x < pwidth; x++)
|
||||||
{
|
{
|
||||||
r = ((gdouble)(*(src++)))/255.0;
|
r = ((gdouble)(*(src++)))/255.0;
|
||||||
a = ((gdouble)(*(src++)))/255.0;
|
a = ((gdouble)(*(src++)))/255.0;
|
||||||
chk = ((gdouble)((( (x^y) & 4 ) << 4) | 128))/255.0;
|
chk = ((gdouble)((( (x^y) & 4 ) << 4) | 128))/255.0;
|
||||||
if(!invalidated)
|
|
||||||
{
|
|
||||||
*(dest++) = (guchar)((chk + (r - chk)*a)*255.0);
|
*(dest++) = (guchar)((chk + (r - chk)*a)*255.0);
|
||||||
*(dest++) = (guchar)((chk + (r - chk)*a)*255.0);
|
*(dest++) = (guchar)((chk + (r - chk)*a)*255.0);
|
||||||
*(dest++) = (guchar)((chk + (r - chk)*a)*255.0);
|
*(dest++) = (guchar)((chk + (r - chk)*a)*255.0);
|
||||||
}
|
}
|
||||||
else
|
|
||||||
{
|
|
||||||
chk *= 255.0;
|
|
||||||
*(dest++) = (guchar)chk;
|
|
||||||
*(dest++) = (guchar)chk;
|
|
||||||
*(dest++) = (guchar)chk;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
g_warning("UNKNOWN TempBuf bpp in nav_window_update_preview()");
|
g_warning("UNKNOWN TempBuf bpp in nav_window_update_preview()");
|
||||||
}
|
}
|
||||||
|
|
||||||
gtk_preview_draw_row (GTK_PREVIEW (iwd->preview),
|
gtk_preview_draw_row (GTK_PREVIEW (iwd->preview),
|
||||||
(guchar *)buf, 0, y, preview_buf->width);
|
(guchar *)buf, xoff, yoff+y, preview_buf->width);
|
||||||
}
|
}
|
||||||
|
|
||||||
g_free (buf);
|
g_free (buf);
|
||||||
temp_buf_free (preview_buf);
|
temp_buf_free (preview_buf);
|
||||||
|
|
||||||
nav_window_disp_area(iwd,gdisp);
|
/* nav_window_disp_area(iwd,gdisp); */
|
||||||
|
|
||||||
gimp_remove_busy_cursors (NULL);
|
gimp_remove_busy_cursors (NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void nav_window_update_preview_blank(NavWinData *iwd)
|
||||||
|
{
|
||||||
|
GDisplay *gdisp;
|
||||||
|
guchar *buf, *dest;
|
||||||
|
gint x,y;
|
||||||
|
GimpImage *gimage;
|
||||||
|
gdouble chk;
|
||||||
|
|
||||||
|
gdisp = (GDisplay *) iwd->gdisp_ptr;
|
||||||
|
|
||||||
|
/* Calculate preview size */
|
||||||
|
gimage = ((GDisplay *)(iwd->gdisp_ptr))->gimage;
|
||||||
|
|
||||||
|
buf = g_new (gchar, iwd->pwidth * 3);
|
||||||
|
|
||||||
|
for (y = 0; y < iwd->pheight ; y++)
|
||||||
|
{
|
||||||
|
dest = buf;
|
||||||
|
for (x = 0; x < iwd->pwidth; x++)
|
||||||
|
{
|
||||||
|
chk = ((gdouble)((( (x^y) & 4 ) << 4) | 128))/255.0;
|
||||||
|
chk *= 128.0;
|
||||||
|
*(dest++) = (guchar)chk;
|
||||||
|
*(dest++) = (guchar)chk;
|
||||||
|
*(dest++) = (guchar)chk;
|
||||||
|
}
|
||||||
|
|
||||||
|
gtk_preview_draw_row (GTK_PREVIEW (iwd->preview),
|
||||||
|
(guchar *)buf, 0, y, iwd->pwidth);
|
||||||
|
}
|
||||||
|
|
||||||
|
g_free (buf);
|
||||||
|
|
||||||
|
gdk_flush();
|
||||||
|
/* nav_window_disp_area(iwd,gdisp);*/
|
||||||
|
}
|
||||||
|
|
||||||
static gint
|
static gint
|
||||||
inside_preview_square(NavWinData *iwd, gint x, gint y)
|
inside_preview_square(NavWinData *iwd, gint x, gint y)
|
||||||
{
|
{
|
||||||
@ -496,55 +515,42 @@ inside_preview_square(NavWinData *iwd, gint x, gint y)
|
|||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if 0
|
static void
|
||||||
static gint
|
update_zoom_label(NavWinData *iwd)
|
||||||
nav_window_preview_resized (GtkWidget *widget,
|
|
||||||
GtkAllocation *alloc,
|
|
||||||
gpointer *data)
|
|
||||||
{
|
{
|
||||||
NavWinData *iwd;
|
gchar scale_str[MAX_SCALE_BUF];
|
||||||
|
|
||||||
iwd = (NavWinData *)data;
|
/* Update the zoom scale string */
|
||||||
|
g_snprintf (scale_str, MAX_SCALE_BUF, "%d:%d",
|
||||||
|
SCALEDEST (((GDisplay *)iwd->gdisp_ptr)),
|
||||||
|
SCALESRC (((GDisplay *)iwd->gdisp_ptr)));
|
||||||
|
|
||||||
if(!iwd || !iwd->preview)
|
gtk_label_set_text(GTK_LABEL(iwd->zoom_label),scale_str);
|
||||||
return FALSE;
|
}
|
||||||
|
|
||||||
printf("Now at [x,y] = [%d,%d] [w,h] = [%d,%d]\n",
|
static void
|
||||||
alloc->x,alloc->y,
|
update_zoom_adjustment(NavWinData *iwd)
|
||||||
alloc->width,alloc->height);
|
{
|
||||||
|
GtkAdjustment *adj = GTK_ADJUSTMENT(iwd->zoom_adjustment);
|
||||||
if(iwd->nav_preview_width == alloc->width &&
|
gdouble f = ((gdouble)SCALEDEST (((GDisplay *)iwd->gdisp_ptr)))/((gdouble)SCALESRC (((GDisplay *)iwd->gdisp_ptr)));
|
||||||
iwd->nav_preview_height == alloc->height)
|
gdouble val;
|
||||||
return FALSE;
|
|
||||||
|
if(f < 1.0)
|
||||||
iwd->nav_preview_width = alloc->width;
|
{
|
||||||
iwd->nav_preview_height = alloc->height;
|
val = -1/f;
|
||||||
set_size_data(iwd);
|
}
|
||||||
gtk_preview_size(GTK_PREVIEW(iwd->preview),alloc->width,alloc->height);
|
else
|
||||||
nav_window_update_preview(iwd,FALSE);
|
{
|
||||||
nav_window_draw_sqr(iwd,FALSE,
|
val = f;
|
||||||
iwd->dispx,iwd->dispy,
|
}
|
||||||
iwd->dispwidth,iwd->dispheight);
|
|
||||||
|
if(abs((gint)adj->value) != (gint)(val - 1) && iwd->block_adj_sig != TRUE)
|
||||||
#if 0
|
{
|
||||||
destroy_preview_widget(iwd);
|
adj->value = val;
|
||||||
create_preview_widget(iwd);
|
gtk_signal_emit_by_name (GTK_OBJECT (iwd->zoom_adjustment), "changed");
|
||||||
nav_window_update_preview(iwd,FALSE);
|
}
|
||||||
|
|
||||||
|
|
||||||
nav_window_update_preview(iwd,FALSE);
|
|
||||||
gtk_widget_show(iwd->preview);
|
|
||||||
gtk_widget_draw(iwd->preview, NULL);
|
|
||||||
gtk_widget_show(iwd->previewAlign);
|
|
||||||
nav_window_draw_sqr(iwd,FALSE,
|
|
||||||
iwd->dispx,iwd->dispy,
|
|
||||||
iwd->dispwidth,iwd->dispheight);
|
|
||||||
|
|
||||||
#endif /* 0 */
|
|
||||||
return FALSE;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif /* 0 */
|
|
||||||
static void
|
static void
|
||||||
move_to_point(NavWinData *iwd,
|
move_to_point(NavWinData *iwd,
|
||||||
gint tx,
|
gint tx,
|
||||||
@ -616,9 +622,9 @@ nav_window_preview_events (GtkWidget *widget,
|
|||||||
{
|
{
|
||||||
case GDK_EXPOSE:
|
case GDK_EXPOSE:
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case GDK_MAP:
|
case GDK_MAP:
|
||||||
nav_window_update_preview(iwd,FALSE);
|
nav_window_update_preview_blank(iwd);
|
||||||
|
gtk_timeout_add(PREVIEW_UPDATE_TIMEOUT,(GtkFunction)nav_preview_update_do_timer,(gpointer)iwd);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case GDK_BUTTON_PRESS:
|
case GDK_BUTTON_PRESS:
|
||||||
@ -798,7 +804,8 @@ nav_window_expose_events (GtkWidget *widget,
|
|||||||
static gint
|
static gint
|
||||||
nav_preview_update_do(NavWinData *iwd)
|
nav_preview_update_do(NavWinData *iwd)
|
||||||
{
|
{
|
||||||
nav_window_update_preview(iwd,FALSE);
|
nav_window_update_preview(iwd);
|
||||||
|
nav_window_disp_area(iwd,iwd->gdisp_ptr);
|
||||||
gtk_widget_draw(iwd->preview, NULL);
|
gtk_widget_draw(iwd->preview, NULL);
|
||||||
iwd->installedDirtyTimer = FALSE;
|
iwd->installedDirtyTimer = FALSE;
|
||||||
return FALSE;
|
return FALSE;
|
||||||
@ -826,16 +833,165 @@ nav_image_need_update (GtkObject *obj,
|
|||||||
iwd->installedDirtyTimer = TRUE;
|
iwd->installedDirtyTimer = TRUE;
|
||||||
|
|
||||||
/* Update preview at a less busy time */
|
/* Update preview at a less busy time */
|
||||||
nav_window_update_preview(iwd,TRUE);
|
nav_window_update_preview_blank(iwd);
|
||||||
gtk_widget_draw(iwd->preview, NULL);
|
gtk_widget_draw(iwd->preview, NULL);
|
||||||
gtk_timeout_add(2000,(GtkFunction)nav_preview_update_do_timer,(gpointer)iwd);
|
gtk_timeout_add(PREVIEW_UPDATE_TIMEOUT,(GtkFunction)nav_preview_update_do_timer,(gpointer)iwd);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
navwindow_zoomin (GtkWidget *widget,
|
||||||
|
gpointer data)
|
||||||
|
{
|
||||||
|
NavWinData *iwd;
|
||||||
|
GDisplay *gdisp;
|
||||||
|
|
||||||
|
iwd = (NavWinData *)data;
|
||||||
|
|
||||||
|
if(!iwd)
|
||||||
|
return;
|
||||||
|
|
||||||
|
gdisp = (GDisplay *) iwd->gdisp_ptr;
|
||||||
|
|
||||||
|
change_scale(gdisp,ZOOMIN);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
navwindow_zoomout (GtkWidget *widget,
|
||||||
|
gpointer data)
|
||||||
|
{
|
||||||
|
NavWinData *iwd;
|
||||||
|
GDisplay *gdisp;
|
||||||
|
|
||||||
|
iwd = (NavWinData *)data;
|
||||||
|
|
||||||
|
if(!iwd)
|
||||||
|
return;
|
||||||
|
|
||||||
|
gdisp = (GDisplay *) iwd->gdisp_ptr;
|
||||||
|
|
||||||
|
change_scale(gdisp,ZOOMOUT);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
zoom_adj_changed (GtkAdjustment *adj,
|
||||||
|
gpointer data)
|
||||||
|
{
|
||||||
|
NavWinData *iwd;
|
||||||
|
GDisplay *gdisp;
|
||||||
|
gint scalesrc, scaledest;
|
||||||
|
|
||||||
|
iwd = (NavWinData *)data;
|
||||||
|
|
||||||
|
if(!iwd)
|
||||||
|
return;
|
||||||
|
|
||||||
|
gdisp = (GDisplay *) iwd->gdisp_ptr;
|
||||||
|
|
||||||
|
if(adj->value < 0.0)
|
||||||
|
{
|
||||||
|
scalesrc = abs((gint)adj->value-1);
|
||||||
|
scaledest = 1;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
scaledest = abs((gint)adj->value+1);
|
||||||
|
scalesrc = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
iwd->block_adj_sig = TRUE;
|
||||||
|
change_scale(gdisp,(scaledest*100)+scalesrc);
|
||||||
|
iwd->block_adj_sig = FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
static GtkWidget *
|
||||||
|
nav_create_button_area(InfoDialog *info_win)
|
||||||
|
{
|
||||||
|
GtkWidget *hbox1;
|
||||||
|
GtkWidget *vbox1;
|
||||||
|
GtkWidget *button;
|
||||||
|
GtkWidget *hscale1;
|
||||||
|
GtkWidget *label1;
|
||||||
|
GtkObject *adjustment;
|
||||||
|
GdkPixmap *pixmap;
|
||||||
|
GtkWidget *pixmapwid;
|
||||||
|
GdkBitmap *mask;
|
||||||
|
GtkStyle *style;
|
||||||
|
NavWinData *iwd;
|
||||||
|
gchar scale_str[MAX_SCALE_BUF];
|
||||||
|
|
||||||
|
iwd = (NavWinData *)info_win->user_data;
|
||||||
|
|
||||||
|
hbox1 = gtk_hbox_new (FALSE, 0);
|
||||||
|
gtk_widget_show (hbox1);
|
||||||
|
|
||||||
|
style = gtk_widget_get_style (info_win->shell);
|
||||||
|
|
||||||
|
button = gtk_button_new ();
|
||||||
|
GTK_WIDGET_UNSET_FLAGS (button, GTK_RECEIVES_DEFAULT);
|
||||||
|
gtk_signal_connect (GTK_OBJECT (button), "clicked",
|
||||||
|
GTK_SIGNAL_FUNC (navwindow_zoomout), (gpointer) info_win->user_data);
|
||||||
|
gtk_box_pack_start (GTK_BOX (hbox1), button, FALSE, FALSE, 0);
|
||||||
|
|
||||||
|
pixmap = gdk_pixmap_create_from_xpm_d (info_win->shell->window, &mask,
|
||||||
|
&style->bg[GTK_STATE_NORMAL],
|
||||||
|
zoom_out_xpm);
|
||||||
|
pixmapwid = gtk_pixmap_new (pixmap, mask);
|
||||||
|
gtk_container_add (GTK_CONTAINER (button), pixmapwid);
|
||||||
|
gtk_widget_show (pixmapwid);
|
||||||
|
gtk_widget_show (button);
|
||||||
|
|
||||||
|
vbox1 = gtk_vbox_new (FALSE, 0);
|
||||||
|
gtk_widget_show (vbox1);
|
||||||
|
gtk_box_pack_start (GTK_BOX (vbox1), hbox1, TRUE, TRUE, 0);
|
||||||
|
|
||||||
|
/* user zoom ratio */
|
||||||
|
g_snprintf (scale_str, MAX_SCALE_BUF, "%d:%d",
|
||||||
|
SCALEDEST (((GDisplay *)iwd->gdisp_ptr)),
|
||||||
|
SCALESRC (((GDisplay *)iwd->gdisp_ptr)));
|
||||||
|
|
||||||
|
label1 = gtk_label_new (scale_str);
|
||||||
|
gtk_widget_show (label1);
|
||||||
|
iwd->zoom_label = label1;
|
||||||
|
gtk_box_pack_start (GTK_BOX (hbox1), label1, TRUE, TRUE, 0);
|
||||||
|
|
||||||
|
adjustment = gtk_adjustment_new (0.0, -15.0, 16.0, 1.0, 1.0, 1.0);
|
||||||
|
hscale1 = gtk_hscale_new (GTK_ADJUSTMENT (adjustment));
|
||||||
|
gtk_scale_set_digits (GTK_SCALE (hscale1), 0);
|
||||||
|
iwd->zoom_adjustment = adjustment;
|
||||||
|
iwd->zoom_scale = hscale1;
|
||||||
|
gtk_widget_show (hscale1);
|
||||||
|
|
||||||
|
gtk_signal_connect (GTK_OBJECT (adjustment), "value_changed",
|
||||||
|
GTK_SIGNAL_FUNC (zoom_adj_changed),
|
||||||
|
iwd);
|
||||||
|
|
||||||
|
gtk_box_pack_start (GTK_BOX (vbox1), hscale1, TRUE, TRUE, 0);
|
||||||
|
gtk_scale_set_draw_value (GTK_SCALE (hscale1), FALSE);
|
||||||
|
|
||||||
|
button = gtk_button_new ();
|
||||||
|
GTK_WIDGET_UNSET_FLAGS (button, GTK_RECEIVES_DEFAULT);
|
||||||
|
gtk_signal_connect (GTK_OBJECT (button), "clicked",
|
||||||
|
GTK_SIGNAL_FUNC (navwindow_zoomin), (gpointer) info_win->user_data);
|
||||||
|
gtk_box_pack_start (GTK_BOX (hbox1), button, FALSE, FALSE, 0);
|
||||||
|
|
||||||
|
pixmap = gdk_pixmap_create_from_xpm_d (info_win->shell->window, &mask,
|
||||||
|
&style->bg[GTK_STATE_NORMAL],
|
||||||
|
zoom_in_xpm);
|
||||||
|
pixmapwid = gtk_pixmap_new (pixmap, mask);
|
||||||
|
gtk_container_add (GTK_CONTAINER (button), pixmapwid);
|
||||||
|
gtk_widget_show (pixmapwid);
|
||||||
|
gtk_widget_show (button);
|
||||||
|
|
||||||
|
return vbox1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static GtkWidget *
|
static GtkWidget *
|
||||||
info_window_image_preview_new(InfoDialog *info_win)
|
info_window_image_preview_new(InfoDialog *info_win)
|
||||||
{
|
{
|
||||||
GtkWidget *hbox1;
|
GtkWidget *hbox1;
|
||||||
|
GtkWidget *vbox1;
|
||||||
GtkWidget *alignment;
|
GtkWidget *alignment;
|
||||||
|
GtkWidget *button_area;
|
||||||
|
|
||||||
NavWinData *iwd;
|
NavWinData *iwd;
|
||||||
|
|
||||||
@ -844,6 +1000,9 @@ info_window_image_preview_new(InfoDialog *info_win)
|
|||||||
hbox1 = gtk_hbox_new (FALSE, 0);
|
hbox1 = gtk_hbox_new (FALSE, 0);
|
||||||
gtk_widget_show (hbox1);
|
gtk_widget_show (hbox1);
|
||||||
|
|
||||||
|
vbox1 = gtk_vbox_new (FALSE, 0);
|
||||||
|
gtk_widget_show (vbox1);
|
||||||
|
|
||||||
gtk_widget_realize(info_win->shell);
|
gtk_widget_realize(info_win->shell);
|
||||||
|
|
||||||
/* need gc to draw the preview sqr with */
|
/* need gc to draw the preview sqr with */
|
||||||
@ -861,8 +1020,12 @@ info_window_image_preview_new(InfoDialog *info_win)
|
|||||||
create_preview_widget(iwd);
|
create_preview_widget(iwd);
|
||||||
|
|
||||||
gtk_box_pack_start (GTK_BOX (hbox1), alignment, TRUE, TRUE, 0);
|
gtk_box_pack_start (GTK_BOX (hbox1), alignment, TRUE, TRUE, 0);
|
||||||
|
gtk_box_pack_start (GTK_BOX (vbox1), hbox1, TRUE, TRUE, 0);
|
||||||
|
|
||||||
return hbox1;
|
button_area = nav_create_button_area(info_win);
|
||||||
|
gtk_box_pack_start (GTK_BOX (vbox1), button_area, TRUE, TRUE, 0);
|
||||||
|
|
||||||
|
return vbox1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static ActionAreaItem action_items[] =
|
static ActionAreaItem action_items[] =
|
||||||
@ -915,6 +1078,8 @@ nav_window_create (void *gdisp_ptr)
|
|||||||
iwd->block_window_marker = FALSE;
|
iwd->block_window_marker = FALSE;
|
||||||
iwd->nav_preview_width = NAV_PREVIEW_WIDTH;
|
iwd->nav_preview_width = NAV_PREVIEW_WIDTH;
|
||||||
iwd->nav_preview_height = NAV_PREVIEW_HEIGHT;
|
iwd->nav_preview_height = NAV_PREVIEW_HEIGHT;
|
||||||
|
iwd->block_adj_sig = FALSE;
|
||||||
|
|
||||||
|
|
||||||
/* Add preview */
|
/* Add preview */
|
||||||
container = info_window_image_preview_new(info_win);
|
container = info_window_image_preview_new(info_win);
|
||||||
@ -968,6 +1133,30 @@ nav_window_update_window_marker(InfoDialog *info_win)
|
|||||||
iwd->dispx,
|
iwd->dispx,
|
||||||
iwd->dispy,
|
iwd->dispy,
|
||||||
iwd->dispwidth,iwd->dispheight);
|
iwd->dispwidth,iwd->dispheight);
|
||||||
|
|
||||||
|
update_zoom_label(iwd);
|
||||||
|
|
||||||
|
update_zoom_adjustment(iwd);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
nav_dialog_popup (InfoDialog *idialog)
|
||||||
|
{
|
||||||
|
NavWinData *iwd;
|
||||||
|
|
||||||
|
if (!idialog)
|
||||||
|
return;
|
||||||
|
|
||||||
|
iwd = (NavWinData *)idialog->user_data;
|
||||||
|
iwd->showingPreview = TRUE;
|
||||||
|
|
||||||
|
if (! GTK_WIDGET_VISIBLE (idialog->shell))
|
||||||
|
{
|
||||||
|
gtk_widget_show (idialog->shell);
|
||||||
|
nav_window_update_preview_blank(iwd);
|
||||||
|
nav_window_update_window_marker(idialog);
|
||||||
|
gtk_timeout_add(PREVIEW_UPDATE_TIMEOUT,(GtkFunction)nav_preview_update_do_timer,(gpointer)iwd);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -477,8 +477,8 @@ channel_toggle_visibility (Channel *channel)
|
|||||||
return GIMP_DRAWABLE (channel)->visible;
|
return GIMP_DRAWABLE (channel)->visible;
|
||||||
}
|
}
|
||||||
|
|
||||||
TempBuf *
|
static TempBuf *
|
||||||
channel_preview (Channel *channel,
|
channel_preview_private (Channel *channel,
|
||||||
gint width,
|
gint width,
|
||||||
gint height)
|
gint height)
|
||||||
{
|
{
|
||||||
@ -530,6 +530,31 @@ channel_preview (Channel *channel,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TempBuf *
|
||||||
|
channel_preview (Channel *channel,
|
||||||
|
gint width,
|
||||||
|
gint height)
|
||||||
|
{
|
||||||
|
/* Ok prime the cache with a large preview if the cache is invalid */
|
||||||
|
if(!GIMP_DRAWABLE(channel)->preview_valid &&
|
||||||
|
width <= PREVIEW_CACHE_PRIME_WIDTH &&
|
||||||
|
height <= PREVIEW_CACHE_PRIME_HEIGHT)
|
||||||
|
{
|
||||||
|
TempBuf * tb = channel_preview_private(channel,
|
||||||
|
PREVIEW_CACHE_PRIME_WIDTH,
|
||||||
|
PREVIEW_CACHE_PRIME_HEIGHT);
|
||||||
|
|
||||||
|
/* Save the 2nd call */
|
||||||
|
if(width == PREVIEW_CACHE_PRIME_WIDTH &&
|
||||||
|
height == PREVIEW_CACHE_PRIME_HEIGHT)
|
||||||
|
return tb;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Second call - should NOT visit the tile cache...*/
|
||||||
|
return channel_preview_private(channel,width,height);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
channel_invalidate_previews (GimpImage* gimage)
|
channel_invalidate_previews (GimpImage* gimage)
|
||||||
{
|
{
|
||||||
|
@ -1089,8 +1089,8 @@ layer_linked (Layer *layer)
|
|||||||
return layer->linked;
|
return layer->linked;
|
||||||
}
|
}
|
||||||
|
|
||||||
TempBuf *
|
static TempBuf *
|
||||||
layer_preview (Layer *layer,
|
layer_preview_private (Layer *layer,
|
||||||
gint w,
|
gint w,
|
||||||
gint h)
|
gint h)
|
||||||
{
|
{
|
||||||
@ -1161,7 +1161,31 @@ layer_preview (Layer *layer,
|
|||||||
}
|
}
|
||||||
|
|
||||||
TempBuf *
|
TempBuf *
|
||||||
layer_mask_preview (Layer *layer,
|
layer_preview (Layer *layer,
|
||||||
|
gint w,
|
||||||
|
gint h)
|
||||||
|
{
|
||||||
|
/* Ok prime the cache with a large preview if the cache is invalid */
|
||||||
|
if(!GIMP_DRAWABLE(layer)->preview_valid &&
|
||||||
|
w <= PREVIEW_CACHE_PRIME_WIDTH &&
|
||||||
|
h <= PREVIEW_CACHE_PRIME_HEIGHT)
|
||||||
|
{
|
||||||
|
TempBuf * tb = layer_preview_private(layer,
|
||||||
|
PREVIEW_CACHE_PRIME_WIDTH,
|
||||||
|
PREVIEW_CACHE_PRIME_HEIGHT);
|
||||||
|
|
||||||
|
/* Save the 2nd call */
|
||||||
|
if(w == PREVIEW_CACHE_PRIME_WIDTH &&
|
||||||
|
h == PREVIEW_CACHE_PRIME_HEIGHT)
|
||||||
|
return tb;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Second call - should NOT visit the tile cache...*/
|
||||||
|
return layer_preview_private(layer,w,h);
|
||||||
|
}
|
||||||
|
|
||||||
|
static TempBuf *
|
||||||
|
layer_mask_preview_private (Layer *layer,
|
||||||
gint w,
|
gint w,
|
||||||
gint h)
|
gint h)
|
||||||
{
|
{
|
||||||
@ -1213,6 +1237,31 @@ layer_mask_preview (Layer *layer,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TempBuf *
|
||||||
|
layer_mask_preview (Layer *layer,
|
||||||
|
gint w,
|
||||||
|
gint h)
|
||||||
|
{
|
||||||
|
/* Ok prime the cache with a large preview if the cache is invalid */
|
||||||
|
if(!GIMP_DRAWABLE(layer->mask)->preview_valid &&
|
||||||
|
w <= PREVIEW_CACHE_PRIME_WIDTH &&
|
||||||
|
h <= PREVIEW_CACHE_PRIME_HEIGHT)
|
||||||
|
{
|
||||||
|
TempBuf * tb = layer_mask_preview_private(layer,
|
||||||
|
PREVIEW_CACHE_PRIME_WIDTH,
|
||||||
|
PREVIEW_CACHE_PRIME_HEIGHT);
|
||||||
|
|
||||||
|
/* Save the 2nd call */
|
||||||
|
if(w == PREVIEW_CACHE_PRIME_WIDTH &&
|
||||||
|
h == PREVIEW_CACHE_PRIME_HEIGHT)
|
||||||
|
return tb;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Second call - should NOT visit the tile cache...*/
|
||||||
|
return layer_mask_preview_private(layer,w,h);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
Tattoo
|
Tattoo
|
||||||
layer_get_tattoo (const Layer *layer)
|
layer_get_tattoo (const Layer *layer)
|
||||||
{
|
{
|
||||||
|
@ -34,6 +34,9 @@ typedef struct _PreviewNearest {
|
|||||||
} PreviewNearest;
|
} PreviewNearest;
|
||||||
|
|
||||||
#define MAX_CACHE_PREVIEWS 5
|
#define MAX_CACHE_PREVIEWS 5
|
||||||
|
#define PREVIEW_CACHE_PRIME_WIDTH 112
|
||||||
|
#define PREVIEW_CACHE_PRIME_HEIGHT 112
|
||||||
|
|
||||||
TempBuf * gimp_preview_cache_get(GSList **,gint,gint);
|
TempBuf * gimp_preview_cache_get(GSList **,gint,gint);
|
||||||
void gimp_preview_cache_add(GSList **,TempBuf *);
|
void gimp_preview_cache_add(GSList **,TempBuf *);
|
||||||
void gimp_preview_cache_invalidate(GSList **);
|
void gimp_preview_cache_invalidate(GSList **);
|
||||||
|
@ -546,7 +546,7 @@ view_window_nav_cmd_callback (GtkWidget *widget,
|
|||||||
if (! gdisp->window_nav_dialog)
|
if (! gdisp->window_nav_dialog)
|
||||||
gdisp->window_nav_dialog = nav_window_create ((void *) gdisp);
|
gdisp->window_nav_dialog = nav_window_create ((void *) gdisp);
|
||||||
|
|
||||||
info_dialog_popup (gdisp->window_nav_dialog);
|
nav_dialog_popup (gdisp->window_nav_dialog);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -546,7 +546,7 @@ view_window_nav_cmd_callback (GtkWidget *widget,
|
|||||||
if (! gdisp->window_nav_dialog)
|
if (! gdisp->window_nav_dialog)
|
||||||
gdisp->window_nav_dialog = nav_window_create ((void *) gdisp);
|
gdisp->window_nav_dialog = nav_window_create ((void *) gdisp);
|
||||||
|
|
||||||
info_dialog_popup (gdisp->window_nav_dialog);
|
nav_dialog_popup (gdisp->window_nav_dialog);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
55
app/layer.c
55
app/layer.c
@ -1089,8 +1089,8 @@ layer_linked (Layer *layer)
|
|||||||
return layer->linked;
|
return layer->linked;
|
||||||
}
|
}
|
||||||
|
|
||||||
TempBuf *
|
static TempBuf *
|
||||||
layer_preview (Layer *layer,
|
layer_preview_private (Layer *layer,
|
||||||
gint w,
|
gint w,
|
||||||
gint h)
|
gint h)
|
||||||
{
|
{
|
||||||
@ -1161,7 +1161,31 @@ layer_preview (Layer *layer,
|
|||||||
}
|
}
|
||||||
|
|
||||||
TempBuf *
|
TempBuf *
|
||||||
layer_mask_preview (Layer *layer,
|
layer_preview (Layer *layer,
|
||||||
|
gint w,
|
||||||
|
gint h)
|
||||||
|
{
|
||||||
|
/* Ok prime the cache with a large preview if the cache is invalid */
|
||||||
|
if(!GIMP_DRAWABLE(layer)->preview_valid &&
|
||||||
|
w <= PREVIEW_CACHE_PRIME_WIDTH &&
|
||||||
|
h <= PREVIEW_CACHE_PRIME_HEIGHT)
|
||||||
|
{
|
||||||
|
TempBuf * tb = layer_preview_private(layer,
|
||||||
|
PREVIEW_CACHE_PRIME_WIDTH,
|
||||||
|
PREVIEW_CACHE_PRIME_HEIGHT);
|
||||||
|
|
||||||
|
/* Save the 2nd call */
|
||||||
|
if(w == PREVIEW_CACHE_PRIME_WIDTH &&
|
||||||
|
h == PREVIEW_CACHE_PRIME_HEIGHT)
|
||||||
|
return tb;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Second call - should NOT visit the tile cache...*/
|
||||||
|
return layer_preview_private(layer,w,h);
|
||||||
|
}
|
||||||
|
|
||||||
|
static TempBuf *
|
||||||
|
layer_mask_preview_private (Layer *layer,
|
||||||
gint w,
|
gint w,
|
||||||
gint h)
|
gint h)
|
||||||
{
|
{
|
||||||
@ -1213,6 +1237,31 @@ layer_mask_preview (Layer *layer,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TempBuf *
|
||||||
|
layer_mask_preview (Layer *layer,
|
||||||
|
gint w,
|
||||||
|
gint h)
|
||||||
|
{
|
||||||
|
/* Ok prime the cache with a large preview if the cache is invalid */
|
||||||
|
if(!GIMP_DRAWABLE(layer->mask)->preview_valid &&
|
||||||
|
w <= PREVIEW_CACHE_PRIME_WIDTH &&
|
||||||
|
h <= PREVIEW_CACHE_PRIME_HEIGHT)
|
||||||
|
{
|
||||||
|
TempBuf * tb = layer_mask_preview_private(layer,
|
||||||
|
PREVIEW_CACHE_PRIME_WIDTH,
|
||||||
|
PREVIEW_CACHE_PRIME_HEIGHT);
|
||||||
|
|
||||||
|
/* Save the 2nd call */
|
||||||
|
if(w == PREVIEW_CACHE_PRIME_WIDTH &&
|
||||||
|
h == PREVIEW_CACHE_PRIME_HEIGHT)
|
||||||
|
return tb;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Second call - should NOT visit the tile cache...*/
|
||||||
|
return layer_mask_preview_private(layer,w,h);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
Tattoo
|
Tattoo
|
||||||
layer_get_tattoo (const Layer *layer)
|
layer_get_tattoo (const Layer *layer)
|
||||||
{
|
{
|
||||||
|
401
app/nav_window.c
401
app/nav_window.c
@ -34,6 +34,9 @@
|
|||||||
#include "libgimp/gimpintl.h"
|
#include "libgimp/gimpintl.h"
|
||||||
#include "libgimp/gimpunit.h"
|
#include "libgimp/gimpunit.h"
|
||||||
|
|
||||||
|
#include "pixmaps/zoom_in.xpm"
|
||||||
|
#include "pixmaps/zoom_out.xpm"
|
||||||
|
|
||||||
|
|
||||||
#define MAX_BUF 256
|
#define MAX_BUF 256
|
||||||
|
|
||||||
@ -47,6 +50,12 @@
|
|||||||
#define NAV_PREVIEW_HEIGHT 112
|
#define NAV_PREVIEW_HEIGHT 112
|
||||||
#define BORDER_PEN_WIDTH 3
|
#define BORDER_PEN_WIDTH 3
|
||||||
|
|
||||||
|
#define MAX_SCALE_BUF 20
|
||||||
|
|
||||||
|
|
||||||
|
/* Timeout before preview is updated */
|
||||||
|
#define PREVIEW_UPDATE_TIMEOUT 1100
|
||||||
|
|
||||||
typedef struct _NavWinData NavWinData;
|
typedef struct _NavWinData NavWinData;
|
||||||
struct _NavWinData
|
struct _NavWinData
|
||||||
{
|
{
|
||||||
@ -57,6 +66,9 @@ struct _NavWinData
|
|||||||
void *gdisp_ptr; /* I'm not happy 'bout this one */
|
void *gdisp_ptr; /* I'm not happy 'bout this one */
|
||||||
GtkWidget *previewBox;
|
GtkWidget *previewBox;
|
||||||
GtkWidget *previewAlign;
|
GtkWidget *previewAlign;
|
||||||
|
GtkWidget *zoom_label;
|
||||||
|
GtkWidget *zoom_scale;
|
||||||
|
GtkObject *zoom_adjustment;
|
||||||
gdouble ratio;
|
gdouble ratio;
|
||||||
GdkGC *gc;
|
GdkGC *gc;
|
||||||
gint dispx; /* x pos of top left corner of display area */
|
gint dispx; /* x pos of top left corner of display area */
|
||||||
@ -74,6 +86,7 @@ struct _NavWinData
|
|||||||
gboolean block_window_marker; /* Block redraws of window marker */
|
gboolean block_window_marker; /* Block redraws of window marker */
|
||||||
gint nav_preview_width;
|
gint nav_preview_width;
|
||||||
gint nav_preview_height;
|
gint nav_preview_height;
|
||||||
|
gboolean block_adj_sig;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
@ -95,7 +108,10 @@ nav_window_preview_resized (GtkWidget *,
|
|||||||
#endif /* 0 */
|
#endif /* 0 */
|
||||||
|
|
||||||
static void
|
static void
|
||||||
nav_window_update_preview (NavWinData *,gboolean);
|
nav_window_update_preview (NavWinData *);
|
||||||
|
|
||||||
|
static void
|
||||||
|
nav_window_update_preview_blank(NavWinData *iwd);
|
||||||
|
|
||||||
static void
|
static void
|
||||||
destroy_preview_widget (NavWinData *);
|
destroy_preview_widget (NavWinData *);
|
||||||
@ -117,6 +133,10 @@ nav_window_draw_sqr(NavWinData *,
|
|||||||
static void
|
static void
|
||||||
set_size_data(NavWinData *);
|
set_size_data(NavWinData *);
|
||||||
|
|
||||||
|
static gint
|
||||||
|
nav_preview_update_do_timer(NavWinData *);
|
||||||
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
nav_window_destroy_callback (GtkWidget *widget,
|
nav_window_destroy_callback (GtkWidget *widget,
|
||||||
gpointer client_data)
|
gpointer client_data)
|
||||||
@ -137,7 +157,7 @@ nav_window_close_callback (GtkWidget *widget,
|
|||||||
info_win = (InfoDialog *)client_data;
|
info_win = (InfoDialog *)client_data;
|
||||||
iwd = (NavWinData *)info_win->user_data;
|
iwd = (NavWinData *)info_win->user_data;
|
||||||
|
|
||||||
/* iwd->showingPreview = FALSE; ALT. Needs to be sorted out */
|
iwd->showingPreview = FALSE;
|
||||||
info_dialog_popdown ((InfoDialog *) client_data);
|
info_dialog_popdown ((InfoDialog *) client_data);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -177,13 +197,17 @@ nav_window_disp_area(NavWinData *iwd,GDisplay *gdisp)
|
|||||||
iwd->imageheight = newheight;
|
iwd->imageheight = newheight;
|
||||||
|
|
||||||
/* Normalise */
|
/* Normalise */
|
||||||
|
iwd->dispwidth = MAX(iwd->dispwidth, 2);
|
||||||
|
iwd->dispheight = MAX(iwd->dispheight, 2);
|
||||||
|
|
||||||
iwd->dispwidth = MIN(iwd->dispwidth, iwd->pwidth/*-BORDER_PEN_WIDTH*/);
|
iwd->dispwidth = MIN(iwd->dispwidth, iwd->pwidth/*-BORDER_PEN_WIDTH*/);
|
||||||
iwd->dispheight = MIN(iwd->dispheight, iwd->pheight/*-BORDER_PEN_WIDTH*/);
|
iwd->dispheight = MIN(iwd->dispheight, iwd->pheight/*-BORDER_PEN_WIDTH*/);
|
||||||
|
|
||||||
if(need_update == TRUE)
|
if(need_update == TRUE)
|
||||||
{
|
{
|
||||||
gtk_widget_hide(iwd->previewAlign);
|
gtk_widget_hide(iwd->previewAlign);
|
||||||
nav_window_update_preview(iwd,FALSE);
|
/* ALT nav_window_update_preview(iwd);*/
|
||||||
|
nav_window_update_preview_blank(iwd);
|
||||||
gtk_widget_show(iwd->preview);
|
gtk_widget_show(iwd->preview);
|
||||||
gtk_widget_draw(iwd->preview, NULL);
|
gtk_widget_draw(iwd->preview, NULL);
|
||||||
gtk_widget_show(iwd->previewAlign);
|
gtk_widget_show(iwd->previewAlign);
|
||||||
@ -191,6 +215,7 @@ nav_window_disp_area(NavWinData *iwd,GDisplay *gdisp)
|
|||||||
iwd->dispx,iwd->dispy,
|
iwd->dispx,iwd->dispy,
|
||||||
iwd->dispwidth,iwd->dispheight);
|
iwd->dispwidth,iwd->dispheight);
|
||||||
gtk_window_set_focus(GTK_WINDOW (iwd->info_win->shell),iwd->preview);
|
gtk_window_set_focus(GTK_WINDOW (iwd->info_win->shell),iwd->preview);
|
||||||
|
gtk_timeout_add(PREVIEW_UPDATE_TIMEOUT,(GtkFunction)nav_preview_update_do_timer,(gpointer)iwd);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -328,30 +353,6 @@ create_preview_widget(NavWinData *iwd)
|
|||||||
GTK_WIDGET_SET_FLAGS (image, GTK_CAN_FOCUS);
|
GTK_WIDGET_SET_FLAGS (image, GTK_CAN_FOCUS);
|
||||||
}
|
}
|
||||||
|
|
||||||
#if 0
|
|
||||||
static void
|
|
||||||
info_window_page_switch (GtkWidget *widget,
|
|
||||||
GtkNotebookPage *page,
|
|
||||||
gint page_num)
|
|
||||||
{
|
|
||||||
InfoDialog *info_win;
|
|
||||||
InfoWinData *iwd;
|
|
||||||
|
|
||||||
info_win = (InfoDialog *)gtk_object_get_user_data(GTK_OBJECT (widget));
|
|
||||||
iwd = (InfoWinData *)info_win->user_data;
|
|
||||||
|
|
||||||
/* Only deal with the second page */
|
|
||||||
if(page_num != 1)
|
|
||||||
{
|
|
||||||
iwd->showingPreview = FALSE;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
iwd->showingPreview = TRUE;
|
|
||||||
|
|
||||||
}
|
|
||||||
#endif /* 0 */
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
update_real_view(NavWinData *iwd,gint tx,gint ty)
|
update_real_view(NavWinData *iwd,gint tx,gint ty)
|
||||||
{
|
{
|
||||||
@ -387,10 +388,7 @@ update_real_view(NavWinData *iwd,gint tx,gint ty)
|
|||||||
iwd->block_window_marker = FALSE;
|
iwd->block_window_marker = FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void nav_window_update_preview(NavWinData *iwd)
|
||||||
nav_window_update_preview
|
|
||||||
(NavWinData *iwd,
|
|
||||||
gboolean invalidated)
|
|
||||||
{
|
{
|
||||||
GDisplay *gdisp;
|
GDisplay *gdisp;
|
||||||
TempBuf * preview_buf;
|
TempBuf * preview_buf;
|
||||||
@ -399,6 +397,8 @@ nav_window_update_preview
|
|||||||
gint pwidth, pheight;
|
gint pwidth, pheight;
|
||||||
GimpImage *gimage;
|
GimpImage *gimage;
|
||||||
gdouble r,g,b,a,chk;
|
gdouble r,g,b,a,chk;
|
||||||
|
gint xoff = 0;
|
||||||
|
gint yoff = 0;
|
||||||
|
|
||||||
gimp_add_busy_cursors();
|
gimp_add_busy_cursors();
|
||||||
|
|
||||||
@ -411,79 +411,98 @@ nav_window_update_preview
|
|||||||
pwidth = iwd->pwidth;
|
pwidth = iwd->pwidth;
|
||||||
pheight = iwd->pheight;
|
pheight = iwd->pheight;
|
||||||
|
|
||||||
|
|
||||||
preview_buf = gimp_image_construct_composite_preview (gimage,
|
preview_buf = gimp_image_construct_composite_preview (gimage,
|
||||||
MAX (pwidth, 2),
|
MAX (pwidth, 2),
|
||||||
MAX (pheight, 2));
|
MAX (pheight, 2));
|
||||||
|
|
||||||
|
|
||||||
buf = g_new (gchar, iwd->nav_preview_width * 3);
|
buf = g_new (gchar, iwd->nav_preview_width * 3);
|
||||||
src = (gchar *) temp_buf_data (preview_buf);
|
src = (gchar *) temp_buf_data (preview_buf);
|
||||||
has_alpha = (preview_buf->bytes == 2 || preview_buf->bytes == 4);
|
has_alpha = (preview_buf->bytes == 2 || preview_buf->bytes == 4);
|
||||||
|
|
||||||
for (y = 0; y <preview_buf->height ; y++)
|
for (y = 0; y <pheight ; y++)
|
||||||
{
|
{
|
||||||
dest = buf;
|
dest = buf;
|
||||||
switch (preview_buf->bytes)
|
switch (preview_buf->bytes)
|
||||||
{
|
{
|
||||||
case 4:
|
case 4:
|
||||||
for (x = 0; x < preview_buf->width; x++)
|
for (x = 0; x < pwidth; x++)
|
||||||
{
|
{
|
||||||
r = ((gdouble)(*(src++)))/255.0;
|
r = ((gdouble)(*(src++)))/255.0;
|
||||||
g = ((gdouble)(*(src++)))/255.0;
|
g = ((gdouble)(*(src++)))/255.0;
|
||||||
b = ((gdouble)(*(src++)))/255.0;
|
b = ((gdouble)(*(src++)))/255.0;
|
||||||
a = ((gdouble)(*(src++)))/255.0;
|
a = ((gdouble)(*(src++)))/255.0;
|
||||||
chk = ((gdouble)((( (x^y) & 4 ) << 4) | 128))/255.0;
|
chk = ((gdouble)((( (x^y) & 4 ) << 4) | 128))/255.0;
|
||||||
if(!invalidated)
|
|
||||||
{
|
|
||||||
*(dest++) = (guchar)((chk + (r - chk)*a)*255.0);
|
*(dest++) = (guchar)((chk + (r - chk)*a)*255.0);
|
||||||
*(dest++) = (guchar)((chk + (g - chk)*a)*255.0);
|
*(dest++) = (guchar)((chk + (g - chk)*a)*255.0);
|
||||||
*(dest++) = (guchar)((chk + (b - chk)*a)*255.0);
|
*(dest++) = (guchar)((chk + (b - chk)*a)*255.0);
|
||||||
}
|
}
|
||||||
else
|
|
||||||
{
|
|
||||||
chk *= 128.0;
|
|
||||||
*(dest++) = (guchar)chk;
|
|
||||||
*(dest++) = (guchar)chk;
|
|
||||||
*(dest++) = (guchar)chk;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
case 2:
|
case 2:
|
||||||
for (x = 0; x < preview_buf->width; x++)
|
for (x = 0; x < pwidth; x++)
|
||||||
{
|
{
|
||||||
r = ((gdouble)(*(src++)))/255.0;
|
r = ((gdouble)(*(src++)))/255.0;
|
||||||
a = ((gdouble)(*(src++)))/255.0;
|
a = ((gdouble)(*(src++)))/255.0;
|
||||||
chk = ((gdouble)((( (x^y) & 4 ) << 4) | 128))/255.0;
|
chk = ((gdouble)((( (x^y) & 4 ) << 4) | 128))/255.0;
|
||||||
if(!invalidated)
|
|
||||||
{
|
|
||||||
*(dest++) = (guchar)((chk + (r - chk)*a)*255.0);
|
*(dest++) = (guchar)((chk + (r - chk)*a)*255.0);
|
||||||
*(dest++) = (guchar)((chk + (r - chk)*a)*255.0);
|
*(dest++) = (guchar)((chk + (r - chk)*a)*255.0);
|
||||||
*(dest++) = (guchar)((chk + (r - chk)*a)*255.0);
|
*(dest++) = (guchar)((chk + (r - chk)*a)*255.0);
|
||||||
}
|
}
|
||||||
else
|
|
||||||
{
|
|
||||||
chk *= 255.0;
|
|
||||||
*(dest++) = (guchar)chk;
|
|
||||||
*(dest++) = (guchar)chk;
|
|
||||||
*(dest++) = (guchar)chk;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
g_warning("UNKNOWN TempBuf bpp in nav_window_update_preview()");
|
g_warning("UNKNOWN TempBuf bpp in nav_window_update_preview()");
|
||||||
}
|
}
|
||||||
|
|
||||||
gtk_preview_draw_row (GTK_PREVIEW (iwd->preview),
|
gtk_preview_draw_row (GTK_PREVIEW (iwd->preview),
|
||||||
(guchar *)buf, 0, y, preview_buf->width);
|
(guchar *)buf, xoff, yoff+y, preview_buf->width);
|
||||||
}
|
}
|
||||||
|
|
||||||
g_free (buf);
|
g_free (buf);
|
||||||
temp_buf_free (preview_buf);
|
temp_buf_free (preview_buf);
|
||||||
|
|
||||||
nav_window_disp_area(iwd,gdisp);
|
/* nav_window_disp_area(iwd,gdisp); */
|
||||||
|
|
||||||
gimp_remove_busy_cursors (NULL);
|
gimp_remove_busy_cursors (NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void nav_window_update_preview_blank(NavWinData *iwd)
|
||||||
|
{
|
||||||
|
GDisplay *gdisp;
|
||||||
|
guchar *buf, *dest;
|
||||||
|
gint x,y;
|
||||||
|
GimpImage *gimage;
|
||||||
|
gdouble chk;
|
||||||
|
|
||||||
|
gdisp = (GDisplay *) iwd->gdisp_ptr;
|
||||||
|
|
||||||
|
/* Calculate preview size */
|
||||||
|
gimage = ((GDisplay *)(iwd->gdisp_ptr))->gimage;
|
||||||
|
|
||||||
|
buf = g_new (gchar, iwd->pwidth * 3);
|
||||||
|
|
||||||
|
for (y = 0; y < iwd->pheight ; y++)
|
||||||
|
{
|
||||||
|
dest = buf;
|
||||||
|
for (x = 0; x < iwd->pwidth; x++)
|
||||||
|
{
|
||||||
|
chk = ((gdouble)((( (x^y) & 4 ) << 4) | 128))/255.0;
|
||||||
|
chk *= 128.0;
|
||||||
|
*(dest++) = (guchar)chk;
|
||||||
|
*(dest++) = (guchar)chk;
|
||||||
|
*(dest++) = (guchar)chk;
|
||||||
|
}
|
||||||
|
|
||||||
|
gtk_preview_draw_row (GTK_PREVIEW (iwd->preview),
|
||||||
|
(guchar *)buf, 0, y, iwd->pwidth);
|
||||||
|
}
|
||||||
|
|
||||||
|
g_free (buf);
|
||||||
|
|
||||||
|
gdk_flush();
|
||||||
|
/* nav_window_disp_area(iwd,gdisp);*/
|
||||||
|
}
|
||||||
|
|
||||||
static gint
|
static gint
|
||||||
inside_preview_square(NavWinData *iwd, gint x, gint y)
|
inside_preview_square(NavWinData *iwd, gint x, gint y)
|
||||||
{
|
{
|
||||||
@ -496,55 +515,42 @@ inside_preview_square(NavWinData *iwd, gint x, gint y)
|
|||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if 0
|
static void
|
||||||
static gint
|
update_zoom_label(NavWinData *iwd)
|
||||||
nav_window_preview_resized (GtkWidget *widget,
|
|
||||||
GtkAllocation *alloc,
|
|
||||||
gpointer *data)
|
|
||||||
{
|
{
|
||||||
NavWinData *iwd;
|
gchar scale_str[MAX_SCALE_BUF];
|
||||||
|
|
||||||
iwd = (NavWinData *)data;
|
/* Update the zoom scale string */
|
||||||
|
g_snprintf (scale_str, MAX_SCALE_BUF, "%d:%d",
|
||||||
|
SCALEDEST (((GDisplay *)iwd->gdisp_ptr)),
|
||||||
|
SCALESRC (((GDisplay *)iwd->gdisp_ptr)));
|
||||||
|
|
||||||
if(!iwd || !iwd->preview)
|
gtk_label_set_text(GTK_LABEL(iwd->zoom_label),scale_str);
|
||||||
return FALSE;
|
}
|
||||||
|
|
||||||
printf("Now at [x,y] = [%d,%d] [w,h] = [%d,%d]\n",
|
static void
|
||||||
alloc->x,alloc->y,
|
update_zoom_adjustment(NavWinData *iwd)
|
||||||
alloc->width,alloc->height);
|
{
|
||||||
|
GtkAdjustment *adj = GTK_ADJUSTMENT(iwd->zoom_adjustment);
|
||||||
if(iwd->nav_preview_width == alloc->width &&
|
gdouble f = ((gdouble)SCALEDEST (((GDisplay *)iwd->gdisp_ptr)))/((gdouble)SCALESRC (((GDisplay *)iwd->gdisp_ptr)));
|
||||||
iwd->nav_preview_height == alloc->height)
|
gdouble val;
|
||||||
return FALSE;
|
|
||||||
|
if(f < 1.0)
|
||||||
iwd->nav_preview_width = alloc->width;
|
{
|
||||||
iwd->nav_preview_height = alloc->height;
|
val = -1/f;
|
||||||
set_size_data(iwd);
|
}
|
||||||
gtk_preview_size(GTK_PREVIEW(iwd->preview),alloc->width,alloc->height);
|
else
|
||||||
nav_window_update_preview(iwd,FALSE);
|
{
|
||||||
nav_window_draw_sqr(iwd,FALSE,
|
val = f;
|
||||||
iwd->dispx,iwd->dispy,
|
}
|
||||||
iwd->dispwidth,iwd->dispheight);
|
|
||||||
|
if(abs((gint)adj->value) != (gint)(val - 1) && iwd->block_adj_sig != TRUE)
|
||||||
#if 0
|
{
|
||||||
destroy_preview_widget(iwd);
|
adj->value = val;
|
||||||
create_preview_widget(iwd);
|
gtk_signal_emit_by_name (GTK_OBJECT (iwd->zoom_adjustment), "changed");
|
||||||
nav_window_update_preview(iwd,FALSE);
|
}
|
||||||
|
|
||||||
|
|
||||||
nav_window_update_preview(iwd,FALSE);
|
|
||||||
gtk_widget_show(iwd->preview);
|
|
||||||
gtk_widget_draw(iwd->preview, NULL);
|
|
||||||
gtk_widget_show(iwd->previewAlign);
|
|
||||||
nav_window_draw_sqr(iwd,FALSE,
|
|
||||||
iwd->dispx,iwd->dispy,
|
|
||||||
iwd->dispwidth,iwd->dispheight);
|
|
||||||
|
|
||||||
#endif /* 0 */
|
|
||||||
return FALSE;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif /* 0 */
|
|
||||||
static void
|
static void
|
||||||
move_to_point(NavWinData *iwd,
|
move_to_point(NavWinData *iwd,
|
||||||
gint tx,
|
gint tx,
|
||||||
@ -616,9 +622,9 @@ nav_window_preview_events (GtkWidget *widget,
|
|||||||
{
|
{
|
||||||
case GDK_EXPOSE:
|
case GDK_EXPOSE:
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case GDK_MAP:
|
case GDK_MAP:
|
||||||
nav_window_update_preview(iwd,FALSE);
|
nav_window_update_preview_blank(iwd);
|
||||||
|
gtk_timeout_add(PREVIEW_UPDATE_TIMEOUT,(GtkFunction)nav_preview_update_do_timer,(gpointer)iwd);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case GDK_BUTTON_PRESS:
|
case GDK_BUTTON_PRESS:
|
||||||
@ -798,7 +804,8 @@ nav_window_expose_events (GtkWidget *widget,
|
|||||||
static gint
|
static gint
|
||||||
nav_preview_update_do(NavWinData *iwd)
|
nav_preview_update_do(NavWinData *iwd)
|
||||||
{
|
{
|
||||||
nav_window_update_preview(iwd,FALSE);
|
nav_window_update_preview(iwd);
|
||||||
|
nav_window_disp_area(iwd,iwd->gdisp_ptr);
|
||||||
gtk_widget_draw(iwd->preview, NULL);
|
gtk_widget_draw(iwd->preview, NULL);
|
||||||
iwd->installedDirtyTimer = FALSE;
|
iwd->installedDirtyTimer = FALSE;
|
||||||
return FALSE;
|
return FALSE;
|
||||||
@ -826,16 +833,165 @@ nav_image_need_update (GtkObject *obj,
|
|||||||
iwd->installedDirtyTimer = TRUE;
|
iwd->installedDirtyTimer = TRUE;
|
||||||
|
|
||||||
/* Update preview at a less busy time */
|
/* Update preview at a less busy time */
|
||||||
nav_window_update_preview(iwd,TRUE);
|
nav_window_update_preview_blank(iwd);
|
||||||
gtk_widget_draw(iwd->preview, NULL);
|
gtk_widget_draw(iwd->preview, NULL);
|
||||||
gtk_timeout_add(2000,(GtkFunction)nav_preview_update_do_timer,(gpointer)iwd);
|
gtk_timeout_add(PREVIEW_UPDATE_TIMEOUT,(GtkFunction)nav_preview_update_do_timer,(gpointer)iwd);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
navwindow_zoomin (GtkWidget *widget,
|
||||||
|
gpointer data)
|
||||||
|
{
|
||||||
|
NavWinData *iwd;
|
||||||
|
GDisplay *gdisp;
|
||||||
|
|
||||||
|
iwd = (NavWinData *)data;
|
||||||
|
|
||||||
|
if(!iwd)
|
||||||
|
return;
|
||||||
|
|
||||||
|
gdisp = (GDisplay *) iwd->gdisp_ptr;
|
||||||
|
|
||||||
|
change_scale(gdisp,ZOOMIN);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
navwindow_zoomout (GtkWidget *widget,
|
||||||
|
gpointer data)
|
||||||
|
{
|
||||||
|
NavWinData *iwd;
|
||||||
|
GDisplay *gdisp;
|
||||||
|
|
||||||
|
iwd = (NavWinData *)data;
|
||||||
|
|
||||||
|
if(!iwd)
|
||||||
|
return;
|
||||||
|
|
||||||
|
gdisp = (GDisplay *) iwd->gdisp_ptr;
|
||||||
|
|
||||||
|
change_scale(gdisp,ZOOMOUT);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
zoom_adj_changed (GtkAdjustment *adj,
|
||||||
|
gpointer data)
|
||||||
|
{
|
||||||
|
NavWinData *iwd;
|
||||||
|
GDisplay *gdisp;
|
||||||
|
gint scalesrc, scaledest;
|
||||||
|
|
||||||
|
iwd = (NavWinData *)data;
|
||||||
|
|
||||||
|
if(!iwd)
|
||||||
|
return;
|
||||||
|
|
||||||
|
gdisp = (GDisplay *) iwd->gdisp_ptr;
|
||||||
|
|
||||||
|
if(adj->value < 0.0)
|
||||||
|
{
|
||||||
|
scalesrc = abs((gint)adj->value-1);
|
||||||
|
scaledest = 1;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
scaledest = abs((gint)adj->value+1);
|
||||||
|
scalesrc = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
iwd->block_adj_sig = TRUE;
|
||||||
|
change_scale(gdisp,(scaledest*100)+scalesrc);
|
||||||
|
iwd->block_adj_sig = FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
static GtkWidget *
|
||||||
|
nav_create_button_area(InfoDialog *info_win)
|
||||||
|
{
|
||||||
|
GtkWidget *hbox1;
|
||||||
|
GtkWidget *vbox1;
|
||||||
|
GtkWidget *button;
|
||||||
|
GtkWidget *hscale1;
|
||||||
|
GtkWidget *label1;
|
||||||
|
GtkObject *adjustment;
|
||||||
|
GdkPixmap *pixmap;
|
||||||
|
GtkWidget *pixmapwid;
|
||||||
|
GdkBitmap *mask;
|
||||||
|
GtkStyle *style;
|
||||||
|
NavWinData *iwd;
|
||||||
|
gchar scale_str[MAX_SCALE_BUF];
|
||||||
|
|
||||||
|
iwd = (NavWinData *)info_win->user_data;
|
||||||
|
|
||||||
|
hbox1 = gtk_hbox_new (FALSE, 0);
|
||||||
|
gtk_widget_show (hbox1);
|
||||||
|
|
||||||
|
style = gtk_widget_get_style (info_win->shell);
|
||||||
|
|
||||||
|
button = gtk_button_new ();
|
||||||
|
GTK_WIDGET_UNSET_FLAGS (button, GTK_RECEIVES_DEFAULT);
|
||||||
|
gtk_signal_connect (GTK_OBJECT (button), "clicked",
|
||||||
|
GTK_SIGNAL_FUNC (navwindow_zoomout), (gpointer) info_win->user_data);
|
||||||
|
gtk_box_pack_start (GTK_BOX (hbox1), button, FALSE, FALSE, 0);
|
||||||
|
|
||||||
|
pixmap = gdk_pixmap_create_from_xpm_d (info_win->shell->window, &mask,
|
||||||
|
&style->bg[GTK_STATE_NORMAL],
|
||||||
|
zoom_out_xpm);
|
||||||
|
pixmapwid = gtk_pixmap_new (pixmap, mask);
|
||||||
|
gtk_container_add (GTK_CONTAINER (button), pixmapwid);
|
||||||
|
gtk_widget_show (pixmapwid);
|
||||||
|
gtk_widget_show (button);
|
||||||
|
|
||||||
|
vbox1 = gtk_vbox_new (FALSE, 0);
|
||||||
|
gtk_widget_show (vbox1);
|
||||||
|
gtk_box_pack_start (GTK_BOX (vbox1), hbox1, TRUE, TRUE, 0);
|
||||||
|
|
||||||
|
/* user zoom ratio */
|
||||||
|
g_snprintf (scale_str, MAX_SCALE_BUF, "%d:%d",
|
||||||
|
SCALEDEST (((GDisplay *)iwd->gdisp_ptr)),
|
||||||
|
SCALESRC (((GDisplay *)iwd->gdisp_ptr)));
|
||||||
|
|
||||||
|
label1 = gtk_label_new (scale_str);
|
||||||
|
gtk_widget_show (label1);
|
||||||
|
iwd->zoom_label = label1;
|
||||||
|
gtk_box_pack_start (GTK_BOX (hbox1), label1, TRUE, TRUE, 0);
|
||||||
|
|
||||||
|
adjustment = gtk_adjustment_new (0.0, -15.0, 16.0, 1.0, 1.0, 1.0);
|
||||||
|
hscale1 = gtk_hscale_new (GTK_ADJUSTMENT (adjustment));
|
||||||
|
gtk_scale_set_digits (GTK_SCALE (hscale1), 0);
|
||||||
|
iwd->zoom_adjustment = adjustment;
|
||||||
|
iwd->zoom_scale = hscale1;
|
||||||
|
gtk_widget_show (hscale1);
|
||||||
|
|
||||||
|
gtk_signal_connect (GTK_OBJECT (adjustment), "value_changed",
|
||||||
|
GTK_SIGNAL_FUNC (zoom_adj_changed),
|
||||||
|
iwd);
|
||||||
|
|
||||||
|
gtk_box_pack_start (GTK_BOX (vbox1), hscale1, TRUE, TRUE, 0);
|
||||||
|
gtk_scale_set_draw_value (GTK_SCALE (hscale1), FALSE);
|
||||||
|
|
||||||
|
button = gtk_button_new ();
|
||||||
|
GTK_WIDGET_UNSET_FLAGS (button, GTK_RECEIVES_DEFAULT);
|
||||||
|
gtk_signal_connect (GTK_OBJECT (button), "clicked",
|
||||||
|
GTK_SIGNAL_FUNC (navwindow_zoomin), (gpointer) info_win->user_data);
|
||||||
|
gtk_box_pack_start (GTK_BOX (hbox1), button, FALSE, FALSE, 0);
|
||||||
|
|
||||||
|
pixmap = gdk_pixmap_create_from_xpm_d (info_win->shell->window, &mask,
|
||||||
|
&style->bg[GTK_STATE_NORMAL],
|
||||||
|
zoom_in_xpm);
|
||||||
|
pixmapwid = gtk_pixmap_new (pixmap, mask);
|
||||||
|
gtk_container_add (GTK_CONTAINER (button), pixmapwid);
|
||||||
|
gtk_widget_show (pixmapwid);
|
||||||
|
gtk_widget_show (button);
|
||||||
|
|
||||||
|
return vbox1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static GtkWidget *
|
static GtkWidget *
|
||||||
info_window_image_preview_new(InfoDialog *info_win)
|
info_window_image_preview_new(InfoDialog *info_win)
|
||||||
{
|
{
|
||||||
GtkWidget *hbox1;
|
GtkWidget *hbox1;
|
||||||
|
GtkWidget *vbox1;
|
||||||
GtkWidget *alignment;
|
GtkWidget *alignment;
|
||||||
|
GtkWidget *button_area;
|
||||||
|
|
||||||
NavWinData *iwd;
|
NavWinData *iwd;
|
||||||
|
|
||||||
@ -844,6 +1000,9 @@ info_window_image_preview_new(InfoDialog *info_win)
|
|||||||
hbox1 = gtk_hbox_new (FALSE, 0);
|
hbox1 = gtk_hbox_new (FALSE, 0);
|
||||||
gtk_widget_show (hbox1);
|
gtk_widget_show (hbox1);
|
||||||
|
|
||||||
|
vbox1 = gtk_vbox_new (FALSE, 0);
|
||||||
|
gtk_widget_show (vbox1);
|
||||||
|
|
||||||
gtk_widget_realize(info_win->shell);
|
gtk_widget_realize(info_win->shell);
|
||||||
|
|
||||||
/* need gc to draw the preview sqr with */
|
/* need gc to draw the preview sqr with */
|
||||||
@ -861,8 +1020,12 @@ info_window_image_preview_new(InfoDialog *info_win)
|
|||||||
create_preview_widget(iwd);
|
create_preview_widget(iwd);
|
||||||
|
|
||||||
gtk_box_pack_start (GTK_BOX (hbox1), alignment, TRUE, TRUE, 0);
|
gtk_box_pack_start (GTK_BOX (hbox1), alignment, TRUE, TRUE, 0);
|
||||||
|
gtk_box_pack_start (GTK_BOX (vbox1), hbox1, TRUE, TRUE, 0);
|
||||||
|
|
||||||
return hbox1;
|
button_area = nav_create_button_area(info_win);
|
||||||
|
gtk_box_pack_start (GTK_BOX (vbox1), button_area, TRUE, TRUE, 0);
|
||||||
|
|
||||||
|
return vbox1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static ActionAreaItem action_items[] =
|
static ActionAreaItem action_items[] =
|
||||||
@ -915,6 +1078,8 @@ nav_window_create (void *gdisp_ptr)
|
|||||||
iwd->block_window_marker = FALSE;
|
iwd->block_window_marker = FALSE;
|
||||||
iwd->nav_preview_width = NAV_PREVIEW_WIDTH;
|
iwd->nav_preview_width = NAV_PREVIEW_WIDTH;
|
||||||
iwd->nav_preview_height = NAV_PREVIEW_HEIGHT;
|
iwd->nav_preview_height = NAV_PREVIEW_HEIGHT;
|
||||||
|
iwd->block_adj_sig = FALSE;
|
||||||
|
|
||||||
|
|
||||||
/* Add preview */
|
/* Add preview */
|
||||||
container = info_window_image_preview_new(info_win);
|
container = info_window_image_preview_new(info_win);
|
||||||
@ -968,6 +1133,30 @@ nav_window_update_window_marker(InfoDialog *info_win)
|
|||||||
iwd->dispx,
|
iwd->dispx,
|
||||||
iwd->dispy,
|
iwd->dispy,
|
||||||
iwd->dispwidth,iwd->dispheight);
|
iwd->dispwidth,iwd->dispheight);
|
||||||
|
|
||||||
|
update_zoom_label(iwd);
|
||||||
|
|
||||||
|
update_zoom_adjustment(iwd);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
nav_dialog_popup (InfoDialog *idialog)
|
||||||
|
{
|
||||||
|
NavWinData *iwd;
|
||||||
|
|
||||||
|
if (!idialog)
|
||||||
|
return;
|
||||||
|
|
||||||
|
iwd = (NavWinData *)idialog->user_data;
|
||||||
|
iwd->showingPreview = TRUE;
|
||||||
|
|
||||||
|
if (! GTK_WIDGET_VISIBLE (idialog->shell))
|
||||||
|
{
|
||||||
|
gtk_widget_show (idialog->shell);
|
||||||
|
nav_window_update_preview_blank(iwd);
|
||||||
|
nav_window_update_window_marker(idialog);
|
||||||
|
gtk_timeout_add(PREVIEW_UPDATE_TIMEOUT,(GtkFunction)nav_preview_update_do_timer,(gpointer)iwd);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -24,5 +24,6 @@
|
|||||||
InfoDialog *nav_window_create (void *);
|
InfoDialog *nav_window_create (void *);
|
||||||
void nav_window_free (InfoDialog *);
|
void nav_window_free (InfoDialog *);
|
||||||
void nav_window_update_window_marker(InfoDialog *);
|
void nav_window_update_window_marker(InfoDialog *);
|
||||||
|
void nav_dialog_popup (InfoDialog *idialog);
|
||||||
|
|
||||||
#endif /* __NAV_WINDOW_H__ */
|
#endif /* __NAV_WINDOW_H__ */
|
||||||
|
Reference in New Issue
Block a user