index 196bf7e86d074bd8f49e1f7c9c536992e64d53dc..f6d3b030958859530d3f96b19157a2ab91df44fd 100644 (file)
* Clone tiling dialog
*
* Authors:
* Clone tiling dialog
*
* Authors:
- * bulia byak <buliabyak@users.sf.net>
+ * bulia byak <buliabyak@users.sf.net>
+ * Johan Engelen <goejendaagh@zonnet.nl>
*
*
- * Copyright (C) 2004-2005 Authors
+ * Copyright (C) 2004-2006 Authors
* Released under GNU GPL
*/
#ifdef HAVE_CONFIG_H
# include "config.h"
#endif
* Released under GNU GPL
*/
#ifdef HAVE_CONFIG_H
# include "config.h"
#endif
+#include <glib/gmem.h>
#include <gtk/gtk.h>
#include <glibmm/i18n.h>
#include <gtk/gtk.h>
#include <glibmm/i18n.h>
#include "ui/widget/color-picker.h"
#include "ui/widget/color-picker.h"
+#include "../sp-filter.h"
+#include "../filter-chemistry.h"
+
+#define MIN_ONSCREEN_DISTANCE 50
+
static GtkWidget *dlg = NULL;
static win_data wd;
static GtkWidget *dlg = NULL;
static win_data wd;
Inkscape::XML::Node *repr = inkscape_get_repr(INKSCAPE, prefs_path);
gchar c[32];
Inkscape::XML::Node *repr = inkscape_get_repr(INKSCAPE, prefs_path);
gchar c[32];
- sp_svg_write_color(c, 32, rgba);
+ sp_svg_write_color(c, sizeof(c), rgba);
repr->setAttribute("initial_color", c);
is_updating = false;
repr->setAttribute("initial_color", c);
is_updating = false;
@@ -183,7 +190,7 @@ clonetiler_change_selection (Inkscape::Application * /*inkscape*/, Inkscape::Sel
static void
clonetiler_external_change (Inkscape::Application * /*inkscape*/, GtkWidget *dlg)
{
static void
clonetiler_external_change (Inkscape::Application * /*inkscape*/, GtkWidget *dlg)
{
- clonetiler_change_selection (NULL, SP_DT_SELECTION(SP_ACTIVE_DESKTOP), dlg);
+ clonetiler_change_selection (NULL, sp_desktop_selection(SP_ACTIVE_DESKTOP), dlg);
}
static void clonetiler_disconnect_gsignal (GObject *widget, gpointer source) {
}
static void clonetiler_disconnect_gsignal (GObject *widget, gpointer source) {
NR::Matrix flip_x = NR::translate(-cx, -cy) * NR::scale (-1, 1) * NR::translate(cx, cy);
NR::Matrix flip_y = NR::translate(-cx, -cy) * NR::scale (1, -1) * NR::translate(cx, cy);
NR::Matrix flip_x = NR::translate(-cx, -cy) * NR::scale (-1, 1) * NR::translate(cx, cy);
NR::Matrix flip_y = NR::translate(-cx, -cy) * NR::scale (1, -1) * NR::translate(cx, cy);
- x = (int) pow ((double) x, d_per_x_exp);
- y = (int) pow ((double) y, d_per_y_exp);
-
switch (type) {
case TILE_P1:
switch (type) {
case TILE_P1:
case TILE_P4:
{
case TILE_P4:
{
- NR::Matrix ori (NR::translate ((w + h) * (x/2) + dx, (h + w) * (y/2) + dy));
+ NR::Matrix ori (NR::translate ((w + h) * pow((x/2), d_per_x_exp) + dx, (h + w) * pow((y/2), d_per_y_exp) + dy));
NR::Matrix dia1 (NR::translate (w/2 + h/2, -h/2 + w/2));
NR::Matrix dia2 (NR::translate (-w/2 + h/2, h/2 + w/2));
if (y % 2 == 0) {
NR::Matrix dia1 (NR::translate (w/2 + h/2, -h/2 + w/2));
NR::Matrix dia2 (NR::translate (-w/2 + h/2, h/2 + w/2));
if (y % 2 == 0) {
case TILE_P4M:
{
double max = MAX(w, h);
case TILE_P4M:
{
double max = MAX(w, h);
- NR::Matrix ori (NR::translate ((max + max) * (x/4) + dx, (max + max) * (y/2) + dy));
+ NR::Matrix ori (NR::translate ((max + max) * pow((x/4), d_per_x_exp) + dx, (max + max) * pow((y/2), d_per_y_exp) + dy));
NR::Matrix dia1 (NR::translate (w/2 - h/2, h/2 - w/2));
NR::Matrix dia2 (NR::translate (-h/2 + w/2, w/2 - h/2));
if (y % 2 == 0) {
NR::Matrix dia1 (NR::translate (w/2 - h/2, h/2 - w/2));
NR::Matrix dia2 (NR::translate (-h/2 + w/2, w/2 - h/2));
if (y % 2 == 0) {
case TILE_P4G:
{
double max = MAX(w, h);
case TILE_P4G:
{
double max = MAX(w, h);
- NR::Matrix ori (NR::translate ((max + max) * (x/4) + dx, (max + max) * y + dy));
+ NR::Matrix ori (NR::translate ((max + max) * pow((x/4), d_per_x_exp) + dx, (max + max) * pow(y, d_per_y_exp) + dy));
NR::Matrix dia1 (NR::translate (w/2 + h/2, h/2 - w/2));
NR::Matrix dia2 (NR::translate (-h/2 + w/2, w/2 + h/2));
if (((x/4) + y) % 2 == 0) {
NR::Matrix dia1 (NR::translate (w/2 + h/2, h/2 - w/2));
NR::Matrix dia2 (NR::translate (-h/2 + w/2, w/2 + h/2));
if (((x/4) + y) % 2 == 0) {
dia1 = NR::Matrix (NR::translate (h/2 * cos30, -(h/2 * sin30)));
dia2 = dia1 * NR::Matrix (NR::translate (0, h/2));
}
dia1 = NR::Matrix (NR::translate (h/2 * cos30, -(h/2 * sin30)));
dia2 = dia1 * NR::Matrix (NR::translate (0, h/2));
}
- NR::Matrix ori (NR::translate (width * (2*(x/3) + y%2) + dx, (height/2) * y + dy));
+ NR::Matrix ori (NR::translate (width * pow((2*(x/3) + y%2), d_per_x_exp) + dx, (height/2) * pow(y, d_per_y_exp) + dy));
if (x % 3 == 0) {
return d_s_r * ori;
} else if (x % 3 == 1) {
if (x % 3 == 0) {
return d_s_r * ori;
} else if (x % 3 == 1) {
NR::Matrix dia3;
NR::Matrix dia4;
if (w > h) {
NR::Matrix dia3;
NR::Matrix dia4;
if (w > h) {
- ori = NR::Matrix(NR::translate (w * (x/6) + w/2 * (y%2) + dx, (w * cos30) * y + dy));
+ ori = NR::Matrix(NR::translate (w * pow((x/6) + 1/2 * (y%2), d_per_x_exp) + dx, (w * cos30) * pow(y, d_per_y_exp) + dy));
dia1 = NR::Matrix (NR::translate (0, h/2) * NR::translate (w/2, 0) * NR::translate (w/2 * cos60, -w/2 * sin60) * NR::translate (-h/2 * cos30, -h/2 * sin30) );
dia2 = dia1 * NR::Matrix (NR::translate (h * cos30, h * sin30));
dia3 = dia2 * NR::Matrix (NR::translate (0, 2 * (w/2 * sin60 - h/2 * sin30)));
dia4 = dia3 * NR::Matrix (NR::translate (-h * cos30, h * sin30));
} else {
dia1 = NR::Matrix (NR::translate (0, h/2) * NR::translate (w/2, 0) * NR::translate (w/2 * cos60, -w/2 * sin60) * NR::translate (-h/2 * cos30, -h/2 * sin30) );
dia2 = dia1 * NR::Matrix (NR::translate (h * cos30, h * sin30));
dia3 = dia2 * NR::Matrix (NR::translate (0, 2 * (w/2 * sin60 - h/2 * sin30)));
dia4 = dia3 * NR::Matrix (NR::translate (-h * cos30, h * sin30));
} else {
- ori = NR::Matrix (NR::translate (2*h * cos30 * (x/6 + 0.5*(y%2)) + dx, (2*h - h * sin30) * y + dy));
+ ori = NR::Matrix (NR::translate (2*h * cos30 * pow((x/6 + 0.5*(y%2)), d_per_x_exp) + dx, (2*h - h * sin30) * pow(y, d_per_y_exp) + dy));
dia1 = NR::Matrix (NR::translate (0, -h/2) * NR::translate (h/2 * cos30, h/2 * sin30));
dia2 = dia1 * NR::Matrix (NR::translate (h * cos30, h * sin30));
dia3 = dia2 * NR::Matrix (NR::translate (0, h/2));
dia1 = NR::Matrix (NR::translate (0, -h/2) * NR::translate (h/2 * cos30, h/2 * sin30));
dia2 = dia1 * NR::Matrix (NR::translate (h * cos30, h * sin30));
dia3 = dia2 * NR::Matrix (NR::translate (0, h/2));
dia3 = dia2 * NR::Matrix (NR::translate (0, h/2));
dia4 = dia3 * NR::Matrix (NR::translate (-h * cos30, h * sin30));
}
dia3 = dia2 * NR::Matrix (NR::translate (0, h/2));
dia4 = dia3 * NR::Matrix (NR::translate (-h * cos30, h * sin30));
}
- NR::Matrix ori (NR::translate (width * (2*(x/6) + y%2) + dx, (height/2) * y + dy));
+ NR::Matrix ori (NR::translate (width * pow((2*(x/6) + y%2), d_per_x_exp) + dx, (height/2) * pow(y, d_per_y_exp) + dy));
if (x % 6 == 0) {
return d_s_r * ori;
} else if (x % 6 == 1) {
if (x % 6 == 0) {
return d_s_r * ori;
} else if (x % 6 == 1) {
NR::Matrix dia4;
NR::Matrix dia5;
if (w > h) {
NR::Matrix dia4;
NR::Matrix dia5;
if (w > h) {
- ori = NR::Matrix(NR::translate (2*w * (x/6) + w * (y%2) + dx, (2*w * sin60) * y + dy));
+ ori = NR::Matrix(NR::translate (w * pow((2*(x/6) + (y%2)), d_per_x_exp) + dx, (2*w * sin60) * pow(y, d_per_y_exp) + dy));
dia1 = NR::Matrix (NR::translate (w/2 * cos60, -w/2 * sin60));
dia2 = dia1 * NR::Matrix (NR::translate (w/2, 0));
dia3 = dia2 * NR::Matrix (NR::translate (w/2 * cos60, w/2 * sin60));
dia4 = dia3 * NR::Matrix (NR::translate (-w/2 * cos60, w/2 * sin60));
dia5 = dia4 * NR::Matrix (NR::translate (-w/2, 0));
} else {
dia1 = NR::Matrix (NR::translate (w/2 * cos60, -w/2 * sin60));
dia2 = dia1 * NR::Matrix (NR::translate (w/2, 0));
dia3 = dia2 * NR::Matrix (NR::translate (w/2 * cos60, w/2 * sin60));
dia4 = dia3 * NR::Matrix (NR::translate (-w/2 * cos60, w/2 * sin60));
dia5 = dia4 * NR::Matrix (NR::translate (-w/2, 0));
} else {
- ori = NR::Matrix(NR::translate (2*h * cos30 * (x/6 + 0.5*(y%2)) + dx, (h + h * sin30) * y + dy));
+ ori = NR::Matrix(NR::translate (2*h * cos30 * pow((x/6 + 0.5*(y%2)), d_per_x_exp) + dx, (h + h * sin30) * pow(y, d_per_y_exp) + dy));
dia1 = NR::Matrix (NR::translate (-w/2, -h/2) * NR::translate (h/2 * cos30, -h/2 * sin30) * NR::translate (w/2 * cos60, w/2 * sin60));
dia2 = dia1 * NR::Matrix (NR::translate (-w/2 * cos60, -w/2 * sin60) * NR::translate (h/2 * cos30, -h/2 * sin30) * NR::translate (h/2 * cos30, h/2 * sin30) * NR::translate (-w/2 * cos60, w/2 * sin60));
dia3 = dia2 * NR::Matrix (NR::translate (w/2 * cos60, -w/2 * sin60) * NR::translate (h/2 * cos30, h/2 * sin30) * NR::translate (-w/2, h/2));
dia1 = NR::Matrix (NR::translate (-w/2, -h/2) * NR::translate (h/2 * cos30, -h/2 * sin30) * NR::translate (w/2 * cos60, w/2 * sin60));
dia2 = dia1 * NR::Matrix (NR::translate (-w/2 * cos60, -w/2 * sin60) * NR::translate (h/2 * cos30, -h/2 * sin30) * NR::translate (h/2 * cos30, h/2 * sin30) * NR::translate (-w/2 * cos60, w/2 * sin60));
dia3 = dia2 * NR::Matrix (NR::translate (w/2 * cos60, -w/2 * sin60) * NR::translate (h/2 * cos30, h/2 * sin30) * NR::translate (-w/2, h/2));
NR::Matrix ori;
NR::Matrix dia1, dia2, dia3, dia4, dia5, dia6, dia7, dia8, dia9, dia10;
if (w > h) {
NR::Matrix ori;
NR::Matrix dia1, dia2, dia3, dia4, dia5, dia6, dia7, dia8, dia9, dia10;
if (w > h) {
- ori = NR::Matrix(NR::translate (2*w * (x/12) + w * (y%2) + dx, (2*w * sin60) * y + dy));
+ ori = NR::Matrix(NR::translate (w * pow((2*(x/12) + (y%2)), d_per_x_exp) + dx, (2*w * sin60) * pow(y, d_per_y_exp) + dy));
dia1 = NR::Matrix (NR::translate (w/2, h/2) * NR::translate (-w/2 * cos60, -w/2 * sin60) * NR::translate (-h/2 * cos30, h/2 * sin30));
dia2 = dia1 * NR::Matrix (NR::translate (h * cos30, -h * sin30));
dia3 = dia2 * NR::Matrix (NR::translate (-h/2 * cos30, h/2 * sin30) * NR::translate (w * cos60, 0) * NR::translate (-h/2 * cos30, -h/2 * sin30));
dia1 = NR::Matrix (NR::translate (w/2, h/2) * NR::translate (-w/2 * cos60, -w/2 * sin60) * NR::translate (-h/2 * cos30, h/2 * sin30));
dia2 = dia1 * NR::Matrix (NR::translate (h * cos30, -h * sin30));
dia3 = dia2 * NR::Matrix (NR::translate (-h/2 * cos30, h/2 * sin30) * NR::translate (w * cos60, 0) * NR::translate (-h/2 * cos30, -h/2 * sin30));
dia9 = dia6 * dia3.inverse();
dia10 = dia6 * dia4.inverse();
} else {
dia9 = dia6 * dia3.inverse();
dia10 = dia6 * dia4.inverse();
} else {
- ori = NR::Matrix(NR::translate (4*h * cos30 * (x/12 + 0.5*(y%2)) + dx, (2*h + 2*h * sin30) * y + dy));
+ ori = NR::Matrix(NR::translate (4*h * cos30 * pow((x/12 + 0.5*(y%2)), d_per_x_exp) + dx, (2*h + 2*h * sin30) * pow(y, d_per_y_exp) + dy));
dia1 = NR::Matrix (NR::translate (-w/2, -h/2) * NR::translate (h/2 * cos30, -h/2 * sin30) * NR::translate (w/2 * cos60, w/2 * sin60));
dia2 = dia1 * NR::Matrix (NR::translate (h * cos30, -h * sin30));
dia3 = dia2 * NR::Matrix (NR::translate (-w/2 * cos60, -w/2 * sin60) * NR::translate (h * cos30, 0) * NR::translate (-w/2 * cos60, w/2 * sin60));
dia1 = NR::Matrix (NR::translate (-w/2, -h/2) * NR::translate (h/2 * cos30, -h/2 * sin30) * NR::translate (w/2 * cos60, w/2 * sin60));
dia2 = dia1 * NR::Matrix (NR::translate (h * cos30, -h * sin30));
dia3 = dia2 * NR::Matrix (NR::translate (-w/2 * cos60, -w/2 * sin60) * NR::translate (h * cos30, 0) * NR::translate (-w/2 * cos60, w/2 * sin60));
int height = ibox.y1 - ibox.y0;
/* Set up pixblock */
int height = ibox.y1 - ibox.y0;
/* Set up pixblock */
- guchar *px = nr_new(guchar, 4 * width * height);
+ guchar *px = g_new(guchar, 4 * width * height);
+
+ if (px == NULL) {
+ return 0; // buffer is too big or too small, cannot pick, so return 0
+ }
+
memset(px, 0x00, 4 * width * height);
/* Render */
memset(px, 0x00, 4 * width * height);
/* Render */
nr_pixblock_setup_extern( &pb, NR_PIXBLOCK_MODE_R8G8B8A8N,
ibox.x0, ibox.y0, ibox.x1, ibox.y1,
px, 4 * width, FALSE, FALSE );
nr_pixblock_setup_extern( &pb, NR_PIXBLOCK_MODE_R8G8B8A8N,
ibox.x0, ibox.y0, ibox.x1, ibox.y1,
px, 4 * width, FALSE, FALSE );
- nr_arena_item_invoke_render( trace_root, &ibox, &pb,
+ nr_arena_item_invoke_render(NULL, trace_root, &ibox, &pb,
NR_ARENA_ITEM_RENDER_NO_CACHE );
double R = 0, G = 0, B = 0, A = 0;
NR_ARENA_ITEM_RENDER_NO_CACHE );
double R = 0, G = 0, B = 0, A = 0;
if (desktop == NULL)
return;
if (desktop == NULL)
return;
- Inkscape::Selection *selection = SP_DT_SELECTION(desktop);
+ Inkscape::Selection *selection = sp_desktop_selection(desktop);
// check if something is selected
if (selection->isEmpty() || g_slist_length((GSList *) selection->itemList()) > 1) {
// check if something is selected
if (selection->isEmpty() || g_slist_length((GSList *) selection->itemList()) > 1) {
- SP_DT_MSGSTACK(desktop)->flash(Inkscape::WARNING_MESSAGE, _("Select <b>one object</b> whose tiled clones to unclump."));
+ sp_desktop_message_stack(desktop)->flash(Inkscape::WARNING_MESSAGE, _("Select <b>one object</b> whose tiled clones to unclump."));
return;
}
return;
}
}
}
}
}
- sp_document_ensure_up_to_date(SP_DT_DOCUMENT(desktop));
+ sp_document_ensure_up_to_date(sp_desktop_document(desktop));
unclump (to_unclump);
g_slist_free (to_unclump);
unclump (to_unclump);
g_slist_free (to_unclump);
- sp_document_done (SP_DT_DOCUMENT (desktop));
+ sp_document_done (sp_desktop_document (desktop), SP_VERB_DIALOG_CLONETILER,
+ _("Unclump tiled clones"));
}
static guint
}
static guint
if (desktop == NULL)
return;
if (desktop == NULL)
return;
- Inkscape::Selection *selection = SP_DT_SELECTION(desktop);
+ Inkscape::Selection *selection = sp_desktop_selection(desktop);
// check if something is selected
if (selection->isEmpty() || g_slist_length((GSList *) selection->itemList()) > 1) {
// check if something is selected
if (selection->isEmpty() || g_slist_length((GSList *) selection->itemList()) > 1) {
- SP_DT_MSGSTACK(desktop)->flash(Inkscape::WARNING_MESSAGE, _("Select <b>one object</b> whose tiled clones to remove."));
+ sp_desktop_message_stack(desktop)->flash(Inkscape::WARNING_MESSAGE, _("Select <b>one object</b> whose tiled clones to remove."));
return;
}
return;
}
clonetiler_change_selection (NULL, selection, dlg);
if (do_undo)
clonetiler_change_selection (NULL, selection, dlg);
if (do_undo)
- sp_document_done (SP_DT_DOCUMENT (desktop));
+ sp_document_done (sp_desktop_document (desktop), SP_VERB_DIALOG_CLONETILER,
+ _("Delete tiled clones"));
}
static NR::Rect
}
static NR::Rect
if (desktop == NULL)
return;
if (desktop == NULL)
return;
- Inkscape::Selection *selection = SP_DT_SELECTION(desktop);
+ Inkscape::Selection *selection = sp_desktop_selection(desktop);
// check if something is selected
if (selection->isEmpty()) {
// check if something is selected
if (selection->isEmpty()) {
- SP_DT_MSGSTACK(desktop)->flash(Inkscape::WARNING_MESSAGE, _("Select an <b>object</b> to clone."));
+ sp_desktop_message_stack(desktop)->flash(Inkscape::WARNING_MESSAGE, _("Select an <b>object</b> to clone."));
return;
}
// Check if more than one object is selected.
if (g_slist_length((GSList *) selection->itemList()) > 1) {
return;
}
// Check if more than one object is selected.
if (g_slist_length((GSList *) selection->itemList()) > 1) {
- SP_DT_MSGSTACK(desktop)->flash(Inkscape::ERROR_MESSAGE, _("If you want to clone several objects, <b>group</b> them and <b>clone the group</b>."));
+ sp_desktop_message_stack(desktop)->flash(Inkscape::ERROR_MESSAGE, _("If you want to clone several objects, <b>group</b> them and <b>clone the group</b>."));
return;
}
return;
}
int alternate_roty = prefs_get_int_attribute (prefs_path, "alternate_roty", 0);
double rand_rot = 0.01 * prefs_get_double_attribute_limited (prefs_path, "rand_rot", 0, 0, 100);
int alternate_roty = prefs_get_int_attribute (prefs_path, "alternate_roty", 0);
double rand_rot = 0.01 * prefs_get_double_attribute_limited (prefs_path, "rand_rot", 0, 0, 100);
+ double d_blur_per_y = 0.01 * prefs_get_double_attribute_limited (prefs_path, "d_blur_per_y", 0, 0, 100);
+ double d_blur_per_x = 0.01 * prefs_get_double_attribute_limited (prefs_path, "d_blur_per_x", 0, 0, 100);
+ int alternate_blury = prefs_get_int_attribute (prefs_path, "alternate_blury", 0);
+ int alternate_blurx = prefs_get_int_attribute (prefs_path, "alternate_blurx", 0);
+ double rand_blur = 0.01 * prefs_get_double_attribute_limited (prefs_path, "rand_blur", 0, 0, 100);
+
double d_opacity_per_y = 0.01 * prefs_get_double_attribute_limited (prefs_path, "d_opacity_per_y", 0, 0, 100);
double d_opacity_per_x = 0.01 * prefs_get_double_attribute_limited (prefs_path, "d_opacity_per_x", 0, 0, 100);
int alternate_opacityy = prefs_get_int_attribute (prefs_path, "alternate_opacityy", 0);
double d_opacity_per_y = 0.01 * prefs_get_double_attribute_limited (prefs_path, "d_opacity_per_y", 0, 0, 100);
double d_opacity_per_x = 0.01 * prefs_get_double_attribute_limited (prefs_path, "d_opacity_per_x", 0, 0, 100);
int alternate_opacityy = prefs_get_int_attribute (prefs_path, "alternate_opacityy", 0);
int ymax = prefs_get_int_attribute (prefs_path, "ymax", 2);
int fillrect = prefs_get_int_attribute (prefs_path, "fillrect", 0);
int ymax = prefs_get_int_attribute (prefs_path, "ymax", 2);
int fillrect = prefs_get_int_attribute (prefs_path, "fillrect", 0);
- double fillwidth = prefs_get_double_attribute_limited (prefs_path, "fillwidth", 50, 0, 6000);
- double fillheight = prefs_get_double_attribute_limited (prefs_path, "fillheight", 50, 0, 6000);
+ double fillwidth = prefs_get_double_attribute_limited (prefs_path, "fillwidth", 50, 0, 1e6);
+ double fillheight = prefs_get_double_attribute_limited (prefs_path, "fillheight", 50, 0, 1e6);
int dotrace = prefs_get_int_attribute (prefs_path, "dotrace", 0);
int pick = prefs_get_int_attribute (prefs_path, "pick", 0);
int dotrace = prefs_get_int_attribute (prefs_path, "dotrace", 0);
int pick = prefs_get_int_attribute (prefs_path, "pick", 0);
double gamma_picked = prefs_get_double_attribute_limited (prefs_path, "gamma_picked", 0, -10, 10);
if (dotrace) {
double gamma_picked = prefs_get_double_attribute_limited (prefs_path, "gamma_picked", 0, -10, 10);
if (dotrace) {
- clonetiler_trace_setup (SP_DT_DOCUMENT(desktop), 1.0, SP_ITEM (obj));
+ clonetiler_trace_setup (sp_desktop_document(desktop), 1.0, SP_ITEM (obj));
}
}
- NR::Point c;
+ NR::Point center;
double w;
double h;
double w;
double h;
+ double x0;
+ double y0;
if (keepbbox &&
obj_repr->attribute("inkscape:tile-w") &&
obj_repr->attribute("inkscape:tile-h") &&
if (keepbbox &&
obj_repr->attribute("inkscape:tile-w") &&
obj_repr->attribute("inkscape:tile-h") &&
+ obj_repr->attribute("inkscape:tile-x0") &&
+ obj_repr->attribute("inkscape:tile-y0") &&
obj_repr->attribute("inkscape:tile-cx") &&
obj_repr->attribute("inkscape:tile-cy")) {
double cx = sp_repr_get_double_attribute (obj_repr, "inkscape:tile-cx", 0);
double cy = sp_repr_get_double_attribute (obj_repr, "inkscape:tile-cy", 0);
obj_repr->attribute("inkscape:tile-cx") &&
obj_repr->attribute("inkscape:tile-cy")) {
double cx = sp_repr_get_double_attribute (obj_repr, "inkscape:tile-cx", 0);
double cy = sp_repr_get_double_attribute (obj_repr, "inkscape:tile-cy", 0);
-
- c = NR::Point (cx, cy);
+ center = NR::Point (cx, cy);
w = sp_repr_get_double_attribute (obj_repr, "inkscape:tile-w", 0);
h = sp_repr_get_double_attribute (obj_repr, "inkscape:tile-h", 0);
w = sp_repr_get_double_attribute (obj_repr, "inkscape:tile-w", 0);
h = sp_repr_get_double_attribute (obj_repr, "inkscape:tile-h", 0);
+ x0 = sp_repr_get_double_attribute (obj_repr, "inkscape:tile-x0", 0);
+ y0 = sp_repr_get_double_attribute (obj_repr, "inkscape:tile-y0", 0);
} else {
} else {
- NR::Rect const r = SP_ITEM(obj)->invokeBbox(sp_item_i2doc_affine(SP_ITEM(obj)));
- c = r.midpoint();
- w = r.dimensions()[NR::X];
- h = r.dimensions()[NR::Y];
-
- sp_repr_set_svg_double(obj_repr, "inkscape:tile-w", w);
- sp_repr_set_svg_double(obj_repr, "inkscape:tile-h", h);
- sp_repr_set_svg_double(obj_repr, "inkscape:tile-cx", c[NR::X]);
- sp_repr_set_svg_double(obj_repr, "inkscape:tile-cy", c[NR::Y]);
+ NR::Maybe<NR::Rect> r = SP_ITEM(obj)->getBounds(sp_item_i2doc_affine(SP_ITEM(obj)),
+ SPItem::GEOMETRIC_BBOX);
+ /* impl: Use of GEOMETRIC_BBOX is so that the stroke of rectangles will be shared
+ * (overlapped) rather than effectively doubled in width.
+ *
+ * (If you wish to change this, then please consider discussing at bug #1722238.) */
+
+ if (r) {
+ w = r->dimensions()[NR::X];
+ h = r->dimensions()[NR::Y];
+ x0 = r->min()[NR::X];
+ y0 = r->min()[NR::Y];
+ center = desktop->dt2doc(SP_ITEM(obj)->getCenter());
+
+ sp_repr_set_svg_double(obj_repr, "inkscape:tile-cx", center[NR::X]);
+ sp_repr_set_svg_double(obj_repr, "inkscape:tile-cy", center[NR::Y]);
+ sp_repr_set_svg_double(obj_repr, "inkscape:tile-w", w);
+ sp_repr_set_svg_double(obj_repr, "inkscape:tile-h", h);
+ sp_repr_set_svg_double(obj_repr, "inkscape:tile-x0", x0);
+ sp_repr_set_svg_double(obj_repr, "inkscape:tile-y0", y0);
+ } else {
+ center = NR::Point(0, 0);
+ w = h = 0;
+ x0 = y0 = 0;
+ }
}
NR::Point cur = NR::Point (0, 0);
}
NR::Point cur = NR::Point (0, 0);
- NR::Rect bbox_original = NR::Rect (NR::Point (c[NR::X] - w/2, c[NR::Y] - h/2), NR::Point (c[NR::X] + w/2, c[NR::Y] + h/2));
+ NR::Rect bbox_original = NR::Rect (NR::Point (x0, y0), NR::Point (x0 + w, y0 + h));
+ double perimeter_original = (w + h)/4;
for (int x = 0;
fillrect?
for (int x = 0;
fillrect?
// Note: We create a clone at 0,0 too, right over the original, in case our clones are colored
// Get transform from symmetry, shift, scale, rotation
// Note: We create a clone at 0,0 too, right over the original, in case our clones are colored
// Get transform from symmetry, shift, scale, rotation
- NR::Matrix t = clonetiler_get_transform (type, x, y, c[NR::X], c[NR::Y], w, h,
+ NR::Matrix t = clonetiler_get_transform (type, x, y, center[NR::X], center[NR::Y], w, h,
d_x_per_x, d_y_per_x, d_x_per_y, d_y_per_y, alternate_x, alternate_y, rand_x, rand_y,
d_per_x_exp, d_per_y_exp,
d_rot_per_x, d_rot_per_y, alternate_rotx, alternate_roty, rand_rot,
d_scalex_per_x, d_scaley_per_x, d_scalex_per_y, d_scaley_per_y,
alternate_scalex, alternate_scaley, rand_scalex, rand_scaley);
d_x_per_x, d_y_per_x, d_x_per_y, d_y_per_y, alternate_x, alternate_y, rand_x, rand_y,
d_per_x_exp, d_per_y_exp,
d_rot_per_x, d_rot_per_y, alternate_rotx, alternate_roty, rand_rot,
d_scalex_per_x, d_scaley_per_x, d_scalex_per_y, d_scaley_per_y,
alternate_scalex, alternate_scaley, rand_scalex, rand_scaley);
- cur = c * t - c;
+ cur = center * t - center;
if (fillrect) {
if ((cur[NR::X] > fillwidth) || (cur[NR::Y] > fillheight)) { // off limits
continue;
if (fillrect) {
if ((cur[NR::X] > fillwidth) || (cur[NR::Y] > fillheight)) { // off limits
continue;
float rgb[3];
sp_color_hsl_to_rgb_floatv (rgb, hsl[0], hsl[1], hsl[2]);
float rgb[3];
sp_color_hsl_to_rgb_floatv (rgb, hsl[0], hsl[1], hsl[2]);
- sp_svg_write_color(color_string, 32, SP_RGBA32_F_COMPOSE(rgb[0], rgb[1], rgb[2], 1.0));
+ sp_svg_write_color(color_string, sizeof(color_string), SP_RGBA32_F_COMPOSE(rgb[0], rgb[1], rgb[2], 1.0));
}
}
- // Opacity tab
+ // Blur
+ double blur = 0.0;
+ {
+ int eff_x = (alternate_blurx? (x%2) : (x));
+ int eff_y = (alternate_blury? (y%2) : (y));
+ blur = (d_blur_per_x * eff_x + d_blur_per_y * eff_y + rand_blur * g_random_double_range (-1, 1));
+ blur = CLAMP (blur, 0, 1);
+ }
+
+ // Opacity
double opacity = 1.0;
double opacity = 1.0;
+ {
int eff_x = (alternate_opacityx? (x%2) : (x));
int eff_y = (alternate_opacityy? (y%2) : (y));
opacity = 1 - (d_opacity_per_x * eff_x + d_opacity_per_y * eff_y + rand_opacity * g_random_double_range (-1, 1));
opacity = CLAMP (opacity, 0, 1);
int eff_x = (alternate_opacityx? (x%2) : (x));
int eff_y = (alternate_opacityy? (y%2) : (y));
opacity = 1 - (d_opacity_per_x * eff_x + d_opacity_per_y * eff_y + rand_opacity * g_random_double_range (-1, 1));
opacity = CLAMP (opacity, 0, 1);
+ }
// Trace tab
if (dotrace) {
// Trace tab
if (dotrace) {
}
}
if (pick_to_size) {
}
}
if (pick_to_size) {
- t = NR::translate(-c[NR::X], -c[NR::Y]) * NR::scale (val, val) * NR::translate(c[NR::X], c[NR::Y]) * t;
+ t = NR::translate(-center[NR::X], -center[NR::Y]) * NR::scale (val, val) * NR::translate(center[NR::X], center[NR::Y]) * t;
}
if (pick_to_opacity) {
opacity *= val;
}
if (pick_to_color) {
}
if (pick_to_opacity) {
opacity *= val;
}
if (pick_to_color) {
- sp_svg_write_color(color_string, 32, rgba);
+ sp_svg_write_color(color_string, sizeof(color_string), rgba);
}
}
}
}
}
// Create the clone
}
// Create the clone
- Inkscape::XML::Node *clone = sp_repr_new("svg:use");
+ Inkscape::XML::Node *clone = obj_repr->document()->createElement("svg:use");
clone->setAttribute("x", "0");
clone->setAttribute("y", "0");
clone->setAttribute("inkscape:tiled-clone-of", id_href);
clone->setAttribute("x", "0");
clone->setAttribute("y", "0");
clone->setAttribute("inkscape:tiled-clone-of", id_href);
center_set = true;
}
center_set = true;
}
- gchar affinestr[80];
- if (sp_svg_transform_write(affinestr, 79, t)) {
- clone->setAttribute("transform", affinestr);
- } else {
- clone->setAttribute("transform", NULL);
- }
+ gchar *affinestr=sp_svg_transform_write(t);
+ clone->setAttribute("transform", affinestr);
+ g_free(affinestr);
if (opacity < 1.0) {
sp_repr_set_css_double(clone, "opacity", opacity);
if (opacity < 1.0) {
sp_repr_set_css_double(clone, "opacity", opacity);
// add the new clone to the top of the original's parent
SP_OBJECT_REPR(parent)->appendChild(clone);
// add the new clone to the top of the original's parent
SP_OBJECT_REPR(parent)->appendChild(clone);
+ if (blur > 0.0) {
+ SPObject *clone_object = sp_desktop_document(desktop)->getObjectByRepr(clone);
+ double perimeter = perimeter_original * t.expansion();
+ double radius = blur * perimeter;
+ // it's hard to figure out exact width/height of the tile without having an object
+ // that we can take bbox of; however here we only need a lower bound so that blur
+ // margins are not too small, and the perimeter should work
+ SPFilter *constructed = new_filter_gaussian_blur(sp_desktop_document(desktop), radius, t.expansion(), t.expansionX(), t.expansionY(), perimeter, perimeter);
+ sp_style_set_property_url (clone_object, "filter", SP_OBJECT(constructed), false);
+ }
+
if (center_set) {
if (center_set) {
- SPObject *clone_object = SP_DT_DOCUMENT(desktop)->getObjectByRepr(clone);
+ SPObject *clone_object = sp_desktop_document(desktop)->getObjectByRepr(clone);
if (clone_object && SP_IS_ITEM(clone_object)) {
clone_object->requestDisplayUpdate(SP_OBJECT_MODIFIED_FLAG);
SP_ITEM(clone_object)->setCenter(desktop->doc2dt(new_center));
if (clone_object && SP_IS_ITEM(clone_object)) {
clone_object->requestDisplayUpdate(SP_OBJECT_MODIFIED_FLAG);
SP_ITEM(clone_object)->setCenter(desktop->doc2dt(new_center));
clonetiler_change_selection (NULL, selection, dlg);
clonetiler_change_selection (NULL, selection, dlg);
- sp_document_done(SP_DT_DOCUMENT(desktop));
+ sp_document_done(sp_desktop_document(desktop), SP_VERB_DIALOG_CLONETILER,
+ _("Create tiled clones"));
}
static GtkWidget *
}
static GtkWidget *
{
GtkWidget *hb = gtk_hbox_new (FALSE, 0);
{
GtkWidget *hb = gtk_hbox_new (FALSE, 0);
- GtkWidget *i = sp_icon_new (GTK_ICON_SIZE_MENU, "clonetiler_per_row");
+ GtkWidget *i = sp_icon_new (Inkscape::ICON_SIZE_DECORATION, "clonetiler_per_row");
gtk_box_pack_start (GTK_BOX (hb), i, FALSE, FALSE, 2);
GtkWidget *l = gtk_label_new ("");
gtk_box_pack_start (GTK_BOX (hb), i, FALSE, FALSE, 2);
GtkWidget *l = gtk_label_new ("");
{
GtkWidget *hb = gtk_hbox_new (FALSE, 0);
{
GtkWidget *hb = gtk_hbox_new (FALSE, 0);
- GtkWidget *i = sp_icon_new (GTK_ICON_SIZE_MENU, "clonetiler_per_column");
+ GtkWidget *i = sp_icon_new (Inkscape::ICON_SIZE_DECORATION, "clonetiler_per_column");
gtk_box_pack_start (GTK_BOX (hb), i, FALSE, FALSE, 2);
GtkWidget *l = gtk_label_new ("");
gtk_box_pack_start (GTK_BOX (hb), i, FALSE, FALSE, 2);
GtkWidget *l = gtk_label_new ("");
dlg = sp_window_new (title, TRUE);
if (x == -1000 || y == -1000) {
dlg = sp_window_new (title, TRUE);
if (x == -1000 || y == -1000) {
- x = prefs_get_int_attribute (prefs_path, "x", 0);
- y = prefs_get_int_attribute (prefs_path, "y", 0);
+ x = prefs_get_int_attribute (prefs_path, "x", -1000);
+ y = prefs_get_int_attribute (prefs_path, "y", -1000);
}
if (w ==0 || h == 0) {
}
if (w ==0 || h == 0) {
h = prefs_get_int_attribute (prefs_path, "h", 0);
}
h = prefs_get_int_attribute (prefs_path, "h", 0);
}
- if (x<0) x=0;
- if (y<0) y=0;
+// if (x<0) x=0;
+// if (y<0) y=0;
- if (x != 0 || y != 0) {
+ if (w && h) {
+ gtk_window_resize ((GtkWindow *) dlg, w, h);
+ }
+ if (x >= 0 && y >= 0 && (x < (gdk_screen_width()-MIN_ONSCREEN_DISTANCE)) && (y < (gdk_screen_height()-MIN_ONSCREEN_DISTANCE))) {
gtk_window_move ((GtkWindow *) dlg, x, y);
} else {
gtk_window_set_position(GTK_WINDOW(dlg), GTK_WIN_POS_CENTER);
}
gtk_window_move ((GtkWindow *) dlg, x, y);
} else {
gtk_window_set_position(GTK_WINDOW(dlg), GTK_WIN_POS_CENTER);
}
- if (w && h) {
- gtk_window_resize ((GtkWindow *) dlg, w, h);
- }
sp_transientize (dlg);
wd.win = dlg;
sp_transientize (dlg);
wd.win = dlg;
}
}
-// Opacity
+// Blur and opacity
{
{
- GtkWidget *vb = clonetiler_new_tab (nb, _("_Opacity"));
+ GtkWidget *vb = clonetiler_new_tab (nb, _("_Blur & opacity"));
GtkWidget *table = clonetiler_table_x_y_rand (1);
gtk_box_pack_start (GTK_BOX (vb), table, FALSE, FALSE, 0);
GtkWidget *table = clonetiler_table_x_y_rand (1);
gtk_box_pack_start (GTK_BOX (vb), table, FALSE, FALSE, 0);
- // Dissolve
+
+ // Blur
{
GtkWidget *l = gtk_label_new ("");
{
GtkWidget *l = gtk_label_new ("");
- gtk_label_set_markup (GTK_LABEL(l), _("<b>Fade out:</b>"));
+ gtk_label_set_markup (GTK_LABEL(l), _("<b>Blur:</b>"));
gtk_size_group_add_widget(table_row_labels, l);
clonetiler_table_attach (table, l, 1, 2, 1);
}
{
GtkWidget *l = clonetiler_spinbox (tt,
gtk_size_group_add_widget(table_row_labels, l);
clonetiler_table_attach (table, l, 1, 2, 1);
}
{
GtkWidget *l = clonetiler_spinbox (tt,
- _("Decrease tile opacity by this percentage for each row"), "d_opacity_per_y",
+ _("Blur tiles by this percentage for each row"), "d_blur_per_y",
0, 100, "%");
clonetiler_table_attach (table, l, 0, 2, 2);
}
{
GtkWidget *l = clonetiler_spinbox (tt,
0, 100, "%");
clonetiler_table_attach (table, l, 0, 2, 2);
}
{
GtkWidget *l = clonetiler_spinbox (tt,
- _("Decrease tile opacity by this percentage for each column"), "d_opacity_per_x",
+ _("Blur tiles by this percentage for each column"), "d_blur_per_x",
0, 100, "%");
clonetiler_table_attach (table, l, 0, 2, 3);
}
{
GtkWidget *l = clonetiler_spinbox (tt,
0, 100, "%");
clonetiler_table_attach (table, l, 0, 2, 3);
}
{
GtkWidget *l = clonetiler_spinbox (tt,
- _("Randomize the tile opacity by this percentage"), "rand_opacity",
+ _("Randomize the tile blur by this percentage"), "rand_blur",
0, 100, "%");
clonetiler_table_attach (table, l, 0, 2, 4);
}
0, 100, "%");
clonetiler_table_attach (table, l, 0, 2, 4);
}
}
{
}
{
- GtkWidget *l = clonetiler_checkbox (tt, _("Alternate the sign of opacity change for each row"), "alternate_opacityy");
+ GtkWidget *l = clonetiler_checkbox (tt, _("Alternate the sign of blur change for each row"), "alternate_blury");
clonetiler_table_attach (table, l, 0, 3, 2);
}
{
clonetiler_table_attach (table, l, 0, 3, 2);
}
{
- GtkWidget *l = clonetiler_checkbox (tt, _("Alternate the sign of opacity change for each column"), "alternate_opacityx");
+ GtkWidget *l = clonetiler_checkbox (tt, _("Alternate the sign of blur change for each column"), "alternate_blurx");
clonetiler_table_attach (table, l, 0, 3, 3);
}
clonetiler_table_attach (table, l, 0, 3, 3);
}
+
+
+
+ // Dissolve
+ {
+ GtkWidget *l = gtk_label_new ("");
+ gtk_label_set_markup (GTK_LABEL(l), _("<b>Fade out:</b>"));
+ gtk_size_group_add_widget(table_row_labels, l);
+ clonetiler_table_attach (table, l, 1, 4, 1);
+ }
+
+ {
+ GtkWidget *l = clonetiler_spinbox (tt,
+ _("Decrease tile opacity by this percentage for each row"), "d_opacity_per_y",
+ 0, 100, "%");
+ clonetiler_table_attach (table, l, 0, 4, 2);
+ }
+
+ {
+ GtkWidget *l = clonetiler_spinbox (tt,
+ _("Decrease tile opacity by this percentage for each column"), "d_opacity_per_x",
+ 0, 100, "%");
+ clonetiler_table_attach (table, l, 0, 4, 3);
+ }
+
+ {
+ GtkWidget *l = clonetiler_spinbox (tt,
+ _("Randomize the tile opacity by this percentage"), "rand_opacity",
+ 0, 100, "%");
+ clonetiler_table_attach (table, l, 0, 4, 4);
+ }
+
+ { // alternates
+ GtkWidget *l = gtk_label_new ("");
+ // TRANSLATORS: "Alternate" is a verb here
+ gtk_label_set_markup (GTK_LABEL(l), _("<small>Alternate:</small>"));
+ gtk_size_group_add_widget(table_row_labels, l);
+ clonetiler_table_attach (table, l, 1, 5, 1);
+ }
+
+ {
+ GtkWidget *l = clonetiler_checkbox (tt, _("Alternate the sign of opacity change for each row"), "alternate_opacityy");
+ clonetiler_table_attach (table, l, 0, 5, 2);
+ }
+
+ {
+ GtkWidget *l = clonetiler_checkbox (tt, _("Alternate the sign of opacity change for each column"), "alternate_opacityx");
+ clonetiler_table_attach (table, l, 0, 5, 3);
+ }
}
}
// unitmenu
GtkWidget *u = sp_unit_selector_new (SP_UNIT_ABSOLUTE | SP_UNIT_DEVICE);
// unitmenu
GtkWidget *u = sp_unit_selector_new (SP_UNIT_ABSOLUTE | SP_UNIT_DEVICE);
- sp_unit_selector_set_unit (SP_UNIT_SELECTOR(u), SP_DT_NAMEDVIEW(SP_ACTIVE_DESKTOP)->doc_units);
+ sp_unit_selector_set_unit (SP_UNIT_SELECTOR(u), sp_desktop_namedview(SP_ACTIVE_DESKTOP)->doc_units);
{
// Width spinbutton
{
// Width spinbutton
- GtkObject *a = gtk_adjustment_new (0.0, -SP_DESKTOP_SCROLL_LIMIT, SP_DESKTOP_SCROLL_LIMIT, 1.0, 10.0, 10.0);
+ GtkObject *a = gtk_adjustment_new (0.0, -1e6, 1e6, 1.0, 10.0, 10.0);
sp_unit_selector_add_adjustment (SP_UNIT_SELECTOR (u), GTK_ADJUSTMENT (a));
double value = prefs_get_double_attribute (prefs_path, "fillwidth", 50);
sp_unit_selector_add_adjustment (SP_UNIT_SELECTOR (u), GTK_ADJUSTMENT (a));
double value = prefs_get_double_attribute (prefs_path, "fillwidth", 50);
{
// Height spinbutton
{
// Height spinbutton
- GtkObject *a = gtk_adjustment_new (0.0, -SP_DESKTOP_SCROLL_LIMIT, SP_DESKTOP_SCROLL_LIMIT, 1.0, 10.0, 10.0);
+ GtkObject *a = gtk_adjustment_new (0.0, -1e6, 1e6, 1.0, 10.0, 10.0);
sp_unit_selector_add_adjustment (SP_UNIT_SELECTOR (u), GTK_ADJUSTMENT (a));
double value = prefs_get_double_attribute (prefs_path, "fillheight", 50);
sp_unit_selector_add_adjustment (SP_UNIT_SELECTOR (u), GTK_ADJUSTMENT (a));
double value = prefs_get_double_attribute (prefs_path, "fillheight", 50);
g_signal_connect(G_OBJECT(dlg), "destroy", G_CALLBACK(clonetiler_disconnect_gsignal), G_OBJECT (INKSCAPE));
// update now
g_signal_connect(G_OBJECT(dlg), "destroy", G_CALLBACK(clonetiler_disconnect_gsignal), G_OBJECT (INKSCAPE));
// update now
- clonetiler_change_selection (NULL, SP_DT_SELECTION(SP_ACTIVE_DESKTOP), dlg);
+ clonetiler_change_selection (NULL, sp_desktop_selection(SP_ACTIVE_DESKTOP), dlg);
}
{
}
{