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