Hi again,
sorry for the missing patch. I hope it works now.
Have a lot of fun
Christoph
diff -ru kaffeine-svn-orig/src/player-parts/xine-part/kxinewidget.cpp kaffeine-svn/src/player-parts/xine-part/kxinewidget.cpp
--- kaffeine-svn-orig/src/player-parts/xine-part/kxinewidget.cpp 2008-01-02 17:58:58.000000000 +0100
+++ kaffeine-svn/src/player-parts/xine-part/kxinewidget.cpp 2008-01-02 23:09:30.000000000 +0100
@@ -22,7 +22,7 @@
#include <qapplication.h>
#include <qwidget.h>
#include <qstringlist.h>
-
+#include <qpaintdevicemetrics.h>
#include <qtimer.h>
#include <qevent.h>
#include <qdir.h>
@@ -1596,7 +1596,7 @@
dvbColor[DVB_COLOR_BAR] = rgb2yuv(255,128,0); dvbTrans[DVB_COLOR_BAR] = 8;
}
-void getOSDLine( xine_osd_t *osd, int w, QCString &dest, QCString &source )
+void getOSDLine( xine_osd_t *osd, int w, QString &dest, QString &source )
{
int prevPos, pos, tw, th;
bool wrap=false;
@@ -1610,7 +1610,7 @@
prevPos = pos;
dest = source.left( pos );
while ( !wrap ) {
- xine_osd_get_text_size( osd, dest, &tw, &th );
+ xine_osd_get_text_size( osd, dest.utf8(), &tw, &th );
if ( tw>w ) {
wrap = true;
break;
@@ -1631,6 +1631,21 @@
}
}
+void cutLine2OSD( xine_osd_t * dvbOSD, QString & s, QString & t, int w )
+{
+ // shorten string to fit into osd
+ int tw, th, i = 0;
+ t = s;
+ while ( i<(int)t.length() ) {
+
+ xine_osd_get_text_size( dvbOSD, t.utf8(), &tw, &th );
+ if ( tw <= w ) break;
+ t = t.remove( t.length()-1, t.length() );
+ ++i;
+
+ }
+}
+
void KXineWidget::dvbShowOSD()
{
if ( m_trackURL!="DVB" )
@@ -1672,161 +1687,183 @@
dvbOSD = 0;
}
- int border=40;
- int w = m_videoFrameWidth;
- int h = m_videoFrameHeight;
- if ( !w || !h )
- return;
- if ( w<800 ) {
- if ( dvbCurrentNext[0]=="E" ) {
- dvbOSDHideTimer.stop();
- dvbOSD = xine_osd_new( m_xineStream, border, border, w-(2*border), h-(2/border) );
- }
- else
- dvbOSD = xine_osd_new( m_xineStream, border, h-border-100, w-(2*border), 100 );
+ const int w = m_videoFrameWidth;
+ const int h = m_videoFrameHeight;
+
+ if ( !w || !h || (w >= 800) )
+ return;
+
+ QPaintDeviceMetrics pdm( this );
+
+ const int dpi = pdm.logicalDpiY();
+ const int fontsizetable[] = { 16,20,24,32,48,64 };
+ const int osdfontsize = 0 <= m_osdSize && m_osdSize < 6 ? fontsizetable[m_osdSize] : 16;
+
+ const int osdborder = 40;
+ const int textborder = 5;
+ const int vspace = 2;
+ const int boxlen = (osdfontsize*dpi)/72 - 2;
+
+ const int textheight = (osdfontsize*dpi)/72;
+
+ int osdleft = osdborder;
+ int osdheight = textheight + 2*(textheight+vspace) + 2*textborder + 5*vspace+1;
+ int osdtop = h - osdborder - osdheight;
+ int osdwidth = w - 2*osdborder;
+ int osdlinestart = textborder;
+
+
+ if ( dvbCurrentNext[0]=="E" ) {
+ dvbOSDHideTimer.stop();
+ osdtop = osdleft;
+ osdheight = h - 2*osdborder;
}
- if ( dvbOSD ) {
- QCString ct, cs;
- if ( !dvbColor[0] ) initDvbPalette();
- xine_osd_set_palette( dvbOSD, dvbColor, dvbTrans );
- xine_osd_set_font( dvbOSD, m_osdFont, 16 );
- xine_osd_set_encoding( dvbOSD, "utf-8" );
- if ( dvbCurrentNext[0]=="E" )
- xine_osd_draw_rect( dvbOSD, 0, 0, w-(2*border), h-(2*border), DVB_TEXT_WHITE+1, 1 );
- else
- xine_osd_draw_rect( dvbOSD, 0, 0, w-(2*border), 100, DVB_TEXT_WHITE+1, 1 );
- QString t = QTime::currentTime().toString( "hh:mm" );
- int tw, th, len;
- xine_osd_get_text_size(dvbOSD, t.utf8(), &tw, &th);
- len = tw;
- int offset = 5;
- xine_osd_draw_text( dvbOSD, w-(2*border)-tw-offset, 5, t.utf8(), DVB_TEXT_BLUE );
- int i;
- for ( i=0; i<(int)dvbCurrentNext.count(); i++ ) {
- if ( dvbCurrentNext[i]=="R" ) {
- xine_osd_draw_rect( dvbOSD, offset, 5, offset+16, 21, DVB_COLOR_RED, 1 );
- offset+=21;
- }
- else if ( dvbCurrentNext[i]=="T" ) {
- xine_osd_draw_rect( dvbOSD, offset, 5, offset+16, 21, DVB_COLOR_GREEN, 1 );
- offset+=21;
- }
- }
- if (m_dvbChannelName == "")
- t = m_trackTitle;
- else
- t = m_dvbChannelName;
- i=0;
- ct = t.utf8();
- while ( i<(int)t.length() ) {
- xine_osd_get_text_size( dvbOSD, ct, &tw, &th );
- if ( tw<=(w-(2*border)-offset-5-len) ) break;
- ct = ct.remove( ct.length()-1, ct.length() );
- i++;
+ dvbOSD = xine_osd_new( m_xineStream, osdleft, osdtop, osdwidth, osdheight );
+
+ if ( !dvbOSD ) return;
+
+ if ( !dvbColor[0] ) initDvbPalette();
+
+ xine_osd_set_palette( dvbOSD, dvbColor, dvbTrans );
+ xine_osd_set_font( dvbOSD, m_osdFont, osdfontsize );
+ xine_osd_set_encoding( dvbOSD, "utf-8" );
+
+ // draw osd background
+ xine_osd_draw_rect( dvbOSD, 0, 0, osdwidth, osdheight, DVB_TEXT_WHITE+1, 1 );
+
+ // draw current time
+ QString t = QTime::currentTime().toString( "hh:mm" );
+ int th, ttextlen;
+ xine_osd_get_text_size(dvbOSD, t.utf8(), &ttextlen, &th);
+ fprintf( stderr, "th : %d\n", th );
+
+ xine_osd_draw_text( dvbOSD, osdwidth-textborder-ttextlen, osdlinestart, t.utf8(), DVB_TEXT_BLUE );
+
+ // draw marker for recording, time-shift-playing
+ int i, xoffset = textborder;
+ for ( i=0; i<(int)dvbCurrentNext.count(); i++ ) {
+ if ( dvbCurrentNext[i]=="R" ) {
+ xine_osd_draw_rect( dvbOSD, xoffset, osdlinestart+1, xoffset+boxlen, boxlen, DVB_COLOR_RED, 1 );
+ xoffset+=boxlen+textborder;
}
- xine_osd_draw_text( dvbOSD, offset, 5, ct, DVB_TEXT_BLUE );
- xine_osd_draw_line( dvbOSD, 5, 10+18, w-(2*border)-5, 10+18, DVB_COLOR_MAGENTA );
+ else if ( dvbCurrentNext[i]=="T" ) {
+ xine_osd_draw_rect( dvbOSD, xoffset, osdlinestart+1, xoffset+boxlen, boxlen, DVB_COLOR_GREEN, 1 );
+ xoffset+=boxlen+textborder;
+ }
+ }
- QString s, c;
- int y=43;
- int pos;
- if ( dvbCurrentNext[0]=="E" ) {
- if ( dvbCurrentNext.count()<2 ) {
- xine_osd_show( dvbOSD, 0 );
- return;
- }
- if ( !dvbCurrentNext[1].isEmpty() ) {
- s = dvbCurrentNext[1];
- pos = s.find("-");
- c = s.left( pos+1 );
- s = s.right( s.length()-pos-1 );
- t = s;
- xine_osd_draw_text( dvbOSD, 10, y, c.utf8(), DVB_TEXT_GREEN );
- xine_osd_get_text_size( dvbOSD, c.utf8(), &offset, &th );
- i=0;
- cs = s.utf8();
- while ( i<(int)t.length() ) {
- ct = cs.remove( cs.length()-i, cs.length() );
- xine_osd_get_text_size( dvbOSD, ct, &tw, &th );
- if ( tw<=(w-(2*border)-20-offset) ) break;
- i++;
- }
- xine_osd_draw_text( dvbOSD, 10+offset, y, ct, DVB_TEXT_WHITE );
- y+= 40;
- }
- if ( !dvbCurrentNext[2].isEmpty() ) {
- cs = dvbCurrentNext[2].utf8();
- while ( y<(h-(2*border)-23) ) {
- getOSDLine( dvbOSD, (w-(2*border)-20), ct, cs );
- xine_osd_draw_text( dvbOSD, 10, y, ct, DVB_TEXT_BLUE );
- y+= 28;
- if ( !cs.length() )
- break;
- }
- y+= 40;
- }
- if ( !dvbCurrentNext[3].isEmpty() ) {
- cs = dvbCurrentNext[3].utf8();
- while ( y<(h-(2*border)-23) ) {
- getOSDLine( dvbOSD, (w-(2*border)-20), ct, cs );
- xine_osd_draw_text( dvbOSD, 10, y, ct, DVB_TEXT_WHITE );
- y+= 28;
- if ( !cs.length() )
- break;
- }
- }
+ // draw name of channel
+ if (m_dvbChannelName == "")
+ t = m_trackTitle;
+ else
+ t = m_dvbChannelName;
+
+ QString ct;
+ cutLine2OSD( dvbOSD, t, ct, (osdwidth-textborder-xoffset-ttextlen) );
+ xine_osd_draw_text( dvbOSD, xoffset, osdlinestart, ct.utf8(), DVB_TEXT_BLUE );
+
+ // draw horizontal seperator line
+ osdlinestart += textheight;
+ xine_osd_draw_line( dvbOSD, textborder, osdlinestart, osdwidth-textborder, osdlinestart, DVB_COLOR_MAGENTA );
+
+ osdlinestart += 5*vspace+1;
+
+ // draw extended information osd
+ QString s;
+ int pos;
+ if ( dvbCurrentNext[0]=="E" ) {
+ if ( dvbCurrentNext.count()<2 ) {
xine_osd_show( dvbOSD, 0 );
return;
}
- int bar=-1;
- int barOffset=0;
- for ( int j=0; j<(int)dvbCurrentNext.count(); j++ ) {
- if ( (dvbCurrentNext[ j ]=="T") || (dvbCurrentNext[ j ]=="R") ) continue;
- if ( dvbCurrentNext[ j ].startsWith("BAR") ) {
- s = dvbCurrentNext[ j ];
- s = s.remove("BAR");
- bar = s.toInt();
- //fprintf( stderr, "BAR : %d\n", bar );
- continue;
- }
- s = dvbCurrentNext[ j ];
+ if ( !dvbCurrentNext[1].isEmpty() ) {
+ s = dvbCurrentNext[1];
pos = s.find("-");
- c = s.left( pos+1 );
- s = s.right( s.length()-pos-1 );
- ct = cs = s.utf8();
- xine_osd_draw_text( dvbOSD, 10, y, c.utf8(), DVB_TEXT_GREEN );
- xine_osd_get_text_size( dvbOSD, c.utf8(), &offset, &th );
- i=0;
- while ( i<(int)t.length() ) {
- ct = cs.remove( cs.length()-i, cs.length() );
- xine_osd_get_text_size( dvbOSD, ct, &tw, &th );
- if ( tw<=(w-(2*border)-20-offset-35) ) break;
- i++;
+ t = s.right( s.length()-pos-1 );
+ s = s.left( pos+1 );
+ xine_osd_get_text_size( dvbOSD, s.utf8(), &xoffset, &th );
+ xine_osd_draw_text( dvbOSD, 2*textborder, osdlinestart, s.utf8(), DVB_TEXT_GREEN );
+
+
+ cutLine2OSD( dvbOSD, t, ct, (osdwidth-4*textborder-xoffset) );
+ xine_osd_draw_text( dvbOSD, 2*textborder+xoffset, osdlinestart, ct.utf8(), DVB_TEXT_WHITE );
+ osdlinestart += textheight+vspace;
+ }
+ if ( !dvbCurrentNext[2].isEmpty() ) {
+ s = dvbCurrentNext[2];
+ while ( osdlinestart <= (osdheight-2*textborder-textheight) ) {
+ getOSDLine( dvbOSD, (osdwidth-4*textborder), ct, s );
+ xine_osd_draw_text( dvbOSD, 2*textborder, osdlinestart, ct.utf8(), DVB_TEXT_BLUE );
+ osdlinestart += textheight+vspace;
+ if ( !s.length() )
+ break;
}
- if ( !barOffset )
- barOffset = tw;
- xine_osd_draw_text( dvbOSD, 10+offset, y, ct, DVB_TEXT_WHITE );
- y+= 28;
- if ( bar>-1 ) {
- int x1=10+offset+barOffset+10;
- int x2=w-(2*border)-5;
- if ( (x1+30)>x2 )
- x1 = x2 - 30;
- int x3=x1+((bar*(x2-x1))/100);
- //fprintf( stderr, "x1=%d - x2=%d - x3=%d\n", x1, x2, x3 );
- int y1=46;
- int y2=60;
- xine_osd_draw_line( dvbOSD, x1, y1, x2, y1, DVB_COLOR_BAR );
- xine_osd_draw_line( dvbOSD, x1, y2, x2, y2, DVB_COLOR_BAR );
- xine_osd_draw_line( dvbOSD, x1, y1, x1, y2, DVB_COLOR_BAR );
- xine_osd_draw_line( dvbOSD, x2, y1, x2, y2, DVB_COLOR_BAR );
- xine_osd_draw_rect( dvbOSD, x1, y1, x3, y2, DVB_COLOR_BAR, 1 );
+// osdlinestart += textheight+vspace;
+ }
+ if ( !dvbCurrentNext[3].isEmpty() ) {
+ s = dvbCurrentNext[3];
+ while ( osdlinestart <= (osdheight-2*textborder-textheight) ) {
+ getOSDLine( dvbOSD, (osdwidth-4*textborder), ct, s );
+ xine_osd_draw_text( dvbOSD, 2*textborder, osdlinestart, ct.utf8(), DVB_TEXT_WHITE );
+ osdlinestart += textheight+vspace;
+ if ( !s.length() )
+ break;
}
}
+
xine_osd_show( dvbOSD, 0 );
- dvbOSDHideTimer.start( 5000, true );
+ return;
}
+
+ // draw normal program info osd
+ int bar=-1;
+ int baroffset=0;
+ xine_osd_get_text_size( dvbOSD, " ", &baroffset, &th );
+
+ for ( int j=0; j<(int)dvbCurrentNext.count(); j++ ) {
+ if ( (dvbCurrentNext[ j ]=="T") || (dvbCurrentNext[ j ]=="R") ) continue;
+ if ( dvbCurrentNext[ j ].startsWith("BAR") ) {
+ s = dvbCurrentNext[ j ];
+ s = s.remove("BAR");
+ bar = s.toInt();
+ //fprintf( stderr, "BAR : %d\n", bar );
+ continue;
+ }
+ s = dvbCurrentNext[ j ];
+ pos = s.find("-");
+ t = s.right( s.length()-pos-1 );
+ s = s.left( pos+1 );
+ xine_osd_draw_text( dvbOSD, 2*textborder, osdlinestart, s.utf8(), DVB_TEXT_GREEN );
+ xine_osd_get_text_size( dvbOSD, s.utf8(), &xoffset, &th );
+ xoffset += baroffset;
+
+ cutLine2OSD( dvbOSD, t, ct, (osdwidth-4*textborder-xoffset) );
+
+ if ( bar>-1 ) {
+ int x1 = 2*textborder+xoffset;
+ int x2 = osdwidth-2*textborder;
+ if ( (x1+30)>x2 )
+ x1 = x2 - 30;
+ int x3=x1+((bar*(x2-x1))/100);
+ //fprintf( stderr, "x1=%d - x2=%d - x3=%d\n", x1, x2, x3 );
+ int y1=osdlinestart-1;
+ int y2=y1+textheight+1;
+ xine_osd_draw_line( dvbOSD, x1, y1, x2, y1, DVB_COLOR_BAR );
+ xine_osd_draw_line( dvbOSD, x1, y2, x2, y2, DVB_COLOR_BAR );
+ xine_osd_draw_line( dvbOSD, x1, y1, x1, y2, DVB_COLOR_BAR );
+ xine_osd_draw_line( dvbOSD, x2, y1, x2, y2, DVB_COLOR_BAR );
+ xine_osd_draw_rect( dvbOSD, x1, y1, x3, y2, DVB_COLOR_BAR, 1 );
+ bar = -1; // make sure to get only one progress bar
+ }
+
+ xine_osd_draw_text( dvbOSD, 2*textborder+xoffset, osdlinestart, ct.utf8(), DVB_TEXT_WHITE );
+ osdlinestart += textheight+vspace;
+
+ }
+
+ xine_osd_show( dvbOSD, 0 );
+ dvbOSDHideTimer.start( 5000, true );
}
void KXineWidget::dvbHideOSD()
-------------------------------------------------------------------------
This SF.net email is sponsored by: Microsoft
Defy all challenges. Microsoft(R) Visual Studio 2005.
http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/_______________________________________________
Kaffeine-devel mailing list
Kaffeine-devel@...
https://lists.sourceforge.net/lists/listinfo/kaffeine-devel