diff --git a/mozilla/layout/generic/nsObjectFrame.cpp b/mozilla/layout/generic/nsObjectFrame.cpp index a94c882387f..6452d1a4861 100644 --- a/mozilla/layout/generic/nsObjectFrame.cpp +++ b/mozilla/layout/generic/nsObjectFrame.cpp @@ -4133,25 +4133,31 @@ nsPluginInstanceOwner::Renderer::NativeDraw(Screen* screen, Drawable drawable, doupdatewindow = PR_TRUE; } - // The clip rect is relative to plugin top-left. + // The clip rect is relative to drawable top-left. NS_ASSERTION(numClipRects <= 1, "We don't support multiple clip rectangles!"); - nsPluginRect newClipRect; + nsIntRect clipRect; if (numClipRects) { - newClipRect.left = clipRects[0].x; - newClipRect.top = clipRects[0].y; - newClipRect.right = clipRects[0].x + clipRects[0].width; - newClipRect.bottom = clipRects[0].y + clipRects[0].height; + clipRect.x = clipRects[0].x; + clipRect.y = clipRects[0].y; + clipRect.width = clipRects[0].width; + clipRect.height = clipRects[0].height; } else { - // We should have been given a clip if an offset is -ve. + // nsPluginRect members are unsigned, but + // we should have been given a clip if an offset is -ve. NS_ASSERTION(offsetX >= 0 && offsetY >= 0, "Clip rectangle offsets are negative!"); - newClipRect.left = offsetX; - newClipRect.top = offsetY; - newClipRect.right = offsetX + mWindow->width; - newClipRect.bottom = offsetY + mWindow->height; + clipRect.x = offsetX; + clipRect.y = offsetY; + clipRect.width = mWindow->width; + clipRect.height = mWindow->height; } + nsPluginRect newClipRect; + newClipRect.left = clipRect.x; + newClipRect.top = clipRect.y; + newClipRect.right = clipRect.XMost(); + newClipRect.bottom = clipRect.YMost(); if (mWindow->clipRect.left != newClipRect.left || mWindow->clipRect.top != newClipRect.top || mWindow->clipRect.right != newClipRect.right || @@ -4172,16 +4178,23 @@ nsPluginInstanceOwner::Renderer::NativeDraw(Screen* screen, Drawable drawable, if (doupdatewindow) mInstance->SetWindow(mWindow); + // Translate the dirty rect to drawable coordinates. + nsIntRect dirtyRect = mDirtyRect + nsIntPoint(offsetX, offsetY); + // Intersect the dirty rect with the clip rect to ensure that it lies within + // the drawable. + if (!dirtyRect.IntersectRect(dirtyRect, clipRect)) + return NS_OK; + nsPluginEvent pluginEvent; XGraphicsExposeEvent& exposeEvent = pluginEvent.event.xgraphicsexpose; // set the drawing info exposeEvent.type = GraphicsExpose; exposeEvent.display = DisplayOfScreen(screen); exposeEvent.drawable = drawable; - exposeEvent.x = mDirtyRect.x + offsetX; - exposeEvent.y = mDirtyRect.y + offsetY; - exposeEvent.width = mDirtyRect.width; - exposeEvent.height = mDirtyRect.height; + exposeEvent.x = dirtyRect.x; + exposeEvent.y = dirtyRect.y; + exposeEvent.width = dirtyRect.width; + exposeEvent.height = dirtyRect.height; exposeEvent.count = 0; // information not set: exposeEvent.serial = 0;