xref: /haiku/src/servers/app/drawing/interface/virtual/DWindowBuffer.cpp (revision 97f11716bfaa0f385eb0e28a52bf56a5023b9e99)
1*a68b6c25SAugustin Cavalier #include <stdio.h>
2*a68b6c25SAugustin Cavalier 
3*a68b6c25SAugustin Cavalier #include <Accelerant.h>
4*a68b6c25SAugustin Cavalier #include <DirectWindow.h>
5*a68b6c25SAugustin Cavalier 
6*a68b6c25SAugustin Cavalier #include "DWindowBuffer.h"
7*a68b6c25SAugustin Cavalier 
8*a68b6c25SAugustin Cavalier // constructor
DWindowBuffer()9*a68b6c25SAugustin Cavalier DWindowBuffer::DWindowBuffer()
10*a68b6c25SAugustin Cavalier 	: fBits(NULL),
11*a68b6c25SAugustin Cavalier 	  fWidth(0),
12*a68b6c25SAugustin Cavalier 	  fHeight(0),
13*a68b6c25SAugustin Cavalier 	  fBytesPerRow(0),
14*a68b6c25SAugustin Cavalier 	  fFormat(B_NO_COLOR_SPACE),
15*a68b6c25SAugustin Cavalier 	  fWindowClipping()
16*a68b6c25SAugustin Cavalier {
17*a68b6c25SAugustin Cavalier }
18*a68b6c25SAugustin Cavalier 
19*a68b6c25SAugustin Cavalier // destructor
~DWindowBuffer()20*a68b6c25SAugustin Cavalier DWindowBuffer::~DWindowBuffer()
21*a68b6c25SAugustin Cavalier {
22*a68b6c25SAugustin Cavalier }
23*a68b6c25SAugustin Cavalier 
24*a68b6c25SAugustin Cavalier // InitCheck
25*a68b6c25SAugustin Cavalier status_t
InitCheck() const26*a68b6c25SAugustin Cavalier DWindowBuffer::InitCheck() const
27*a68b6c25SAugustin Cavalier {
28*a68b6c25SAugustin Cavalier 	if (fBits)
29*a68b6c25SAugustin Cavalier 		return B_OK;
30*a68b6c25SAugustin Cavalier 
31*a68b6c25SAugustin Cavalier 	return B_NO_INIT;
32*a68b6c25SAugustin Cavalier }
33*a68b6c25SAugustin Cavalier 
34*a68b6c25SAugustin Cavalier // ColorSpace
35*a68b6c25SAugustin Cavalier color_space
ColorSpace() const36*a68b6c25SAugustin Cavalier DWindowBuffer::ColorSpace() const
37*a68b6c25SAugustin Cavalier {
38*a68b6c25SAugustin Cavalier 	return fFormat;
39*a68b6c25SAugustin Cavalier }
40*a68b6c25SAugustin Cavalier 
41*a68b6c25SAugustin Cavalier // Bits
42*a68b6c25SAugustin Cavalier void*
Bits() const43*a68b6c25SAugustin Cavalier DWindowBuffer::Bits() const
44*a68b6c25SAugustin Cavalier {
45*a68b6c25SAugustin Cavalier 	return (void*)fBits;
46*a68b6c25SAugustin Cavalier }
47*a68b6c25SAugustin Cavalier 
48*a68b6c25SAugustin Cavalier // BytesPerRow
49*a68b6c25SAugustin Cavalier uint32
BytesPerRow() const50*a68b6c25SAugustin Cavalier DWindowBuffer::BytesPerRow() const
51*a68b6c25SAugustin Cavalier {
52*a68b6c25SAugustin Cavalier 	return fBytesPerRow;
53*a68b6c25SAugustin Cavalier }
54*a68b6c25SAugustin Cavalier 
55*a68b6c25SAugustin Cavalier // Width
56*a68b6c25SAugustin Cavalier uint32
Width() const57*a68b6c25SAugustin Cavalier DWindowBuffer::Width() const
58*a68b6c25SAugustin Cavalier {
59*a68b6c25SAugustin Cavalier 	return fWidth;
60*a68b6c25SAugustin Cavalier }
61*a68b6c25SAugustin Cavalier 
62*a68b6c25SAugustin Cavalier // Height
63*a68b6c25SAugustin Cavalier uint32
Height() const64*a68b6c25SAugustin Cavalier DWindowBuffer::Height() const
65*a68b6c25SAugustin Cavalier {
66*a68b6c25SAugustin Cavalier 	return fHeight;
67*a68b6c25SAugustin Cavalier }
68*a68b6c25SAugustin Cavalier 
69*a68b6c25SAugustin Cavalier // Set
70*a68b6c25SAugustin Cavalier void
SetTo(direct_buffer_info * info)71*a68b6c25SAugustin Cavalier DWindowBuffer::SetTo(direct_buffer_info* info)
72*a68b6c25SAugustin Cavalier {
73*a68b6c25SAugustin Cavalier 	fWindowClipping.MakeEmpty();
74*a68b6c25SAugustin Cavalier 
75*a68b6c25SAugustin Cavalier 	if (info) {
76*a68b6c25SAugustin Cavalier 		int32 xOffset = info->window_bounds.left;
77*a68b6c25SAugustin Cavalier 		int32 yOffset = info->window_bounds.top;
78*a68b6c25SAugustin Cavalier 		// Get clipping information
79*a68b6c25SAugustin Cavalier 		for (uint32 i = 0; i < info->clip_list_count; i++) {
80*a68b6c25SAugustin Cavalier 			fWindowClipping.Include(info->clip_list[i]);
81*a68b6c25SAugustin Cavalier 		}
82*a68b6c25SAugustin Cavalier 		fWindowClipping.OffsetBy(xOffset, yOffset);
83*a68b6c25SAugustin Cavalier 
84*a68b6c25SAugustin Cavalier 		fBytesPerRow = info->bytes_per_row;
85*a68b6c25SAugustin Cavalier 		fBits = (uint8*)info->bits;
86*a68b6c25SAugustin Cavalier 		fFormat = info->pixel_format;
87*a68b6c25SAugustin Cavalier 		fWidth = info->window_bounds.right - info->window_bounds.left + 1;
88*a68b6c25SAugustin Cavalier 		fHeight = info->window_bounds.bottom - info->window_bounds.top + 1;
89*a68b6c25SAugustin Cavalier 		// offset bits to left top corner of window
90*a68b6c25SAugustin Cavalier 		fBits += xOffset * 4 + yOffset * fBytesPerRow;
91*a68b6c25SAugustin Cavalier 	} else {
92*a68b6c25SAugustin Cavalier 		fBits = NULL;
93*a68b6c25SAugustin Cavalier 		fWidth = 0;
94*a68b6c25SAugustin Cavalier 		fHeight = 0;
95*a68b6c25SAugustin Cavalier 		fBytesPerRow = 0;
96*a68b6c25SAugustin Cavalier 		fFormat = B_NO_COLOR_SPACE;
97*a68b6c25SAugustin Cavalier 	}
98*a68b6c25SAugustin Cavalier }
99*a68b6c25SAugustin Cavalier 
100*a68b6c25SAugustin Cavalier // SetTo
101*a68b6c25SAugustin Cavalier void
SetTo(frame_buffer_config * config,uint32 x,uint32 y,uint32 width,uint32 height,color_space format)102*a68b6c25SAugustin Cavalier DWindowBuffer::SetTo(frame_buffer_config* config,
103*a68b6c25SAugustin Cavalier 					 uint32 x, uint32 y,
104*a68b6c25SAugustin Cavalier 					 uint32 width, uint32 height,
105*a68b6c25SAugustin Cavalier 					 color_space format)
106*a68b6c25SAugustin Cavalier {
107*a68b6c25SAugustin Cavalier 	fBits = (uint8*)config->frame_buffer;
108*a68b6c25SAugustin Cavalier 	fBytesPerRow = config->bytes_per_row;
109*a68b6c25SAugustin Cavalier 	fBits += x * 4 + y * fBytesPerRow;
110*a68b6c25SAugustin Cavalier 	fWidth = width;
111*a68b6c25SAugustin Cavalier 	fHeight = height;
112*a68b6c25SAugustin Cavalier 	fFormat = format;
113*a68b6c25SAugustin Cavalier }
114