Updated with upstream update
This commit is contained in:
@ -92,17 +92,6 @@ typedef enum
|
||||
(e) == CURL_EDGE_UPPER_RIGHT)
|
||||
|
||||
|
||||
/***** Types *****/
|
||||
|
||||
typedef struct
|
||||
{
|
||||
CurlColors colors;
|
||||
gdouble opacity;
|
||||
gboolean shade;
|
||||
CurlEdge edge;
|
||||
CurlOrientation orientation;
|
||||
} CurlParams;
|
||||
|
||||
typedef struct _Pagecurl Pagecurl;
|
||||
typedef struct _PagecurlClass PagecurlClass;
|
||||
|
||||
@ -118,7 +107,7 @@ struct _PagecurlClass
|
||||
|
||||
|
||||
#define PAGECURL_TYPE (pagecurl_get_type ())
|
||||
#define PAGECURL (obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), PAGECURL_TYPE, Pagecurl))
|
||||
#define PAGECURL(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), PAGECURL_TYPE, Pagecurl))
|
||||
|
||||
GType pagecurl_get_type (void) G_GNUC_CONST;
|
||||
|
||||
@ -131,20 +120,22 @@ static PikaValueArray * pagecurl_run (PikaProcedure *procedu
|
||||
PikaImage *image,
|
||||
gint n_drawables,
|
||||
PikaDrawable **drawables,
|
||||
const PikaValueArray *args,
|
||||
PikaProcedureConfig *config,
|
||||
gpointer run_data);
|
||||
|
||||
static void dialog_scale_update (PikaLabelSpin *spin,
|
||||
gdouble *value);
|
||||
static gboolean dialog (PikaProcedure *procedure,
|
||||
PikaProcedureConfig *config);
|
||||
|
||||
static gboolean dialog (void);
|
||||
|
||||
static void init_calculation (PikaDrawable *drawable);
|
||||
static PikaLayer * do_curl_effect (PikaDrawable *drawable);
|
||||
static void clear_curled_region (PikaDrawable *drawable);
|
||||
static PikaLayer * page_curl (PikaDrawable *drawable);
|
||||
static PikaRGB * get_gradient_samples (PikaDrawable *drawable,
|
||||
gboolean reverse);
|
||||
static void init_calculation (PikaDrawable *drawable,
|
||||
PikaProcedureConfig *config);
|
||||
static PikaLayer * do_curl_effect (PikaDrawable *drawable,
|
||||
PikaProcedureConfig *config);
|
||||
static void clear_curled_region (PikaDrawable *drawable,
|
||||
PikaProcedureConfig *config);
|
||||
static PikaLayer * page_curl (PikaDrawable *drawable,
|
||||
PikaProcedureConfig *config);
|
||||
static PikaRGB * get_gradient_samples (PikaDrawable *drawable,
|
||||
gboolean reverse);
|
||||
|
||||
|
||||
G_DEFINE_TYPE (Pagecurl, pagecurl, PIKA_TYPE_PLUG_IN)
|
||||
@ -153,16 +144,10 @@ PIKA_MAIN (PAGECURL_TYPE)
|
||||
DEFINE_STD_SET_I18N
|
||||
|
||||
|
||||
/***** Variables *****/
|
||||
|
||||
static CurlParams curl;
|
||||
|
||||
/* Image parameters */
|
||||
|
||||
static PikaImage *image = NULL;
|
||||
|
||||
static GtkWidget *curl_image = NULL;
|
||||
|
||||
static gint sel_x, sel_y;
|
||||
static gint true_sel_width, true_sel_height;
|
||||
static gint sel_width, sel_height;
|
||||
@ -240,34 +225,46 @@ pagecurl_create_procedure (PikaPlugIn *plug_in,
|
||||
"Federico Mena Quintero and Simon Budig",
|
||||
PLUG_IN_VERSION);
|
||||
|
||||
PIKA_PROC_ARG_INT (procedure, "colors",
|
||||
"Colors",
|
||||
"FG- and BG-Color (0), Current gradient (1), "
|
||||
"Current gradient reversed (2)",
|
||||
CURL_COLORS_FG_BG, CURL_COLORS_LAST, CURL_COLORS_FG_BG,
|
||||
G_PARAM_READWRITE);
|
||||
PIKA_PROC_ARG_CHOICE (procedure, "colors",
|
||||
_("Colors"), NULL,
|
||||
pika_choice_new_with_values ("fg-bg", CURL_COLORS_FG_BG, _("Foreground / background colors"), NULL,
|
||||
"current-gradient", CURL_COLORS_GRADIENT, _("Current gradient"), NULL,
|
||||
"current-gradient-reversed", CURL_COLORS_GRADIENT_REVERSE, _("Current gradient (reversed)"), NULL,
|
||||
NULL),
|
||||
"fg-bg",
|
||||
G_PARAM_READWRITE);
|
||||
|
||||
PIKA_PROC_ARG_INT (procedure, "edge",
|
||||
"Edge",
|
||||
"Edge to curl (1-4, clockwise, starting in the "
|
||||
"lower right edge)",
|
||||
CURL_EDGE_LOWER_RIGHT, CURL_EDGE_UPPER_RIGHT,
|
||||
CURL_EDGE_LOWER_RIGHT,
|
||||
G_PARAM_READWRITE);
|
||||
PIKA_PROC_ARG_CHOICE (procedure, "edge",
|
||||
_("Locatio_n"),
|
||||
_("Corner which is curled"),
|
||||
pika_choice_new_with_values ("upper-left", CURL_EDGE_UPPER_LEFT, _("Upper left"), NULL,
|
||||
"upper-right", CURL_EDGE_UPPER_RIGHT, _("Upper right"), NULL,
|
||||
"lower-left", CURL_EDGE_LOWER_LEFT, _("Lower left"), NULL,
|
||||
"lower-right", CURL_EDGE_LOWER_RIGHT, _("Lower right"), NULL,
|
||||
NULL),
|
||||
"lower-right",
|
||||
G_PARAM_READWRITE);
|
||||
|
||||
PIKA_PROC_ARG_INT (procedure, "orientation",
|
||||
"Orientation",
|
||||
"Vertical (0), Horizontal (1)",
|
||||
CURL_ORIENTATION_VERTICAL, CURL_ORIENTATION_HORIZONTAL,
|
||||
CURL_ORIENTATION_VERTICAL,
|
||||
G_PARAM_READWRITE);
|
||||
PIKA_PROC_ARG_CHOICE (procedure, "orientation",
|
||||
_("Or_ientation"), NULL,
|
||||
pika_choice_new_with_values ("vertical", CURL_ORIENTATION_VERTICAL, _("Vertical"), NULL,
|
||||
"horizontal", CURL_ORIENTATION_HORIZONTAL, _("Horizontal"), NULL,
|
||||
NULL),
|
||||
"vertical",
|
||||
G_PARAM_READWRITE);
|
||||
|
||||
PIKA_PROC_ARG_BOOLEAN (procedure, "shade",
|
||||
"Shade",
|
||||
"Shade the region under the curl",
|
||||
_("Sh_ade"),
|
||||
_("Shade the region under the curl"),
|
||||
TRUE,
|
||||
G_PARAM_READWRITE);
|
||||
|
||||
PIKA_PROC_ARG_DOUBLE (procedure, "opacity",
|
||||
_("Opaci_ty"),
|
||||
_("Opacity"),
|
||||
0.0, 1.0, 0.0,
|
||||
PIKA_PARAM_READWRITE);
|
||||
|
||||
PIKA_PROC_VAL_LAYER (procedure, "curl-layer",
|
||||
"Curl layer",
|
||||
"The new layer with the curl.",
|
||||
@ -284,7 +281,7 @@ pagecurl_run (PikaProcedure *procedure,
|
||||
PikaImage *_image,
|
||||
gint n_drawables,
|
||||
PikaDrawable **drawables,
|
||||
const PikaValueArray *args,
|
||||
PikaProcedureConfig *config,
|
||||
gpointer run_data)
|
||||
{
|
||||
PikaDrawable *drawable;
|
||||
@ -311,11 +308,6 @@ pagecurl_run (PikaProcedure *procedure,
|
||||
drawable = drawables[0];
|
||||
}
|
||||
|
||||
curl.colors = PIKA_VALUES_GET_INT (args, 0);
|
||||
curl.edge = PIKA_VALUES_GET_INT (args, 1);
|
||||
curl.orientation = PIKA_VALUES_GET_INT (args, 2);
|
||||
curl.shade = PIKA_VALUES_GET_BOOLEAN (args, 3);
|
||||
|
||||
if (! pika_drawable_mask_intersect (drawable, &sel_x, &sel_y,
|
||||
&true_sel_width, &true_sel_height))
|
||||
{
|
||||
@ -332,42 +324,19 @@ pagecurl_run (PikaProcedure *procedure,
|
||||
NULL);
|
||||
}
|
||||
|
||||
switch (run_mode)
|
||||
{
|
||||
case PIKA_RUN_INTERACTIVE:
|
||||
/* Possibly retrieve data */
|
||||
pika_get_data (PLUG_IN_PROC, &curl);
|
||||
|
||||
/* First acquire information with a dialog */
|
||||
if (! dialog ())
|
||||
return pika_procedure_new_return_values (procedure,
|
||||
PIKA_PDB_CANCEL,
|
||||
NULL);
|
||||
break;
|
||||
|
||||
case PIKA_RUN_NONINTERACTIVE:
|
||||
break;
|
||||
|
||||
case PIKA_RUN_WITH_LAST_VALS:
|
||||
/* Possibly retrieve data */
|
||||
pika_get_data (PLUG_IN_PROC, &curl);
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
if (run_mode == PIKA_RUN_INTERACTIVE && ! dialog (procedure, config))
|
||||
return pika_procedure_new_return_values (procedure,
|
||||
PIKA_PDB_CANCEL,
|
||||
NULL);
|
||||
|
||||
return_vals = pika_procedure_new_return_values (procedure, PIKA_PDB_SUCCESS,
|
||||
NULL);
|
||||
|
||||
PIKA_VALUES_SET_LAYER (return_vals, 1, page_curl (drawable));
|
||||
PIKA_VALUES_SET_LAYER (return_vals, 1, page_curl (drawable, config));
|
||||
|
||||
if (run_mode != PIKA_RUN_NONINTERACTIVE)
|
||||
pika_displays_flush ();
|
||||
|
||||
if (run_mode == PIKA_RUN_INTERACTIVE)
|
||||
pika_set_data (PLUG_IN_PROC, &curl, sizeof (CurlParams));
|
||||
|
||||
return return_vals;
|
||||
}
|
||||
|
||||
@ -437,20 +406,18 @@ inside_circle (gdouble x,
|
||||
/********************************************************************/
|
||||
|
||||
static void
|
||||
dialog_scale_update (PikaLabelSpin *scale,
|
||||
gdouble *value)
|
||||
curl_pixbuf_update (PikaProcedureConfig *config,
|
||||
const GParamSpec *pspec,
|
||||
GtkWidget *curl_image)
|
||||
{
|
||||
*value = ((gdouble) pika_label_spin_get_value (scale)) / 100.0;
|
||||
}
|
||||
GdkPixbuf *pixbuf;
|
||||
gint index;
|
||||
gchar *resource;
|
||||
CurlEdge edge;
|
||||
CurlOrientation orientation;
|
||||
|
||||
static void
|
||||
curl_pixbuf_update (void)
|
||||
{
|
||||
GdkPixbuf *pixbuf;
|
||||
gint index;
|
||||
gchar *resource;
|
||||
|
||||
switch (curl.edge)
|
||||
edge = pika_procedure_config_get_choice_id (PIKA_PROCEDURE_CONFIG (config), "edge");
|
||||
switch (edge)
|
||||
{
|
||||
case CURL_EDGE_LOWER_RIGHT: index = 0; break;
|
||||
case CURL_EDGE_LOWER_LEFT: index = 1; break;
|
||||
@ -460,7 +427,8 @@ curl_pixbuf_update (void)
|
||||
return;
|
||||
}
|
||||
|
||||
index += curl.orientation * 4;
|
||||
orientation = pika_procedure_config_get_choice_id (PIKA_PROCEDURE_CONFIG (config), "orientation");
|
||||
index += orientation * 4;
|
||||
|
||||
resource = g_strdup_printf ("/technology.heckin/pagecurl-icons/curl%c.png",
|
||||
'0' + index);
|
||||
@ -472,193 +440,37 @@ curl_pixbuf_update (void)
|
||||
}
|
||||
|
||||
static gboolean
|
||||
dialog (void)
|
||||
dialog (PikaProcedure *procedure,
|
||||
PikaProcedureConfig *config)
|
||||
{
|
||||
/* Missing options: Color-dialogs? / own curl layer ? / transparency
|
||||
to original drawable / Warp-curl (unsupported yet) */
|
||||
|
||||
GtkWidget *dialog;
|
||||
GtkWidget *hbox;
|
||||
GtkWidget *vbox;
|
||||
GtkWidget *grid;
|
||||
GtkWidget *frame;
|
||||
GtkWidget *button;
|
||||
GtkWidget *combo;
|
||||
GtkWidget *scale;
|
||||
GtkWidget *curl_image;
|
||||
gboolean run;
|
||||
|
||||
pika_ui_init (PLUG_IN_BINARY);
|
||||
|
||||
dialog = pika_dialog_new (_("Pagecurl Effect"), PLUG_IN_ROLE,
|
||||
NULL, 0,
|
||||
pika_standard_help_func, PLUG_IN_PROC,
|
||||
dialog = pika_procedure_dialog_new (procedure,
|
||||
PIKA_PROCEDURE_CONFIG (config),
|
||||
_("Pagecurl Effect"));
|
||||
|
||||
_("_Cancel"), GTK_RESPONSE_CANCEL,
|
||||
_("_OK"), GTK_RESPONSE_OK,
|
||||
|
||||
NULL);
|
||||
|
||||
pika_dialog_set_alternative_button_order (GTK_DIALOG (dialog),
|
||||
GTK_RESPONSE_OK,
|
||||
GTK_RESPONSE_CANCEL,
|
||||
-1);
|
||||
|
||||
pika_window_set_transient (GTK_WINDOW (dialog));
|
||||
|
||||
vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 12);
|
||||
gtk_container_set_border_width (GTK_CONTAINER (vbox), 12);
|
||||
gtk_box_pack_start (GTK_BOX (gtk_dialog_get_content_area (GTK_DIALOG (dialog))),
|
||||
vbox, TRUE, TRUE, 0);
|
||||
gtk_widget_show (vbox);
|
||||
|
||||
frame = pika_frame_new (_("Curl Location"));
|
||||
gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
|
||||
gtk_widget_show (frame);
|
||||
|
||||
grid = gtk_grid_new ();
|
||||
gtk_grid_set_row_spacing (GTK_GRID (grid), 6);
|
||||
gtk_grid_set_column_spacing (GTK_GRID (grid), 6);
|
||||
gtk_container_add (GTK_CONTAINER (frame), grid);
|
||||
gtk_widget_show (grid);
|
||||
pika_procedure_dialog_get_spin_scale (PIKA_PROCEDURE_DIALOG (dialog), "opacity", 100.0);
|
||||
pika_procedure_dialog_fill (PIKA_PROCEDURE_DIALOG (dialog),
|
||||
"edge", "orientation", "shade", "colors", "opacity", NULL);
|
||||
|
||||
curl_image = gtk_image_new ();
|
||||
|
||||
gtk_grid_attach (GTK_GRID (grid), curl_image, 0, 1, 2, 1);
|
||||
gtk_box_pack_start (GTK_BOX (gtk_dialog_get_content_area (GTK_DIALOG (dialog))),
|
||||
curl_image, FALSE, FALSE, 0);
|
||||
gtk_widget_show (curl_image);
|
||||
|
||||
curl_pixbuf_update ();
|
||||
g_signal_connect (config, "notify",
|
||||
G_CALLBACK (curl_pixbuf_update),
|
||||
curl_image);
|
||||
curl_pixbuf_update (config, NULL, curl_image);
|
||||
|
||||
{
|
||||
static const gchar *name[] =
|
||||
{
|
||||
N_("Lower right"),
|
||||
N_("Lower left"),
|
||||
N_("Upper left"),
|
||||
N_("Upper right")
|
||||
};
|
||||
gint i;
|
||||
|
||||
button = NULL;
|
||||
for (i = CURL_EDGE_FIRST; i <= CURL_EDGE_LAST; i++)
|
||||
{
|
||||
button =
|
||||
gtk_radio_button_new_with_label (button == NULL ?
|
||||
NULL :
|
||||
gtk_radio_button_get_group (GTK_RADIO_BUTTON (button)),
|
||||
gettext (name[i - CURL_EDGE_FIRST]));
|
||||
|
||||
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button),
|
||||
curl.edge == i);
|
||||
|
||||
g_object_set_data (G_OBJECT (button),
|
||||
"pika-item-data", GINT_TO_POINTER (i));
|
||||
|
||||
gtk_grid_attach (GTK_GRID (grid), button,
|
||||
CURL_EDGE_LEFT (i) ? 0 : 1,
|
||||
CURL_EDGE_UPPER (i) ? 0 : 2,
|
||||
1, 1);
|
||||
// GTK_FILL | GTK_EXPAND, GTK_SHRINK, 0, 0);
|
||||
gtk_widget_show (button);
|
||||
|
||||
g_signal_connect (button, "toggled",
|
||||
G_CALLBACK (pika_radio_button_update),
|
||||
&curl.edge);
|
||||
|
||||
g_signal_connect (button, "toggled",
|
||||
G_CALLBACK (curl_pixbuf_update),
|
||||
NULL);
|
||||
}
|
||||
}
|
||||
|
||||
frame = pika_frame_new (_("Curl Orientation"));
|
||||
gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
|
||||
gtk_widget_show (frame);
|
||||
|
||||
hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 6);
|
||||
gtk_box_set_homogeneous (GTK_BOX (hbox), TRUE);
|
||||
gtk_container_add (GTK_CONTAINER (frame), hbox);
|
||||
gtk_widget_show (hbox);
|
||||
|
||||
{
|
||||
static const gchar *name[] =
|
||||
{
|
||||
N_("_Vertical"),
|
||||
N_("_Horizontal")
|
||||
};
|
||||
gint i;
|
||||
|
||||
button = NULL;
|
||||
for (i = 0; i <= CURL_ORIENTATION_LAST; i++)
|
||||
{
|
||||
button = gtk_radio_button_new_with_mnemonic (button == NULL ?
|
||||
NULL :
|
||||
gtk_radio_button_get_group (GTK_RADIO_BUTTON (button)),
|
||||
gettext (name[i]));
|
||||
|
||||
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button),
|
||||
curl.orientation == i);
|
||||
|
||||
g_object_set_data (G_OBJECT (button),
|
||||
"pika-item-data", GINT_TO_POINTER (i));
|
||||
|
||||
gtk_box_pack_end (GTK_BOX (hbox), button, TRUE, TRUE, 0);
|
||||
gtk_widget_show (button);
|
||||
|
||||
g_signal_connect (button, "toggled",
|
||||
G_CALLBACK (pika_radio_button_update),
|
||||
&curl.orientation);
|
||||
|
||||
g_signal_connect (button, "toggled",
|
||||
G_CALLBACK (curl_pixbuf_update),
|
||||
NULL);
|
||||
}
|
||||
}
|
||||
|
||||
button = gtk_check_button_new_with_mnemonic (_("_Shade under curl"));
|
||||
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), curl.shade);
|
||||
gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
|
||||
gtk_widget_show (button);
|
||||
|
||||
g_signal_connect (button, "toggled",
|
||||
G_CALLBACK (pika_toggle_button_update),
|
||||
&curl.shade);
|
||||
|
||||
combo = g_object_new (PIKA_TYPE_INT_COMBO_BOX, NULL);
|
||||
|
||||
pika_int_combo_box_prepend (PIKA_INT_COMBO_BOX (combo),
|
||||
PIKA_INT_STORE_VALUE, CURL_COLORS_GRADIENT_REVERSE,
|
||||
PIKA_INT_STORE_LABEL, _("Current gradient (reversed)"),
|
||||
PIKA_INT_STORE_ICON_NAME, PIKA_ICON_GRADIENT,
|
||||
-1);
|
||||
pika_int_combo_box_prepend (PIKA_INT_COMBO_BOX (combo),
|
||||
PIKA_INT_STORE_VALUE, CURL_COLORS_GRADIENT,
|
||||
PIKA_INT_STORE_LABEL, _("Current gradient"),
|
||||
PIKA_INT_STORE_ICON_NAME, PIKA_ICON_GRADIENT,
|
||||
-1);
|
||||
pika_int_combo_box_prepend (PIKA_INT_COMBO_BOX (combo),
|
||||
PIKA_INT_STORE_VALUE, CURL_COLORS_FG_BG,
|
||||
PIKA_INT_STORE_LABEL, _("Foreground / background colors"),
|
||||
PIKA_INT_STORE_ICON_NAME, PIKA_ICON_COLORS_DEFAULT,
|
||||
-1);
|
||||
|
||||
gtk_box_pack_start (GTK_BOX (vbox), combo, FALSE, FALSE, 0);
|
||||
gtk_widget_show (combo);
|
||||
|
||||
pika_int_combo_box_connect (PIKA_INT_COMBO_BOX (combo),
|
||||
curl.colors,
|
||||
G_CALLBACK (pika_int_combo_box_get_active),
|
||||
&curl.colors, NULL);
|
||||
|
||||
scale = pika_scale_entry_new (_("_Opacity:"), curl.opacity * 100.0, 0.0, 100.0, 0.0);
|
||||
g_signal_connect (scale, "value-changed",
|
||||
G_CALLBACK (dialog_scale_update),
|
||||
&curl.opacity);
|
||||
gtk_box_pack_start (GTK_BOX (vbox), scale, FALSE, FALSE, 6);
|
||||
gtk_widget_show (scale);
|
||||
|
||||
gtk_widget_show (dialog);
|
||||
|
||||
run = (pika_dialog_run (PIKA_DIALOG (dialog)) == GTK_RESPONSE_OK);
|
||||
run = pika_procedure_dialog_run (PIKA_PROCEDURE_DIALOG (dialog));
|
||||
|
||||
gtk_widget_destroy (dialog);
|
||||
|
||||
@ -666,13 +478,17 @@ dialog (void)
|
||||
}
|
||||
|
||||
static void
|
||||
init_calculation (PikaDrawable *drawable)
|
||||
init_calculation (PikaDrawable *drawable,
|
||||
PikaProcedureConfig *config)
|
||||
{
|
||||
gdouble k;
|
||||
gdouble alpha, beta;
|
||||
gdouble angle;
|
||||
PikaVector2 v1, v2;
|
||||
GList *layers;
|
||||
gdouble k;
|
||||
gdouble alpha, beta;
|
||||
gdouble angle;
|
||||
PikaVector2 v1, v2;
|
||||
GList *layers;
|
||||
CurlOrientation orientation;
|
||||
|
||||
orientation = pika_procedure_config_get_choice_id (PIKA_PROCEDURE_CONFIG (config), "orientation");
|
||||
|
||||
pika_layer_add_alpha (PIKA_LAYER (drawable));
|
||||
|
||||
@ -683,7 +499,7 @@ init_calculation (PikaDrawable *drawable)
|
||||
drawable_position = g_list_index (layers, drawable);
|
||||
g_list_free (layers);
|
||||
|
||||
switch (curl.orientation)
|
||||
switch (orientation)
|
||||
{
|
||||
case CURL_ORIENTATION_VERTICAL:
|
||||
sel_width = true_sel_width;
|
||||
@ -736,23 +552,38 @@ init_calculation (PikaDrawable *drawable)
|
||||
}
|
||||
|
||||
static PikaLayer *
|
||||
do_curl_effect (PikaDrawable *drawable)
|
||||
do_curl_effect (PikaDrawable *drawable,
|
||||
PikaProcedureConfig *config)
|
||||
{
|
||||
gint x = 0;
|
||||
gint y = 0;
|
||||
gboolean color_image;
|
||||
gint x1, y1;
|
||||
guint progress, max_progress;
|
||||
gdouble intensity, alpha;
|
||||
PikaVector2 v, dl, dr;
|
||||
gdouble dl_mag, dr_mag, angle, factor;
|
||||
GeglBuffer *curl_buffer;
|
||||
PikaLayer *curl_layer;
|
||||
PikaRGB *grad_samples = NULL;
|
||||
gint width, height, n_ch;
|
||||
GeglRectangle *roi;
|
||||
gint x = 0;
|
||||
gint y = 0;
|
||||
gboolean color_image;
|
||||
gint x1, y1;
|
||||
guint progress, max_progress;
|
||||
gdouble intensity, alpha;
|
||||
PikaVector2 v, dl, dr;
|
||||
gdouble dl_mag, dr_mag, angle, factor;
|
||||
GeglBuffer *curl_buffer;
|
||||
PikaLayer *curl_layer;
|
||||
PikaRGB *grad_samples = NULL;
|
||||
gint width, height, n_ch;
|
||||
GeglRectangle *roi;
|
||||
GeglBufferIterator *iter;
|
||||
const Babl *format;
|
||||
CurlOrientation orientation;
|
||||
CurlColors colors;
|
||||
CurlEdge edge;
|
||||
gboolean shade;
|
||||
gdouble opacity;
|
||||
|
||||
orientation = pika_procedure_config_get_choice_id (PIKA_PROCEDURE_CONFIG (config), "orientation");
|
||||
colors = pika_procedure_config_get_choice_id (PIKA_PROCEDURE_CONFIG (config), "colors");
|
||||
edge = pika_procedure_config_get_choice_id (PIKA_PROCEDURE_CONFIG (config), "edge");
|
||||
|
||||
g_object_get (config,
|
||||
"shade", &shade,
|
||||
"opacity", &opacity,
|
||||
NULL);
|
||||
|
||||
color_image = pika_drawable_is_rgb (drawable);
|
||||
|
||||
@ -795,7 +626,7 @@ do_curl_effect (PikaDrawable *drawable)
|
||||
alpha = acos (pika_vector2_inner_product (&dl, &dr) / (dl_mag * dr_mag));
|
||||
|
||||
/* Gradient Samples */
|
||||
switch (curl.colors)
|
||||
switch (colors)
|
||||
{
|
||||
case CURL_COLORS_FG_BG:
|
||||
break;
|
||||
@ -825,16 +656,16 @@ do_curl_effect (PikaDrawable *drawable)
|
||||
for (x1 = roi->x; x1 < roi->x + roi->width; x1++)
|
||||
{
|
||||
/* Map coordinates to get the curl correct... */
|
||||
switch (curl.orientation)
|
||||
switch (orientation)
|
||||
{
|
||||
case CURL_ORIENTATION_VERTICAL:
|
||||
x = CURL_EDGE_RIGHT (curl.edge) ? x1 : sel_width - 1 - x1;
|
||||
y = CURL_EDGE_UPPER (curl.edge) ? y1 : sel_height - 1 - y1;
|
||||
x = CURL_EDGE_RIGHT (edge) ? x1 : sel_width - 1 - x1;
|
||||
y = CURL_EDGE_UPPER (edge) ? y1 : sel_height - 1 - y1;
|
||||
break;
|
||||
|
||||
case CURL_ORIENTATION_HORIZONTAL:
|
||||
x = CURL_EDGE_LOWER (curl.edge) ? y1 : sel_width - 1 - y1;
|
||||
y = CURL_EDGE_LEFT (curl.edge) ? x1 : sel_height - 1 - x1;
|
||||
x = CURL_EDGE_LOWER (edge) ? y1 : sel_width - 1 - y1;
|
||||
y = CURL_EDGE_LEFT (edge) ? x1 : sel_height - 1 - x1;
|
||||
break;
|
||||
}
|
||||
|
||||
@ -861,14 +692,14 @@ do_curl_effect (PikaDrawable *drawable)
|
||||
{
|
||||
/* Below the curl. */
|
||||
factor = angle / alpha;
|
||||
pika_rgba_set (&color, 0, 0, 0, curl.shade ? factor : 0);
|
||||
pika_rgba_set (&color, 0, 0, 0, shade ? factor : 0);
|
||||
}
|
||||
else
|
||||
{
|
||||
PikaRGB *gradrgb;
|
||||
|
||||
/* On the curl */
|
||||
switch (curl.colors)
|
||||
switch (colors)
|
||||
{
|
||||
case CURL_COLORS_FG_BG:
|
||||
intensity = pow (sin (G_PI * angle / alpha), 1.5);
|
||||
@ -876,7 +707,7 @@ do_curl_effect (PikaDrawable *drawable)
|
||||
intensity * bg_color.r + (1.0 - intensity) * fg_color.r,
|
||||
intensity * bg_color.g + (1.0 - intensity) * fg_color.g,
|
||||
intensity * bg_color.b + (1.0 - intensity) * fg_color.b,
|
||||
(1.0 - intensity * (1.0 - curl.opacity)));
|
||||
(1.0 - intensity * (1.0 - opacity)));
|
||||
break;
|
||||
|
||||
case CURL_COLORS_GRADIENT:
|
||||
@ -889,7 +720,7 @@ do_curl_effect (PikaDrawable *drawable)
|
||||
/* Check boundaries */
|
||||
intensity = CLAMP (intensity, 0.0, 1.0);
|
||||
color = *gradrgb;
|
||||
color.a = gradrgb->a * (1.0 - intensity * (1.0 - curl.opacity));
|
||||
color.a = gradrgb->a * (1.0 - intensity * (1.0 - opacity));
|
||||
break;
|
||||
}
|
||||
}
|
||||
@ -920,20 +751,26 @@ do_curl_effect (PikaDrawable *drawable)
|
||||
/************************************************/
|
||||
|
||||
static void
|
||||
clear_curled_region (PikaDrawable *drawable)
|
||||
clear_curled_region (PikaDrawable *drawable,
|
||||
PikaProcedureConfig *config)
|
||||
{
|
||||
gint x = 0;
|
||||
gint y = 0;
|
||||
guint x1, y1;
|
||||
gfloat *dest, *src;
|
||||
guint progress, max_progress;
|
||||
GeglBuffer *buf;
|
||||
GeglBuffer *shadow_buf;
|
||||
GeglRectangle *roi;
|
||||
gint x = 0;
|
||||
gint y = 0;
|
||||
guint x1, y1;
|
||||
gfloat *dest, *src;
|
||||
guint progress, max_progress;
|
||||
GeglBuffer *buf;
|
||||
GeglBuffer *shadow_buf;
|
||||
GeglRectangle *roi;
|
||||
GeglBufferIterator *iter;
|
||||
const Babl *format;
|
||||
gint width, height, bpp, n_ch;
|
||||
gint buf_index;
|
||||
const Babl *format;
|
||||
gint width, height, bpp, n_ch;
|
||||
gint buf_index;
|
||||
CurlOrientation orientation;
|
||||
CurlEdge edge;
|
||||
|
||||
orientation = pika_procedure_config_get_choice_id (PIKA_PROCEDURE_CONFIG (config), "orientation");
|
||||
edge = pika_procedure_config_get_choice_id (PIKA_PROCEDURE_CONFIG (config), "edge");
|
||||
|
||||
max_progress = 2 * sel_width * sel_height;
|
||||
progress = max_progress / 2;
|
||||
@ -968,19 +805,19 @@ clear_curled_region (PikaDrawable *drawable)
|
||||
for (x1 = roi->x; x1 < roi->x + roi->width; x1++)
|
||||
{
|
||||
/* Map coordinates to get the curl correct... */
|
||||
switch (curl.orientation)
|
||||
switch (orientation)
|
||||
{
|
||||
case CURL_ORIENTATION_VERTICAL:
|
||||
x = (CURL_EDGE_RIGHT (curl.edge) ?
|
||||
x = (CURL_EDGE_RIGHT (edge) ?
|
||||
x1 - sel_x : sel_width - 1 - (x1 - sel_x));
|
||||
y = (CURL_EDGE_UPPER (curl.edge) ?
|
||||
y = (CURL_EDGE_UPPER (edge) ?
|
||||
y1 - sel_y : sel_height - 1 - (y1 - sel_y));
|
||||
break;
|
||||
|
||||
case CURL_ORIENTATION_HORIZONTAL:
|
||||
x = (CURL_EDGE_LOWER (curl.edge) ?
|
||||
x = (CURL_EDGE_LOWER (edge) ?
|
||||
y1 - sel_y : sel_width - 1 - (y1 - sel_y));
|
||||
y = (CURL_EDGE_LEFT (curl.edge) ?
|
||||
y = (CURL_EDGE_LEFT (edge) ?
|
||||
x1 - sel_x : sel_height - 1 - (x1 - sel_x));
|
||||
break;
|
||||
}
|
||||
@ -1015,7 +852,8 @@ clear_curled_region (PikaDrawable *drawable)
|
||||
}
|
||||
|
||||
static PikaLayer *
|
||||
page_curl (PikaDrawable *drawable)
|
||||
page_curl (PikaDrawable *drawable,
|
||||
PikaProcedureConfig *config)
|
||||
{
|
||||
PikaLayer *curl_layer;
|
||||
|
||||
@ -1023,11 +861,11 @@ page_curl (PikaDrawable *drawable)
|
||||
|
||||
pika_progress_init (_("Page Curl"));
|
||||
|
||||
init_calculation (drawable);
|
||||
init_calculation (drawable, config);
|
||||
|
||||
curl_layer = do_curl_effect (drawable);
|
||||
curl_layer = do_curl_effect (drawable, config);
|
||||
|
||||
clear_curled_region (drawable);
|
||||
clear_curled_region (drawable, config);
|
||||
|
||||
pika_image_undo_group_end (image);
|
||||
|
||||
|
Reference in New Issue
Block a user