21 #include "../../SDL_internal.h"
23 #if SDL_VIDEO_DRIVER_HAIKU
28 #include <InterfaceKit.h>
32 #include "../../main/haiku/SDL_BApp.h"
52 void **
pixels,
int *pitch) {
55 if(!bscreen.IsValid()) {
59 while(!bwin->
Connected()) { snooze(100); }
66 bscreen.GetMode(&bmode);
76 bitmap =
new BBitmap(bwin->Bounds(), (color_space)bmode.space,
80 if(bitmap->InitCheck() != B_OK) {
82 return SDL_SetError(
"Could not initialize back buffer!");
89 *pixels = bitmap->Bits();
92 *pitch = bitmap->BytesPerRow();
115 HAIKU_UpdateOnce(window);
125 if(!bscreen.IsValid()) {
132 BBitmap *bitmap =
NULL;
134 int32 windowPitch = bitmap->BytesPerRow();
140 int32 windowSub = bwin->
GetFbX() * BPP +
141 bwin->
GetFbY() * windowPitch;
142 clipping_rect *clips = bwin->
GetClips();
147 bscreen.WaitForRetrace();
148 for(i = 0; i < numClips; ++
i) {
150 int32
width = clips[
i].right - clips[
i].left + 1;
151 int32
height = clips[
i].bottom - clips[
i].top + 1;
153 clips[
i].top * bufferPitch + clips[
i].left *
BPP;
154 windowpx = (uint8*)bitmap->Bits() +
155 clips[
i].top * windowPitch + clips[
i].left * BPP -
167 memcpy(bufferpx, windowpx, width * BPP);
168 bufferpx += bufferPitch;
169 windowpx += windowPitch;
205 static int32 HAIKU_UpdateOnce(
SDL_Window *window) {
208 if(!bscreen.IsValid()) {
221 int32 windowSub = bwin->
GetFbX() * BPP +
222 bwin->
GetFbY() * windowPitch;
223 clipping_rect *clips = bwin->
GetClips();
228 bscreen.WaitForRetrace();
229 for(i = 0; i < numClips; ++
i) {
231 int32 width = clips[
i].right - clips[
i].left + 1;
232 int32 height = clips[
i].bottom - clips[
i].top + 1;
234 clips[
i].top * bufferPitch + clips[
i].left *
BPP;
235 windowpx = windowBaseAddress +
236 clips[
i].top * windowPitch + clips[
i].left * BPP - windowSub;
242 memcpy(bufferpx, windowpx, width * BPP);
243 bufferpx += bufferPitch;
244 windowpx += windowPitch;