Index: ui/accelerated_widget_mac/io_surface_texture.mm |
diff --git a/ui/accelerated_widget_mac/io_surface_texture.mm b/ui/accelerated_widget_mac/io_surface_texture.mm |
index 291fbdd2da4d6f88a634c5aa583e1d39314c585d..d3898a4adc98eff88fd572b5f9eceb8e72f58592 100644 |
--- a/ui/accelerated_widget_mac/io_surface_texture.mm |
+++ b/ui/accelerated_widget_mac/io_surface_texture.mm |
@@ -63,7 +63,16 @@ IOSurfaceTexture::~IOSurfaceTexture() { |
} |
bool IOSurfaceTexture::DrawIOSurface() { |
- TRACE_EVENT0("browser", "IOSurfaceTexture::DrawIOSurface"); |
+ return DrawIOSurfaceInternal(gfx::Rect(pixel_size_), true); |
+} |
+ |
+bool IOSurfaceTexture::DrawIOSurfaceWithDamageRect(gfx::Rect damage_rect) { |
+ return DrawIOSurfaceInternal(damage_rect, false); |
+} |
+ |
+bool IOSurfaceTexture::DrawIOSurfaceInternal( |
+ gfx::Rect damage_rect, bool draw_boundary) { |
+ TRACE_EVENT0("browser", "IOSurfaceTexture::DrawIOSurfaceInternal"); |
DCHECK(CGLGetCurrentContext()); |
// If we have release the IOSurface, clear the screen to light grey and |
@@ -94,14 +103,14 @@ bool IOSurfaceTexture::DrawIOSurface() { |
glEnable(GL_TEXTURE_RECTANGLE_ARB); |
glBindTexture(GL_TEXTURE_RECTANGLE_ARB, texture_); |
glBegin(GL_QUADS); |
- glTexCoord2f(0, 0); |
- glVertex2f(0, 0); |
- glTexCoord2f(pixel_size_.width(), 0); |
- glVertex2f(pixel_size_.width(), 0); |
- glTexCoord2f(pixel_size_.width(), pixel_size_.height()); |
- glVertex2f(pixel_size_.width(), pixel_size_.height()); |
- glTexCoord2f(0, pixel_size_.height()); |
- glVertex2f(0, pixel_size_.height()); |
+ glTexCoord2f(damage_rect.x(), damage_rect.y()); |
+ glVertex2f(damage_rect.x(), damage_rect.y()); |
+ glTexCoord2f(damage_rect.right(), damage_rect.y()); |
+ glVertex2f(damage_rect.right(), damage_rect.y()); |
+ glTexCoord2f(damage_rect.right(), damage_rect.bottom()); |
+ glVertex2f(damage_rect.right(), damage_rect.bottom()); |
+ glTexCoord2f(damage_rect.x(), damage_rect.bottom()); |
+ glVertex2f(damage_rect.x(), damage_rect.bottom()); |
glEnd(); |
glBindTexture(GL_TEXTURE_RECTANGLE_ARB, 0); |
glDisable(GL_TEXTURE_RECTANGLE_ARB); |
@@ -112,6 +121,28 @@ bool IOSurfaceTexture::DrawIOSurface() { |
glBegin(GL_TRIANGLES); |
glEnd(); |
+ // If the viewport is larger than the texture, clear out the overflow to |
+ // white. |
+ if (draw_boundary) { |
+ if (pixel_size_.width() < viewport_rect.width()) { |
+ glBegin(GL_QUADS); |
+ glVertex2f(pixel_size_.width(), 0); |
+ glVertex2f(pixel_size_.width(), viewport_rect.height()); |
+ glVertex2f(viewport_rect.width(), viewport_rect.height()); |
+ glVertex2f(viewport_rect.width(), 0); |
+ glEnd(); |
+ } |
+ if (pixel_size_.height() < viewport_rect.height()) { |
+ int non_surface_height = viewport_rect.height() - pixel_size_.height(); |
+ glBegin(GL_QUADS); |
+ glVertex2f(0, 0); |
+ glVertex2f(0, non_surface_height); |
+ glVertex2f(pixel_size_.width(), non_surface_height); |
+ glVertex2f(pixel_size_.width(), 0); |
+ glEnd(); |
+ } |
+ } |
+ |
if (needs_gl_finish_workaround_) { |
TRACE_EVENT0("gpu", "glFinish"); |
glFinish(); |