MyGUI  3.2.1
MyGUI_Canvas.h
Go to the documentation of this file.
00001 /*
00002  * This source file is part of MyGUI. For the latest info, see http://mygui.info/
00003  * Distributed under the MIT License
00004  * (See accompanying file COPYING.MIT or copy at http://opensource.org/licenses/MIT)
00005  */
00006 
00007 #ifndef __MYGUI_CANVAS_H__
00008 #define __MYGUI_CANVAS_H__
00009 
00010 #include "MyGUI_Prerequest.h"
00011 #include "MyGUI_Widget.h"
00012 #include "MyGUI_ITexture.h"
00013 
00014 namespace MyGUI
00015 {
00016 
00021     class MYGUI_EXPORT Canvas :
00022         public Widget,
00023         public ITextureInvalidateListener
00024     {
00025         MYGUI_RTTI_DERIVED( Canvas )
00026 
00027     public:
00028         Canvas();
00029 
00030         struct Event
00031         {
00032             Event( bool _textureChanged, bool _widgetResized, bool _requested ) :
00033                 textureChanged( _textureChanged ),
00034                 widgetResized( _widgetResized ),
00035                 requested( _requested )
00036             {
00037             }
00038 
00039             bool textureChanged;
00040             bool widgetResized;
00041 
00043             bool requested;
00044         };
00045 
00046         typedef delegates::CMultiDelegate1<Canvas*> EventHandle_CanvasPtr;
00047         typedef delegates::CDelegate2<Canvas*, Event> EventHandle_CanvasPtrEvent;
00048 
00053         enum TextureResizeMode
00054         {
00059             // Размер указаный при создании текстуры увеличиваеться до степени двойки и больше не меняется.
00060             // Текстура всегда растягиваеться во весь виджет.
00061             TRM_PT_CONST_SIZE,
00062 
00071             // Размер указаный при создании текстуры игнорируется.
00072             // Текстура всегда больше размера окна и кратна степени двойки.
00073             // Если размер виджета становится больше чем размер текстуры, текстура пересоздается.
00074             // Текстура всегда отображатся пиксель в пиксель на виджет, образуя рабочую область текстуры.
00075             TRM_PT_VIEW_REQUESTED,
00076 
00084             // Размер указаный при создании текстуры игнорируется.
00085             // Текстура всегда больше размера окна и кратна степени двойки.
00086             // Если размер виджета становится больше чем размер текстуры, текстура пересоздается.
00087             // Текстура всегда растягиваеться во весь виджет.
00088             TRM_PT_VIEW_ALL
00089         };
00090 
00091     public:
00093         void createTexture(TextureResizeMode _resizeMode, TextureUsage _usage = getDefaultTextureUsage(), PixelFormat _format = getDefaultTextureFormat());
00094 
00096         void createTexture(int _width, int _height, TextureResizeMode _resizeMode, TextureUsage _usage = getDefaultTextureUsage(), PixelFormat _format = getDefaultTextureFormat());
00097 
00099         void createTexture(const IntSize& _size, TextureResizeMode _resizeMode, TextureUsage _usage = getDefaultTextureUsage(), PixelFormat _format = getDefaultTextureFormat());
00100 
00102         void destroyTexture();
00103 
00105         void updateTexture();
00106 
00108         void* lock(TextureUsage _usage = TextureUsage::Write);
00109 
00111         void unlock();
00112 
00114         bool isLocked() const;
00115 
00117         int getTextureRealWidth() const;
00118 
00120         int getTextureRealHeight() const;
00121 
00123         IntSize getTextureRealSize() const;
00124 
00126         int getTextureSrcWidth() const;
00127 
00129         int getTextureSrcHeight() const;
00130 
00132         IntSize getTextureSrcSize() const;
00133 
00135         PixelFormat getTextureFormat() const;
00136 
00138         const std::string& getTextureName() const;
00139 
00141         virtual void setSize(const IntSize& _value);
00143         virtual void setCoord(const IntCoord& _value);
00144 
00146         void setSize(int _width, int _height);
00148         void setCoord(int _left, int _top, int _width, int _height);
00149 
00151         TextureResizeMode getResizeMode() const;
00152 
00154         void setResizeMode(TextureResizeMode _value);
00155 
00157         bool isTextureSrcSize() const;
00158 
00160         bool isTextureCreated() const;
00161 
00163         bool isTextureManaged() const;
00164 
00166         ITexture* getTexture() const;
00167 
00169         void setTextureManaged(bool _value);
00170 
00172         static TextureUsage getDefaultTextureUsage();
00173 
00175         static PixelFormat getDefaultTextureFormat();
00176 
00177         /*events:*/
00182         EventHandle_CanvasPtr eventPreTextureChanges;
00183 
00189         EventHandle_CanvasPtrEvent requestUpdateCanvas;
00190 
00191     protected:
00192         virtual void shutdownOverride();
00193         virtual void initialiseOverride();
00194 
00196         void _destroyTexture(bool _sendEvent);
00197 
00199         void validate(int& _width, int& _height, TextureUsage& _usage, PixelFormat& _format) const;
00200 
00202         void createExactTexture(int _width, int _height, TextureUsage _usage, PixelFormat _format);
00203 
00205         bool checkCreate(int _width, int _height) const;
00206 
00208         void resize(const IntSize& _size);
00209 
00211         void correctUV();
00212 
00214         void frameAdvise(bool _advise);
00215 
00217         void frameEntered(float _time);
00218 
00219         virtual void textureInvalidate(ITexture* _texture);
00220 
00221         void _setUVSet(const FloatRect& _rect);
00222 
00223     protected:
00225         ITexture* mTexture;
00226 
00228         IntSize mReqTexSize;
00229 
00231         std::string mGenTexName;
00232 
00234         TextureResizeMode mTexResizeMode;
00235 
00237         uint8* mTexData;
00238 
00240         bool mTexManaged;
00241 
00243         bool mFrameAdvise;
00244 
00245         bool mInvalidateData;
00246     };
00247 
00248 } // namespace MyGUI
00249 
00250 #endif // __MYGUI_CANVAS_H__