summaryrefslogtreecommitdiffstats
path: root/xbmc/video/dialogs/GUIDialogTeletext.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'xbmc/video/dialogs/GUIDialogTeletext.cpp')
-rw-r--r--xbmc/video/dialogs/GUIDialogTeletext.cpp197
1 files changed, 197 insertions, 0 deletions
diff --git a/xbmc/video/dialogs/GUIDialogTeletext.cpp b/xbmc/video/dialogs/GUIDialogTeletext.cpp
new file mode 100644
index 0000000..01e86cb
--- /dev/null
+++ b/xbmc/video/dialogs/GUIDialogTeletext.cpp
@@ -0,0 +1,197 @@
+/*
+ * 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.
+ */
+
+#include "GUIDialogTeletext.h"
+
+#include "ServiceBroker.h"
+#include "application/ApplicationComponents.h"
+#include "application/ApplicationPlayer.h"
+#include "dialogs/GUIDialogKaiToast.h"
+#include "guilib/GUIMessage.h"
+#include "guilib/GUITexture.h"
+#include "guilib/LocalizeStrings.h"
+#include "guilib/Texture.h"
+#include "settings/Settings.h"
+#include "settings/SettingsComponent.h"
+#include "utils/ColorUtils.h"
+#include "utils/log.h"
+
+static int teletextFadeAmount = 0;
+
+CGUIDialogTeletext::CGUIDialogTeletext()
+ : CGUIDialog(WINDOW_DIALOG_OSD_TELETEXT, ""), m_pTxtTexture(nullptr)
+{
+ m_renderOrder = RENDER_ORDER_DIALOG_TELETEXT;
+}
+
+CGUIDialogTeletext::~CGUIDialogTeletext() = default;
+
+bool CGUIDialogTeletext::OnAction(const CAction& action)
+{
+ if (m_TextDecoder.HandleAction(action))
+ {
+ MarkDirtyRegion();
+ return true;
+ }
+
+ return CGUIDialog::OnAction(action);
+}
+
+bool CGUIDialogTeletext::OnBack(int actionID)
+{
+ m_bClose = true;
+ MarkDirtyRegion();
+ return true;
+}
+
+bool CGUIDialogTeletext::OnMessage(CGUIMessage& message)
+{
+ if (message.GetMessage() == GUI_MSG_WINDOW_INIT)
+ {
+ /* Do not open if no teletext is available */
+ const auto& components = CServiceBroker::GetAppComponents();
+ const auto appPlayer = components.GetComponent<CApplicationPlayer>();
+ if (!appPlayer->HasTeletextCache())
+ {
+ Close();
+ CGUIDialogKaiToast::QueueNotification(CGUIDialogKaiToast::Info, g_localizeStrings.Get(23049), "", 1500, false);
+ return true;
+ }
+ }
+ else if (message.GetMessage() == GUI_MSG_NOTIFY_ALL)
+ {
+ if (message.GetParam1() == GUI_MSG_WINDOW_RESIZE)
+ {
+ SetCoordinates();
+ }
+ }
+ return CGUIDialog::OnMessage(message);
+}
+
+void CGUIDialogTeletext::Process(unsigned int currentTime, CDirtyRegionList &dirtyregions)
+{
+ CGUIDialog::Process(currentTime, dirtyregions);
+ m_renderRegion = m_vertCoords;
+}
+
+void CGUIDialogTeletext::Render()
+{
+ // Do not render if we have no texture
+ if (!m_pTxtTexture)
+ {
+ CLog::Log(LOGERROR, "CGUITeletextBox::Render called without texture");
+ return;
+ }
+
+ m_TextDecoder.RenderPage();
+
+ if (!m_bClose)
+ {
+ if (teletextFadeAmount < 100)
+ {
+ teletextFadeAmount = std::min(100, teletextFadeAmount + 5);
+ MarkDirtyRegion();
+ }
+ }
+ else
+ {
+ if (teletextFadeAmount > 0)
+ {
+ teletextFadeAmount = std::max(0, teletextFadeAmount - 10);
+ MarkDirtyRegion();
+ }
+
+ if (teletextFadeAmount == 0)
+ Close();
+ }
+
+ unsigned char* textureBuffer = (unsigned char*)m_TextDecoder.GetTextureBuffer();
+ if (!m_bClose && m_TextDecoder.NeedRendering() && textureBuffer)
+ {
+ m_pTxtTexture->Update(m_TextDecoder.GetWidth(), m_TextDecoder.GetHeight(), m_TextDecoder.GetWidth()*4, XB_FMT_A8R8G8B8, textureBuffer, false);
+ m_TextDecoder.RenderingDone();
+ MarkDirtyRegion();
+ }
+
+ UTILS::COLOR::Color color =
+ (static_cast<UTILS::COLOR::Color>(teletextFadeAmount * 2.55f) & 0xff) << 24 | 0xFFFFFF;
+ CGUITexture::DrawQuad(m_vertCoords, color, m_pTxtTexture.get());
+
+ CGUIDialog::Render();
+}
+
+void CGUIDialogTeletext::OnInitWindow()
+{
+ teletextFadeAmount = 0;
+ m_bClose = false;
+ m_windowLoaded = true;
+
+ SetCoordinates();
+
+ if (!m_TextDecoder.InitDecoder())
+ {
+ CLog::Log(LOGERROR, "{}: failed to init teletext decoder", __FUNCTION__);
+ Close();
+ }
+
+ m_pTxtTexture =
+ CTexture::CreateTexture(m_TextDecoder.GetWidth(), m_TextDecoder.GetHeight(), XB_FMT_A8R8G8B8);
+ if (!m_pTxtTexture)
+ {
+ CLog::Log(LOGERROR, "{}: failed to create texture", __FUNCTION__);
+ Close();
+ }
+
+ CGUIDialog::OnInitWindow();
+}
+
+void CGUIDialogTeletext::OnDeinitWindow(int nextWindowID)
+{
+ m_windowLoaded = false;
+ m_TextDecoder.EndDecoder();
+
+ m_pTxtTexture.reset();
+
+ CGUIDialog::OnDeinitWindow(nextWindowID);
+}
+
+void CGUIDialogTeletext::SetCoordinates()
+{
+ float left, right, top, bottom;
+
+ CServiceBroker::GetWinSystem()->GetGfxContext().SetScalingResolution(m_coordsRes, m_needsScaling);
+
+ left = CServiceBroker::GetWinSystem()->GetGfxContext().ScaleFinalXCoord(0, 0);
+ right = CServiceBroker::GetWinSystem()->GetGfxContext().ScaleFinalXCoord((float)m_coordsRes.iWidth, 0);
+ top = CServiceBroker::GetWinSystem()->GetGfxContext().ScaleFinalYCoord(0, 0);
+ bottom = CServiceBroker::GetWinSystem()->GetGfxContext().ScaleFinalYCoord(0, (float)m_coordsRes.iHeight);
+
+ if (CServiceBroker::GetSettingsComponent()->GetSettings()->GetBool(CSettings::SETTING_VIDEOPLAYER_TELETEXTSCALE))
+ {
+ /* Fixed aspect ratio to 4:3 for teletext */
+ float width = right - left;
+ float height = bottom - top;
+ if (width / 4 > height / 3)
+ {
+ left = (width - height * 4 / 3) / 2;
+ right = width - left;
+ }
+ else
+ {
+ top = (height - width * 3 / 4) / 2;
+ bottom = height - top;
+ }
+ }
+
+ m_vertCoords.SetRect(left,
+ top,
+ right,
+ bottom);
+
+ MarkDirtyRegion();
+}