xref: /haiku/src/servers/app/drawing/Painter/Transformable.h (revision c302a243e15e640fae0f689e32cdf0c18749afee)
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