author | Nicholas Nethercote <nnethercote@mozilla.com> |
Wed, 25 Nov 2015 20:32:47 -0800 | |
changeset 308953 | 0cc1efabc37f8879530fe19aeed25b6cebaef5f2 |
parent 308952 | dd0db75af15ffa5beb0f74cea95c748ae4bae87f |
child 308954 | 71bf6683f1013c62aed6653228cf1260e9574a26 |
push id | 5513 |
push user | raliiev@mozilla.com |
push date | Mon, 25 Jan 2016 13:55:34 +0000 |
treeherder | mozilla-beta@5ee97dd05b5c [default view] [failures only] |
perfherder | [talos] [build metrics] [platform microbench] (compared to previous push) |
reviewers | botond |
bugs | 1228125 |
milestone | 45.0a1 |
first release with | nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
|
last release without | nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
|
--- a/dom/plugins/base/nsPluginInstanceOwner.cpp +++ b/dom/plugins/base/nsPluginInstanceOwner.cpp @@ -827,18 +827,18 @@ NPBool nsPluginInstanceOwner::ConvertPoi nsPoint chromeSize = AsNsPoint(rootWidget->GetChromeDimensions()) / scaleFactor; nsIntSize intScreenDims = rootWidget->GetScreenDimensions(); nsSize screenDims = nsSize(intScreenDims.width / scaleFactor, intScreenDims.height / scaleFactor); int32_t screenH = screenDims.height; nsPoint windowPosition = AsNsPoint(rootWidget->GetWindowPosition()) / scaleFactor; // Window size is tab size + chrome size. - nsIntRect tabContentBounds; - NS_ENSURE_SUCCESS(puppetWidget->GetBoundsUntyped(tabContentBounds), false); + LayoutDeviceIntRect tabContentBounds; + NS_ENSURE_SUCCESS(puppetWidget->GetBounds(tabContentBounds), false); tabContentBounds.ScaleInverseRoundOut(scaleFactor); int32_t windowH = tabContentBounds.height + int(chromeSize.y); nsPoint pluginPosition = AsNsPoint(pluginFrame->GetScreenRect().TopLeft()); // Convert (sourceX, sourceY) to 'real' (not PuppetWidget) screen space. // In OSX, the Y-axis increases upward, which is the reverse of ours. // We want OSX coordinates for window and screen so those equations are swapped.
--- a/gfx/layers/client/ClientLayerManager.cpp +++ b/gfx/layers/client/ClientLayerManager.cpp @@ -487,37 +487,40 @@ ClientLayerManager::MakeSnapshotIfRequir if (!mShadowTarget) { return; } if (mWidget) { if (CompositorChild* remoteRenderer = GetRemoteRenderer()) { // The compositor doesn't draw to a different sized surface // when there's a rotation. Instead we rotate the result // when drawing into dt - IntRect outerBounds; - mWidget->GetBoundsUntyped(outerBounds); + LayoutDeviceIntRect outerBounds; + mWidget->GetBounds(outerBounds); IntRect bounds = ToOutsideIntRect(mShadowTarget->GetClipExtents()); if (mTargetRotation) { - bounds = RotateRect(bounds, outerBounds, mTargetRotation); + bounds = + RotateRect(bounds, outerBounds.ToUnknownRect(), mTargetRotation); } SurfaceDescriptor inSnapshot; if (!bounds.IsEmpty() && mForwarder->AllocSurfaceDescriptor(bounds.Size(), gfxContentType::COLOR_ALPHA, &inSnapshot) && remoteRenderer->SendMakeSnapshot(inSnapshot, bounds)) { RefPtr<DataSourceSurface> surf = GetSurfaceForDescriptor(inSnapshot); DrawTarget* dt = mShadowTarget->GetDrawTarget(); Rect dstRect(bounds.x, bounds.y, bounds.width, bounds.height); Rect srcRect(0, 0, bounds.width, bounds.height); - gfx::Matrix rotate = ComputeTransformForUnRotation(outerBounds, mTargetRotation); + gfx::Matrix rotate = + ComputeTransformForUnRotation(outerBounds.ToUnknownRect(), + mTargetRotation); gfx::Matrix oldMatrix = dt->GetTransform(); dt->SetTransform(rotate * oldMatrix); dt->DrawSurface(surf, dstRect, srcRect, DrawSurfaceOptions(), DrawOptions(1.0f, CompositionOp::OP_OVER)); dt->SetTransform(oldMatrix); }
--- a/layout/base/UnitTransforms.h +++ b/layout/base/UnitTransforms.h @@ -39,17 +39,20 @@ enum class PixelCastJustification : uint // When an OS event is initially constructed, its reference point is // technically in screen pixels, as it has not yet accounted for any // asynchronous transforms. This justification is for viewing the initial // reference point as a screen point. The reverse is useful when synthetically // created WidgetEvents need to be converted back to InputData. LayoutDeviceIsScreenForUntransformedEvent, // Similar to LayoutDeviceIsScreenForUntransformedEvent, PBrowser handles // some widget/tab dimension information as the OS does -- in screen units. - LayoutDeviceIsScreenForTabDims + LayoutDeviceIsScreenForTabDims, + // A combination of LayoutDeviceIsScreenForBounds and + // ScreenIsParentLayerForRoot, which is how we're using it. + LayoutDeviceIsParentLayerForRCDRSF }; template <class TargetUnits, class SourceUnits> gfx::SizeTyped<TargetUnits> ViewAs(const gfx::SizeTyped<SourceUnits>& aSize, PixelCastJustification) { return gfx::SizeTyped<TargetUnits>(aSize.width, aSize.height); } template <class TargetUnits, class SourceUnits> gfx::IntSizeTyped<TargetUnits> ViewAs(const gfx::IntSizeTyped<SourceUnits>& aSize, PixelCastJustification) {
--- a/layout/base/Units.h +++ b/layout/base/Units.h @@ -283,16 +283,23 @@ struct LayoutDevicePixel { aSize.height * aAppUnitsPerDevPixel); } static nsSize ToAppUnits(const LayoutDeviceSize& aSize, nscoord aAppUnitsPerDevPixel) { return nsSize(NSFloatPixelsToAppUnits(aSize.width, aAppUnitsPerDevPixel), NSFloatPixelsToAppUnits(aSize.height, aAppUnitsPerDevPixel)); } + static nsRect ToAppUnits(const LayoutDeviceIntRect& aRect, nscoord aAppUnitsPerDevPixel) { + return nsRect(aRect.x * aAppUnitsPerDevPixel, + aRect.y * aAppUnitsPerDevPixel, + aRect.width * aAppUnitsPerDevPixel, + aRect.height * aAppUnitsPerDevPixel); + } + static nsRect ToAppUnits(const LayoutDeviceRect& aRect, nscoord aAppUnitsPerDevPixel) { return nsRect(NSFloatPixelsToAppUnits(aRect.x, aAppUnitsPerDevPixel), NSFloatPixelsToAppUnits(aRect.y, aAppUnitsPerDevPixel), NSFloatPixelsToAppUnits(aRect.width, aAppUnitsPerDevPixel), NSFloatPixelsToAppUnits(aRect.height, aAppUnitsPerDevPixel)); } };
--- a/layout/base/nsDisplayList.cpp +++ b/layout/base/nsDisplayList.cpp @@ -1242,19 +1242,19 @@ nsDisplayListBuilder::AdjustWindowDraggi LayoutDevicePixel::FromAppUnits(borderBox, aFrame->PresContext()->AppUnitsPerDevPixel()); LayoutDeviceRect transformedDevPixelBorderBox = TransformTo<LayoutDevicePixel>(referenceFrameToRootReferenceFrame, devPixelBorderBox); transformedDevPixelBorderBox.Round(); LayoutDeviceIntRect transformedDevPixelBorderBoxInt; if (transformedDevPixelBorderBox.ToIntRect(&transformedDevPixelBorderBoxInt)) { const nsStyleUserInterface* styleUI = aFrame->StyleUserInterface(); if (styleUI->mWindowDragging == NS_STYLE_WINDOW_DRAGGING_DRAG) { - mWindowDraggingRegion.OrWith(transformedDevPixelBorderBoxInt.ToUnknownRect()); + mWindowDraggingRegion.OrWith(transformedDevPixelBorderBoxInt); } else { - mWindowDraggingRegion.SubOut(transformedDevPixelBorderBoxInt.ToUnknownRect()); + mWindowDraggingRegion.SubOut(transformedDevPixelBorderBoxInt); } } } } const uint32_t gWillChangeAreaMultiplier = 3; static uint32_t GetWillChangeCost(nsIFrame* aFrame, const nsSize& aSize) {
--- a/layout/base/nsDisplayList.h +++ b/layout/base/nsDisplayList.h @@ -153,16 +153,19 @@ struct AnimatedGeometryRoot * nsIFrame::BuildDisplayList. * It contains the parameters that don't change from frame to frame and manages * the display list memory using a PLArena. It also establishes the reference * coordinate system for all display list items. Some of the parameters are * available from the prescontext/presshell, but we copy them into the builder * for faster/more convenient access. */ class nsDisplayListBuilder { + typedef mozilla::LayoutDeviceIntRect LayoutDeviceIntRect; + typedef mozilla::LayoutDeviceIntRegion LayoutDeviceIntRegion; + /** * This manages status of a 3d context to collect visible rects of * descendants and passing a dirty rect. * * Since some transforms maybe singular, passing visible rects or * the dirty rect level by level from parent to children may get a * wrong result, being different from the result of appling with * effective transform directly. @@ -607,17 +610,17 @@ public: /** * Adjusts mWindowDraggingRegion to take into account aFrame. If aFrame's * -moz-window-dragging value is |drag|, its border box is added to the * collected dragging region; if the value is |no-drag|, the border box is * subtracted from the region. */ void AdjustWindowDraggingRegion(nsIFrame* aFrame); - const nsIntRegion& GetWindowDraggingRegion() { return mWindowDraggingRegion; } + const LayoutDeviceIntRegion& GetWindowDraggingRegion() { return mWindowDraggingRegion; } /** * Allocate memory in our arena. It will only be freed when this display list * builder is destroyed. This memory holds nsDisplayItems. nsDisplayItem * destructors are called as soon as the item is no longer used. */ void* Allocate(size_t aSize); @@ -1204,17 +1207,17 @@ private: // rects are relative to the frame's reference frame nsDataHashtable<nsPtrHashKey<nsIFrame>, nsRect> mDirtyRectForScrolledContents; // Relative to mCurrentFrame. nsRect mDirtyRect; nsRegion mWindowExcludeGlassRegion; nsRegion mWindowOpaqueRegion; - nsIntRegion mWindowDraggingRegion; + LayoutDeviceIntRegion mWindowDraggingRegion; // The display item for the Windows window glass background, if any nsDisplayItem* mGlassDisplayItem; // When encountering inactive layers, we need to hoist scroll info items // above these layers so APZ can deliver events to content. Such scroll // info items are considered "committed" to the final hoisting list. If // no hoisting is needed immediately, it may be needed later if a blend // mode is introduced in a higher stacking context, so we keep all scroll // info items until the end of display list building.
--- a/layout/base/nsLayoutUtils.cpp +++ b/layout/base/nsLayoutUtils.cpp @@ -3435,17 +3435,18 @@ nsLayoutUtils::PaintFrame(nsRenderingCon !(aFlags & PAINT_DOCUMENT_RELATIVE)) { nsIWidget *widget = aFrame->GetNearestWidget(); if (widget) { nsRegion opaqueRegion; opaqueRegion.And(builder.GetWindowExcludeGlassRegion(), builder.GetWindowOpaqueRegion()); widget->UpdateOpaqueRegion( opaqueRegion.ToNearestPixels(presContext->AppUnitsPerDevPixel())); - const nsIntRegion& draggingRegion = builder.GetWindowDraggingRegion(); + const nsIntRegion& draggingRegion = + builder.GetWindowDraggingRegion().ToUnknownRegion(); widget->UpdateWindowDraggingRegion(draggingRegion); } } if (builder.WillComputePluginGeometry()) { // For single process compute and apply plugin geometry updates to plugin // windows, then request composition. For content processes skip eveything // except requesting composition. Geometry updates were calculated and @@ -7911,20 +7912,23 @@ UpdateCompositionBoundsForRCDRSF(ParentL #if defined(MOZ_WIDGET_ANDROID) || defined(MOZ_WIDGET_UIKIT) nsIWidget* widget = rootFrame->GetNearestWidget(); #else nsView* view = rootFrame->GetView(); nsIWidget* widget = view ? view->GetWidget() : nullptr; #endif if (widget) { - nsIntRect widgetBounds; - widget->GetBoundsUntyped(widgetBounds); + LayoutDeviceIntRect widgetBounds; + widget->GetBounds(widgetBounds); widgetBounds.MoveTo(0, 0); - aCompBounds = ParentLayerRect(ViewAs<ParentLayerPixel>(widgetBounds)); + aCompBounds = ParentLayerRect( + ViewAs<ParentLayerPixel>( + widgetBounds, + PixelCastJustification::LayoutDeviceIsParentLayerForRCDRSF)); return true; } LayoutDeviceIntSize contentSize; if (nsLayoutUtils::GetContentViewerSize(aPresContext, contentSize)) { LayoutDeviceToParentLayerScale scale; if (aScaleContentViewerSize && aPresContext->GetParentPresContext()) { scale = LayoutDeviceToParentLayerScale( @@ -8036,19 +8040,21 @@ nsLayoutUtils::CalculateRootCompositionS LayerSize frameSize = (LayoutDeviceRect::FromAppUnits(rootFrame->GetRect(), rootAUPerDevPixel) * cumulativeResolution).Size(); rootCompositionSize = frameSize * LayerToScreenScale(1.0f); } } } else { nsIWidget* widget = aFrame->GetNearestWidget(); - nsIntRect widgetBounds; - widget->GetBoundsUntyped(widgetBounds); - rootCompositionSize = ScreenSize(ViewAs<ScreenPixel>(widgetBounds.Size())); + LayoutDeviceIntRect widgetBounds; + widget->GetBounds(widgetBounds); + rootCompositionSize = ScreenSize( + ViewAs<ScreenPixel>(widgetBounds.Size(), + PixelCastJustification::LayoutDeviceIsScreenForBounds)); } // Adjust composition size for the size of scroll bars. nsIFrame* rootRootScrollFrame = rootPresShell ? rootPresShell->GetRootScrollFrame() : nullptr; nsMargin scrollbarMargins = ScrollbarAreaToExcludeFromCompositionBoundsFor(rootRootScrollFrame); LayoutDeviceMargin margins = LayoutDeviceMargin::FromAppUnits(scrollbarMargins, rootPresContext->AppUnitsPerDevPixel()); // Scrollbars are not subject to resolution scaling, so LD pixels = layer pixels for them.
--- a/layout/base/nsPresContext.cpp +++ b/layout/base/nsPresContext.cpp @@ -3093,24 +3093,27 @@ nsRootPresContext::CancelApplyPluginGeom mApplyPluginGeometryTimer->Cancel(); mApplyPluginGeometryTimer = nullptr; } } #ifndef XP_MACOSX static bool -HasOverlap(const nsIntPoint& aOffset1, const nsTArray<nsIntRect>& aClipRects1, - const nsIntPoint& aOffset2, const nsTArray<nsIntRect>& aClipRects2) +HasOverlap(const LayoutDeviceIntPoint& aOffset1, + const nsTArray<nsIntRect>& aClipRects1, + const LayoutDeviceIntPoint& aOffset2, + const nsTArray<nsIntRect>& aClipRects2) { - nsIntPoint offsetDelta = aOffset1 - aOffset2; + nsIntPoint offsetDelta = (aOffset1 - aOffset2).ToUnknownPoint(); for (uint32_t i = 0; i < aClipRects1.Length(); ++i) { for (uint32_t j = 0; j < aClipRects2.Length(); ++j) { - if ((aClipRects1[i] + offsetDelta).Intersects(aClipRects2[j])) + if ((aClipRects1[i] + offsetDelta).Intersects(aClipRects2[j])) { return true; + } } } return false; } /** * Given a list of plugin windows to move to new locations, sort the list * so that for each window move, the window moves to a location that @@ -3139,22 +3142,22 @@ SortConfigurations(nsTArray<nsIWidget::C // Find a window whose destination does not overlap any other window uint32_t i; for (i = 0; i + 1 < pluginsToMove.Length(); ++i) { nsIWidget::Configuration* config = &pluginsToMove[i]; bool foundOverlap = false; for (uint32_t j = 0; j < pluginsToMove.Length(); ++j) { if (i == j) continue; - nsIntRect bounds; - pluginsToMove[j].mChild->GetBoundsUntyped(bounds); + LayoutDeviceIntRect bounds; + pluginsToMove[j].mChild->GetBounds(bounds); nsAutoTArray<nsIntRect,1> clipRects; pluginsToMove[j].mChild->GetWindowClipRegion(&clipRects); if (HasOverlap(bounds.TopLeft(), clipRects, - config->mBounds.ToUnknownRect().TopLeft(), + config->mBounds.TopLeft(), config->mClipRegion)) { foundOverlap = true; break; } } if (!foundOverlap) break; }
--- a/layout/base/nsPresShell.cpp +++ b/layout/base/nsPresShell.cpp @@ -9629,17 +9629,17 @@ CompareTrees(nsPresContext* aFirstPresCo LogVerifyMessage(kids1.FirstChild(), kids2.FirstChild(), "child counts don't match: "); printf("%d != %d\n", l1, l2); if (0 == (VERIFY_REFLOW_ALL & gVerifyReflowFlags)) { break; } } - nsIntRect r1, r2; + LayoutDeviceIntRect r1, r2; nsView* v1; nsView* v2; for (nsFrameList::Enumerator e1(kids1), e2(kids2); ; e1.Next(), e2.Next()) { nsIFrame* k1 = e1.get(); nsIFrame* k2 = e2.get(); if (((nullptr == k1) && (nullptr != k2)) || @@ -9674,20 +9674,21 @@ CompareTrees(nsPresContext* aFirstPresCo nsIWidget* w1 = v1->GetWidget(); nsIWidget* w2 = v2->GetWidget(); if (((nullptr == w1) && (nullptr != w2)) || ((nullptr != w1) && (nullptr == w2))) { ok = false; LogVerifyMessage(k1, k2, "child widgets are not matched\n"); } else if (nullptr != w1) { - w1->GetBoundsUntyped(r1); - w2->GetBoundsUntyped(r2); + w1->GetBounds(r1); + w2->GetBounds(r2); if (!r1.IsEqualEdges(r2)) { - LogVerifyMessage(k1, k2, "(widget rects)", r1, r2); + LogVerifyMessage(k1, k2, "(widget rects)", + r1.ToUnknownRect(), r2.ToUnknownRect()); } } } if (!ok && (0 == (VERIFY_REFLOW_ALL & gVerifyReflowFlags))) { break; } // XXX Should perhaps compare their float managers.
--- a/view/nsView.cpp +++ b/view/nsView.cpp @@ -796,21 +796,21 @@ void nsView::DetachWidgetEventHandler(ns #ifdef DEBUG void nsView::List(FILE* out, int32_t aIndent) const { int32_t i; for (i = aIndent; --i >= 0; ) fputs(" ", out); fprintf(out, "%p ", (void*)this); if (nullptr != mWindow) { nscoord p2a = mViewManager->AppUnitsPerDevPixel(); - nsIntRect rect; - mWindow->GetClientBoundsUntyped(rect); - nsRect windowBounds = ToAppUnits(rect, p2a); - mWindow->GetBoundsUntyped(rect); - nsRect nonclientBounds = ToAppUnits(rect, p2a); + LayoutDeviceIntRect rect; + mWindow->GetClientBounds(rect); + nsRect windowBounds = LayoutDeviceIntRect::ToAppUnits(rect, p2a); + mWindow->GetBounds(rect); + nsRect nonclientBounds = LayoutDeviceIntRect::ToAppUnits(rect, p2a); nsrefcnt widgetRefCnt = mWindow.get()->AddRef() - 1; mWindow.get()->Release(); int32_t Z = mWindow->GetZIndex(); fprintf(out, "(widget=%p[%" PRIuPTR "] z=%d pos={%d,%d,%d,%d}) ", (void*)mWindow, widgetRefCnt, Z, nonclientBounds.x, nonclientBounds.y, windowBounds.width, windowBounds.height); }
--- a/view/nsViewManager.cpp +++ b/view/nsViewManager.cpp @@ -580,23 +580,24 @@ nsViewManager::InvalidateWidgetArea(nsVi "Only plugin or popup widgets can be children!"); // We do not need to invalidate in plugin widgets, but we should // exclude them from the invalidation region IF we're not on // Mac. On Mac we need to draw under plugin widgets, because // plugin widgets are basically invisible #ifndef XP_MACOSX // GetBounds should compensate for chrome on a toplevel widget - nsIntRect bounds; - childWidget->GetBoundsUntyped(bounds); + LayoutDeviceIntRect bounds; + childWidget->GetBounds(bounds); nsTArray<nsIntRect> clipRects; childWidget->GetWindowClipRegion(&clipRects); for (uint32_t i = 0; i < clipRects.Length(); ++i) { - nsRect rr = ToAppUnits(clipRects[i] + bounds.TopLeft(), AppUnitsPerDevPixel()); + nsRect rr = ToAppUnits(clipRects[i] + bounds.TopLeft().ToUnknownPoint(), + AppUnitsPerDevPixel()); children.Or(children, rr - aWidgetView->ViewToWidgetOffset()); children.SimplifyInward(20); } #endif } } }
--- a/widget/cocoa/nsChildView.mm +++ b/widget/cocoa/nsChildView.mm @@ -3802,21 +3802,21 @@ NSEvent* gLastDragMouseDownEvent = nil; PROFILER_LABEL("ChildView", "drawUsingOpenGL", js::ProfileEntry::Category::GRAPHICS); if (![self isUsingOpenGL] || !mGeckoChild->IsVisible()) return; mWaitingForPaint = NO; - nsIntRect geckoBounds; - mGeckoChild->GetBoundsUntyped(geckoBounds); - nsIntRegion region(geckoBounds); - - mGeckoChild->PaintWindow(region); + LayoutDeviceIntRect geckoBounds; + mGeckoChild->GetBounds(geckoBounds); + LayoutDeviceIntRegion region(geckoBounds); + + mGeckoChild->PaintWindow(region.ToUnknownRegion()); // Force OpenGL to refresh the very first time we draw. This works around a // Mac OS X bug that stops windows updating on OS X when we use OpenGL. if (!mDidForceRefreshOpenGL) { [self performSelector:@selector(forceRefreshOpenGL) withObject:nil afterDelay:0]; mDidForceRefreshOpenGL = YES; } }
--- a/widget/gtk/nsWindow.cpp +++ b/widget/gtk/nsWindow.cpp @@ -2191,20 +2191,21 @@ nsWindow::OnExposeEvent(cairo_t *cr) GList *children = gdk_window_peek_children(mGdkWindow); while (children) { GdkWindow *gdkWin = GDK_WINDOW(children->data); nsWindow *kid = get_window_for_gdk_window(gdkWin); if (kid && gdk_window_is_visible(gdkWin)) { nsAutoTArray<nsIntRect,1> clipRects; kid->GetWindowClipRegion(&clipRects); - nsIntRect bounds; - kid->GetBoundsUntyped(bounds); + LayoutDeviceIntRect bounds; + kid->GetBounds(bounds); for (uint32_t i = 0; i < clipRects.Length(); ++i) { - nsIntRect r = clipRects[i] + bounds.TopLeft(); + nsIntRect r = clipRects[i] + + bounds.TopLeft().ToUnknownPoint(); region.Sub(region, r); } } children = children->next; } } if (region.IsEmpty()) {
--- a/widget/nsIWidget.h +++ b/widget/nsIWidget.h @@ -811,29 +811,20 @@ class nsIWidget : public nsISupports { */ NS_IMETHOD SetFocus(bool aRaise = false) = 0; /** * Get this widget's outside dimensions relative to its parent widget. For * popup widgets the returned rect is in screen coordinates and not * relative to its parent widget. * - * The untyped version exists temporarily to ease conversion to typed - * coordinates. - * * @param aRect On return it holds the x, y, width and height of * this widget. */ NS_IMETHOD GetBounds(LayoutDeviceIntRect& aRect) = 0; - NS_IMETHOD GetBoundsUntyped(nsIntRect& aRect) { - LayoutDeviceIntRect tmp; - nsresult rv = GetBounds(tmp); - aRect = tmp.ToUnknownRect(); - return rv; - } /** * Get this widget's outside dimensions in global coordinates. This * includes any title bar on the window. * * The untyped version exists temporarily to ease conversion to typed * coordinates. *
--- a/widget/uikit/nsWindow.mm +++ b/widget/uikit/nsWindow.mm @@ -273,21 +273,21 @@ private: PROFILER_LABEL("ChildView", "drawUsingOpenGL", js::ProfileEntry::Category::GRAPHICS); if (!mGeckoChild->IsVisible()) return; mWaitingForPaint = NO; - nsIntRect geckoBounds; - mGeckoChild->GetBoundsUntyped(geckoBounds); - nsIntRegion region(geckoBounds); + LayoutDeviceIntRect geckoBounds; + mGeckoChild->GetBounds(geckoBounds); + LayoutDeviceIntRegion region(geckoBounds); - mGeckoChild->PaintWindow(region); + mGeckoChild->PaintWindow(region.ToUnknownRegion()); } // Called asynchronously after setNeedsDisplay in order to avoid entering the // normal drawing machinery. - (void)drawUsingOpenGLCallback { if (mWaitingForPaint) { [self drawUsingOpenGL];
--- a/widget/windows/nsWindow.cpp +++ b/widget/windows/nsWindow.cpp @@ -2658,32 +2658,33 @@ void nsWindow::UpdateOpaqueRegion(const if (!HasGlass() || GetParent()) return; // If there is no opaque region or hidechrome=true, set margins // to support a full sheet of glass. Comments in MSDN indicate // all values must be set to -1 to get a full sheet of glass. MARGINS margins = { -1, -1, -1, -1 }; if (!aOpaqueRegion.IsEmpty()) { - nsIntRect pluginBounds; + LayoutDeviceIntRect pluginBounds; for (nsIWidget* child = GetFirstChild(); child; child = child->GetNextSibling()) { if (child->IsPlugin()) { // Collect the bounds of all plugins for GetLargestRectangle. - nsIntRect childBounds; - child->GetBoundsUntyped(childBounds); + LayoutDeviceIntRect childBounds; + child->GetBounds(childBounds); pluginBounds.UnionRect(pluginBounds, childBounds); } } LayoutDeviceIntRect clientBounds; GetClientBounds(clientBounds); // Find the largest rectangle and use that to calculate the inset. Our top // priority is to include the bounds of all plugins. - nsIntRect largest = aOpaqueRegion.GetLargestRectangle(pluginBounds); + LayoutDeviceIntRect largest = + LayoutDeviceIntRegion::FromUnknownRegion(aOpaqueRegion).GetLargestRectangle(pluginBounds); margins.cxLeftWidth = largest.x; margins.cxRightWidth = clientBounds.width - largest.XMost(); margins.cyBottomHeight = clientBounds.height - largest.YMost(); if (mCustomNonClient) { // The minimum glass height must be the caption buttons height, // otherwise the buttons are drawn incorrectly. largest.y = std::max<uint32_t>(largest.y, nsUXThemeData::sCommandButtons[CMDBUTTONIDX_BUTTONBOX].cy);