summaryrefslogtreecommitdiffstats
path: root/xbmc/windowing/GraphicContext.h
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--xbmc/windowing/GraphicContext.h232
1 files changed, 232 insertions, 0 deletions
diff --git a/xbmc/windowing/GraphicContext.h b/xbmc/windowing/GraphicContext.h
new file mode 100644
index 0000000..9cd4f32
--- /dev/null
+++ b/xbmc/windowing/GraphicContext.h
@@ -0,0 +1,232 @@
+/*
+ * Copyright (C) 2005-2018 Team Kodi
+ * This file is part of Kodi - https://kodi.tv
+ *
+ * SPDX-License-Identifier: GPL-2.0-or-later
+ * See LICENSES/README.md for more information.
+ */
+
+#pragma once
+
+#include "Resolution.h"
+#include "rendering/RenderSystem.h"
+#include "threads/CriticalSection.h"
+#include "utils/ColorUtils.h"
+#include "utils/Geometry.h" // for CRect/CPoint
+#include "utils/TransformMatrix.h" // for the members m_guiTransform etc.
+
+#include <map>
+#include <stack>
+#include <string>
+#include <vector>
+
+// required by clients
+#include "ServiceBroker.h"
+#include "WinSystem.h"
+
+#define D3DPRESENTFLAG_INTERLACED 1
+#define D3DPRESENTFLAG_WIDESCREEN 2
+#define D3DPRESENTFLAG_PROGRESSIVE 4
+#define D3DPRESENTFLAG_MODE3DSBS 8
+#define D3DPRESENTFLAG_MODE3DTB 16
+
+/* what types are important for mode setting */
+#define D3DPRESENTFLAG_MODEMASK ( D3DPRESENTFLAG_INTERLACED \
+ | D3DPRESENTFLAG_MODE3DSBS \
+ | D3DPRESENTFLAG_MODE3DTB )
+
+enum VIEW_TYPE { VIEW_TYPE_NONE = 0,
+ VIEW_TYPE_LIST,
+ VIEW_TYPE_ICON,
+ VIEW_TYPE_BIG_LIST,
+ VIEW_TYPE_BIG_ICON,
+ VIEW_TYPE_WIDE,
+ VIEW_TYPE_BIG_WIDE,
+ VIEW_TYPE_WRAP,
+ VIEW_TYPE_BIG_WRAP,
+ VIEW_TYPE_INFO,
+ VIEW_TYPE_BIG_INFO,
+ VIEW_TYPE_AUTO,
+ VIEW_TYPE_MAX };
+
+enum AdjustRefreshRate
+{
+ ADJUST_REFRESHRATE_OFF = 0,
+ ADJUST_REFRESHRATE_ALWAYS,
+ ADJUST_REFRESHRATE_ON_STARTSTOP,
+ ADJUST_REFRESHRATE_ON_START,
+};
+
+class CGraphicContext : public CCriticalSection
+{
+public:
+ CGraphicContext(void);
+ virtual ~CGraphicContext();
+
+ // methods related to windowing
+ float GetFPS() const;
+ void SetFPS(float fps);
+ float GetDisplayLatency() const;
+ bool IsFullScreenRoot() const;
+ void ToggleFullScreen();
+ void SetFullScreenVideo(bool bOnOff);
+ bool IsFullScreenVideo() const;
+ bool IsValidResolution(RESOLUTION res);
+ void SetVideoResolution(RESOLUTION res, bool forceUpdate);
+ void ApplyModeChange(RESOLUTION res);
+ void ApplyWindowResize(int newWidth, int newHeight);
+ RESOLUTION GetVideoResolution() const;
+ const RESOLUTION_INFO GetResInfo() const;
+ const RESOLUTION_INFO GetResInfo(RESOLUTION res) const;
+ void SetResInfo(RESOLUTION res, const RESOLUTION_INFO& info);
+
+ void Flip(bool rendered, bool videoLayer);
+
+ // gfx context interface
+ int GetWidth() const;
+ int GetHeight() const;
+ bool SetViewPort(float fx, float fy , float fwidth, float fheight, bool intersectPrevious = false);
+ void RestoreViewPort();
+ void SetScissors(const CRect &rect);
+ void ResetScissors();
+ const CRect &GetScissors() const;
+ const CRect GetViewWindow() const;
+ void SetViewWindow(float left, float top, float right, float bottom);
+ bool IsCalibrating() const;
+ void SetCalibrating(bool bOnOff);
+ void ResetOverscan(RESOLUTION res, OVERSCAN &overscan);
+ void ResetOverscan(RESOLUTION_INFO &resinfo);
+ void ResetScreenParameters(RESOLUTION res);
+ void CaptureStateBlock();
+ void ApplyStateBlock();
+ void Clear(UTILS::COLOR::Color color = 0);
+ void GetAllowedResolutions(std::vector<RESOLUTION> &res);
+
+ /* \brief Get UI scaling information from a given resolution to the screen resolution.
+ Takes account of overscan and UI zooming.
+ \param res the resolution to scale from.
+ \param scaleX [out] the scaling amount in the X direction.
+ \param scaleY [out] the scaling amount in the Y direction.
+ \param matrix [out] if non-NULL, a suitable transformation from res to screen resolution is set.
+ */
+ void GetGUIScaling(const RESOLUTION_INFO &res, float &scaleX, float &scaleY, TransformMatrix *matrix = NULL);
+ void SetRenderingResolution(const RESOLUTION_INFO &res, bool needsScaling); ///< Sets scaling up for rendering
+ void SetScalingResolution(const RESOLUTION_INFO &res, bool needsScaling); ///< Sets scaling up for skin loading etc.
+ float GetScalingPixelRatio() const;
+ void InvertFinalCoords(float &x, float &y) const;
+ float ScaleFinalXCoord(float x, float y) const;
+ float ScaleFinalYCoord(float x, float y) const;
+ float ScaleFinalZCoord(float x, float y) const;
+ void ScaleFinalCoords(float &x, float &y, float &z) const;
+ bool RectIsAngled(float x1, float y1, float x2, float y2) const;
+ const TransformMatrix &GetGUIMatrix() const;
+ float GetGUIScaleX() const;
+ float GetGUIScaleY() const;
+ UTILS::COLOR::Color MergeAlpha(UTILS::COLOR::Color color) const;
+ UTILS::COLOR::Color MergeColor(UTILS::COLOR::Color color) const;
+ void SetOrigin(float x, float y);
+ void RestoreOrigin();
+ void SetCameraPosition(const CPoint &camera);
+ void SetStereoView(RENDER_STEREO_VIEW view);
+ RENDER_STEREO_VIEW GetStereoView() { return m_stereoView; }
+ void SetStereoMode(RENDER_STEREO_MODE mode) { m_nextStereoMode = mode; }
+ RENDER_STEREO_MODE GetStereoMode() { return m_stereoMode; }
+ void RestoreCameraPosition();
+ void SetStereoFactor(float factor);
+ void RestoreStereoFactor();
+ /*! \brief Set a region in which to clip all rendering
+ Anything that is rendered after setting a clip region will be clipped so that no part renders
+ outside of the clip region. Successive calls to SetClipRegion intersect the clip region, which
+ means the clip region may eventually become an empty set. In this case SetClipRegion returns false
+ to indicate that no rendering need be performed.
+
+ This call must be matched with a RestoreClipRegion call unless SetClipRegion returns false.
+
+ Usage should be of the form:
+
+ if (SetClipRegion(x, y, w, h))
+ {
+ ...
+ perform rendering
+ ...
+ RestoreClipRegion();
+ }
+
+ \param x the left-most coordinate of the clip region
+ \param y the top-most coordinate of the clip region
+ \param w the width of the clip region
+ \param h the height of the clip region
+ \returns true if the region is set and the result is non-empty. Returns false if the resulting region is empty.
+ \sa RestoreClipRegion
+ */
+ bool SetClipRegion(float x, float y, float w, float h);
+ void RestoreClipRegion();
+ void ClipRect(CRect &vertex, CRect &texture, CRect *diffuse = NULL);
+ CRect GetClipRegion();
+ void AddGUITransform();
+ TransformMatrix AddTransform(const TransformMatrix &matrix);
+ void SetTransform(const TransformMatrix &matrix);
+ void SetTransform(const TransformMatrix &matrix, float scaleX, float scaleY);
+ void RemoveTransform();
+
+ /* modifies final coordinates according to stereo mode if needed */
+ CRect StereoCorrection(const CRect &rect) const;
+ CPoint StereoCorrection(const CPoint &point) const;
+
+ CRect GenerateAABB(const CRect &rect) const;
+
+ //@todo move those somewhere else
+ const std::string& GetMediaDir() const;
+ void SetMediaDir(const std::string& strMediaDir);
+
+protected:
+
+ void UpdateCameraPosition(const CPoint &camera, const float &factor);
+ void SetVideoResolutionInternal(RESOLUTION res, bool forceUpdate);
+ void ApplyVideoResolution(RESOLUTION res);
+ void UpdateInternalStateWithResolution(RESOLUTION res);
+
+ int m_iScreenHeight = 576;
+ int m_iScreenWidth = 720;
+ std::string m_strMediaDir;
+ CRect m_videoRect;
+ bool m_bFullScreenRoot = true;
+ bool m_bFullScreenVideo = false;
+ bool m_bCalibrating = false;
+ RESOLUTION m_Resolution = RES_INVALID;
+ float m_fFPSOverride = 0.0f;
+
+ RESOLUTION_INFO m_windowResolution;
+ std::stack<CPoint> m_cameras;
+ std::stack<CPoint> m_origins;
+ std::stack<CRect> m_clipRegions;
+ std::stack<float> m_stereoFactors;
+ std::stack<CRect> m_viewStack;
+ CRect m_scissors;
+
+ class UITransform
+ {
+ public:
+ UITransform() : matrix() {}
+ UITransform(const TransformMatrix& m, const float sX = 1.0f, const float sY = 1.0f)
+ : matrix(m), scaleX(sX), scaleY(sY)
+ {
+ }
+ void Reset()
+ {
+ matrix.Reset();
+ scaleX = scaleY = 1.0f;
+ }
+
+ TransformMatrix matrix;
+ float scaleX = 1.0f;
+ float scaleY = 1.0f;
+ };
+
+ UITransform m_guiTransform;
+ UITransform m_finalTransform;
+ std::stack<UITransform> m_transforms;
+ RENDER_STEREO_VIEW m_stereoView = RENDER_STEREO_VIEW_OFF;
+ RENDER_STEREO_MODE m_stereoMode = RENDER_STEREO_MODE_OFF;
+ RENDER_STEREO_MODE m_nextStereoMode = RENDER_STEREO_MODE_OFF;
+};