vwebp: fix incorrect clipping w/NO_BLEND

when the previous frame does not specify dispose to background only the
current frame's rectangle should be cleared

related to bug #245

Change-Id: I2fc4f5be99057e0bf87d8fedec57b06859b070bd
This commit is contained in:
Pascal Massimino 2015-10-23 00:01:24 -07:00 committed by James Zern
parent 4b9186b2eb
commit 469ba2cdfd

View File

@ -308,19 +308,24 @@ static void HandleDisplay(void) {
// they will be incorrect if the window is resized. // they will be incorrect if the window is resized.
// glScissor() takes window coordinates (0,0 at bottom left). // glScissor() takes window coordinates (0,0 at bottom left).
int window_x, window_y; int window_x, window_y;
int frame_w, frame_h;
if (prev->dispose_method == WEBP_MUX_DISPOSE_BACKGROUND) { if (prev->dispose_method == WEBP_MUX_DISPOSE_BACKGROUND) {
// Clear the previous frame rectangle. // Clear the previous frame rectangle.
window_x = prev->x_offset; window_x = prev->x_offset;
window_y = kParams.canvas_height - prev->y_offset - prev->height; window_y = kParams.canvas_height - prev->y_offset - prev->height;
frame_w = prev->width;
frame_h = prev->height;
} else { // curr->blend_method == WEBP_MUX_NO_BLEND. } else { // curr->blend_method == WEBP_MUX_NO_BLEND.
// We simulate no-blending behavior by first clearing the current frame // We simulate no-blending behavior by first clearing the current frame
// rectangle (to a checker-board) and then alpha-blending against it. // rectangle (to a checker-board) and then alpha-blending against it.
window_x = curr->x_offset; window_x = curr->x_offset;
window_y = kParams.canvas_height - curr->y_offset - curr->height; window_y = kParams.canvas_height - curr->y_offset - curr->height;
frame_w = curr->width;
frame_h = curr->height;
} }
glEnable(GL_SCISSOR_TEST); glEnable(GL_SCISSOR_TEST);
// Only update the requested area, not the whole canvas. // Only update the requested area, not the whole canvas.
glScissor(window_x, window_y, prev->width, prev->height); glScissor(window_x, window_y, frame_w, frame_h);
glClear(GL_COLOR_BUFFER_BIT); // use clear color glClear(GL_COLOR_BUFFER_BIT); // use clear color
DrawCheckerBoard(); DrawCheckerBoard();