xref: /haiku/src/servers/app/drawing/BitmapDrawingEngine.cpp (revision 1e60bdeab63fa7a57bc9a55b032052e95a18bd2c)
1 #include "BitmapDrawingEngine.h"
2 #include "BitmapHWInterface.h"
3 #include "ServerBitmap.h"
4 #include <new>
5 
6 
7 BitmapDrawingEngine::BitmapDrawingEngine(color_space colorSpace)
8 	:	DrawingEngine(),
9 		fColorSpace(colorSpace),
10 		fHWInterface(NULL),
11 		fBitmap(NULL)
12 {
13 }
14 
15 
16 BitmapDrawingEngine::~BitmapDrawingEngine()
17 {
18 	SetSize(0, 0);
19 }
20 
21 
22 #if DEBUG
23 bool
24 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
34 BitmapDrawingEngine::IsExclusiveAccessLocked() const
35 {
36 	// See IsParallelAccessLocked().
37 	return true;
38 }
39 
40 
41 status_t
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 != NULL) {
52 		fHWInterface->LockExclusiveAccess();
53 		fHWInterface->Shutdown();
54 		fHWInterface->UnlockExclusiveAccess();
55 		delete fHWInterface;
56 		fHWInterface = NULL;
57 	}
58 
59 	if (fBitmap != NULL) {
60 		fBitmap->ReleaseReference();
61 		fBitmap = NULL;
62 	}
63 
64 	if (newWidth <= 0 || newHeight <= 0)
65 		return B_OK;
66 
67 	fBitmap = new(std::nothrow) UtilityBitmap(BRect(0, 0, newWidth - 1,
68 		newHeight - 1), fColorSpace, 0);
69 	if (fBitmap == NULL)
70 		return B_NO_MEMORY;
71 
72 	fHWInterface = new(std::nothrow) BitmapHWInterface(fBitmap);
73 	if (fHWInterface == NULL)
74 		return B_NO_MEMORY;
75 
76 	status_t result = fHWInterface->Initialize();
77 	if (result != B_OK)
78 		return result;
79 
80 	// we have to set a valid clipping first
81 	fClipping.Set(fBitmap->Bounds());
82 	ConstrainClippingRegion(&fClipping);
83 	SetHWInterface(fHWInterface);
84 	return B_OK;
85 }
86 
87 
88 UtilityBitmap*
89 BitmapDrawingEngine::ExportToBitmap(int32 width, int32 height,
90 	color_space space)
91 {
92 	if (width <= 0 || height <= 0)
93 		return NULL;
94 
95 	UtilityBitmap *result = new(std::nothrow) UtilityBitmap(BRect(0, 0,
96 		width - 1, height - 1), space, 0);
97 	if (result == NULL)
98 		return NULL;
99 
100 	if (result->ImportBits(fBitmap->Bits(), fBitmap->BitsLength(),
101 		fBitmap->BytesPerRow(), fBitmap->ColorSpace()) != B_OK) {
102 		delete result;
103 		return NULL;
104 	}
105 
106 	return result;
107 }
108