1*91c99ff4SAndrew Rist /**************************************************************
2cdf0e10cSrcweir  *
3*91c99ff4SAndrew Rist  * Licensed to the Apache Software Foundation (ASF) under one
4*91c99ff4SAndrew Rist  * or more contributor license agreements.  See the NOTICE file
5*91c99ff4SAndrew Rist  * distributed with this work for additional information
6*91c99ff4SAndrew Rist  * regarding copyright ownership.  The ASF licenses this file
7*91c99ff4SAndrew Rist  * to you under the Apache License, Version 2.0 (the
8*91c99ff4SAndrew Rist  * "License"); you may not use this file except in compliance
9*91c99ff4SAndrew Rist  * with the License.  You may obtain a copy of the License at
10*91c99ff4SAndrew Rist  *
11*91c99ff4SAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
12*91c99ff4SAndrew Rist  *
13*91c99ff4SAndrew Rist  * Unless required by applicable law or agreed to in writing,
14*91c99ff4SAndrew Rist  * software distributed under the License is distributed on an
15*91c99ff4SAndrew Rist  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*91c99ff4SAndrew Rist  * KIND, either express or implied.  See the License for the
17*91c99ff4SAndrew Rist  * specific language governing permissions and limitations
18*91c99ff4SAndrew Rist  * under the License.
19*91c99ff4SAndrew Rist  *
20*91c99ff4SAndrew Rist  *************************************************************/
21*91c99ff4SAndrew Rist 
22*91c99ff4SAndrew Rist 
23cdf0e10cSrcweir 
24cdf0e10cSrcweir #ifndef _VCLCANVAS_BITMAPBACKBUFFER_HXX_
25cdf0e10cSrcweir #define _VCLCANVAS_BITMAPBACKBUFFER_HXX_
26cdf0e10cSrcweir 
27cdf0e10cSrcweir #include <vcl/virdev.hxx>
28cdf0e10cSrcweir #include <vcl/bitmapex.hxx>
29cdf0e10cSrcweir 
30cdf0e10cSrcweir #include <canvas/vclwrapper.hxx>
31cdf0e10cSrcweir #include "outdevprovider.hxx"
32cdf0e10cSrcweir 
33cdf0e10cSrcweir #include <boost/shared_ptr.hpp>
34cdf0e10cSrcweir 
35cdf0e10cSrcweir 
36cdf0e10cSrcweir namespace vclcanvas
37cdf0e10cSrcweir {
38cdf0e10cSrcweir     /** Backbuffer implementation for canvas bitmap.
39cdf0e10cSrcweir 
40cdf0e10cSrcweir     	This class abstracts away the renderable bitmap for the bitmap
41cdf0e10cSrcweir     	canvas. The actual VirtualDevice is only created when
42cdf0e10cSrcweir     	necessary, which makes read-only bitmaps a lot smaller.
43cdf0e10cSrcweir     */
44cdf0e10cSrcweir 	class BitmapBackBuffer : public OutDevProvider
45cdf0e10cSrcweir     {
46cdf0e10cSrcweir     public:
47cdf0e10cSrcweir         /** Create a backbuffer for given reference device
48cdf0e10cSrcweir          */
49cdf0e10cSrcweir         BitmapBackBuffer( const BitmapEx& 		rBitmap,
50cdf0e10cSrcweir                           const OutputDevice& 	rRefDevice );
51cdf0e10cSrcweir 
52cdf0e10cSrcweir         ~BitmapBackBuffer();
53cdf0e10cSrcweir 
54cdf0e10cSrcweir         virtual OutputDevice& 		getOutDev();
55cdf0e10cSrcweir         virtual const OutputDevice& getOutDev() const;
56cdf0e10cSrcweir 
57cdf0e10cSrcweir         /// Clear the underlying bitmap to white, all transparent
58cdf0e10cSrcweir         void clear();
59cdf0e10cSrcweir 
60cdf0e10cSrcweir         /** Exposing our internal bitmap. Only to be used from
61cdf0e10cSrcweir             CanvasBitmapHelper
62cdf0e10cSrcweir 
63cdf0e10cSrcweir         	@internal
64cdf0e10cSrcweir         */
65cdf0e10cSrcweir         BitmapEx&					getBitmapReference();
66cdf0e10cSrcweir         Size						getBitmapSizePixel() const;
67cdf0e10cSrcweir 
68cdf0e10cSrcweir     private:
69cdf0e10cSrcweir         void createVDev() const;
70cdf0e10cSrcweir         void updateVDev() const;
71cdf0e10cSrcweir 
72cdf0e10cSrcweir         ::canvas::vcltools::VCLObject<BitmapEx>	maBitmap;
73cdf0e10cSrcweir         mutable VirtualDevice*					mpVDev; // created only on demand
74cdf0e10cSrcweir 
75cdf0e10cSrcweir         const OutputDevice& 					mrRefDevice;
76cdf0e10cSrcweir 
77cdf0e10cSrcweir         /** When true, the bitmap contains the last valid
78cdf0e10cSrcweir             content. When false, and mbVDevContentIsCurrent is true,
79cdf0e10cSrcweir             the VDev contains the last valid content (which must be
80cdf0e10cSrcweir             copied back to the bitmap, when getBitmapReference() is
81cdf0e10cSrcweir             called). When both are false, this object is just
82cdf0e10cSrcweir             initialized.
83cdf0e10cSrcweir          */
84cdf0e10cSrcweir         mutable bool							mbBitmapContentIsCurrent;
85cdf0e10cSrcweir 
86cdf0e10cSrcweir         /** When true, and mpVDev is non-NULL, the VDev contains the
87cdf0e10cSrcweir             last valid content. When false, and
88cdf0e10cSrcweir             mbBitmapContentIsCurrent is true, the bitmap contains the
89cdf0e10cSrcweir             last valid content. When both are false, this object is
90cdf0e10cSrcweir             just initialized.
91cdf0e10cSrcweir          */
92cdf0e10cSrcweir         mutable bool							mbVDevContentIsCurrent;
93cdf0e10cSrcweir     };
94cdf0e10cSrcweir 
95cdf0e10cSrcweir     typedef ::boost::shared_ptr< BitmapBackBuffer > BitmapBackBufferSharedPtr;
96cdf0e10cSrcweir 
97cdf0e10cSrcweir }
98cdf0e10cSrcweir 
99cdf0e10cSrcweir #endif /* #ifndef _VCLCANVAS_BITMAPBACKBUFFER_HXX_ */
100cdf0e10cSrcweir 
101