diff options
Diffstat (limited to 'libs/libgnomecanvasmm/libgnomecanvasmm/affinetrans.cc')
-rw-r--r-- | libs/libgnomecanvasmm/libgnomecanvasmm/affinetrans.cc | 234 |
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(); +} |