summaryrefslogtreecommitdiff
path: root/libs/libgnomecanvasmm/libgnomecanvasmm/affinetrans.cc
diff options
context:
space:
mode:
Diffstat (limited to 'libs/libgnomecanvasmm/libgnomecanvasmm/affinetrans.cc')
-rw-r--r--libs/libgnomecanvasmm/libgnomecanvasmm/affinetrans.cc234
1 files changed, 234 insertions, 0 deletions
diff --git a/libs/libgnomecanvasmm/libgnomecanvasmm/affinetrans.cc b/libs/libgnomecanvasmm/libgnomecanvasmm/affinetrans.cc
new file mode 100644
index 0000000000..f483e7022e
--- /dev/null
+++ b/libs/libgnomecanvasmm/libgnomecanvasmm/affinetrans.cc
@@ -0,0 +1,234 @@
+// -*- C++ -*-
+/* $Id$ */
+
+/* affinetrans.h
+ *
+ * Copyright (C) 1999 The gnomemm Development Team
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the Free
+ * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#include <libgnomecanvasmm/affinetrans.h>
+#include <libgnomecanvas/gnome-canvas.h>
+
+namespace Gnome
+{
+
+namespace Art
+{
+
+AffineTrans::AffineTrans(double scale)
+{
+ trans_[0] = scale;
+ trans_[1] = 0.0;
+ trans_[2] = 0.0;
+ trans_[3] = scale;
+ trans_[4] = 0.0;
+ trans_[5] = 0.0;
+}
+
+AffineTrans::AffineTrans(const double aff[6])
+{
+ trans_[0] = aff[0];
+ trans_[1] = aff[1];
+ trans_[2] = aff[2];
+ trans_[3] = aff[3];
+ trans_[4] = aff[4];
+ trans_[5] = aff[5];
+}
+
+AffineTrans::AffineTrans(const AffineTrans& src)
+{
+ operator=(src);
+}
+
+AffineTrans::~AffineTrans()
+{
+}
+
+AffineTrans& AffineTrans::operator=(const AffineTrans& src)
+{
+ for(unsigned int i = 0; i < 6; i++)
+ {
+ trans_[i] = src.trans_[i];
+ }
+
+ return *this;
+}
+
+double&
+AffineTrans::operator[](unsigned int idx)
+{
+ if(idx > 5)
+ {
+ g_warning("AffineTrans::operator[] called with idx > 5");
+ return trans_[5]; //0; //Can't convert 0 to double& - throw exception?
+ }
+
+ return trans_[idx];
+}
+
+const double&
+AffineTrans::operator[](unsigned int idx) const
+{
+ if(idx > 5)
+ {
+ g_warning("AffineTrans::operator[] const called with idx > 5");
+ return trans_[5]; //0; //Can't convert 0 to double& - throw exception?
+ }
+
+ return trans_[idx];
+}
+
+Point AffineTrans::apply_to(const Point& p) const
+{
+ Point result;
+ art_affine_point(result.gobj(), p.gobj(), trans_);
+ return result;
+}
+
+Point AffineTrans::operator*(const Point& p) const
+{
+ return apply_to(p);
+}
+
+AffineTrans
+AffineTrans::operator*(const AffineTrans& aff2)
+{
+ AffineTrans result;
+ art_affine_multiply(result.gobj(), gobj(), aff2.gobj());
+ return result;
+}
+
+bool AffineTrans::operator==(const AffineTrans& other) const
+{
+ return (bool)art_affine_equal(const_cast<double*>(trans_),
+ const_cast<double*>(other.gobj()));
+}
+
+bool AffineTrans::operator!=(const AffineTrans& other) const
+{
+ return !(bool)art_affine_equal(const_cast<double*>(trans_),
+ const_cast<double*>(other.gobj()));
+}
+
+void AffineTrans::invert()
+{
+ art_affine_invert(trans_, trans_);
+}
+
+void AffineTrans::flip(bool horiz, bool vert)
+{
+ art_affine_flip(trans_, trans_, horiz, vert);
+}
+
+bool AffineTrans::rectilinear() const
+{
+ return art_affine_rectilinear(trans_);
+}
+
+double AffineTrans::expansion() const
+{
+ return art_affine_expansion(trans_);
+}
+
+AffineTrans const &
+AffineTrans::operator*=(AffineTrans& other)
+{
+ art_affine_multiply(gobj(), gobj(), other.gobj());
+ return *this;
+}
+
+
+AffineTrans AffineTrans::identity()
+{
+ AffineTrans tmp;
+ art_affine_identity(tmp.gobj());
+ return tmp;
+}
+
+AffineTrans
+AffineTrans::scaling(double s)
+{
+ return scaling(s, s);
+}
+
+AffineTrans
+AffineTrans::scaling(double sx, double sy)
+{
+ AffineTrans tmp;
+ art_affine_scale(tmp.gobj(), sx, sy);
+ return tmp;
+}
+
+AffineTrans
+AffineTrans::rotation(double theta)
+{
+ AffineTrans tmp;
+ art_affine_rotate(tmp.gobj(), theta);
+ return tmp;
+}
+
+AffineTrans
+AffineTrans::translation(double dx, double dy)
+{
+ AffineTrans tmp;
+ art_affine_translate(tmp.gobj(), dx, dy);
+ return tmp;
+}
+
+AffineTrans
+AffineTrans::translation(const Point& p)
+{
+ AffineTrans tmp;
+ art_affine_translate(tmp.gobj(), p.get_x(), p.get_y());
+ return tmp;
+}
+
+
+AffineTrans
+AffineTrans::shearing(double theta)
+{
+ AffineTrans tmp;
+ art_affine_shear(tmp.gobj(), theta);
+ return tmp;
+}
+
+double* AffineTrans::gobj()
+{
+ return trans_;
+}
+
+const double* AffineTrans::gobj() const
+{
+ return trans_;
+}
+
+Glib::ustring AffineTrans::to_string() const
+{
+ char pchStr[128];
+ pchStr[127] = 0; //Just in case art_affine_to_string doesn't work properly.
+ art_affine_to_string(pchStr, gobj());
+ return Glib::ustring(pchStr);
+}
+
+} //namespace Art
+
+} //namespace Gnome
+
+std::ostream& operator<<(std::ostream& out, const Gnome::Art::AffineTrans& aff)
+{
+ return out << aff.to_string();
+}