1/*
2    SDL - Simple DirectMedia Layer
3    Copyright (C) 1997-2012 Sam Lantinga
4
5    This library is free software; you can redistribute it and/or
6    modify it under the terms of the GNU Lesser General Public
7    License as published by the Free Software Foundation; either
8    version 2.1 of the License, or (at your option) any later version.
9
10    This library is distributed in the hope that it will be useful,
11    but WITHOUT ANY WARRANTY; without even the implied warranty of
12    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13    Lesser General Public License for more details.
14
15    You should have received a copy of the GNU Lesser General Public
16    License along with this library; if not, write to the Free Software
17    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
18
19    Sam Lantinga
20    slouken@libsdl.org
21*/
22#include "SDL_config.h"
23
24#ifndef _SDL_BView_h
25#define _SDL_BView_h
26
27/* This is the event handling and graphics update portion of SDL_BWin */
28
29extern "C" {
30#include "../../events/SDL_events_c.h"
31};
32
33class SDL_BView : public BView
34{
35public:
36	SDL_BView(BRect frame) :
37		BView(frame, "SDL View", B_FOLLOW_ALL_SIDES,
38					(B_WILL_DRAW|B_FRAME_EVENTS)) {
39		image = NULL;
40		xoff = yoff = 0;
41		SetViewColor(0,0,0,0);
42		SetHighColor(0,0,0,0);
43	}
44	virtual ~SDL_BView() {
45		SetBitmap(NULL);
46	}
47	/* Set drawing offsets for fullscreen mode */
48	virtual void SetXYOffset(int x, int y) {
49		xoff = x;
50		yoff = y;
51	}
52	virtual void GetXYOffset(int &x, int &y) {
53		x = xoff;
54		y = yoff;
55	}
56	virtual void GetXYOffset(float &x, float &y) {
57		x = (float)xoff;
58		y = (float)yoff;
59	}
60	/* The view changed size. If it means we're in fullscreen, we
61	 * draw a nice black box in the entire view to get black borders.
62	 */
63	virtual void FrameResized(float width, float height) {
64		BRect bounds;
65		bounds.top = bounds.left = 0;
66		bounds.right = width;
67		bounds.bottom = height;
68		/* Fill the entire view with black */
69		FillRect(bounds, B_SOLID_HIGH);
70		/* And if there's an image, redraw it. */
71		if( image ) {
72			bounds = image->Bounds();
73			Draw(bounds);
74		}
75	}
76
77	/* Drawing portion of this complete breakfast. :) */
78	virtual void SetBitmap(BBitmap *bitmap) {
79		if ( image ) {
80			delete image;
81		}
82		image = bitmap;
83	}
84	virtual void Draw(BRect updateRect) {
85		if ( image ) {
86			if(xoff || yoff) {
87				BRect dest;
88				dest.top    = updateRect.top + yoff;
89				dest.left   = updateRect.left + xoff;
90				dest.bottom = updateRect.bottom + yoff;
91				dest.right  = updateRect.right + xoff;
92				DrawBitmap(image, updateRect, dest);
93			} else {
94				DrawBitmap(image, updateRect, updateRect);
95			}
96		}
97	}
98	virtual void DrawAsync(BRect updateRect) {
99		if(xoff || yoff) {
100			BRect dest;
101			dest.top    = updateRect.top + yoff;
102			dest.left   = updateRect.left + xoff;
103			dest.bottom = updateRect.bottom + yoff;
104			dest.right  = updateRect.right + xoff;;
105			DrawBitmapAsync(image, updateRect, dest);
106		} else {
107			DrawBitmapAsync(image, updateRect, updateRect);
108		}
109	}
110
111private:
112	BBitmap *image;
113	int xoff, yoff;
114};
115
116#endif /* _SDL_BView_h */
117