diff options
author | Kamil Zbróg | 2013-10-20 23:53:31 +0100 |
---|---|---|
committer | Kamil Zbróg | 2013-10-20 23:53:31 +0100 |
commit | 1f0e976ea69e1e28aeb146047181eb814c0f2aef (patch) | |
tree | 6f39d3cd4aa27cf68177c02b46811ac24f1c71c1 /backends/graphics/opengl/opengl-graphics.h | |
parent | 852a9637119b544400984508ca20ccf47ed66a81 (diff) | |
parent | b6bace0fa070985f5301480c36318043ef7b025e (diff) | |
download | scummvm-rg350-1f0e976ea69e1e28aeb146047181eb814c0f2aef.tar.gz scummvm-rg350-1f0e976ea69e1e28aeb146047181eb814c0f2aef.tar.bz2 scummvm-rg350-1f0e976ea69e1e28aeb146047181eb814c0f2aef.zip |
Merge branch 'master' into prince
Diffstat (limited to 'backends/graphics/opengl/opengl-graphics.h')
-rw-r--r-- | backends/graphics/opengl/opengl-graphics.h | 492 |
1 files changed, 312 insertions, 180 deletions
diff --git a/backends/graphics/opengl/opengl-graphics.h b/backends/graphics/opengl/opengl-graphics.h index 9d8d418d11..ebfe38fb60 100644 --- a/backends/graphics/opengl/opengl-graphics.h +++ b/backends/graphics/opengl/opengl-graphics.h @@ -8,338 +8,468 @@ * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. - + * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - + * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * */ -#ifndef BACKENDS_GRAPHICS_OPENGL_H -#define BACKENDS_GRAPHICS_OPENGL_H +#ifndef BACKENDS_GRAPHICS_OPENGL_OPENGL_GRAPHICS_H +#define BACKENDS_GRAPHICS_OPENGL_OPENGL_GRAPHICS_H -#include "backends/graphics/opengl/gltexture.h" +#include "backends/graphics/opengl/opengl-sys.h" #include "backends/graphics/graphics.h" -#include "common/array.h" -#include "common/rect.h" -#include "graphics/font.h" -#include "graphics/pixelformat.h" -// Uncomment this to enable the 'on screen display' code. -#define USE_OSD 1 +#include "common/frac.h" +#include "common/mutex.h" + +namespace Graphics { +class Font; +} // End of namespace Graphics namespace OpenGL { -// The OpenGL GFX modes. They have to be inside the OpenGL namespace so they -// do not clash with the SDL GFX modes. + +// HACK: We use glColor in the OSD code. This might not be working on GL ES but +// we still enable it because Tizen already shipped with it. Also, the +// SurfaceSDL backend enables it and disabling it can cause issues in sdl.cpp. +#define USE_OSD 1 + +class Texture; + enum { - GFX_NORMAL = 0, - GFX_CONSERVE = 1, - GFX_ORIGINAL = 2 + GFX_LINEAR = 0, + GFX_NEAREST = 1 }; -} - -/** - * OpenGL graphics manager. This is an abstract class, it does not do the - * window and OpenGL context initialization. - * Derived classes should at least override internUpdateScreen for doing - * the buffers swap, and implement loadGFXMode for handling the window/context if - * needed. If USE_RGB_COLOR is enabled, getSupportedFormats must be implemented. - */ class OpenGLGraphicsManager : public GraphicsManager { public: OpenGLGraphicsManager(); virtual ~OpenGLGraphicsManager(); + // GraphicsManager API virtual bool hasFeature(OSystem::Feature f); virtual void setFeatureState(OSystem::Feature f, bool enable); virtual bool getFeatureState(OSystem::Feature f); + // HACK: This is required for the SDL backend to switch between OpenGL SDL + // and Surface SDL. static const OSystem::GraphicsMode *supportedGraphicsModes(); + virtual const OSystem::GraphicsMode *getSupportedGraphicsModes() const; virtual int getDefaultGraphicsMode() const; virtual bool setGraphicsMode(int mode); virtual int getGraphicsMode() const; - virtual void resetGraphicsScale(); + + virtual void resetGraphicsScale() {} + #ifdef USE_RGB_COLOR virtual Graphics::PixelFormat getScreenFormat() const; virtual Common::List<Graphics::PixelFormat> getSupportedFormats() const = 0; #endif - virtual void initSize(uint width, uint height, const Graphics::PixelFormat *format = NULL); - virtual int getScreenChangeID() const; virtual void beginGFXTransaction(); virtual OSystem::TransactionError endGFXTransaction(); - virtual int16 getHeight(); + virtual int getScreenChangeID() const; + + virtual void initSize(uint width, uint height, const Graphics::PixelFormat *format); + virtual int16 getWidth(); -protected: - // PaletteManager API - virtual void setPalette(const byte *colors, uint start, uint num); - virtual void grabPalette(byte *colors, uint start, uint num); + virtual int16 getHeight(); -public: virtual void copyRectToScreen(const void *buf, int pitch, int x, int y, int w, int h); - virtual Graphics::Surface *lockScreen(); - virtual void unlockScreen(); virtual void fillScreen(uint32 col); - virtual void updateScreen(); + virtual void setShakePos(int shakeOffset); - virtual void setFocusRectangle(const Common::Rect &rect); + + virtual void updateScreen(); + + virtual Graphics::Surface *lockScreen(); + virtual void unlockScreen(); + + virtual void setFocusRectangle(const Common::Rect& rect); virtual void clearFocusRectangle(); + virtual int16 getOverlayWidth(); + virtual int16 getOverlayHeight(); + virtual void showOverlay(); virtual void hideOverlay(); + virtual Graphics::PixelFormat getOverlayFormat() const; + + virtual void copyRectToOverlay(const void *buf, int pitch, int x, int y, int w, int h); virtual void clearOverlay(); virtual void grabOverlay(void *buf, int pitch); - virtual void copyRectToOverlay(const void *buf, int pitch, int x, int y, int w, int h); - virtual int16 getOverlayHeight(); - virtual int16 getOverlayWidth(); virtual bool showMouse(bool visible); virtual void warpMouse(int x, int y); - virtual void setMouseCursor(const void *buf, uint w, uint h, int hotspotX, int hotspotY, uint32 keycolor, bool dontScale = false, const Graphics::PixelFormat *format = NULL); + virtual void setMouseCursor(const void *buf, uint w, uint h, int hotspotX, int hotspotY, uint32 keycolor, bool dontScale, const Graphics::PixelFormat *format); virtual void setCursorPalette(const byte *colors, uint start, uint num); virtual void displayMessageOnOSD(const char *msg); + + // PaletteManager interface + virtual void setPalette(const byte *colors, uint start, uint num); + virtual void grabPalette(byte *colors, uint start, uint num); + protected: /** - * Setup OpenGL settings + * Set up the actual screen size available for the OpenGL code to do any + * drawing. + * + * @param width The width of the screen. + * @param height The height of the screen. */ - virtual void initGL(); + void setActualScreenSize(uint width, uint height); /** - * Creates and refreshs OpenGL textures. + * Notify the manager of a OpenGL context change. This should be the first + * thing to call when you create an OpenGL (ES) context! + * + * @param defaultFormat The new default format for the game screen + * (this is used for the CLUT8 game screens). + * @param defaultFromatAlpha The new default format with an alpha channel + * (this is used for the overlay and cursor). */ - virtual void loadTextures(); + void notifyContextChange(const Graphics::PixelFormat &defaultFormat, const Graphics::PixelFormat &defaultFormatAlpha); + /** + * Adjust the physical mouse coordinates according to the currently visible screen. + */ + void adjustMousePosition(int16 &x, int16 &y); + + /** + * Set up the mouse position for graphics output. + * + * @param x X coordinate in physical coordinates. + * @param y Y coordinate in physical coordinates. + */ + void setMousePosition(int x, int y) { _cursorX = x; _cursorY = y; } + + /** + * Query the mouse position in physical coordinates. + */ + void getMousePosition(int16 &x, int16 &y) const { x = _cursorX; y = _cursorY; } + + /** + * Set up the mouse position for the (event) system. + * + * @param x X coordinate in physical coordinates. + * @param y Y coordinate in physical coordinates. + */ + virtual void setInternalMousePosition(int x, int y) = 0; + +private: // - // GFX and video + // Transaction support // - enum { - kTransactionNone = 0, - kTransactionActive = 1, - kTransactionRollback = 2 - }; - - struct TransactionDetails { - bool sizeChanged; - bool needRefresh; - bool needUpdatescreen; - bool filterChanged; + struct VideoState { + VideoState() : valid(false), gameWidth(0), gameHeight(0), #ifdef USE_RGB_COLOR - bool formatChanged; + gameFormat(), #endif - }; - TransactionDetails _transactionDetails; - int _transactionMode; - - struct VideoState { - bool setup; + aspectRatioCorrection(false), graphicsMode(GFX_LINEAR) { + } - bool fullscreen; + bool valid; - int mode; - int scaleFactor; - bool antialiasing; + uint gameWidth, gameHeight; +#ifdef USE_RGB_COLOR + Graphics::PixelFormat gameFormat; +#endif bool aspectRatioCorrection; + int graphicsMode; - int screenWidth, screenHeight; - int overlayWidth, overlayHeight; - int hardwareWidth, hardwareHeight; + bool operator==(const VideoState &right) { + return gameWidth == right.gameWidth && gameHeight == right.gameHeight #ifdef USE_RGB_COLOR - Graphics::PixelFormat format; + && gameFormat == right.gameFormat #endif + && aspectRatioCorrection == right.aspectRatioCorrection + && graphicsMode == right.graphicsMode; + } + + bool operator!=(const VideoState &right) { + return !(*this == right); + } }; - VideoState _videoMode, _oldVideoMode; /** - * Sets the OpenGL texture format for the given pixel format. If format is not support will raise an error. + * The currently setup video state. */ - virtual void getGLPixelFormat(Graphics::PixelFormat pixelFormat, byte &bpp, GLenum &intFormat, GLenum &glFormat, GLenum &type); + VideoState _currentState; - virtual void internUpdateScreen(); - virtual bool loadGFXMode(); - virtual void unloadGFXMode(); + /** + * The old video state used when doing a transaction rollback. + */ + VideoState _oldState; +protected: + enum TransactionMode { + kTransactionNone = 0, + kTransactionActive = 1, + kTransactionRollback = 2 + }; + + TransactionMode getTransactionMode() const { return _transactionMode; } + +private: /** - * Setup the fullscreen mode state. + * The current transaction mode. */ - void setFullscreenMode(bool enable); + TransactionMode _transactionMode; /** - * Query the fullscreen state. + * The current screen change ID. */ - inline bool getFullscreenMode() const { return _videoMode.fullscreen; } + int _screenChangeID; +protected: /** - * Set the scale factor. + * Set up the requested video mode. This takes parameters which describe + * what resolution the game screen requests (this is possibly aspect ratio + * corrected!). * - * This can only be used in a GFX transaction. + * A sub-class should take these parameters as hints. It might very well + * set up a mode which it thinks suites the situation best. * - * @param newScale New scale factor. + * @parma requestedWidth This is the requested actual game screen width. + * @param requestedHeight This is the requested actual game screen height. + * @param format This is the requested pixel format of the virtual game screen. + * @return true on success, false otherwise */ - void setScale(int newScale); + virtual bool loadVideoMode(uint requestedWidth, uint requestedHeight, const Graphics::PixelFormat &format) = 0; /** - * Query the scale factor. + * Save a screenshot of the full display as BMP to the given file. This + * uses Common::DumpFile for writing the screenshot. + * + * @param filename The output filename. */ - inline int getScale() const { return _videoMode.scaleFactor; } + void saveScreenshot(const Common::String &filename) const; + +private: + // + // OpenGL utilities + // /** - * Toggle the antialiasing state of the current video mode. + * Try to determine the internal parameters for a given pixel format. * - * This can only be used in a GFX transaction. + * @return true when the format can be used, false otherwise. */ - void toggleAntialiasing(); + bool getGLPixelFormat(const Graphics::PixelFormat &pixelFormat, GLenum &glIntFormat, GLenum &glFormat, GLenum &glType) const; + + // + // Actual hardware screen + // /** - * Query the antialiasing state. + * The width of the physical output. */ - inline bool getAntialiasingState() const { return _videoMode.antialiasing; } + uint _outputScreenWidth; - // Drawing coordinates for the current display mode and scale - int _displayX; - int _displayY; - int _displayWidth; - int _displayHeight; + /** + * The height of the physical output. + */ + uint _outputScreenHeight; + + /** + * @return The desired aspect of the game screen. + */ + frac_t getDesiredGameScreenAspect() const; + + /** + * Recalculates the area used to display the game screen. + */ + void recalculateDisplayArea(); + + /** + * The X coordinate of the game screen. + */ + uint _displayX; + + /** + * The Y coordinate of the game screen. + */ + uint _displayY; - virtual const char *getCurrentModeName(); + /** + * The width of the game screen in physical coordinates. + */ + uint _displayWidth; - virtual void calculateDisplaySize(int &width, int &height); - virtual void refreshDisplaySize(); + /** + * The height of the game screen in physical coordinates. + */ + uint _displayHeight; - uint getAspectRatio() const; + /** + * The default pixel format of the backend. + */ + Graphics::PixelFormat _defaultFormat; - void setFormatIsBGR(bool isBGR) { _formatBGR = isBGR; } - bool _formatBGR; + /** + * The default pixel format with an alpha channel. + */ + Graphics::PixelFormat _defaultFormatAlpha; // // Game screen // - GLTexture *_gameTexture; - Graphics::Surface _screenData; - int _screenChangeCount; - bool _screenNeedsRedraw; - Common::Rect _screenDirtyRect; -#ifdef USE_RGB_COLOR - Graphics::PixelFormat _screenFormat; -#endif - byte *_gamePalette; + /** + * The virtual game screen. + */ + Texture *_gameScreen; - virtual void refreshGameScreen(); + /** + * The game palette if in CLUT8 mode. + */ + byte _gamePalette[3 * 256]; - // Shake mode - int _shakePos; + /** + * The offset by which the screen is moved vertically. + */ + int _gameScreenShakeOffset; // // Overlay // - GLTexture *_overlayTexture; - Graphics::Surface _overlayData; - Graphics::PixelFormat _overlayFormat; - bool _overlayVisible; - bool _overlayNeedsRedraw; - Common::Rect _overlayDirtyRect; - virtual void refreshOverlay(); + /** + * The overlay screen. + */ + Texture *_overlay; + + /** + * Whether the overlay is visible or not. + */ + bool _overlayVisible; // - // Mouse + // Cursor // - struct MousePos { - // The mouse position in hardware screen coordinates. - int16 x, y; - // The size and hotspot of the original cursor image. - int16 w, h; - int16 hotX, hotY; + /** + * Set up the correct cursor palette. + */ + void updateCursorPalette(); - // The size and hotspot of the scaled cursor, in real coordinates. - int16 rW, rH; - int16 rHotX, rHotY; + /** + * The cursor image. + */ + Texture *_cursor; - // The size and hotspot of the scaled cursor, in game coordinates. - int16 vW, vH; - int16 vHotX, vHotY; + /** + * X coordinate of the cursor in phyiscal coordinates. + */ + uint _cursorX; - MousePos() : x(0), y(0), w(0), h(0), hotX(0), hotY(0), - rW(0), rH(0), rHotX(0), rHotY(0), vW(0), vH(0), - vHotX(0), vHotY(0) {} - }; + /** + * Y coordinate of the cursor in physical coordinates. + */ + uint _cursorY; - GLTexture *_cursorTexture; - Graphics::Surface _cursorData; - Graphics::PixelFormat _cursorFormat; - byte *_cursorPalette; - bool _cursorPaletteDisabled; - MousePos _cursorState; - bool _cursorVisible; + /** + * The X offset for the cursor hotspot in unscaled coordinates. + */ + uint _cursorHotspotX; + + /** + * The Y offset for the cursor hotspot in unscaled coordinates. + */ + uint _cursorHotspotY; + + /** + * Recalculate the cursor scaling. Scaling is always done according to + * the game screen. + */ + void recalculateCursorScaling(); + + /** + * The X offset for the cursor hotspot in scaled coordinates. + */ + uint _cursorHotspotXScaled; + + /** + * The Y offset for the cursor hotspot in scaled coordinates. + */ + uint _cursorHotspotYScaled; + + /** + * The width of the cursor scaled coordinates. + */ + uint _cursorWidthScaled; + + /** + * The height of the cursor scaled coordinates. + */ + uint _cursorHeightScaled; + + /** + * The key color. + */ uint32 _cursorKeyColor; - bool _cursorDontScale; - bool _cursorNeedsRedraw; /** - * Set up the mouse position for graphics output. - * - * @param x X coordinate in native coordinates. - * @param y Y coordinate in native coordinates. + * Whether the cursor is actually visible. */ - void setMousePosition(int x, int y) { _cursorState.x = x; _cursorState.y = y; } + bool _cursorVisible; - virtual void refreshCursor(); - virtual void refreshCursorScale(); + /** + * Whether no cursor scaling should be applied. + */ + bool _cursorDontScale; /** - * Set up the mouse position for the (event) system. - * - * @param x X coordinate in native coordinates. - * @param y Y coordinate in native coordinates. + * Whether the special cursor palette is enabled. */ - virtual void setInternalMousePosition(int x, int y) = 0; + bool _cursorPaletteEnabled; /** - * Adjusts hardware screen coordinates to either overlay or game screen - * coordinates depending on whether the overlay is visible or not. - * - * @param x X coordinate of the mouse position. - * @param y Y coordinate of the mouse position. + * The special cursor palette in case enabled. */ - virtual void adjustMousePosition(int16 &x, int16 &y); + byte _cursorPalette[3 * 256]; +#ifdef USE_OSD // - // Misc + // OSD // - virtual bool saveScreenshot(const char *filename); - -#ifdef USE_OSD +protected: /** * Returns the font used for on screen display */ virtual const Graphics::Font *getFontOSD(); +private: /** - * Update the OSD texture / surface. + * The OSD's contents. */ - void updateOSD(); + Texture *_osd; /** - * The OSD contents. + * Current opacity level of the OSD. */ - Common::Array<Common::String> _osdLines; - - GLTexture *_osdTexture; - Graphics::Surface _osdSurface; uint8 _osdAlpha; + + /** + * When fading the OSD has started. + */ uint32 _osdFadeStartTime; - bool _requireOSDUpdate; + + /** + * Mutex to allow displayMessageOnOSD to be used from the audio thread. + */ + Common::Mutex _osdMutex; + enum { kOSDFadeOutDelay = 2 * 1000, kOSDFadeOutDuration = 500, @@ -348,4 +478,6 @@ protected: #endif }; +} // End of namespace OpenGL + #endif |