1#include "BitmapDrawingEngine.h"
2#include "BitmapHWInterface.h"
3#include "ServerBitmap.h"
4#include <new>
5
6
7BitmapDrawingEngine::BitmapDrawingEngine(color_space colorSpace)
8	:	DrawingEngine(),
9		fColorSpace(colorSpace),
10		fHWInterface(NULL),
11		fBitmap(NULL)
12{
13}
14
15
16BitmapDrawingEngine::~BitmapDrawingEngine()
17{
18	SetSize(0, 0);
19}
20
21
22#if DEBUG
23bool
24BitmapDrawingEngine::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
33bool
34BitmapDrawingEngine::IsExclusiveAccessLocked() const
35{
36	// See IsParallelAccessLocked().
37	return true;
38}
39
40
41status_t
42BitmapDrawingEngine::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
88UtilityBitmap*
89BitmapDrawingEngine::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