gimp/plug-ins/fp/fp_gdk.c

169 lines
4.0 KiB
C

#include <stdio.h>
#include <stdlib.h>
#include <gtk/gtk.h>
#include "libgimp/gimp.h"
#include "fp.h"
extern AdvancedWindow AW;
extern FP_Params Current;
extern gint nudgeArray[256];
void
slider_erase (GdkWindow *window,
int xpos)
{
gdk_window_clear_area (window, MARGIN + xpos - (RANGE_HEIGHT - 1) / 2, 0,
RANGE_HEIGHT, RANGE_HEIGHT);
}
void
draw_slider(GdkWindow *window,
GdkGC *border_gc,
GdkGC *fill_gc,
int xpos)
{
gint i;
for (i = 0; i < RANGE_HEIGHT; i++)
gdk_draw_line (window, fill_gc, MARGIN + xpos-i/2, i, MARGIN + xpos+i/2,i);
gdk_draw_line (window, border_gc, MARGIN + xpos, 0,
MARGIN + xpos - (RANGE_HEIGHT - 1) / 2, RANGE_HEIGHT - 1);
gdk_draw_line (window, border_gc, MARGIN + xpos, 0,
MARGIN + xpos + (RANGE_HEIGHT - 1) / 2, RANGE_HEIGHT - 1);
gdk_draw_line (window, border_gc, MARGIN + xpos-(RANGE_HEIGHT-1)/2,RANGE_HEIGHT-1,
MARGIN + xpos + (RANGE_HEIGHT-1)/2, RANGE_HEIGHT-1);
}
void
draw_it (GtkWidget *widget)
{
draw_slider (AW.aliasingGraph->window,
AW.aliasingGraph->style->black_gc,
AW.aliasingGraph->style->dark_gc[GTK_STATE_NORMAL],
Current.Cutoffs[SHADOWS]);
draw_slider (AW.aliasingGraph->window,
AW.aliasingGraph->style->black_gc,
AW.aliasingGraph->style->dark_gc[GTK_STATE_NORMAL],
Current.Cutoffs[MIDTONES]);
draw_slider (AW.aliasingGraph->window,
AW.aliasingGraph->style->black_gc,
AW.aliasingGraph->style->dark_gc[GTK_STATE_SELECTED],
Current.Offset);
}
gint
FP_Range_Change_Events (GtkWidget *widget,
GdkEvent *event,
FP_Params *current)
{
GdkEventButton *bevent;
GdkEventMotion *mevent;
gint shad, mid, offset, min;
static guchar *new;
gint x;
switch (event->type)
{
case GDK_EXPOSE:
draw_it (NULL);
break;
case GDK_BUTTON_PRESS:
bevent= (GdkEventButton *) event;
shad = abs (bevent->x - Current.Cutoffs[SHADOWS]);
mid = abs (bevent->x - Current.Cutoffs[MIDTONES]);
offset = abs (bevent->x - Current.Offset);
min = MIN (MIN (shad, mid), offset);
if (bevent->x >0 && bevent->x<256)
{
if (min == shad)
new = &Current.Cutoffs[SHADOWS];
else if (min == mid)
new = &Current.Cutoffs[MIDTONES];
else
new = &Current.Offset;
slider_erase (AW.aliasingGraph->window, *new);
*new=bevent->x;
}
draw_it (NULL);
if (Current.RealTime)
{
fp_range_preview_spill (AW.rangePreview, Current.ValueBy);
update_range_labels ();
fp_create_smoothness_graph (AW.aliasingPreview);
refreshPreviews (Current.VisibleFrames);
}
break;
case GDK_BUTTON_RELEASE:
if (!Current.RealTime)
{
fp_range_preview_spill (AW.rangePreview, Current.ValueBy);
update_range_labels ();
fp_create_smoothness_graph (AW.aliasingPreview);
refreshPreviews (Current.VisibleFrames);
}
break;
case GDK_MOTION_NOTIFY:
mevent = (GdkEventMotion *) event;
gdk_window_get_pointer (widget->window, &x, NULL, NULL);
if (x >= 0 && x < 256)
{
slider_erase (AW.aliasingGraph->window, *new);
*new = x;
draw_it (NULL);
if (Current.RealTime)
{
fp_range_preview_spill (AW.rangePreview, Current.ValueBy);
update_range_labels ();
fp_create_smoothness_graph (AW.aliasingPreview);
refreshPreviews (Current.VisibleFrames);
}
}
break;
default:
break;
}
return FALSE;
}
void
update_range_labels (void)
{
guchar buffer[3];
gtk_label_set_text (GTK_LABEL(Current.rangeLabels[1]),"0");
g_snprintf (buffer, sizeof (buffer), "%d", Current.Cutoffs[SHADOWS]);
gtk_label_set_text (GTK_LABEL (Current.rangeLabels[3]), buffer);
gtk_label_set_text (GTK_LABEL (Current.rangeLabels[5]), buffer);
g_snprintf (buffer, sizeof (buffer), "%d", Current.Cutoffs[MIDTONES]);
gtk_label_set_text (GTK_LABEL (Current.rangeLabels[7]), buffer);
gtk_label_set_text (GTK_LABEL (Current.rangeLabels[9]), buffer);
gtk_label_set_text (GTK_LABEL(Current.rangeLabels[11]), "255");
}