mirror of
https://github.com/webmproject/libwebp.git
synced 2024-12-27 22:28:22 +01:00
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:
parent
4b9186b2eb
commit
469ba2cdfd
@ -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();
|
||||||
|
Loading…
Reference in New Issue
Block a user