diff options
Diffstat (limited to 'src/svg/gnome-canvas-bpath-util.cpp')
| -rw-r--r-- | src/svg/gnome-canvas-bpath-util.cpp | 209 |
1 files changed, 0 insertions, 209 deletions
diff --git a/src/svg/gnome-canvas-bpath-util.cpp b/src/svg/gnome-canvas-bpath-util.cpp deleted file mode 100644 index bd55bfb10..000000000 --- a/src/svg/gnome-canvas-bpath-util.cpp +++ /dev/null @@ -1,209 +0,0 @@ -/* GnomeCanvas Bezier polyline paths & segments - * - * GnomeCanvas is basically a port of the Tk toolkit's most excellent canvas widget. Tk is - * copyrighted by the Regents of the University of California, Sun Microsystems, and other parties. - * - * Copyright (C) 1998,1999 The Free Software Foundation - * - * Authors: Federico Mena <federico@nuclecu.unam.mx> - * Lauris Kaplinski <lauris@ariman.ee> - * Raph Levien <raph@acm.org> - * Jasper van de Gronde <th.v.d.gronde@hccnet.nl> - */ - -#include <cstring> -#include <string> -#include <cstdlib> -#include <cstdio> -#include <glib/gmem.h> -#include <glib/gmessages.h> -#include <algorithm> - -#include "libnr/n-art-bpath.h" -#include "libnr/nr-point-ops.h" -#include "gnome-canvas-bpath-util.h" -#include "prefs-utils.h" - -static inline NR::Point distTo(GnomeCanvasBpathDef *bpd, size_t idx1, size_t idx2, unsigned int coord1=3, unsigned int coord2=3) { - NR::Point diff(bpd->bpath[idx1].c(coord1) - bpd->bpath[idx2].c(coord2)); - return NR::Point(std::abs(diff[NR::X]), std::abs(diff[NR::Y])); -} - -static bool isApproximatelyClosed(GnomeCanvasBpathDef *bpd) { - int const np = prefs_get_int_attribute("options.svgoutput", "numericprecision", 8); - double const precision = pow(10.0, -(np+1)); // This roughly corresponds to a difference below the last significant digit - int const initial = bpd->moveto_idx; - int const current = bpd->n_bpath - 1; - NR::Point distToInit(distTo(bpd, current, initial)); - // TODO check the double to int conversion in the abs() call: - return - distToInit[NR::X] <= abs(bpd->bpath[current].c(3)[NR::X])*precision && - distToInit[NR::Y] <= abs(bpd->bpath[current].c(3)[NR::Y])*precision; -} - -GnomeCanvasBpathDef * -gnome_canvas_bpath_def_new (void) -{ - GnomeCanvasBpathDef *bpd; - - bpd = g_new (GnomeCanvasBpathDef, 1); - bpd->n_bpath = 0; - bpd->n_bpath_max = 16; - bpd->moveto_idx = -1; - bpd->bpath = g_new (NArtBpath, bpd->n_bpath_max); - bpd->ref_count = 1; - - return bpd; -} - -GnomeCanvasBpathDef * -gnome_canvas_bpath_def_new_from (NArtBpath *path) -{ - GnomeCanvasBpathDef *bpd; - int i; - - g_return_val_if_fail (path != NULL, NULL); - - bpd = g_new (GnomeCanvasBpathDef, 1); - - for (i = 0; path [i].code != NR_END; i++) - ; - bpd->n_bpath = i; - bpd->n_bpath_max = i; - bpd->moveto_idx = -1; - bpd->ref_count = 1; - bpd->bpath = g_new (NArtBpath, i); - - memcpy (bpd->bpath, path, i * sizeof (NArtBpath)); - return bpd; -} - -GnomeCanvasBpathDef * -gnome_canvas_bpath_def_ref (GnomeCanvasBpathDef *bpd) -{ - g_return_val_if_fail (bpd != NULL, NULL); - - bpd->ref_count += 1; - return bpd; -} - -void -gnome_canvas_bpath_def_free (GnomeCanvasBpathDef *bpd) -{ - g_return_if_fail (bpd != NULL); - - bpd->ref_count -= 1; - if (bpd->ref_count == 0) { - g_free (bpd->bpath); - g_free (bpd); - } -} - -void -gnome_canvas_bpath_def_moveto (GnomeCanvasBpathDef *bpd, double x, double y) -{ - NArtBpath *bpath; - int n_bpath; - - g_return_if_fail (bpd != NULL); - - n_bpath = bpd->n_bpath++; - - if (n_bpath == bpd->n_bpath_max) - bpd->bpath = (NArtBpath*)g_realloc (bpd->bpath, - (bpd->n_bpath_max <<= 1) * sizeof (NArtBpath)); - bpath = bpd->bpath; - bpath[n_bpath].code = NR_MOVETO_OPEN; - bpath[n_bpath].x3 = x; - bpath[n_bpath].y3 = y; - bpd->moveto_idx = n_bpath; -} - -void -gnome_canvas_bpath_def_lineto (GnomeCanvasBpathDef *bpd, double x, double y) -{ - NArtBpath *bpath; - int n_bpath; - - g_return_if_fail (bpd != NULL); - g_return_if_fail (bpd->moveto_idx >= 0); - - n_bpath = bpd->n_bpath++; - - if (n_bpath == bpd->n_bpath_max) - bpd->bpath = (NArtBpath*)g_realloc (bpd->bpath, - (bpd->n_bpath_max <<= 1) * sizeof (NArtBpath)); - bpath = bpd->bpath; - bpath[n_bpath].code = NR_LINETO; - bpath[n_bpath].x3 = x; - bpath[n_bpath].y3 = y; -} - -void -gnome_canvas_bpath_def_curveto (GnomeCanvasBpathDef *bpd, double x1, double y1, double x2, double y2, double x3, double y3) -{ - NArtBpath *bpath; - int n_bpath; - - g_return_if_fail (bpd != NULL); - g_return_if_fail (bpd->moveto_idx >= 0); - - n_bpath = bpd->n_bpath++; - - if (n_bpath == bpd->n_bpath_max) - bpd->bpath = (NArtBpath*)g_realloc (bpd->bpath, - (bpd->n_bpath_max <<= 1) * sizeof (NArtBpath)); - bpath = bpd->bpath; - bpath[n_bpath].code = NR_CURVETO; - bpath[n_bpath].x1 = x1; - bpath[n_bpath].y1 = y1; - bpath[n_bpath].x2 = x2; - bpath[n_bpath].y2 = y2; - bpath[n_bpath].x3 = x3; - bpath[n_bpath].y3 = y3; -} - -void -gnome_canvas_bpath_def_closepath (GnomeCanvasBpathDef *bpd) -{ - NArtBpath *bpath; - int n_bpath; - - g_return_if_fail (bpd != NULL); - g_return_if_fail (bpd->moveto_idx >= 0); - g_return_if_fail (bpd->n_bpath > 0); - - bpath = bpd->bpath; - n_bpath = bpd->n_bpath; - - /* Add closing vector if we need it. */ - if (!isApproximatelyClosed(bpd)) { - gnome_canvas_bpath_def_lineto (bpd, bpath[bpd->moveto_idx].x3, - bpath[bpd->moveto_idx].y3); - bpath = bpd->bpath; - } else { - // If it is approximately closed we close it here to prevent internal logic to fail. - // In addition it is probably better to continue working with this end point, as it - // is probably more precise than the original. - bpath[n_bpath-1].x3 = bpath[bpd->moveto_idx].x3; - bpath[n_bpath-1].y3 = bpath[bpd->moveto_idx].y3; - } - bpath[bpd->moveto_idx].code = NR_MOVETO; - bpd->moveto_idx = -1; -} - -void -gnome_canvas_bpath_def_art_finish (GnomeCanvasBpathDef *bpd) -{ - int n_bpath; - - g_return_if_fail (bpd != NULL); - - n_bpath = bpd->n_bpath++; - - if (n_bpath == bpd->n_bpath_max) - bpd->bpath = (NArtBpath*)g_realloc (bpd->bpath, - (bpd->n_bpath_max <<= 1) * sizeof (NArtBpath)); - bpd->bpath [n_bpath].code = NR_END; -} - |
