Home | History | Annotate | Download | only in bwindow
      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 (at) 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 */
    117