|
View:
New views
1 Messages
—
Rating Filter:
Alert me
|
|
|
DVB OSD fontsize patchHello and happy new year!
Because I couldn't read the OSD, as my laptop is around 4m away, when I watch TV, I changed the OSD with program information/EPG data to have the same fontsize as set in the xine-engine parameters OSD section. In order to avoid a very short progress bar for the current show, I moved it under the name i.e. the name is within the rect of the bar. Everything else should look like before. It works for all available fontsizes, but as I just cut of text which is to long you loose some information. It looks reasonable up to a fontsize of medium. So far I tested the patch on my laptop with openSuSE 10.3 and a current svn-snapshot of Kaffeine, but it needs further testing on machines with a different DPI setting (I have 116 DPI). Have a lot of fun Christoph [kaffeine-osd-fontsize.patch] 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 |
| Free embeddable forum powered by Nabble | Forum Help |