void drawMenuBackground(video::IVideoDriver* driver) { core::dimension2d<u32> screensize = driver->getScreenSize(); video::ITexture *bgtexture = driver->getTexture(getTexturePath("menubg.png").c_str()); if(bgtexture) { s32 scaledsize = 128; // The important difference between destsize and screensize is // that destsize is rounded to whole scaled pixels. // These formulas use component-wise multiplication and division of v2u32. v2u32 texturesize = bgtexture->getSize(); v2u32 sourcesize = texturesize * screensize / scaledsize + v2u32(1,1); v2u32 destsize = scaledsize * sourcesize / texturesize; // Default texture wrapping mode in Irrlicht is ETC_REPEAT. driver->draw2DImage(bgtexture, core::rect<s32>(0, 0, destsize.X, destsize.Y), core::rect<s32>(0, 0, sourcesize.X, sourcesize.Y), NULL, NULL, true); } video::ITexture *logotexture = driver->getTexture(getTexturePath("menulogo.png").c_str()); if(logotexture) { v2s32 logosize(logotexture->getOriginalSize().Width, logotexture->getOriginalSize().Height); logosize *= 4; video::SColor bgcolor(255,50,50,50); core::rect<s32> bgrect(0, screensize.Height-logosize.Y-20, screensize.Width, screensize.Height); driver->draw2DRectangle(bgcolor, bgrect, NULL); core::rect<s32> rect(0,0,logosize.X,logosize.Y); rect += v2s32(screensize.Width/2,screensize.Height-10-logosize.Y); rect -= v2s32(logosize.X/2, 0); driver->draw2DImage(logotexture, rect, core::rect<s32>(core::position2d<s32>(0,0), core::dimension2di(logotexture->getSize())), NULL, NULL, true); } }
void drawMenuBackground(video::IVideoDriver* driver) { core::dimension2d<u32> screensize = driver->getScreenSize(); video::ITexture *bgtexture = driver->getTexture(getTexturePath("menubg.png").c_str()); if(bgtexture) { s32 texturesize = 128; s32 tiled_y = screensize.Height / texturesize + 1; s32 tiled_x = screensize.Width / texturesize + 1; for(s32 y=0; y<tiled_y; y++) for(s32 x=0; x<tiled_x; x++) { core::rect<s32> rect(0,0,texturesize,texturesize); rect += v2s32(x*texturesize, y*texturesize); driver->draw2DImage(bgtexture, rect, core::rect<s32>(core::position2d<s32>(0,0), core::dimension2di(bgtexture->getSize())), NULL, NULL, true); } } video::ITexture *logotexture = driver->getTexture(getTexturePath("menulogo.png").c_str()); if(logotexture) { v2s32 logosize(logotexture->getOriginalSize().Width, logotexture->getOriginalSize().Height); logosize *= 4; video::SColor bgcolor(255,50,50,50); core::rect<s32> bgrect(0, screensize.Height-logosize.Y-20, screensize.Width, screensize.Height); driver->draw2DRectangle(bgcolor, bgrect, NULL); core::rect<s32> rect(0,0,logosize.X,logosize.Y); rect += v2s32(screensize.Width/2,screensize.Height-10-logosize.Y); rect -= v2s32(logosize.X/2, 0); driver->draw2DImage(logotexture, rect, core::rect<s32>(core::position2d<s32>(0,0), core::dimension2di(logotexture->getSize())), NULL, NULL, true); } }
void SubtitleScreen::DisplayCC608Subtitles(void) { static const QColor clr[8] = { Qt::white, Qt::red, Qt::green, Qt::yellow, Qt::blue, Qt::magenta, Qt::cyan, Qt::white, }; if (!InitialiseFont(m_fontStretch) || !m_608reader) return; bool changed = false; if (m_player && m_player->GetVideoOutput()) { QRect oldsafe = m_safeArea; m_safeArea = m_player->GetVideoOutput()->GetSafeRect(); if (oldsafe != m_safeArea) changed = true; } else { return; } CC608Buffer* textlist = m_608reader->GetOutputText(changed); if (!changed) return; if (textlist) textlist->lock.lock(); DeleteAllChildren(); if (!textlist) return; if (textlist && textlist->buffers.empty()) { SetRedraw(); textlist->lock.unlock(); return; } vector<CC608Text*>::iterator i = textlist->buffers.begin(); bool teletextmode = (*i)->teletextmode; int xscale = teletextmode ? 40 : 36; int yscale = teletextmode ? 25 : 17; gTextSubFont->GetFace()->setPixelSize(m_safeArea.height() / (yscale * 1.2)); QFontMetrics font(*(gTextSubFont->GetFace())); QBrush bgfill = QBrush(QColor(0, 0, 0), Qt::SolidPattern); int height = font.height() * (1 + PAD_HEIGHT); int pad_width = font.maxWidth() * PAD_WIDTH; for (; i != textlist->buffers.end(); i++) { CC608Text *cc = (*i); if (cc && (cc->text != QString::null)) { int width = font.width(cc->text) + pad_width; int x = teletextmode ? cc->y : (cc->x + 3); int y = teletextmode ? cc->x : cc->y; x = (int)(((float)x / (float)xscale) * (float)m_safeArea.width()); y = (int)(((float)y / (float)yscale) * (float)m_safeArea.height()); QRect rect(x, y, width, height); if (!teletextmode && m_useBackground) { MythUIShape *shape = new MythUIShape(this, QString("cc608bg%1%2%3").arg(cc->x).arg(cc->y).arg(width)); shape->SetFillBrush(bgfill); QRect bgrect(x - pad_width, y, width + pad_width, height); shape->SetArea(MythRect(bgrect)); } gTextSubFont->SetColor(clr[min(max(0, cc->color), 7)]); MythUIText *text = new MythUIText( cc->text, *gTextSubFont, rect, rect, (MythUIType*)this, QString("cc608txt%1%2%3").arg(cc->x).arg(cc->y).arg(width)); if (text) text->SetJustification(Qt::AlignLeft); m_refreshArea = true; LOG(VB_VBI, LOG_INFO, QString("x %1 y %2 String: '%3'") .arg(cc->x).arg(cc->y).arg(cc->text)); } } textlist->lock.unlock(); }