1/*
2 * Copyright 2005 Michael Lotz <mmlr@mlotz.ch>
3 * All rights reserved. Distributed under the terms of the MIT license.
4 */
5
6//! A RenderingBuffer implementation that accesses graphics memory directly.
7
8
9#include "AccelerantBuffer.h"
10
11
12AccelerantBuffer::AccelerantBuffer()
13	: fDisplayModeSet(false),
14	  fFrameBufferConfigSet(false),
15	  fIsOffscreenBuffer(false)
16{
17}
18
19
20AccelerantBuffer::AccelerantBuffer(const display_mode& mode,
21		const frame_buffer_config& config)
22	: fDisplayModeSet(false),
23	  fFrameBufferConfigSet(false),
24	  fIsOffscreenBuffer(false)
25{
26	SetDisplayMode(mode);
27	SetFrameBufferConfig(config);
28}
29
30
31AccelerantBuffer::AccelerantBuffer(const AccelerantBuffer& other,
32		bool offscreenBuffer)
33	: fDisplayMode(other.fDisplayMode),
34	  fFrameBufferConfig(other.fFrameBufferConfig),
35	  fDisplayModeSet(other.fDisplayModeSet),
36	  fFrameBufferConfigSet(other.fFrameBufferConfigSet),
37	  fIsOffscreenBuffer(other.fIsOffscreenBuffer || offscreenBuffer)
38{
39}
40
41
42AccelerantBuffer::~AccelerantBuffer()
43{
44}
45
46
47status_t
48AccelerantBuffer::InitCheck() const
49{
50	if (fDisplayModeSet && fFrameBufferConfigSet)
51		return B_OK;
52
53	return B_NO_INIT;
54}
55
56
57color_space
58AccelerantBuffer::ColorSpace() const
59{
60	if (InitCheck() == B_OK)
61		return (color_space)fDisplayMode.space;
62
63	return B_NO_COLOR_SPACE;
64}
65
66
67void*
68AccelerantBuffer::Bits() const
69{
70	if (InitCheck() != B_OK)
71		return NULL;
72
73	uint8* bits = (uint8*)fFrameBufferConfig.frame_buffer;
74
75	if (fIsOffscreenBuffer)
76		bits += fDisplayMode.virtual_height * fFrameBufferConfig.bytes_per_row;
77
78	return bits;
79}
80
81
82uint32
83AccelerantBuffer::BytesPerRow() const
84{
85	if (InitCheck() == B_OK)
86		return fFrameBufferConfig.bytes_per_row;
87
88	return 0;
89}
90
91
92uint32
93AccelerantBuffer::Width() const
94{
95	if (InitCheck() == B_OK)
96		return fDisplayMode.virtual_width;
97
98	return 0;
99}
100
101
102uint32
103AccelerantBuffer::Height() const
104{
105	if (InitCheck() == B_OK)
106		return fDisplayMode.virtual_height;
107
108	return 0;
109}
110
111
112void
113AccelerantBuffer::SetDisplayMode(const display_mode& mode)
114{
115	fDisplayMode = mode;
116	fDisplayModeSet = true;
117}
118
119
120void
121AccelerantBuffer::SetFrameBufferConfig(const frame_buffer_config& config)
122{
123	fFrameBufferConfig = config;
124	fFrameBufferConfigSet = true;
125}
126
127
128void
129AccelerantBuffer::SetOffscreenBuffer(bool offscreenBuffer)
130{
131	fIsOffscreenBuffer = offscreenBuffer;
132}
133