From f11a59b82c044cc952f5f74a29767e0013ca3c49 Mon Sep 17 00:00:00 2001 From: Michael Liebmann Date: Mon, 21 Nov 2011 23:11:52 +0000 Subject: [PATCH] Correct calculation of the size of logo in list header. - Function for calculating from infoviewer.cpp to pictureviewer.cpp moved - Correct calculation in channellist.cpp, epgview.cpp and moviebrowser.cpp git-svn-id: file:///home/bas/coolstream_public_svn/THIRDPARTY/applications/neutrino-beta@1869 e54a6e83-5905-42d5-8d5c-058d10e6a962 Origin commit data ------------------ Branch: ni/coolstream Commit: https://github.com/neutrino-images/ni-neutrino/commit/4f4f46a912c32fb06fafcc65785b641e020a7421 Author: Michael Liebmann Date: 2011-11-22 (Tue, 22 Nov 2011) ------------------ This commit was generated by Migit --- src/driver/pictureviewer/pictureviewer.cpp | 17 +++++++++++ src/driver/pictureviewer/pictureviewer.h | 1 + src/gui/channellist.cpp | 9 ++---- src/gui/epgview.cpp | 9 ++---- src/gui/infoviewer.cpp | 31 ++------------------ src/gui/moviebrowser.cpp | 34 +++++++++++----------- 6 files changed, 44 insertions(+), 57 deletions(-) diff --git a/src/driver/pictureviewer/pictureviewer.cpp b/src/driver/pictureviewer/pictureviewer.cpp index ecd7e8a5f..aa82ca729 100644 --- a/src/driver/pictureviewer/pictureviewer.cpp +++ b/src/driver/pictureviewer/pictureviewer.cpp @@ -510,6 +510,23 @@ bool CPictureViewer::DisplayLogo (uint64_t channel_id, int posx, int posy, int w return ret; } +void CPictureViewer::rescaleImageDimensions(int *width, int *height, const int max_width, const int max_height, bool upscale) +{ + float aspect; + + if ((!upscale) && (*width <= max_width) && (*height <= max_height)) + return; + + aspect = (float)(*width) / (float)(*height); + if (((float)(*width) / (float)max_width) > ((float)(*height) / (float)max_height)) { + *width = max_width; + *height = (int)(max_width / aspect); + }else{ + *height = max_height; + *width = (int)(max_height * aspect); + } +} + bool CPictureViewer::DisplayImage (const std::string & name, int posx, int posy, int width, int height) { /* TODO: cache or check for same */ diff --git a/src/driver/pictureviewer/pictureviewer.h b/src/driver/pictureviewer/pictureviewer.h index b041baaf1..d6f3e9aee 100644 --- a/src/driver/pictureviewer/pictureviewer.h +++ b/src/driver/pictureviewer/pictureviewer.h @@ -70,6 +70,7 @@ class CPictureViewer void getSize(const char *name, int* width, int *height); unsigned char * Resize(unsigned char *orgin, int ox, int oy, int dx, int dy, ScalingMode type, unsigned char * dst = NULL); unsigned char * ResizeA(unsigned char *orgin, int ox, int oy, int dx, int dy); + void rescaleImageDimensions(int *width, int *height, const int max_width, const int max_height, bool upscale=false); private: CFormathandler *fh_root; diff --git a/src/gui/channellist.cpp b/src/gui/channellist.cpp index 39ee026d6..ba8325e6a 100644 --- a/src/gui/channellist.cpp +++ b/src/gui/channellist.cpp @@ -1771,16 +1771,13 @@ void CChannelList::showChannelLogo() if(g_settings.infobar_show_channellogo){ static int logo_w = 0; static int logo_h = 0; + int logo_w_max = width / 4; frameBuffer->paintBoxRel(x + width - logo_off - logo_w, y+(theight-logo_h)/2, logo_w, logo_h, COL_MENUHEAD_PLUS_0); std::string lname; if(g_PicViewer->GetLogoName(chanlist[selected]->channel_id, chanlist[selected]->name, lname, &logo_w, &logo_h)) { - if(logo_h > theight) { - if((theight/(logo_h-theight))>1) { - logo_w -= (logo_w/(theight/(logo_h-theight))); - } - logo_h = theight; - } + if((logo_h > theight) || (logo_w > logo_w_max)) + g_PicViewer->rescaleImageDimensions(&logo_w, &logo_h, logo_w_max, theight); g_PicViewer->DisplayImage(lname, x + width - logo_off - logo_w, y+(theight-logo_h)/2, logo_w, logo_h); } } diff --git a/src/gui/epgview.cpp b/src/gui/epgview.cpp index 76c964820..68dd5ca4b 100644 --- a/src/gui/epgview.cpp +++ b/src/gui/epgview.cpp @@ -489,15 +489,12 @@ int CEpgData::show(const t_channel_id channel_id, uint64_t a_id, time_t* a_start std::string lname; int logo_w = 0; int logo_h = 0; + int logo_w_max = ox / 4; CZapitChannel * channel = CServiceManager::getInstance()->FindChannel(channel_id); if(channel) { if(g_settings.infobar_show_channellogo && g_PicViewer->GetLogoName(channel_id, channel->getName(), lname, &logo_w, &logo_h)) { - if(logo_h > toph){ - if((toph/(logo_h-toph))>1){ - logo_w -= (logo_w/(toph/(logo_h-toph))); - } - logo_h = toph; - } + if((logo_h > toph) || (logo_w > logo_w_max)) + g_PicViewer->rescaleImageDimensions(&logo_w, &logo_h, logo_w_max, toph); pic_offx = logo_w + 10; } } diff --git a/src/gui/infoviewer.cpp b/src/gui/infoviewer.cpp index f3b9593b8..625270a8b 100644 --- a/src/gui/infoviewer.cpp +++ b/src/gui/infoviewer.cpp @@ -2050,31 +2050,6 @@ void CInfoViewer::Set_CA_Status (int /*Status*/) showIcon_CA_Status (1); } -/* resize the logo, preserving the aspect ratio */ -static void resize_logo(int *w, int *h, const int width, const int height) -{ - //fprintf(stderr, "resize_logo(%d, %d, %d, %d)\n", *w, *h, width, height); - float aspect; - - if (*w <= width && *h <= height) // should we also increase the size? Not yet. - return; - - /* i hate floats ... :) */ - aspect = (float)(*w) / (float)(*h); - - if (((float)(*w) / (float)width) > ((float)(*h) / (float)height)) - { - *w = width; - *h = (int)(width / aspect); - } - else - { - *h = height; - *w = (int)(height * aspect); - } - //fprintf(stderr, "resize_logo(%d, %d, %d, %d) aspect: %f\n", *w, *h, width, height, aspect); -} - /****************************************************************************** returns mode of painted channel logo, 0 = no logo painted @@ -2118,7 +2093,7 @@ int CInfoViewer::showChannelLogo(const t_channel_id logo_channel_id, const int c int x_mid = BoxStartX + ChanWidth / 2; y_mid = BoxStartY + (satNameHeight + ChanHeight) / 2; - resize_logo(&logo_w, &logo_h, ChanWidth, ChanHeight - satNameHeight); + g_PicViewer->rescaleImageDimensions(&logo_w, &logo_h, ChanWidth, ChanHeight - satNameHeight); // channel name with number // this is too ugly... ChannelName = (std::string)strChanNum + ". " + ChannelName; // get position of channel logo, must be centered in number box @@ -2129,7 +2104,7 @@ int CInfoViewer::showChannelLogo(const t_channel_id logo_channel_id, const int c else if (g_settings.infobar_show_channellogo == 2 || g_settings.infobar_show_channellogo == 5 || g_settings.infobar_show_channellogo == 6) // paint logo in place of channel name { // check logo dimensions - resize_logo(&logo_w, &logo_h, chan_w, time_height); + g_PicViewer->rescaleImageDimensions(&logo_w, &logo_h, chan_w, time_height); // hide channel name // this is too ugly... ChannelName = ""; // calculate logo position @@ -2145,7 +2120,7 @@ int CInfoViewer::showChannelLogo(const t_channel_id logo_channel_id, const int c { // check logo dimensions int Logo_max_width = chan_w - logo_w - 10; - resize_logo(&logo_w, &logo_h, Logo_max_width, time_height); + g_PicViewer->rescaleImageDimensions(&logo_w, &logo_h, Logo_max_width, time_height); // calculate logo position y_mid = ChanNameY + time_height / 2; logo_x = start_x + 10; diff --git a/src/gui/moviebrowser.cpp b/src/gui/moviebrowser.cpp index 671aa1f81..ebf51f016 100644 --- a/src/gui/moviebrowser.cpp +++ b/src/gui/moviebrowser.cpp @@ -1204,24 +1204,20 @@ void CMovieBrowser::refreshMovieInfo(void) m_pcInfo->setText(&m_movieSelectionHandler->epgInfo2, logo_ok ? m_cBoxFrameInfo.iWidth-picw-20: 0); static int logo_w = 0; static int logo_h = 0; + int logo_w_max = m_cBoxFrameTitleRel.iWidth / 4; //printf("refreshMovieInfo: EpgId %llx id %llx y %d\n", m_movieSelectionHandler->epgEpgId, m_movieSelectionHandler->epgId, m_cBoxFrameTitleRel.iY); int lx = m_cBoxFrame.iX+m_cBoxFrameTitleRel.iX+m_cBoxFrameTitleRel.iWidth-logo_w-10; int ly = m_cBoxFrameTitleRel.iY+m_cBoxFrame.iY+ (m_cBoxFrameTitleRel.iHeight-logo_h)/2; const short pb_hdd_offset = 104; m_pcWindow->paintBoxRel(lx - pb_hdd_offset , ly, logo_w, logo_h, TITLE_BACKGROUND_COLOR); - //g_PicViewer->DisplayLogo(m_movieSelectionHandler->epgEpgId >>16, lx, ly, PIC_W, PIC_H); std::string lname; if(g_PicViewer->GetLogoName(m_movieSelectionHandler->epgEpgId >>16, m_movieSelectionHandler->epgChannel, lname, &logo_w, &logo_h)){ - if(logo_h > m_cBoxFrameTitleRel.iHeight){ - if((m_cBoxFrameTitleRel.iHeight/(logo_h-m_cBoxFrameTitleRel.iHeight))>1){ - logo_w -= (logo_w/(m_cBoxFrameTitleRel.iHeight/(logo_h-m_cBoxFrameTitleRel.iHeight))); - } - logo_h = m_cBoxFrameTitleRel.iHeight; - } - lx = m_cBoxFrame.iX+m_cBoxFrameTitleRel.iX+m_cBoxFrameTitleRel.iWidth-logo_w-10; - ly = m_cBoxFrameTitleRel.iY+m_cBoxFrame.iY+ (m_cBoxFrameTitleRel.iHeight-logo_h)/2; - g_PicViewer->DisplayImage(lname, lx - pb_hdd_offset, ly, logo_w, logo_h); + if((logo_h > m_cBoxFrameTitleRel.iHeight) || (logo_w > logo_w_max)) + g_PicViewer->rescaleImageDimensions(&logo_w, &logo_h, logo_w_max, m_cBoxFrameTitleRel.iHeight); + lx = m_cBoxFrame.iX+m_cBoxFrameTitleRel.iX+m_cBoxFrameTitleRel.iWidth-logo_w-10; + ly = m_cBoxFrameTitleRel.iY+m_cBoxFrame.iY+ (m_cBoxFrameTitleRel.iHeight-logo_h)/2; + g_PicViewer->DisplayImage(lname, lx - pb_hdd_offset, ly, logo_w, logo_h); } if(logo_ok) { #if 0 @@ -1229,13 +1225,17 @@ void CMovieBrowser::refreshMovieInfo(void) ly = m_cBoxFrameInfo.iY + (m_cBoxFrameInfo.iHeight-pich)/2; g_PicViewer->DisplayImage(fname, lx, ly, picw, pich); #endif - lx = m_cBoxFrameInfo.iX+m_cBoxFrameInfo.iWidth - picw -10; - ly = m_cBoxFrameInfo.iY + (m_cBoxFrameInfo.iHeight-pich)/2; - m_pcWindow->paintVLineRel(lx, ly, pich, COL_WHITE); - m_pcWindow->paintVLineRel(lx+picw, ly, pich, COL_WHITE); - m_pcWindow->paintHLineRel(lx, picw, ly, COL_WHITE); - m_pcWindow->paintHLineRel(lx, picw, ly+pich, COL_WHITE); - g_PicViewer->DisplayImage(fname, lx+3, ly+3, picw-3, pich-3); + + int flogo_w = 0, flogo_h = 0; + g_PicViewer->getSize(fname.c_str(), &flogo_w, &flogo_h); + g_PicViewer->rescaleImageDimensions(&flogo_w, &flogo_h, picw, pich); + lx = m_cBoxFrameInfo.iX+m_cBoxFrameInfo.iWidth - flogo_w -10; + ly = m_cBoxFrameInfo.iY + (m_cBoxFrameInfo.iHeight-flogo_h)/2; + m_pcWindow->paintVLineRel(lx, ly, flogo_h, COL_WHITE); + m_pcWindow->paintVLineRel(lx+flogo_w, ly, flogo_h, COL_WHITE); + m_pcWindow->paintHLineRel(lx, flogo_w, ly, COL_WHITE); + m_pcWindow->paintHLineRel(lx, flogo_w, ly+flogo_h, COL_WHITE); + g_PicViewer->DisplayImage(fname, lx+3, ly+3, flogo_w-3, flogo_h-3); } } }