1/*
2 * Copyright 2002-2009, Haiku.
3 * Distributed under the terms of the MIT License.
4 *
5 * Authors:
6 *		Michael Lotz <mmlr@mlotz.ch>
7 *		DarkWyrm <bpmagic@columbus.rr.com>
8 *		Stephan A��mus <superstippi@gmx.de>
9 */
10
11
12#include <new>
13#include <stdio.h>
14#include <string.h>
15
16#include "Bitmap.h"
17#include "BitmapBuffer.h"
18#include "BBitmapBuffer.h"
19
20#include "BitmapHWInterface.h"
21
22using std::nothrow;
23
24
25BitmapHWInterface::BitmapHWInterface(ServerBitmap* bitmap)
26	:
27	HWInterface(),
28	fBackBuffer(NULL),
29	fFrontBuffer(new(nothrow) BitmapBuffer(bitmap))
30{
31}
32
33
34BitmapHWInterface::~BitmapHWInterface()
35{
36}
37
38
39status_t
40BitmapHWInterface::Initialize()
41{
42	status_t ret = HWInterface::Initialize();
43	if (ret < B_OK)
44		return ret;
45
46	ret = fFrontBuffer->InitCheck();
47	if (ret < B_OK)
48		return ret;
49
50// TODO: Remove once unnecessary...
51	// fall back to double buffered mode until Painter knows how
52	// to draw onto non 32-bit surfaces...
53	if (fFrontBuffer->ColorSpace() != B_RGB32
54		&& fFrontBuffer->ColorSpace() != B_RGBA32) {
55		BBitmap* backBitmap = new BBitmap(fFrontBuffer->Bounds(),
56			B_BITMAP_NO_SERVER_LINK, B_RGBA32);
57		fBackBuffer.SetTo(new BBitmapBuffer(backBitmap));
58
59		ret = fBackBuffer->InitCheck();
60		if (ret < B_OK) {
61			fBackBuffer.Unset();
62		} else {
63			// import the current contents of the bitmap
64			// into the back bitmap
65			backBitmap->ImportBits(fFrontBuffer->Bits(),
66				fFrontBuffer->BitsLength(), fFrontBuffer->BytesPerRow(), 0,
67				fFrontBuffer->ColorSpace());
68		}
69	}
70
71	return ret;
72}
73
74
75status_t
76BitmapHWInterface::Shutdown()
77{
78	return B_OK;
79}
80
81
82status_t
83BitmapHWInterface::SetMode(const display_mode& mode)
84{
85	return B_UNSUPPORTED;
86}
87
88
89void
90BitmapHWInterface::GetMode(display_mode* mode)
91{
92	if (mode != NULL)
93		memset(mode, 0, sizeof(display_mode));
94}
95
96
97status_t
98BitmapHWInterface::GetDeviceInfo(accelerant_device_info* info)
99{
100	return B_UNSUPPORTED;
101}
102
103
104status_t
105BitmapHWInterface::GetFrameBufferConfig(frame_buffer_config& config)
106{
107	return B_UNSUPPORTED;
108}
109
110
111status_t
112BitmapHWInterface::GetModeList(display_mode** modes, uint32 *count)
113{
114	return B_UNSUPPORTED;
115}
116
117
118status_t
119BitmapHWInterface::GetPixelClockLimits(display_mode* mode, uint32* low,
120	uint32* high)
121{
122	return B_UNSUPPORTED;
123}
124
125
126status_t
127BitmapHWInterface::GetTimingConstraints(display_timing_constraints* constraints)
128{
129	return B_UNSUPPORTED;
130}
131
132
133status_t
134BitmapHWInterface::ProposeMode(display_mode* candidate, const display_mode* low,
135	const display_mode* high)
136{
137	return B_UNSUPPORTED;
138}
139
140
141sem_id
142BitmapHWInterface::RetraceSemaphore()
143{
144	return -1;
145}
146
147
148status_t
149BitmapHWInterface::WaitForRetrace(bigtime_t timeout)
150{
151	return B_UNSUPPORTED;
152}
153
154
155status_t
156BitmapHWInterface::SetDPMSMode(uint32 state)
157{
158	return B_UNSUPPORTED;
159}
160
161
162uint32
163BitmapHWInterface::DPMSMode()
164{
165	return 0;
166}
167
168
169uint32
170BitmapHWInterface::DPMSCapabilities()
171{
172	return 0;
173}
174
175
176status_t
177BitmapHWInterface::SetBrightness(float)
178{
179	return B_UNSUPPORTED;
180}
181
182
183status_t
184BitmapHWInterface::GetBrightness(float*)
185{
186	return B_UNSUPPORTED;
187}
188
189
190RenderingBuffer*
191BitmapHWInterface::FrontBuffer() const
192{
193	return fFrontBuffer.Get();
194}
195
196
197RenderingBuffer*
198BitmapHWInterface::BackBuffer() const
199{
200	return fBackBuffer.Get();
201}
202
203
204bool
205BitmapHWInterface::IsDoubleBuffered() const
206{
207	if (fFrontBuffer.IsSet())
208		return fBackBuffer.IsSet();
209
210	return false;
211}
212