SDL-1.2.14
[sdl_omap.git] / src / video / bwindow / SDL_BView.h
1 /*
2     SDL - Simple DirectMedia Layer
3     Copyright (C) 1997-2009 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
29 extern "C" {
30 #include "../../events/SDL_events_c.h"
31 };
32
33 class SDL_BView : public BView
34 {
35 public:
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
111 private:
112         BBitmap *image;
113         int xoff, yoff;
114 };
115
116 #endif /* _SDL_BView_h */