2 * Copyright 2008-2009, Haiku.
3 * Distributed under the terms of the MIT License.
6 * Stefano Ceccherini <stefano.ceccherini@gmail.com>
7 * Axel Dörfler, axeld@pinc-software.de
11 #include "DirectWindowInfo.h"
19 #include "RenderingBuffer.h"
23 DirectWindowInfo::DirectWindowInfo()
29 fOriginalFeel(B_NORMAL_WINDOW_FEEL
),
32 fBufferArea
= create_area("direct area", (void**)&fBufferInfo
,
33 B_ANY_ADDRESS
, DIRECT_BUFFER_INFO_AREA_SIZE
,
34 B_NO_LOCK
, B_READ_AREA
| B_WRITE_AREA
);
36 memset(fBufferInfo
, 0, DIRECT_BUFFER_INFO_AREA_SIZE
);
37 fBufferInfo
->buffer_state
= B_DIRECT_STOP
;
39 fSem
= create_sem(0, "direct sem");
40 fAcknowledgeSem
= create_sem(0, "direct sem ack");
44 DirectWindowInfo::~DirectWindowInfo()
46 // this should make the client die in case it's still running
47 fBufferInfo
->bits
= NULL
;
48 fBufferInfo
->bytes_per_row
= 0;
50 delete_area(fBufferArea
);
52 delete_sem(fAcknowledgeSem
);
57 DirectWindowInfo::InitCheck() const
59 if (fBufferArea
< B_OK
)
63 if (fAcknowledgeSem
< B_OK
)
64 return fAcknowledgeSem
;
71 DirectWindowInfo::GetSyncData(direct_window_sync_data
& data
) const
73 data
.area
= fBufferArea
;
74 data
.disable_sem
= fSem
;
75 data
.disable_sem_ack
= fAcknowledgeSem
;
82 DirectWindowInfo::SetState(direct_buffer_state bufferState
,
83 direct_driver_state driverState
, RenderingBuffer
* buffer
,
84 const BRect
& windowFrame
, const BRegion
& clipRegion
)
86 if ((fBufferInfo
->buffer_state
& B_DIRECT_MODE_MASK
) == B_DIRECT_STOP
87 && (bufferState
& B_DIRECT_MODE_MASK
) != B_DIRECT_START
)
90 fBufferInfo
->buffer_state
= bufferState
;
92 if (driverState
!= -1)
93 fBufferInfo
->driver_state
= driverState
;
95 if ((bufferState
& B_DIRECT_MODE_MASK
) != B_DIRECT_STOP
) {
96 fBufferInfo
->bits
= buffer
->Bits();
97 fBufferInfo
->pci_bits
= NULL
; // TODO
98 fBufferInfo
->bytes_per_row
= buffer
->BytesPerRow();
100 switch (buffer
->ColorSpace()) {
105 fBufferInfo
->bits_per_pixel
= 32;
109 fBufferInfo
->bits_per_pixel
= 24;
115 fBufferInfo
->bits_per_pixel
= 16;
119 fBufferInfo
->bits_per_pixel
= 8;
123 "unknown colorspace in DirectWindowInfo::SetState()!\n");
124 fBufferInfo
->bits_per_pixel
= 0;
128 fBufferInfo
->pixel_format
= buffer
->ColorSpace();
129 fBufferInfo
->layout
= B_BUFFER_NONINTERLEAVED
;
130 fBufferInfo
->orientation
= B_BUFFER_TOP_TO_BOTTOM
;
132 fBufferInfo
->window_bounds
= to_clipping_rect(windowFrame
);
134 const int32 kMaxClipRectsCount
= (DIRECT_BUFFER_INFO_AREA_SIZE
135 - sizeof(direct_buffer_info
)) / sizeof(clipping_rect
);
137 fBufferInfo
->clip_list_count
= min_c(clipRegion
.CountRects(),
139 fBufferInfo
->clip_bounds
= clipRegion
.FrameInt();
141 for (uint32 i
= 0; i
< fBufferInfo
->clip_list_count
; i
++)
142 fBufferInfo
->clip_list
[i
] = clipRegion
.RectAtInt(i
);
145 return _SyncronizeWithClient();
150 DirectWindowInfo::EnableFullScreen(const BRect
& frame
, window_feel feel
)
152 fOriginalFrame
= frame
;
153 fOriginalFeel
= feel
;
159 DirectWindowInfo::DisableFullScreen()
166 DirectWindowInfo::_SyncronizeWithClient()
168 // Releasing this semaphore causes the client to call
169 // BDirectWindow::DirectConnected()
170 status_t status
= release_sem(fSem
);
174 // Wait with a timeout of half a second until the client exits
175 // from its DirectConnected() implementation
177 status
= acquire_sem_etc(fAcknowledgeSem
, 1, B_TIMEOUT
, 500000);
178 } while (status
== B_INTERRUPTED
);