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