Added cOsdProvider::OsdSizeChanged()

This commit is contained in:
Klaus Schmidinger 2015-01-15 11:33:58 +01:00
parent be9a6de0ef
commit 66c65beea7
6 changed files with 32 additions and 4 deletions

View File

@ -3271,6 +3271,7 @@ Thomas Reufer <thomas@reufer.ch>
for implementing cOsd::DrawScaledBitmap()
for adding handling for DTS audio tracks to cPatPmtParser::ParsePmt()
for adding support for PGS subtitles
for adding cOsdProvider::OsdSizeChanged()
Eike Sauer <EikeSauer@t-online.de>
for reporting a problem with channels that need more than 5 TS packets for detecting

View File

@ -8376,3 +8376,6 @@ Video Disk Recorder Revision History
- Plugins can now implement the function SetMenuSortMode() in their skin objects
derived from cSkinDisplayMenu, to get informed about the currently used sort
mode, if applicable (suggested by Martin Schirrmacher).
- Added cOsdProvider::OsdSizeChanged(), which plugins that implement an output device
can call to signal a change in the OSD that requires a redraw of the currently
displayed object (thanks to Thomas Reufer).

7
menu.c
View File

@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
* $Id: menu.c 3.27 2015/01/15 10:31:41 kls Exp $
* $Id: menu.c 3.28 2015/01/15 11:14:21 kls Exp $
*/
#include "menu.h"
@ -4033,6 +4033,7 @@ cDisplayChannel::cDisplayChannel(int Number, bool Switched)
displayChannel = Skins.Current()->DisplayChannel(withInfo);
number = 0;
timeout = Switched || Setup.TimeoutRequChInfo;
cOsdProvider::OsdSizeChanged(osdState); // just to get the current state
positioner = NULL;
channel = Channels.GetByNumber(Number);
lastPresent = lastFollowing = NULL;
@ -4118,6 +4119,10 @@ cChannel *cDisplayChannel::NextAvailableChannel(cChannel *Channel, int Direction
eOSState cDisplayChannel::ProcessKey(eKeys Key)
{
if (cOsdProvider::OsdSizeChanged(osdState)) {
delete displayChannel;
displayChannel = Skins.Current()->DisplayChannel(withInfo);
}
cChannel *NewChannel = NULL;
if (Key != kNone)
lastTime.Set();

3
menu.h
View File

@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
* $Id: menu.h 3.5 2013/12/25 12:06:03 kls Exp $
* $Id: menu.h 3.6 2015/01/15 11:12:57 kls Exp $
*/
#ifndef __MENU_H
@ -121,6 +121,7 @@ private:
cTimeMs lastTime;
int number;
bool timeout;
int osdState;
const cPositioner *positioner;
cChannel *channel;
const cEvent *lastPresent;

13
osd.c
View File

@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
* $Id: osd.c 3.3 2015/01/04 15:46:39 kls Exp $
* $Id: osd.c 3.4 2015/01/15 11:20:56 kls Exp $
*/
#include "osd.h"
@ -1978,6 +1978,7 @@ int cOsdProvider::oldWidth = 0;
int cOsdProvider::oldHeight = 0;
double cOsdProvider::oldAspect = 1.0;
cImage *cOsdProvider::images[MAXOSDIMAGES] = { NULL };
int cOsdProvider::osdState = 0;
cOsdProvider::cOsdProvider(void)
{
@ -2015,6 +2016,7 @@ void cOsdProvider::UpdateOsdSize(bool Force)
int Width;
int Height;
double Aspect;
cMutexLock MutexLock(&cOsd::mutex);
cDevice::PrimaryDevice()->GetOsdSize(Width, Height, Aspect);
if (Width != oldWidth || Height != oldHeight || !DoubleEqual(Aspect, oldAspect) || Force) {
Setup.OSDLeft = int(round(Width * Setup.OSDLeftP));
@ -2032,9 +2034,18 @@ void cOsdProvider::UpdateOsdSize(bool Force)
oldHeight = Height;
oldAspect = Aspect;
dsyslog("OSD size changed to %dx%d @ %g", Width, Height, Aspect);
osdState++;
}
}
bool cOsdProvider::OsdSizeChanged(int &State)
{
cMutexLock MutexLock(&cOsd::mutex);
bool Result = osdState != State;
State = osdState;
return Result;
}
bool cOsdProvider::SupportsTrueColor(void)
{
if (osdProvider) {

9
osd.h
View File

@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
* $Id: osd.h 3.4 2015/01/14 10:50:55 kls Exp $
* $Id: osd.h 3.5 2015/01/15 11:23:52 kls Exp $
*/
#ifndef __OSD_H
@ -949,6 +949,7 @@ private:
static int oldHeight;
static double oldAspect;
static cImage *images[MAXOSDIMAGES];
static int osdState;
protected:
virtual cOsd *CreateOsd(int Left, int Top, uint Level) = 0;
///< Returns a pointer to a newly created cOsd object, which will be located
@ -985,6 +986,12 @@ public:
///< font sizes accordingly. If Force is true, all settings are recalculated,
///< even if the video resolution hasn't changed since the last call to
///< this function.
static bool OsdSizeChanged(int &State);
///< Checks if the OSD size has changed and a currently displayed OSD needs to
///< be redrawn. An internal reference value is incremented on every size change
///< and is compared against State when calling the method.
///< OsdSizeChanged() can be called with an uninitialized State to just get
///< the current value of State.
static bool SupportsTrueColor(void);
///< Returns true if the current OSD provider is able to handle a true color OSD.
static int StoreImage(const cImage &Image);