1/*
2 * Copyright (c) 2001-2015, Haiku, Inc.
3 * Distributed under the terms of the MIT license.
4 *
5 * Authors:
6 *		DarkWyrm <bpmagic@columbus.rr.com>
7 *		Adi Oanca <adioanca@gmail.com>
8 *		Axel D��rfler, axeld@pinc-software.de
9 *		Stephan A��mus <superstippi@gmx.de>
10 *		Marcus Overhagen <marcus@overhagen.de>
11 *		Adrien Destugues <pulkomandy@pulkomandy.tk>
12 *		Julian Harnath <julian.harnath@rwth-aachen.de>
13 */
14#ifndef CANVAS_H
15#define CANVAS_H
16
17
18#include <AutoDeleter.h>
19#include <Point.h>
20
21#include "SimpleTransform.h"
22
23
24class AlphaMask;
25class BGradient;
26class BRegion;
27class DrawingEngine;
28class DrawState;
29class IntPoint;
30class IntRect;
31class Layer;
32class ServerPicture;
33class shape_data;
34
35
36class Canvas {
37public:
38							Canvas();
39							Canvas(const DrawState& state);
40	virtual					~Canvas();
41
42			status_t		InitCheck() const;
43
44	virtual	void			PushState();
45	virtual	void			PopState();
46			DrawState*		CurrentState() const { return fDrawState.Get(); }
47			void			SetDrawState(DrawState* newState);
48			DrawState*		DetachDrawState() { return fDrawState.Detach(); }
49
50			void			SetDrawingOrigin(BPoint origin);
51			BPoint			DrawingOrigin() const;
52
53			void			SetScale(float scale);
54			float			Scale() const;
55
56			void			SetUserClipping(const BRegion* region);
57				// region is expected in view coordinates
58
59			bool			ClipToRect(BRect rect, bool inverse);
60			void			ClipToShape(shape_data* shape, bool inverse);
61
62			void			SetAlphaMask(AlphaMask* mask);
63			AlphaMask*		GetAlphaMask() const;
64
65	virtual	IntRect			Bounds() const = 0;
66
67			SimpleTransform LocalToScreenTransform() const;
68			SimpleTransform ScreenToLocalTransform() const;
69			SimpleTransform PenToScreenTransform() const;
70			SimpleTransform PenToLocalTransform() const;
71			SimpleTransform ScreenToPenTransform() const;
72
73			void			BlendLayer(Layer* layer);
74
75	virtual	DrawingEngine*	GetDrawingEngine() const = 0;
76	virtual ServerPicture*	GetPicture(int32 token) const = 0;
77	virtual	void			RebuildClipping(bool deep) = 0;
78	virtual void			ResyncDrawState() {};
79	virtual void			UpdateCurrentDrawingRegion() {};
80
81protected:
82	virtual	void			_LocalToScreenTransform(
83								SimpleTransform& transform) const = 0;
84	virtual	void			_ScreenToLocalTransform(
85								SimpleTransform& transform) const = 0;
86
87protected:
88			ObjectDeleter<DrawState>
89							fDrawState;
90};
91
92
93class OffscreenCanvas : public Canvas {
94public:
95							OffscreenCanvas(DrawingEngine* engine,
96								const DrawState& state, const IntRect& bounds);
97	virtual					~OffscreenCanvas();
98
99	virtual DrawingEngine*	GetDrawingEngine() const { return fDrawingEngine; }
100
101	virtual void			RebuildClipping(bool deep) { /* TODO */ }
102	virtual void			ResyncDrawState();
103	virtual void			UpdateCurrentDrawingRegion();
104	virtual ServerPicture*	GetPicture(int32 token) const
105								{ /* TODO */ return NULL; }
106	virtual	IntRect			Bounds() const;
107
108protected:
109	virtual	void			_LocalToScreenTransform(SimpleTransform&) const {}
110	virtual	void			_ScreenToLocalTransform(SimpleTransform&) const {}
111
112private:
113			DrawingEngine*	fDrawingEngine;
114			BRegion			fCurrentDrawingRegion;
115			IntRect			fBounds;
116};
117
118
119#endif // CANVAS_H
120