summaryrefslogtreecommitdiffstats
path: root/src/util
diff options
context:
space:
mode:
authorJabier Arraiza Cenoz <jabier.arraiza@marker.es>2016-03-14 16:37:50 +0000
committerJabiertxof <jtx@jtx.marker.es>2016-03-14 16:37:50 +0000
commitb8d22beef5345210ad27cdc2685083aeae6f8f3b (patch)
treed69b8bfd19d3627a8425a1b265c2abf229b05354 /src/util
parentfixes for update to trunk (diff)
parent"Relative to" option for node alignment. (diff)
downloadinkscape-b8d22beef5345210ad27cdc2685083aeae6f8f3b.tar.gz
inkscape-b8d22beef5345210ad27cdc2685083aeae6f8f3b.zip
update to trunk
(bzr r13708.1.39)
Diffstat (limited to 'src/util')
-rw-r--r--src/util/CMakeLists.txt1
-rw-r--r--src/util/Makefile_insert1
-rw-r--r--src/util/glib-list-iterators.h237
-rw-r--r--src/util/units.cpp70
-rw-r--r--src/util/units.h8
5 files changed, 64 insertions, 253 deletions
diff --git a/src/util/CMakeLists.txt b/src/util/CMakeLists.txt
index 8fd8c8c66..9680b6377 100644
--- a/src/util/CMakeLists.txt
+++ b/src/util/CMakeLists.txt
@@ -24,7 +24,6 @@ set(util_SRC
format.h
forward-pointer-iterator.h
function.h
- glib-list-iterators.h
list-container-test.h
list-container.h
list-copy.h
diff --git a/src/util/Makefile_insert b/src/util/Makefile_insert
index c23dffbca..2a778e660 100644
--- a/src/util/Makefile_insert
+++ b/src/util/Makefile_insert
@@ -25,7 +25,6 @@ util_libutil_a_SOURCES = \
util/format.h \
util/forward-pointer-iterator.h \
util/function.h \
- util/glib-list-iterators.h \
util/list.h \
util/list-container.h \
util/list-copy.h \
diff --git a/src/util/glib-list-iterators.h b/src/util/glib-list-iterators.h
deleted file mode 100644
index 6244e5b18..000000000
--- a/src/util/glib-list-iterators.h
+++ /dev/null
@@ -1,237 +0,0 @@
-/*
- * Inkscape::Util::GSListIterator - STL iterator for GSList
- * Inkscape::Util::GSListConstIterator - STL iterator for GSList
- * Inkscape::Util::GListIterator - STL iterator for GList
- * Inkscape::Util::GListConstIterator - STL iterator for GList
- *
- * Authors:
- * MenTaLguY <mental@rydia.net>
- *
- * Copyright (C) 2005 MenTaLguY
- *
- * Released under GNU GPL, read the file 'COPYING' for more information
- */
-
-#ifndef SEEN_INKSCAPE_GLIB_LIST_ITERATORS_H
-#define SEEN_INKSCAPE_GLIB_LIST_ITERATORS_H
-
-#include <cstddef>
-#include <iterator>
-#include <glib.h>
-
-namespace Inkscape {
-
-namespace Util {
-
-template <typename T> class GSListConstIterator;
-template <typename T> class GSListIterator;
-template <typename T> class GListConstIterator;
-template <typename T> class GListIterator;
-
-template <typename T>
-class GSListConstIterator<T *> {
-public:
- typedef std::forward_iterator_tag iterator_category;
- typedef T * const value_type G_GNUC_MAY_ALIAS;
- typedef std::ptrdiff_t difference_type;
- typedef value_type *pointer;
- typedef value_type &reference;
-
- GSListConstIterator(GSList const *list) : _list(list) {}
- // default copy
- // default assign
- GSList const *list() const { return _list; }
-
- reference operator*() const {
- return *reinterpret_cast<pointer>(&_list->data);
- }
-
- bool operator==(GSListConstIterator const &other) {
- return other._list == _list;
- }
- bool operator!=(GSListConstIterator const &other) {
- return other._list != _list;
- }
-
- GSListConstIterator &operator++() {
- _list = _list->next;
- return *this;
- }
- GSListConstIterator operator++(int) {
- GSListConstIterator saved=*this;
- _list = _list->next;
- return saved;
- }
-
-private:
- GSList const *_list;
-};
-
-template <typename T>
-class GSListIterator<T *> {
-public:
- typedef std::forward_iterator_tag iterator_category;
- typedef T *value_type G_GNUC_MAY_ALIAS;
- typedef std::ptrdiff_t difference_type;
- typedef value_type *pointer;
- typedef value_type &reference;
- typedef value_type const &const_reference;
-
- GSListIterator(GSList *list) : _list(list) {}
- // default copy
- // default assign
- operator GSListConstIterator<T *>() const { return _list; }
- GSList const *list() const { return _list; }
- GSList *list() { return _list; }
-
- const_reference operator*() const {
- return *reinterpret_cast<pointer>(&_list->data);
- }
- reference operator*() {
- return *reinterpret_cast<pointer>(&_list->data);
- }
-
- bool operator==(GSListIterator const &other) {
- return other._list == _list;
- }
- bool operator!=(GSListIterator const &other) {
- return other._list != _list;
- }
-
- GSListIterator &operator++() {
- _list = _list->next;
- return *this;
- }
- GSListIterator operator++(int) {
- GSListIterator saved=*this;
- _list = _list->next;
- return saved;
- }
-
-private:
- GSList *_list;
-};
-
-template <typename T>
-class GListConstIterator<T *> {
-public:
- typedef std::bidirectional_iterator_tag iterator_category;
- typedef T * const value_type G_GNUC_MAY_ALIAS;
- typedef std::ptrdiff_t difference_type;
- typedef value_type *pointer;
- typedef value_type &reference;
-
- GListConstIterator(GList const *list) : _list(list) {}
- // default copy
- // default assign
- GList const *list() const { return _list; }
-
- reference operator*() const {
- return *reinterpret_cast<pointer>(&_list->data);
- }
-
- bool operator==(GListConstIterator const &other) {
- return other._list == _list;
- }
- bool operator!=(GListConstIterator const &other) {
- return other._list != _list;
- }
-
- GListConstIterator &operator++() {
- _list = _list->next;
- return *this;
- }
- GListConstIterator operator++(int) {
- GListConstIterator saved=*this;
- _list = _list->next;
- return saved;
- }
-
- GListConstIterator &operator--() {
- _list = _list->prev;
- return *this;
- }
- GListConstIterator operator--(int) {
- GListConstIterator saved=*this;
- _list = _list->prev;
- return saved;
- }
-
-private:
- GList const *_list;
-};
-
-template <typename T>
-class GListIterator<T *> {
-public:
- typedef std::bidirectional_iterator_tag iterator_category;
- typedef T *value_type G_GNUC_MAY_ALIAS;
- typedef std::ptrdiff_t difference_type;
- typedef value_type *pointer;
- typedef value_type &reference;
- typedef value_type const &const_reference;
-
- GListIterator(GList *list) : _list(list) {}
- // default copy
- // default assign
- operator GSListConstIterator<T *>() const {
- return reinterpret_cast<GSList *>(_list);
- }
- operator GSListIterator<T *>() const {
- return reinterpret_cast<GSList *>(_list);
- }
- operator GListConstIterator<T *>() const { return _list; }
- GList const *list() const { return _list; }
- GList *list() { return _list; }
-
- const_reference operator*() const {
- return *reinterpret_cast<pointer>(&_list->data);
- }
- reference operator*() { return *reinterpret_cast<pointer>(&_list->data); }
-
- bool operator==(GListIterator const &other) {
- return other._list == _list;
- }
- bool operator!=(GListIterator const &other) {
- return other._list != _list;
- }
-
- GListIterator &operator++() {
- _list = _list->next;
- return *this;
- }
- GListIterator operator++(int) {
- GListIterator saved=*this;
- _list = _list->next;
- return saved;
- }
-
- GListIterator &operator--() {
- _list = _list->prev;
- return *this;
- }
- GListIterator operator--(int) {
- GListIterator saved=*this;
- _list = _list->prev;
- return saved;
- }
-
-private:
- GList *_list;
-};
-
-}
-
-}
-
-#endif
-/*
- Local Variables:
- mode:c++
- c-file-style:"stroustrup"
- c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
- indent-tabs-mode:nil
- fill-column:99
- End:
-*/
-// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8:textwidth=99 :
diff --git a/src/util/units.cpp b/src/util/units.cpp
index 2c72ec3ae..2e7a3b1d2 100644
--- a/src/util/units.cpp
+++ b/src/util/units.cpp
@@ -81,7 +81,21 @@ unsigned const svg_length_lookup[] = {
UNIT_CODE_PERCENT
};
-
+/* From SP_CSS_UNIT_* to unit */
+unsigned const sp_css_unit_lookup[] = {
+ 0,
+ UNIT_CODE_PX,
+ UNIT_CODE_PT,
+ UNIT_CODE_PC,
+ UNIT_CODE_MM,
+ UNIT_CODE_CM,
+ UNIT_CODE_IN,
+ UNIT_CODE_EM,
+ UNIT_CODE_EX,
+ UNIT_CODE_PERCENT
+ // UNIT_CODE_FT Missing,
+ // UNIT_CODE_MT Missing,
+};
// maps unit codes obtained from their abbreviations to their SVGLength unit indexes
typedef INK_UNORDERED_MAP<unsigned, SVGLength::Unit> UnitCodeLookup;
@@ -213,6 +227,10 @@ bool Unit::compatibleWith(Glib::ustring const &u) const
{
return compatibleWith(unit_table.getUnit(u));
}
+bool Unit::compatibleWith(char const *u) const
+{
+ return compatibleWith(unit_table.getUnit(u));
+}
bool Unit::operator==(Unit const &other) const
{
@@ -231,7 +249,29 @@ int Unit::svgUnit() const
return 0;
}
-
+double Unit::convert(double from_dist, Unit const *to) const
+{
+ // Percentage
+ if (to->type == UNIT_TYPE_DIMENSIONLESS) {
+ return from_dist * to->factor;
+ }
+
+ // Incompatible units
+ if (type != to->type) {
+ return -1;
+ }
+
+ // Compatible units
+ return from_dist * factor / to->factor;
+}
+double Unit::convert(double from_dist, Glib::ustring const &to) const
+{
+ return convert(from_dist, unit_table.getUnit(to));
+}
+double Unit::convert(double from_dist, char const *to) const
+{
+ return convert(from_dist, unit_table.getUnit(to));
+}
Unit UnitTable::_empty_unit;
@@ -283,6 +323,19 @@ Unit const *UnitTable::getUnit(SVGLength::Unit u) const
}
return &_empty_unit;
}
+/* SP_CSS_UNIT lookup */
+Unit const *UnitTable::getUnit(unsigned int u) const
+{
+ if (u == 0 || u > 9) {
+ return &_empty_unit;
+ }
+
+ UnitCodeMap::const_iterator f = _unit_map.find(sp_css_unit_lookup[u]);
+ if (f != _unit_map.end()) {
+ return &(*f->second);
+ }
+ return &_empty_unit;
+}
Unit const *UnitTable::findUnit(double factor, UnitType type) const
{
@@ -505,18 +558,7 @@ Glib::ustring Quantity::string() const {
double Quantity::convert(double from_dist, Unit const *from, Unit const *to)
{
- // Percentage
- if (to->type == UNIT_TYPE_DIMENSIONLESS) {
- return from_dist * to->factor;
- }
-
- // Incompatible units
- if (from->type != to->type) {
- return -1;
- }
-
- // Compatible units
- return from_dist * from->factor / to->factor;
+ return from->convert(from_dist, to);
}
double Quantity::convert(double from_dist, Glib::ustring const &from, Unit const *to)
{
diff --git a/src/util/units.h b/src/util/units.h
index 13777fd1b..a840a37ec 100644
--- a/src/util/units.h
+++ b/src/util/units.h
@@ -75,6 +75,11 @@ public:
/** Get SVG unit code. */
int svgUnit() const;
+
+ /** Convert value from this unit **/
+ double convert(double from_dist, Unit const *to) const;
+ double convert(double from_dist, Glib::ustring const &to) const;
+ double convert(double from_dist, char const *to) const;
};
class Quantity
@@ -147,6 +152,9 @@ public:
/** Retrieve a given unit based on its SVGLength unit */
Unit const *getUnit(SVGLength::Unit u) const;
+
+ /** Retrieve a given unit based on its SP_CSS_UNIT */
+ Unit const *getUnit(unsigned int u) const;
/** Retrieve a quantity based on its string identifier */
Quantity parseQuantity(Glib::ustring const &q) const;