/* * Copyright (c) 2001-2015, Haiku, Inc. * Distributed under the terms of the MIT license. * * Authors: * DarkWyrm * Adi Oanca * Axel Dörfler, axeld@pinc-software.de * Stephan Aßmus * Marcus Overhagen * Adrien Destugues * Julian Harnath */ #ifndef CANVAS_H #define CANVAS_H #include #include #include "SimpleTransform.h" class AlphaMask; class BGradient; class BRegion; class DrawingEngine; class DrawState; class IntPoint; class IntRect; class Layer; class ServerPicture; class shape_data; class Canvas { public: Canvas(); Canvas(const DrawState& state); virtual ~Canvas(); status_t InitCheck() const; virtual void PushState(); virtual void PopState(); DrawState* CurrentState() const { return fDrawState.Get(); } void SetDrawState(DrawState* newState); DrawState* DetachDrawState() { return fDrawState.Detach(); } void SetDrawingOrigin(BPoint origin); BPoint DrawingOrigin() const; void SetScale(float scale); float Scale() const; void SetUserClipping(const BRegion* region); // region is expected in view coordinates bool ClipToRect(BRect rect, bool inverse); void ClipToShape(shape_data* shape, bool inverse); void SetAlphaMask(AlphaMask* mask); AlphaMask* GetAlphaMask() const; virtual IntRect Bounds() const = 0; SimpleTransform LocalToScreenTransform() const; SimpleTransform ScreenToLocalTransform() const; SimpleTransform PenToScreenTransform() const; SimpleTransform PenToLocalTransform() const; SimpleTransform ScreenToPenTransform() const; void BlendLayer(Layer* layer); virtual DrawingEngine* GetDrawingEngine() const = 0; virtual ServerPicture* GetPicture(int32 token) const = 0; virtual void RebuildClipping(bool deep) = 0; virtual void ResyncDrawState() {}; virtual void UpdateCurrentDrawingRegion() {}; protected: virtual void _LocalToScreenTransform( SimpleTransform& transform) const = 0; virtual void _ScreenToLocalTransform( SimpleTransform& transform) const = 0; protected: ObjectDeleter fDrawState; }; class OffscreenCanvas : public Canvas { public: OffscreenCanvas(DrawingEngine* engine, const DrawState& state, const IntRect& bounds); virtual ~OffscreenCanvas(); virtual DrawingEngine* GetDrawingEngine() const { return fDrawingEngine; } virtual void RebuildClipping(bool deep) { /* TODO */ } virtual void ResyncDrawState(); virtual void UpdateCurrentDrawingRegion(); virtual ServerPicture* GetPicture(int32 token) const { /* TODO */ return NULL; } virtual IntRect Bounds() const; protected: virtual void _LocalToScreenTransform(SimpleTransform&) const {} virtual void _ScreenToLocalTransform(SimpleTransform&) const {} private: DrawingEngine* fDrawingEngine; BRegion fCurrentDrawingRegion; IntRect fBounds; }; #endif // CANVAS_H