mirror of
https://projects.vdr-developer.org/git/vdr-plugin-tvguide.git
synced 2023-10-05 15:01:48 +02:00
Fixed possible segfault when showing scrollbar in search result lists
A segfault is possible if numSteps is greater than height in "cRecMenu::createScrollbar()".
This commit is contained in:
parent
e2d67769dc
commit
eb259fb961
27
recmenu.c
27
recmenu.c
@ -123,8 +123,7 @@ void cRecMenu::InitMenu(bool complete) {
|
|||||||
width -= scrollbarWidth + border;
|
width -= scrollbarWidth + border;
|
||||||
osdManager.releasePixmap(pixmapScrollBar);
|
osdManager.releasePixmap(pixmapScrollBar);
|
||||||
pixmapScrollBar = NULL;
|
pixmapScrollBar = NULL;
|
||||||
delete imgScrollBar;
|
DELETENULL(imgScrollBar);
|
||||||
imgScrollBar = NULL;
|
|
||||||
}
|
}
|
||||||
osdManager.releasePixmap(pixmap);
|
osdManager.releasePixmap(pixmap);
|
||||||
pixmap = NULL;
|
pixmap = NULL;
|
||||||
@ -592,14 +591,14 @@ void cRecMenu::DrawScrollBar(void) {
|
|||||||
if (!pixmapScrollBar)
|
if (!pixmapScrollBar)
|
||||||
return;
|
return;
|
||||||
pixmapScrollBar->Fill(theme.Color(clrBorder));
|
pixmapScrollBar->Fill(theme.Color(clrBorder));
|
||||||
pixmapScrollBar->DrawRectangle(cRect(2,2,pixmapScrollBar->ViewPort().Width()-4, pixmapScrollBar->ViewPort().Height() - 4), theme.Color(clrBackground));
|
pixmapScrollBar->DrawRectangle(cRect(2, 2, pixmapScrollBar->ViewPort().Width() - 4, pixmapScrollBar->ViewPort().Height() - 4), theme.Color(clrBackground));
|
||||||
|
|
||||||
int totalNumItems = GetTotalNumMenuItems();
|
int totalNumItems = GetTotalNumMenuItems();
|
||||||
if (!totalNumItems)
|
if (!totalNumItems)
|
||||||
return;
|
return;
|
||||||
if (imgScrollBar == NULL) {
|
if (!imgScrollBar) {
|
||||||
int scrollBarImgHeight = (pixmapScrollBar->ViewPort().Height() - 8) * numItems / totalNumItems;
|
int scrollBarImgHeight = (pixmapScrollBar->ViewPort().Height() - 8) * numItems / totalNumItems;
|
||||||
imgScrollBar = createScrollbar(pixmapScrollBar->ViewPort().Width()-8, scrollBarImgHeight, theme.Color(clrHighlight), theme.Color(clrHighlightBlending));
|
imgScrollBar = createScrollbar(pixmapScrollBar->ViewPort().Width() - 8, scrollBarImgHeight, theme.Color(clrHighlight), theme.Color(clrHighlightBlending));
|
||||||
}
|
}
|
||||||
int offset = (pixmapScrollBar->ViewPort().Height() - 8) * startIndex / totalNumItems;
|
int offset = (pixmapScrollBar->ViewPort().Height() - 8) * startIndex / totalNumItems;
|
||||||
pixmapScrollBar->DrawImage(cPoint(4, 2 + offset), *imgScrollBar);
|
pixmapScrollBar->DrawImage(cPoint(4, 2 + offset), *imgScrollBar);
|
||||||
@ -678,25 +677,21 @@ eRecMenuState cRecMenu::ProcessKey(eKeys Key) {
|
|||||||
cImage *cRecMenu::createScrollbar(int width, int height, tColor clrBgr, tColor clrBlend) {
|
cImage *cRecMenu::createScrollbar(int width, int height, tColor clrBgr, tColor clrBlend) {
|
||||||
cImage *image = new cImage(cSize(width, height));
|
cImage *image = new cImage(cSize(width, height));
|
||||||
image->Fill(clrBgr);
|
image->Fill(clrBgr);
|
||||||
if (config.style != eStyleFlat) {
|
if (height >= 32 && config.style != eStyleFlat) {
|
||||||
int numSteps = 64;
|
int numSteps = 64;
|
||||||
int alphaStep = 0x03;
|
int alphaStep = 0x03;
|
||||||
if (height < 30)
|
if (height < 100) {
|
||||||
return image;
|
|
||||||
else if (height < 100) {
|
|
||||||
numSteps = 32;
|
numSteps = 32;
|
||||||
alphaStep = 0x06;
|
alphaStep = 0x06;
|
||||||
}
|
}
|
||||||
int stepY = 0.5*height / numSteps;
|
int stepY = std::max(1, (int)(0.5 * height / numSteps));
|
||||||
if (stepY == 0)
|
|
||||||
stepY = 1;
|
|
||||||
int alpha = 0x40;
|
int alpha = 0x40;
|
||||||
tColor clr;
|
tColor clr;
|
||||||
for (int i = 0; i<numSteps; i++) {
|
for (int i = 0; i < numSteps; i++) {
|
||||||
clr = AlphaBlend(clrBgr, clrBlend, alpha);
|
clr = AlphaBlend(clrBgr, clrBlend, alpha);
|
||||||
for (int y = i*stepY; y < (i+1)*stepY; y++) {
|
for (int y = i * stepY; y < (i + 1) * stepY; y++) {
|
||||||
for (int x=0; x<width; x++) {
|
for (int x = 0; x < width; x++) {
|
||||||
image->SetPixel(cPoint(x,y), clr);
|
image->SetPixel(cPoint(x, y), clr);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
alpha += alphaStep;
|
alpha += alphaStep;
|
||||||
|
Loading…
Reference in New Issue
Block a user