1 #include "BitmapDrawingEngine.h"
2 #include "BitmapHWInterface.h"
3 #include "ServerBitmap.h"
4 #include <new>
5
6
BitmapDrawingEngine(color_space colorSpace)7 BitmapDrawingEngine::BitmapDrawingEngine(color_space colorSpace)
8 : DrawingEngine(),
9 fColorSpace(colorSpace),
10 fHWInterface(NULL),
11 fBitmap(NULL)
12 {
13 }
14
15
~BitmapDrawingEngine()16 BitmapDrawingEngine::~BitmapDrawingEngine()
17 {
18 SetSize(0, 0);
19 }
20
21
22 #if DEBUG
23 bool
IsParallelAccessLocked() const24 BitmapDrawingEngine::IsParallelAccessLocked() const
25 {
26 // We don't share the HWInterface instance that the Painter is
27 // attached to, so we never need to be locked.
28 return true;
29 }
30 #endif
31
32
33 bool
IsExclusiveAccessLocked() const34 BitmapDrawingEngine::IsExclusiveAccessLocked() const
35 {
36 // See IsParallelAccessLocked().
37 return true;
38 }
39
40
41 status_t
SetSize(int32 newWidth,int32 newHeight)42 BitmapDrawingEngine::SetSize(int32 newWidth, int32 newHeight)
43 {
44 if (fBitmap != NULL && newWidth > 0 && newHeight > 0
45 && fBitmap->Bounds().IntegerWidth() >= newWidth
46 && fBitmap->Bounds().IntegerHeight() >= newHeight) {
47 return B_OK;
48 }
49
50 SetHWInterface(NULL);
51 if (fHWInterface.IsSet()) {
52 fHWInterface->LockExclusiveAccess();
53 fHWInterface->Shutdown();
54 fHWInterface->UnlockExclusiveAccess();
55 fHWInterface.Unset();
56 }
57
58 if (newWidth <= 0 || newHeight <= 0)
59 return B_OK;
60
61 fBitmap.SetTo(new(std::nothrow) UtilityBitmap(BRect(0, 0, newWidth - 1,
62 newHeight - 1), fColorSpace, 0));
63 if (!fBitmap.IsSet())
64 return B_NO_MEMORY;
65
66 fHWInterface.SetTo(new(std::nothrow) BitmapHWInterface(fBitmap));
67 if (!fHWInterface.IsSet())
68 return B_NO_MEMORY;
69
70 status_t result = fHWInterface->Initialize();
71 if (result != B_OK)
72 return result;
73
74 // we have to set a valid clipping first
75 fClipping.Set(fBitmap->Bounds());
76 ConstrainClippingRegion(&fClipping);
77 SetHWInterface(fHWInterface.Get());
78 return B_OK;
79 }
80
81
82 UtilityBitmap*
ExportToBitmap(int32 width,int32 height,color_space space)83 BitmapDrawingEngine::ExportToBitmap(int32 width, int32 height,
84 color_space space)
85 {
86 if (width <= 0 || height <= 0)
87 return NULL;
88
89 UtilityBitmap *result = new(std::nothrow) UtilityBitmap(BRect(0, 0,
90 width - 1, height - 1), space, 0);
91 if (result == NULL)
92 return NULL;
93
94 if (result->ImportBits(fBitmap->Bits(), fBitmap->BitsLength(),
95 fBitmap->BytesPerRow(), fBitmap->ColorSpace()) != B_OK) {
96 delete result;
97 return NULL;
98 }
99
100 return result;
101 }
102