gimp/plug-ins/fp/fp_gdk.c

161 lines
3.8 KiB
C

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include "gtk/gtk.h"
#include "libgimp/gimp.h"
#include "fp.h"
#include "fp_hsv.h"
extern AdvancedWindow AW;
extern FP_Params Current;
extern gint nudgeArray[256];
void
draw_slider(GdkWindow *window,
GdkGC *border_gc,
GdkGC *fill_gc,
int xpos)
{
int i;
for (i = 0; i < RANGE_HEIGHT; i++)
gdk_draw_line(window, fill_gc,xpos-i/2, i,xpos+i/2,i);
gdk_draw_line(window, border_gc, xpos, 0,
xpos - (RANGE_HEIGHT - 1) / 2, RANGE_HEIGHT - 1);
gdk_draw_line(window, border_gc, xpos, 0,
xpos + (RANGE_HEIGHT - 1) / 2, RANGE_HEIGHT - 1);
gdk_draw_line(window, border_gc,xpos-(RANGE_HEIGHT-1)/2,RANGE_HEIGHT-1,
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_NORMAL],
Current.Offset);
}
void
slider_erase (GdkWindow *window,
int xpos)
{
gdk_window_clear_area (window, xpos - (RANGE_HEIGHT - 1) / 2, 0,
RANGE_HEIGHT, RANGE_HEIGHT);
}
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);
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 0;
}
void
update_range_labels()
{
guchar buffer[3];
gtk_label_set(GTK_LABEL(Current.rangeLabels[1]),"0");
sprintf(buffer,"%d",Current.Cutoffs[SHADOWS]);
gtk_label_set(GTK_LABEL(Current.rangeLabels[3]),buffer);
gtk_label_set(GTK_LABEL(Current.rangeLabels[5]),buffer);
sprintf(buffer,"%d",Current.Cutoffs[MIDTONES]);
gtk_label_set(GTK_LABEL(Current.rangeLabels[7]),buffer);
gtk_label_set(GTK_LABEL(Current.rangeLabels[9]),buffer);
gtk_label_set(GTK_LABEL(Current.rangeLabels[11]),"255");
}