mirror of https://github.com/mpv-player/mpv
clear screen and tiny image bug patch by Burton Samograd <kruhft@kruhft.dyndns.org>
git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@7114 b3059339-0415-0410-9bf9-f77b7e298cf2
This commit is contained in:
parent
0dbb552406
commit
e9d168f902
|
@ -153,8 +153,16 @@ static void uninit(void)
|
||||||
|
|
||||||
static void clear_screen()
|
static void clear_screen()
|
||||||
{
|
{
|
||||||
if(vo_doublebuffering) {
|
/* There needs to be some sort of delay here or else things seriously screw up.
|
||||||
memset(vidpage, 0, screenwidth * screenheight * screendepth);
|
Causes the image to not be the right size on screen if this isn't like this.
|
||||||
|
A printf before the memset call also seems to work, but this made more sense
|
||||||
|
since it actually checks the status of the card.
|
||||||
|
*/
|
||||||
|
do {
|
||||||
|
memset(vidpage, 0, screenwidth * screenheight * screendepth);
|
||||||
|
} while((reg_IO->status & 0x1f) < 1);
|
||||||
|
|
||||||
|
if(vo_doublebuffering) {
|
||||||
memset(hidpage, 0, screenwidth * screenheight * screendepth);
|
memset(hidpage, 0, screenwidth * screenheight * screendepth);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -171,9 +179,14 @@ static void setup_screen(uint32_t full)
|
||||||
|
|
||||||
if(screenwidth / ratio <= screenheight)
|
if(screenwidth / ratio <= screenheight)
|
||||||
vidheight = (double)screenwidth / ratio;
|
vidheight = (double)screenwidth / ratio;
|
||||||
|
/* Is this really needed? This causes movies that are encoded at YxY
|
||||||
|
sizes to not be displayed properly (they're squished horizontally).
|
||||||
|
This might cause problems with videos that are taller than they are wide
|
||||||
|
but I haven't really seen many of those so we won't worry about it for now. */
|
||||||
|
#if 0
|
||||||
else
|
else
|
||||||
vidwidth = (double)screenheight * ratio;
|
vidwidth = (double)screenheight * ratio;
|
||||||
|
#endif
|
||||||
vidx = (screenwidth - vidwidth) / 2;
|
vidx = (screenwidth - vidwidth) / 2;
|
||||||
vidy = (screenheight - vidheight) / 2;
|
vidy = (screenheight - vidheight) / 2;
|
||||||
} else { /* Reset to normal size */
|
} else { /* Reset to normal size */
|
||||||
|
@ -185,7 +198,7 @@ static void setup_screen(uint32_t full)
|
||||||
vidheight = r_height;
|
vidheight = r_height;
|
||||||
vidx = vidy = 0;
|
vidx = vidy = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
clear_screen();
|
clear_screen();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -265,12 +278,11 @@ static uint32_t config(uint32_t width, uint32_t height, uint32_t d_width, uint32
|
||||||
|
|
||||||
in_voodoo_format |= in_width * in_depth;
|
in_voodoo_format |= in_width * in_depth;
|
||||||
|
|
||||||
/* Linux lives in the first frame */
|
/* Put the image pages off the console screen so they don't get console messages */
|
||||||
if(vo_doublebuffering) {
|
/* This used to place single buffered movies onto the main console screen */
|
||||||
vidpageoffset = screenwidth * screenheight * screendepth;
|
vidpageoffset = hidpageoffset = screenwidth * screenheight * screendepth;
|
||||||
hidpageoffset = vidpageoffset + screenwidth * screenheight * screendepth;
|
if(vo_doublebuffering)
|
||||||
} else
|
hidpageoffset = vidpageoffset + screenwidth * screenheight * screendepth;
|
||||||
vidpageoffset = hidpageoffset = 0; /* Console background */
|
|
||||||
|
|
||||||
inpageoffset = hidpageoffset + screenwidth * screenheight * screendepth;
|
inpageoffset = hidpageoffset + screenwidth * screenheight * screendepth;
|
||||||
|
|
||||||
|
@ -322,6 +334,10 @@ static void flip_page(void)
|
||||||
{
|
{
|
||||||
voodoo_2d_reg regs = *reg_2d; /* Copy the regs */
|
voodoo_2d_reg regs = *reg_2d; /* Copy the regs */
|
||||||
int i = 0;
|
int i = 0;
|
||||||
|
/* This has to be done of else setting dstSize doesn't work */
|
||||||
|
/* Must be a gcc 3.0+ bug */
|
||||||
|
int tempvidheight = vidheight;
|
||||||
|
int tempvidwidth = vidwidth;
|
||||||
|
|
||||||
if(vo_doublebuffering) {
|
if(vo_doublebuffering) {
|
||||||
/* Flip to an offscreen buffer for rendering */
|
/* Flip to an offscreen buffer for rendering */
|
||||||
|
@ -346,7 +362,8 @@ static void flip_page(void)
|
||||||
reg_2d->dstBaseAddr = vidpageoffset;
|
reg_2d->dstBaseAddr = vidpageoffset;
|
||||||
reg_2d->dstXY = XYREG(vidx, vidy);
|
reg_2d->dstXY = XYREG(vidx, vidy);
|
||||||
reg_2d->dstFormat = vid_voodoo_format;
|
reg_2d->dstFormat = vid_voodoo_format;
|
||||||
reg_2d->dstSize = XYREG(vidwidth, vidheight);
|
/* The XYREG macro doesn't seem to work for this line so build the register contents very explicitly */
|
||||||
|
reg_2d->dstSize = ((((unsigned long)vidheight) & 0x0000FFFF) << 16) | (((unsigned long) vidwidth) & 0x0000FFFF);
|
||||||
reg_2d->command = S2S_STRECH_BLT | S2S_IMMED | S2S_ROP;
|
reg_2d->command = S2S_STRECH_BLT | S2S_IMMED | S2S_ROP;
|
||||||
|
|
||||||
/* Wait for the command to finish (If we don't do this, we get wierd
|
/* Wait for the command to finish (If we don't do this, we get wierd
|
||||||
|
|
Loading…
Reference in New Issue