174994d13SStephan Aßmus /* 274994d13SStephan Aßmus * Copyright 2005, Stephan Aßmus <superstippi@gmx.de>. All rights reserved. 374994d13SStephan Aßmus * Distributed under the terms of the MIT License. 474994d13SStephan Aßmus * 574994d13SStephan Aßmus * A handy front-end to agg::trans_affine transformation matrix. 674994d13SStephan Aßmus * 774994d13SStephan Aßmus */ 874994d13SStephan Aßmus 9c0fe8a07SStephan Aßmus 10c0fe8a07SStephan Aßmus #ifndef TRANSFORMABLE_H 11c0fe8a07SStephan Aßmus #define TRANSFORMABLE_H 12c0fe8a07SStephan Aßmus 13c0fe8a07SStephan Aßmus #include <Archivable.h> 14c0fe8a07SStephan Aßmus #include <Rect.h> 15c0fe8a07SStephan Aßmus 16c0fe8a07SStephan Aßmus #include <agg_trans_affine.h> 17c0fe8a07SStephan Aßmus 18c0fe8a07SStephan Aßmus class Transformable : public BArchivable, 19c0fe8a07SStephan Aßmus public agg::trans_affine { 20c0fe8a07SStephan Aßmus public: 21c0fe8a07SStephan Aßmus Transformable(); 22c0fe8a07SStephan Aßmus Transformable(const Transformable& other); 23c0fe8a07SStephan Aßmus Transformable(const BMessage* archive); 24c0fe8a07SStephan Aßmus virtual ~Transformable(); 25c0fe8a07SStephan Aßmus 26c0fe8a07SStephan Aßmus // the BArchivable protocol 27c0fe8a07SStephan Aßmus // stores matrix directly to message, deep is ignored 28c0fe8a07SStephan Aßmus virtual status_t Archive(BMessage* into, bool deep = true) const; 29c0fe8a07SStephan Aßmus 30c0fe8a07SStephan Aßmus void StoreTo(double matrix[6]) const; 31c0fe8a07SStephan Aßmus void LoadFrom(double matrix[6]); 32c0fe8a07SStephan Aßmus 33c0fe8a07SStephan Aßmus // set to or combine with other matrix 34c0fe8a07SStephan Aßmus void SetTransformable(const Transformable& other); 35*13e393dfSStephan Aßmus Transformable& operator=(const agg::trans_affine& other); 36c0fe8a07SStephan Aßmus Transformable& operator=(const Transformable& other); 37c0fe8a07SStephan Aßmus Transformable& Multiply(const Transformable& other); 38c0fe8a07SStephan Aßmus void Reset(); 39c0fe8a07SStephan Aßmus 40c0fe8a07SStephan Aßmus bool IsIdentity() const; 4108135223SJulian Harnath bool IsDilation() const; 42*13e393dfSStephan Aßmus // bool operator==(const Transformable& other) const; 43*13e393dfSStephan Aßmus // bool operator!=(const Transformable& other) const; 44c0fe8a07SStephan Aßmus 45c0fe8a07SStephan Aßmus // transforms coordiantes 46c0fe8a07SStephan Aßmus void Transform(double* x, double* y) const; 47c0fe8a07SStephan Aßmus void Transform(BPoint* point) const; 48c0fe8a07SStephan Aßmus BPoint Transform(const BPoint& point) const; 49c0fe8a07SStephan Aßmus 50c0fe8a07SStephan Aßmus void InverseTransform(double* x, double* y) const; 51c0fe8a07SStephan Aßmus void InverseTransform(BPoint* point) const; 52c0fe8a07SStephan Aßmus BPoint InverseTransform(const BPoint& point) const; 53c0fe8a07SStephan Aßmus 54c0fe8a07SStephan Aßmus // transforms the rectangle "bounds" and 55c0fe8a07SStephan Aßmus // returns the *bounding box* of that 564389b702SStephan Aßmus BRect TransformBounds(const BRect& bounds) const; 57c0fe8a07SStephan Aßmus 58750958b8SStephan Aßmus bool IsTranslationOnly() const; 59750958b8SStephan Aßmus 60c0fe8a07SStephan Aßmus // some convenience functions 61c0fe8a07SStephan Aßmus virtual void TranslateBy(BPoint offset); 62a37ea917SJérôme Duval virtual void RotateBy(BPoint origin, double radians); 63c0fe8a07SStephan Aßmus virtual void ScaleBy(BPoint origin, double xScale, double yScale); 64c0fe8a07SStephan Aßmus virtual void ShearBy(BPoint origin, double xShear, double yShear); 65c0fe8a07SStephan Aßmus TransformationChanged()66c0fe8a07SStephan Aßmus virtual void TransformationChanged() {} 67c0fe8a07SStephan Aßmus }; 68c0fe8a07SStephan Aßmus 69c0fe8a07SStephan Aßmus #endif // TRANSFORMABLE_H 70c0fe8a07SStephan Aßmus 71