RenderWindow.cpp

00001 
00002 //
00003 // SFML - Simple and Fast Multimedia Library
00004 // Copyright (C) 2007 Laurent Gomila (laurent.gom@gmail.com)
00005 //
00006 // This software is provided 'as-is', without any express or implied warranty.
00007 // In no event will the authors be held liable for any damages arising from the use of this software.
00008 //
00009 // Permission is granted to anyone to use this software for any purpose,
00010 // including commercial applications, and to alter it and redistribute it freely,
00011 // subject to the following restrictions:
00012 //
00013 // 1. The origin of this software must not be misrepresented;
00014 //    you must not claim that you wrote the original software.
00015 //    If you use this software in a product, an acknowledgment
00016 //    in the product documentation would be appreciated but is not required.
00017 //
00018 // 2. Altered source versions must be plainly marked as such,
00019 //    and must not be misrepresented as being the original software.
00020 //
00021 // 3. This notice may not be removed or altered from any source distribution.
00022 //
00024 
00026 // Headers
00028 #include <SFML/Graphics/RenderWindow.h>
00029 #include <SFML/Graphics/RenderWindow.hpp>
00030 #include <SFML/Graphics/PostFX.hpp>
00031 #include <SFML/Graphics/Image.hpp>
00032 #include <SFML/Graphics/Sprite.hpp>
00033 #include <SFML/Graphics/String.hpp>
00034 #include <SFML/Internal.h>
00035 
00036 
00037 // WARNING : this structure must always be the SAME as in Graphics/PostFX.h
00038 struct sfPostFX
00039 {
00040     sf::PostFX This;
00041 };
00042 // WARNING : this structure must always be the SAME as in Graphics/Sprite.h
00043 struct sfSprite
00044 {
00045     sf::Sprite This;
00046     sfImage*   Image;
00047     sfIntRect  SubRect;
00048 };
00049 // WARNING : this structure must always be the SAME as in Graphics/String.h
00050 struct sfString
00051 {
00052     sf::String  This;
00053     std::string Text;
00054 };
00055 // WARNING : this structure must always be the SAME as in Graphics/Image.h
00056 struct sfImage
00057 {
00058     sf::Image This;
00059 };
00060 // WARNING : this structure must always be the SAME as in Window/Input.h
00061 struct sfInput
00062 {
00063     const sf::Input* This;
00064 };
00065 struct sfRenderWindow
00066 {
00067     sf::RenderWindow This;
00068     sfFloatRect      ViewRect;
00069     sfInput          Input;
00070 };
00071 
00072 
00076 sfRenderWindow* sfRenderWindow_Create(sfVideoMode Mode, const char* Title, unsigned long Style, int AntialiasingLevel)
00077 {
00078     // Convert video mode
00079     sf::VideoMode VideoMode(Mode.Width, Mode.Height, Mode.BitsPerPixel);
00080 
00081     // Create the window
00082     sfRenderWindow* RenderWindow = new sfRenderWindow;
00083     RenderWindow->This.Create(VideoMode, Title, Style, AntialiasingLevel);
00084     RenderWindow->Input.This = &RenderWindow->This.GetInput();
00085 
00086     return RenderWindow;
00087 }
00088 
00089 
00093 sfRenderWindow* sfRenderWindow_CreateFromHandle(sfWindowHandle Handle, int AntialiasingLevel)
00094 {
00095     sfRenderWindow* RenderWindow = new sfRenderWindow;
00096     RenderWindow->This.Create(Handle, AntialiasingLevel);
00097     RenderWindow->Input.This = &RenderWindow->This.GetInput();
00098 
00099     return RenderWindow;
00100 }
00101 
00102 
00106 void sfRenderWindow_Destroy(sfRenderWindow* RenderWindow)
00107 {
00108     delete RenderWindow;
00109 }
00110 
00111 
00115 unsigned int sfRenderWindow_GetWidth(sfRenderWindow* RenderWindow)
00116 {
00117     CSFML_CALL_RETURN(RenderWindow, GetWidth(), 0)
00118 }
00119 
00120 
00124 unsigned int sfRenderWindow_GetHeight(sfRenderWindow* RenderWindow)
00125 {
00126     CSFML_CALL_RETURN(RenderWindow, GetHeight(), 0)
00127 }
00128 
00129 
00133 unsigned int sfRenderWindow_GetDepthBits(sfRenderWindow* RenderWindow)
00134 {
00135     CSFML_CALL_RETURN(RenderWindow, GetDepthBits(), 0)
00136 }
00137 
00138 
00142 unsigned int sfRenderWindow_GetStencilBits(sfRenderWindow* RenderWindow)
00143 {
00144     CSFML_CALL_RETURN(RenderWindow, GetStencilBits(), 0)
00145 }
00146 
00147 
00151 sfBool sfRenderWindow_GetEvent(sfRenderWindow* RenderWindow, sfEvent* Event)
00152 {
00153     CSFML_CHECK_RETURN(RenderWindow, sfFalse);
00154     CSFML_CHECK_RETURN(Event,        sfFalse);
00155 
00156     // Get the event
00157     sf::Event SFMLEvent;
00158     sfBool Ret = RenderWindow->This.GetEvent(SFMLEvent);
00159 
00160     // No event, return
00161     if (!Ret)
00162         return sfFalse;
00163 
00164     // Convert its type
00165     Event->Type = static_cast<sfEventType>(SFMLEvent.Type);
00166 
00167     // Fill its fields
00168     switch (Event->Type)
00169     {
00170         case sfEvtResized :
00171             Event->Size.Width  = SFMLEvent.Size.Width;
00172             Event->Size.Height = SFMLEvent.Size.Height;
00173             break;
00174 
00175         case sfEvtTextEntered :
00176             Event->Text.Unicode = SFMLEvent.Text.Unicode;
00177             break;
00178 
00179         case sfEvtKeyReleased :
00180         case sfEvtKeyPressed :
00181             Event->Key.Code    = static_cast<sfKeyCode>(SFMLEvent.Key.Code);
00182             Event->Key.Alt     = SFMLEvent.Key.Alt     ? sfTrue : sfFalse;
00183             Event->Key.Control = SFMLEvent.Key.Control ? sfTrue : sfFalse;
00184             Event->Key.Shift   = SFMLEvent.Key.Shift   ? sfTrue : sfFalse;
00185             break;
00186 
00187         case sfEvtMouseWheelMoved :
00188             Event->MouseWheel.Delta = SFMLEvent.MouseWheel.Delta;
00189             break;
00190 
00191         case sfEvtMouseButtonPressed :
00192         case sfEvtMouseButtonReleased :
00193             Event->MouseButton.Button = static_cast<sfMouseButton>(SFMLEvent.MouseButton.Button);
00194             break;
00195 
00196         case sfEvtMouseMoved :
00197             Event->MouseMove.X = SFMLEvent.MouseMove.X;
00198             Event->MouseMove.Y = SFMLEvent.MouseMove.Y;
00199             break;
00200 
00201         case sfEvtJoyButtonPressed :
00202         case sfEvtJoyButtonReleased :
00203             Event->JoyButton.JoystickId = SFMLEvent.JoyButton.JoystickId;
00204             Event->JoyButton.Button     = SFMLEvent.JoyButton.Button;
00205             break;
00206 
00207         case sfEvtJoyMoved :
00208             Event->JoyMove.JoystickId = SFMLEvent.JoyMove.JoystickId;
00209             Event->JoyMove.Axis       = static_cast<sfJoyAxis>(SFMLEvent.JoyMove.Axis);
00210             Event->JoyMove.Position   = SFMLEvent.JoyMove.Position;
00211             break;
00212 
00213         default :
00214             break;
00215     }
00216 
00217     return sfTrue;
00218 }
00219 
00220 
00224 void sfRenderWindow_UseVerticalSync(sfRenderWindow* RenderWindow, sfBool Enabled)
00225 {
00226     CSFML_CALL(RenderWindow, UseVerticalSync(Enabled == sfTrue))
00227 }
00228 
00229 
00233 void sfRenderWindow_ShowMouseCursor(sfRenderWindow* RenderWindow, sfBool Show)
00234 {
00235     CSFML_CALL(RenderWindow, ShowMouseCursor(Show == sfTrue))
00236 }
00237 
00238 
00242 void sfRenderWindow_SetCursorPosition(sfRenderWindow* RenderWindow, unsigned int Left, unsigned int Top)
00243 {
00244     CSFML_CALL(RenderWindow, SetCursorPosition(Left, Top))
00245 }
00246 
00247 
00252 void sfRenderWindow_SetPosition(sfRenderWindow* RenderWindow, int Left, int Top)
00253 {
00254     CSFML_CALL(RenderWindow, SetPosition(Left, Top))
00255 }
00256 
00257 
00261 void sfRenderWindow_Show(sfRenderWindow* RenderWindow, sfBool State)
00262 {
00263     CSFML_CALL(RenderWindow, Show(State == sfTrue))
00264 }
00265 
00266 
00270 sfBool sfRenderWindow_SetCurrent(sfRenderWindow* RenderWindow)
00271 {
00272     CSFML_CALL_RETURN(RenderWindow, SetCurrent(), sfFalse)
00273 }
00274 
00275 
00279 void sfRenderWindow_Display(sfRenderWindow* RenderWindow)
00280 {
00281     CSFML_CALL(RenderWindow, Display())
00282 }
00283 
00284 
00288 sfInput* sfRenderWindow_GetInput(sfRenderWindow* RenderWindow)
00289 {
00290     CSFML_CHECK_RETURN(RenderWindow, NULL);
00291 
00292     return &RenderWindow->Input;
00293 }
00294 
00295 
00299 void sfRenderWindow_SetFramerateLimit(sfRenderWindow* RenderWindow, unsigned int Limit)
00300 {
00301     CSFML_CALL(RenderWindow, SetFramerateLimit(Limit))
00302 }
00303 
00304 
00308 float sfRenderWindow_GetFrameTime(sfRenderWindow* RenderWindow)
00309 {
00310     CSFML_CALL_RETURN(RenderWindow, GetFrameTime(), 0.f)
00311 }
00312 
00313 
00318 void sfRenderWindow_SetJoystickThreshold(sfRenderWindow* RenderWindow, float Threshold)
00319 {
00320     CSFML_CALL(RenderWindow, SetJoystickThreshold(Threshold))
00321 }
00322 
00323 
00327 void sfRenderWindow_DrawPostFX(sfRenderWindow* RenderWindow, sfPostFX* PostFX)
00328 {
00329     CSFML_CHECK(PostFX)
00330     CSFML_CALL(RenderWindow, Draw(PostFX->This))
00331 }
00332 void sfRenderWindow_DrawSprite(sfRenderWindow* RenderWindow, sfSprite* Sprite)
00333 {
00334     CSFML_CHECK(Sprite)
00335     CSFML_CALL(RenderWindow, Draw(Sprite->This))
00336 }
00337 void sfRenderWindow_DrawString(sfRenderWindow* RenderWindow, sfString* String)
00338 {
00339     CSFML_CHECK(String)
00340     CSFML_CALL(RenderWindow, Draw(String->This))
00341 }
00342 
00343 
00347 sfImage* sfRenderWindow_Capture(sfRenderWindow* RenderWindow)
00348 {
00349     CSFML_CHECK_RETURN(RenderWindow, NULL)
00350 
00351     sfImage* Image = new sfImage;
00352     Image->This = RenderWindow->This.Capture();
00353 
00354     return Image;
00355 }
00356 
00357 
00361 void sfRenderWindow_SetBackgroundColor(sfRenderWindow* RenderWindow, sfColor Color)
00362 {
00363     sf::Color SFMLColor(Color.r, Color.g, Color.b, Color.a);
00364 
00365     CSFML_CALL(RenderWindow, SetBackgroundColor(SFMLColor))
00366 }
00367 
00368 
00372 void sfRenderWindow_SetView(sfRenderWindow* RenderWindow, const sfView* View)
00373 {
00374     if (View)
00375     {
00376         sf::View SFMLView(sf::FloatRect(View->Rect.Left, View->Rect.Top, View->Rect.Right, View->Rect.Bottom), View->Zoom);
00377 
00378         CSFML_CALL(RenderWindow, SetView(&SFMLView))
00379     }
00380     else
00381     {
00382         CSFML_CALL(RenderWindow, SetView(NULL))
00383     }
00384 }
00385 
00386 
00390 sfFloatRect* sfRenderWindow_GetViewRect(sfRenderWindow* RenderWindow)
00391 {
00392     CSFML_CHECK_RETURN(RenderWindow, NULL)
00393 
00394     sf::FloatRect SFMLRect = RenderWindow->This.GetViewRect();
00395     RenderWindow->ViewRect.Left   = SFMLRect.Left;
00396     RenderWindow->ViewRect.Top    = SFMLRect.Top;
00397     RenderWindow->ViewRect.Right  = SFMLRect.Right;
00398     RenderWindow->ViewRect.Bottom = SFMLRect.Bottom;
00399 
00400     return &RenderWindow->ViewRect;
00401 }
00402 
00403 
00408 void sfRenderWindow_OptimizeForNonOpenGL(sfRenderWindow* RenderWindow, sfBool Optimize)
00409 {
00410     CSFML_CALL(RenderWindow, OptimizeForNonOpenGL(Optimize == sfTrue))
00411 }