2001-12-12 10:59:31 +03:00
|
|
|
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
2012-05-21 15:12:37 +04:00
|
|
|
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
|
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
|
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
2001-12-12 10:59:31 +03:00
|
|
|
|
2012-03-26 15:58:59 +04:00
|
|
|
// Main header first:
|
2006-02-21 03:33:27 +03:00
|
|
|
#include "nsSVGForeignObjectFrame.h"
|
|
|
|
|
2012-03-26 15:58:59 +04:00
|
|
|
// Keep others in (case-insensitive) order:
|
|
|
|
#include "gfxContext.h"
|
|
|
|
#include "gfxMatrix.h"
|
|
|
|
#include "nsGkAtoms.h"
|
|
|
|
#include "nsINameSpaceManager.h"
|
|
|
|
#include "nsLayoutUtils.h"
|
2006-02-21 03:33:27 +03:00
|
|
|
#include "nsRegion.h"
|
2012-03-20 16:15:55 +04:00
|
|
|
#include "nsRenderingContext.h"
|
2012-03-26 15:58:59 +04:00
|
|
|
#include "nsSVGContainerFrame.h"
|
2012-03-20 16:15:53 +04:00
|
|
|
#include "nsSVGEffects.h"
|
2013-01-06 10:25:55 +04:00
|
|
|
#include "mozilla/dom/SVGForeignObjectElement.h"
|
2012-06-30 15:20:46 +04:00
|
|
|
#include "nsSVGIntegrationUtils.h"
|
2012-03-26 15:58:59 +04:00
|
|
|
#include "nsSVGOuterSVGFrame.h"
|
|
|
|
#include "nsSVGUtils.h"
|
2012-04-17 02:32:12 +04:00
|
|
|
#include "mozilla/AutoRestore.h"
|
|
|
|
|
|
|
|
using namespace mozilla;
|
2013-01-06 10:25:55 +04:00
|
|
|
using namespace mozilla::dom;
|
2001-12-12 10:59:31 +03:00
|
|
|
|
|
|
|
//----------------------------------------------------------------------
|
|
|
|
// Implementation
|
|
|
|
|
2005-11-11 05:36:29 +03:00
|
|
|
nsIFrame*
|
2007-06-22 03:01:10 +04:00
|
|
|
NS_NewSVGForeignObjectFrame(nsIPresShell *aPresShell,
|
|
|
|
nsStyleContext *aContext)
|
2001-12-12 10:59:31 +03:00
|
|
|
{
|
2006-03-27 01:30:36 +04:00
|
|
|
return new (aPresShell) nsSVGForeignObjectFrame(aContext);
|
2001-12-12 10:59:31 +03:00
|
|
|
}
|
|
|
|
|
2009-09-12 20:49:24 +04:00
|
|
|
NS_IMPL_FRAMEARENA_HELPERS(nsSVGForeignObjectFrame)
|
|
|
|
|
2006-03-27 01:30:36 +04:00
|
|
|
nsSVGForeignObjectFrame::nsSVGForeignObjectFrame(nsStyleContext* aContext)
|
|
|
|
: nsSVGForeignObjectFrameBase(aContext),
|
2011-10-17 18:59:28 +04:00
|
|
|
mInReflow(false)
|
2001-12-12 10:59:31 +03:00
|
|
|
{
|
2012-05-17 08:05:09 +04:00
|
|
|
AddStateBits(NS_FRAME_REFLOW_ROOT | NS_FRAME_MAY_BE_TRANSFORMED |
|
|
|
|
NS_FRAME_SVG_LAYOUT);
|
2001-12-12 10:59:31 +03:00
|
|
|
}
|
|
|
|
|
2009-01-09 19:35:24 +03:00
|
|
|
//----------------------------------------------------------------------
|
|
|
|
// nsIFrame methods
|
2008-11-05 22:25:30 +03:00
|
|
|
|
2009-01-12 22:20:59 +03:00
|
|
|
NS_QUERYFRAME_HEAD(nsSVGForeignObjectFrame)
|
|
|
|
NS_QUERYFRAME_ENTRY(nsISVGChildFrame)
|
|
|
|
NS_QUERYFRAME_TAIL_INHERITING(nsSVGForeignObjectFrameBase)
|
|
|
|
|
2007-11-20 12:10:18 +03:00
|
|
|
NS_IMETHODIMP
|
|
|
|
nsSVGForeignObjectFrame::Init(nsIContent* aContent,
|
|
|
|
nsIFrame* aParent,
|
|
|
|
nsIFrame* aPrevInFlow)
|
|
|
|
{
|
2013-01-08 07:22:41 +04:00
|
|
|
NS_ASSERTION(aContent->IsSVG(nsGkAtoms::foreignObject),
|
|
|
|
"Content is not an SVG foreignObject!");
|
2009-01-19 21:31:34 +03:00
|
|
|
|
2007-11-20 12:10:18 +03:00
|
|
|
nsresult rv = nsSVGForeignObjectFrameBase::Init(aContent, aParent, aPrevInFlow);
|
2011-04-20 13:16:01 +04:00
|
|
|
AddStateBits(aParent->GetStateBits() &
|
2012-03-20 16:15:53 +04:00
|
|
|
(NS_STATE_SVG_NONDISPLAY_CHILD | NS_STATE_SVG_CLIPPATH_CHILD));
|
2012-04-17 02:32:12 +04:00
|
|
|
AddStateBits(NS_FRAME_FONT_INFLATION_CONTAINER |
|
|
|
|
NS_FRAME_FONT_INFLATION_FLOW_ROOT);
|
2012-07-17 21:03:51 +04:00
|
|
|
if (NS_SUCCEEDED(rv) &&
|
|
|
|
!(mState & NS_STATE_SVG_NONDISPLAY_CHILD)) {
|
|
|
|
nsSVGUtils::GetOuterSVGFrame(this)->RegisterForeignObject(this);
|
|
|
|
}
|
2007-11-20 12:10:18 +03:00
|
|
|
return rv;
|
|
|
|
}
|
|
|
|
|
2012-07-17 21:03:51 +04:00
|
|
|
void nsSVGForeignObjectFrame::DestroyFrom(nsIFrame* aDestructRoot)
|
|
|
|
{
|
|
|
|
// Only unregister if we registered in the first place:
|
|
|
|
if (!(mState & NS_STATE_SVG_NONDISPLAY_CHILD)) {
|
|
|
|
nsSVGUtils::GetOuterSVGFrame(this)->UnregisterForeignObject(this);
|
|
|
|
}
|
|
|
|
nsSVGForeignObjectFrameBase::DestroyFrom(aDestructRoot);
|
|
|
|
}
|
|
|
|
|
2006-06-07 03:13:15 +04:00
|
|
|
nsIAtom *
|
|
|
|
nsSVGForeignObjectFrame::GetType() const
|
2001-12-12 10:59:31 +03:00
|
|
|
{
|
2006-12-26 20:47:52 +03:00
|
|
|
return nsGkAtoms::svgForeignObjectFrame;
|
2001-12-12 10:59:31 +03:00
|
|
|
}
|
|
|
|
|
2006-03-02 23:22:19 +03:00
|
|
|
NS_IMETHODIMP
|
2012-08-22 19:56:38 +04:00
|
|
|
nsSVGForeignObjectFrame::AttributeChanged(int32_t aNameSpaceID,
|
2007-06-22 03:01:10 +04:00
|
|
|
nsIAtom *aAttribute,
|
2012-08-22 19:56:38 +04:00
|
|
|
int32_t aModType)
|
2006-03-02 23:22:19 +03:00
|
|
|
{
|
2006-06-15 07:23:56 +04:00
|
|
|
if (aNameSpaceID == kNameSpaceID_None) {
|
|
|
|
if (aAttribute == nsGkAtoms::width ||
|
|
|
|
aAttribute == nsGkAtoms::height) {
|
2012-11-28 13:42:13 +04:00
|
|
|
nsSVGUtils::InvalidateBounds(this, false);
|
|
|
|
nsSVGUtils::ScheduleReflowSVG(this);
|
2007-11-20 12:10:18 +03:00
|
|
|
// XXXjwatt: why mark intrinsic widths dirty? can't we just use eResize?
|
2007-05-05 15:11:07 +04:00
|
|
|
RequestReflow(nsIPresShell::eStyleChange);
|
2006-06-15 07:23:56 +04:00
|
|
|
} else if (aAttribute == nsGkAtoms::x ||
|
2009-06-18 15:31:25 +04:00
|
|
|
aAttribute == nsGkAtoms::y ||
|
|
|
|
aAttribute == nsGkAtoms::transform) {
|
2007-02-13 13:12:18 +03:00
|
|
|
// make sure our cached transform matrix gets (lazily) updated
|
2012-07-30 18:20:58 +04:00
|
|
|
mCanvasTM = nullptr;
|
2012-11-28 13:42:13 +04:00
|
|
|
nsSVGUtils::InvalidateBounds(this, false);
|
|
|
|
nsSVGUtils::ScheduleReflowSVG(this);
|
2012-03-20 16:15:53 +04:00
|
|
|
} else if (aAttribute == nsGkAtoms::viewBox ||
|
|
|
|
aAttribute == nsGkAtoms::preserveAspectRatio) {
|
|
|
|
nsSVGUtils::InvalidateBounds(this);
|
2006-06-15 07:23:56 +04:00
|
|
|
}
|
|
|
|
}
|
2006-03-02 23:22:19 +03:00
|
|
|
|
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
2011-12-17 13:09:19 +04:00
|
|
|
/* virtual */ void
|
|
|
|
nsSVGForeignObjectFrame::DidSetStyleContext(nsStyleContext* aOldStyleContext)
|
|
|
|
{
|
|
|
|
nsSVGForeignObjectFrameBase::DidSetStyleContext(aOldStyleContext);
|
|
|
|
|
2011-12-29 15:59:02 +04:00
|
|
|
// No need to invalidate before first reflow - that will happen elsewhere.
|
|
|
|
// Moreover we haven't been initialised properly yet so we may not have the
|
|
|
|
// right state bits.
|
|
|
|
if (!(GetStateBits() & NS_FRAME_FIRST_REFLOW)) {
|
2012-03-20 16:15:53 +04:00
|
|
|
// XXXperf: probably only need a bounds update if 'font-size' changed and
|
|
|
|
// we have em unit width/height. Or, once we map 'transform' into style,
|
|
|
|
// if some transform property changed.
|
2012-11-28 13:42:13 +04:00
|
|
|
nsSVGUtils::InvalidateBounds(this, false);
|
|
|
|
nsSVGUtils::ScheduleReflowSVG(this);
|
2011-12-29 15:59:02 +04:00
|
|
|
}
|
2011-12-17 13:09:19 +04:00
|
|
|
}
|
|
|
|
|
2007-01-26 09:58:31 +03:00
|
|
|
NS_IMETHODIMP
|
|
|
|
nsSVGForeignObjectFrame::Reflow(nsPresContext* aPresContext,
|
|
|
|
nsHTMLReflowMetrics& aDesiredSize,
|
|
|
|
const nsHTMLReflowState& aReflowState,
|
|
|
|
nsReflowStatus& aStatus)
|
|
|
|
{
|
2012-03-20 16:15:53 +04:00
|
|
|
NS_ABORT_IF_FALSE(!(GetStateBits() & NS_STATE_SVG_NONDISPLAY_CHILD),
|
|
|
|
"Should not have been called");
|
|
|
|
|
2012-03-20 16:15:53 +04:00
|
|
|
// Only InvalidateAndScheduleBoundsUpdate marks us with NS_FRAME_IS_DIRTY,
|
|
|
|
// so if that bit is still set we still have a resize pending. If we hit
|
|
|
|
// this assertion, then we should get the presShell to skip reflow roots
|
|
|
|
// that have a dirty parent since a reflow is going to come via the
|
|
|
|
// reflow root's parent anyway.
|
|
|
|
NS_ASSERTION(!(GetStateBits() & NS_FRAME_IS_DIRTY),
|
|
|
|
"Reflowing while a resize is pending is wasteful");
|
|
|
|
|
2012-07-22 04:01:44 +04:00
|
|
|
// ReflowSVG makes sure mRect is up to date before we're called.
|
2007-06-22 03:01:10 +04:00
|
|
|
|
2007-01-26 09:58:31 +03:00
|
|
|
NS_ASSERTION(!aReflowState.parentReflowState,
|
|
|
|
"should only get reflow from being reflow root");
|
2007-01-26 10:18:55 +03:00
|
|
|
NS_ASSERTION(aReflowState.ComputedWidth() == GetSize().width &&
|
2007-08-02 22:08:05 +04:00
|
|
|
aReflowState.ComputedHeight() == GetSize().height,
|
2009-07-27 12:47:02 +04:00
|
|
|
"reflow roots should be reflowed at existing size and "
|
2007-01-26 09:58:31 +03:00
|
|
|
"svg.css should ensure we have no padding/border/margin");
|
|
|
|
|
|
|
|
DoReflow();
|
|
|
|
|
2007-01-26 10:18:55 +03:00
|
|
|
aDesiredSize.width = aReflowState.ComputedWidth();
|
2007-08-02 22:08:05 +04:00
|
|
|
aDesiredSize.height = aReflowState.ComputedHeight();
|
2010-10-07 08:25:46 +04:00
|
|
|
aDesiredSize.SetOverflowAreasToDesiredBounds();
|
2007-01-26 09:58:31 +03:00
|
|
|
aStatus = NS_FRAME_COMPLETE;
|
|
|
|
|
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
2012-07-20 22:12:29 +04:00
|
|
|
NS_IMETHODIMP
|
|
|
|
nsSVGForeignObjectFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder,
|
|
|
|
const nsRect& aDirtyRect,
|
|
|
|
const nsDisplayListSet& aLists)
|
|
|
|
{
|
|
|
|
if (!static_cast<const nsSVGElement*>(mContent)->HasValidDimensions()) {
|
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
return BuildDisplayListForNonBlockChildren(aBuilder, aDirtyRect, aLists);
|
|
|
|
}
|
|
|
|
|
|
|
|
bool
|
|
|
|
nsSVGForeignObjectFrame::IsSVGTransformed(gfxMatrix *aOwnTransform,
|
|
|
|
gfxMatrix *aFromParentTransform) const
|
|
|
|
{
|
|
|
|
bool foundTransform = false;
|
|
|
|
|
|
|
|
// Check if our parent has children-only transforms:
|
|
|
|
nsIFrame *parent = GetParent();
|
|
|
|
if (parent &&
|
|
|
|
parent->IsFrameOfType(nsIFrame::eSVG | nsIFrame::eSVGContainer)) {
|
|
|
|
foundTransform = static_cast<nsSVGContainerFrame*>(parent)->
|
|
|
|
HasChildrenOnlyTransform(aFromParentTransform);
|
|
|
|
}
|
|
|
|
|
|
|
|
nsSVGElement *content = static_cast<nsSVGElement*>(mContent);
|
|
|
|
if (content->GetAnimatedTransformList()) {
|
|
|
|
if (aOwnTransform) {
|
|
|
|
*aOwnTransform = content->PrependLocalTransformsTo(gfxMatrix(),
|
|
|
|
nsSVGElement::eUserSpaceToParent);
|
|
|
|
}
|
|
|
|
foundTransform = true;
|
|
|
|
}
|
|
|
|
return foundTransform;
|
|
|
|
}
|
|
|
|
|
2012-07-04 04:24:55 +04:00
|
|
|
|
2006-02-21 03:33:27 +03:00
|
|
|
/**
|
2009-06-18 15:31:25 +04:00
|
|
|
* Returns the app unit canvas bounds of a userspace rect.
|
|
|
|
*
|
|
|
|
* @param aToCanvas Transform from userspace to canvas device space.
|
2006-02-21 03:33:27 +03:00
|
|
|
*/
|
2007-06-22 03:01:10 +04:00
|
|
|
static nsRect
|
2009-06-18 15:31:25 +04:00
|
|
|
ToCanvasBounds(const gfxRect &aUserspaceRect,
|
|
|
|
const gfxMatrix &aToCanvas,
|
|
|
|
const nsPresContext *presContext)
|
2006-02-21 03:33:27 +03:00
|
|
|
{
|
2009-06-18 15:31:25 +04:00
|
|
|
return nsLayoutUtils::RoundGfxRectToAppRect(
|
|
|
|
aToCanvas.TransformBounds(aUserspaceRect),
|
|
|
|
presContext->AppUnitsPerDevPixel());
|
2006-02-21 03:33:27 +03:00
|
|
|
}
|
|
|
|
|
2001-12-12 10:59:31 +03:00
|
|
|
NS_IMETHODIMP
|
2012-03-02 12:28:59 +04:00
|
|
|
nsSVGForeignObjectFrame::PaintSVG(nsRenderingContext *aContext,
|
2008-10-20 12:42:03 +04:00
|
|
|
const nsIntRect *aDirtyRect)
|
2001-12-12 10:59:31 +03:00
|
|
|
{
|
2012-07-20 22:12:29 +04:00
|
|
|
NS_ASSERTION(!NS_SVGDisplayListPaintingEnabled() ||
|
|
|
|
(mState & NS_STATE_SVG_NONDISPLAY_CHILD),
|
|
|
|
"If display lists are enabled, only painting of non-display "
|
|
|
|
"SVG should take this code path");
|
|
|
|
|
2007-06-25 12:31:31 +04:00
|
|
|
if (IsDisabled())
|
|
|
|
return NS_OK;
|
|
|
|
|
2011-08-25 00:54:30 +04:00
|
|
|
nsIFrame* kid = GetFirstPrincipalChild();
|
2006-06-07 03:13:15 +04:00
|
|
|
if (!kid)
|
|
|
|
return NS_OK;
|
2006-03-21 18:49:20 +03:00
|
|
|
|
2012-06-30 15:20:46 +04:00
|
|
|
gfxMatrix canvasTM = GetCanvasTM(FOR_PAINTING);
|
2007-01-02 16:15:06 +03:00
|
|
|
|
2012-06-30 15:20:46 +04:00
|
|
|
if (canvasTM.IsSingular()) {
|
Landing of SVG_20020806_BRANCH, Bug 182533. Refactoring of SVG backend, new GDI+ and Libart rendering
backends, text support on Windows (GDI+), rudimentary text support on Linux (libart/freetype2), presentation
attributes, lots of bug fixes (see bug 182533 for dependency list).
Not part of default build; code is #ifdef'ed out.
r=sicking, sr=jst for dom and htmlparser changes
r=bsmedberg, sr=tor for config changes
r=dbaron, sr=bzbarsky for content and layout changes
r=tor, sr=bzbarsky for gfx changes
2004-02-07 15:39:26 +03:00
|
|
|
NS_WARNING("Can't render foreignObject element!");
|
|
|
|
return NS_ERROR_FAILURE;
|
|
|
|
}
|
2006-11-27 20:30:57 +03:00
|
|
|
|
2012-02-10 16:33:46 +04:00
|
|
|
nsRect kidDirtyRect = kid->GetVisualOverflowRect();
|
|
|
|
|
2008-12-06 18:22:01 +03:00
|
|
|
/* Check if we need to draw anything. */
|
2012-01-01 19:47:27 +04:00
|
|
|
if (aDirtyRect) {
|
2012-07-20 22:12:29 +04:00
|
|
|
NS_ASSERTION(!NS_SVGDisplayListPaintingEnabled() ||
|
|
|
|
(mState & NS_STATE_SVG_NONDISPLAY_CHILD),
|
|
|
|
"Display lists handle dirty rect intersection test");
|
2012-02-10 16:33:46 +04:00
|
|
|
// Transform the dirty rect into app units in our userspace.
|
2012-06-30 15:20:46 +04:00
|
|
|
gfxMatrix invmatrix = canvasTM;
|
2012-02-10 16:33:46 +04:00
|
|
|
invmatrix.Invert();
|
|
|
|
NS_ASSERTION(!invmatrix.IsSingular(),
|
|
|
|
"inverse of non-singular matrix should be non-singular");
|
|
|
|
|
|
|
|
gfxRect transDirtyRect = gfxRect(aDirtyRect->x, aDirtyRect->y,
|
|
|
|
aDirtyRect->width, aDirtyRect->height);
|
|
|
|
transDirtyRect = invmatrix.TransformBounds(transDirtyRect);
|
|
|
|
|
|
|
|
kidDirtyRect.IntersectRect(kidDirtyRect,
|
|
|
|
nsLayoutUtils::RoundGfxRectToAppRect(transDirtyRect,
|
|
|
|
PresContext()->AppUnitsPerCSSPixel()));
|
|
|
|
|
|
|
|
// XXX after bug 614732 is fixed, we will compare mRect with aDirtyRect,
|
|
|
|
// not with kidDirtyRect. I.e.
|
2012-08-22 19:56:38 +04:00
|
|
|
// int32_t appUnitsPerDevPx = PresContext()->AppUnitsPerDevPixel();
|
2012-02-10 16:33:46 +04:00
|
|
|
// mRect.ToOutsidePixels(appUnitsPerDevPx).Intersects(*aDirtyRect)
|
|
|
|
if (kidDirtyRect.IsEmpty())
|
2012-01-01 19:47:27 +04:00
|
|
|
return NS_OK;
|
|
|
|
}
|
2008-12-06 18:22:01 +03:00
|
|
|
|
2012-03-02 12:28:59 +04:00
|
|
|
gfxContext *gfx = aContext->ThebesContext();
|
2006-11-27 20:30:57 +03:00
|
|
|
|
|
|
|
gfx->Save();
|
2007-04-30 13:02:38 +04:00
|
|
|
|
|
|
|
if (GetStyleDisplay()->IsScrollableOverflow()) {
|
2007-05-23 12:39:00 +04:00
|
|
|
float x, y, width, height;
|
2007-07-08 11:08:04 +04:00
|
|
|
static_cast<nsSVGElement*>(mContent)->
|
2012-07-30 18:20:58 +04:00
|
|
|
GetAnimatedLengthValues(&x, &y, &width, &height, nullptr);
|
2007-04-30 13:02:38 +04:00
|
|
|
|
2009-06-18 00:51:40 +04:00
|
|
|
gfxRect clipRect =
|
2009-06-18 15:31:25 +04:00
|
|
|
nsSVGUtils::GetClipRectForFrame(this, 0.0f, 0.0f, width, height);
|
2012-06-30 15:20:46 +04:00
|
|
|
nsSVGUtils::SetClipRect(gfx, canvasTM, clipRect);
|
2007-04-30 13:02:38 +04:00
|
|
|
}
|
|
|
|
|
2012-06-30 15:20:46 +04:00
|
|
|
// SVG paints in CSS px, but normally frames paint in dev pixels. Here we
|
|
|
|
// multiply a CSS-px-to-dev-pixel factor onto canvasTM so our children paint
|
|
|
|
// correctly.
|
|
|
|
float cssPxPerDevPx = PresContext()->
|
|
|
|
AppUnitsToFloatCSSPixels(PresContext()->AppUnitsPerDevPixel());
|
|
|
|
gfxMatrix canvasTMForChildren = canvasTM;
|
|
|
|
canvasTMForChildren.Scale(cssPxPerDevPx, cssPxPerDevPx);
|
|
|
|
|
|
|
|
gfx->Multiply(canvasTMForChildren);
|
2006-11-27 20:30:57 +03:00
|
|
|
|
2012-08-22 19:56:38 +04:00
|
|
|
uint32_t flags = nsLayoutUtils::PAINT_IN_TRANSFORM;
|
2012-03-02 12:28:59 +04:00
|
|
|
if (SVGAutoRenderState::IsPaintingToWindow(aContext)) {
|
2010-10-15 05:03:45 +04:00
|
|
|
flags |= nsLayoutUtils::PAINT_TO_WINDOW;
|
|
|
|
}
|
2012-03-02 12:28:59 +04:00
|
|
|
nsresult rv = nsLayoutUtils::PaintFrame(aContext, kid, nsRegion(kidDirtyRect),
|
2010-10-15 05:03:45 +04:00
|
|
|
NS_RGBA(0,0,0,0), flags);
|
2006-11-27 20:30:57 +03:00
|
|
|
|
|
|
|
gfx->Restore();
|
|
|
|
|
2006-01-26 05:29:17 +03:00
|
|
|
return rv;
|
2001-12-12 10:59:31 +03:00
|
|
|
}
|
|
|
|
|
2008-08-25 13:23:54 +04:00
|
|
|
NS_IMETHODIMP_(nsIFrame*)
|
|
|
|
nsSVGForeignObjectFrame::GetFrameForPoint(const nsPoint &aPoint)
|
2001-12-12 10:59:31 +03:00
|
|
|
{
|
2012-07-20 22:12:29 +04:00
|
|
|
NS_ASSERTION(!NS_SVGDisplayListHitTestingEnabled() ||
|
|
|
|
(mState & NS_STATE_SVG_NONDISPLAY_CHILD),
|
|
|
|
"If display lists are enabled, only hit-testing of a "
|
|
|
|
"clipPath's contents should take this code path");
|
|
|
|
|
2009-06-18 15:31:25 +04:00
|
|
|
if (IsDisabled() || (GetStateBits() & NS_STATE_SVG_NONDISPLAY_CHILD))
|
2012-07-30 18:20:58 +04:00
|
|
|
return nullptr;
|
2007-06-25 12:31:31 +04:00
|
|
|
|
2011-08-25 00:54:30 +04:00
|
|
|
nsIFrame* kid = GetFirstPrincipalChild();
|
2009-06-18 15:31:25 +04:00
|
|
|
if (!kid)
|
2012-07-30 18:20:58 +04:00
|
|
|
return nullptr;
|
2009-06-18 15:31:25 +04:00
|
|
|
|
|
|
|
float x, y, width, height;
|
|
|
|
static_cast<nsSVGElement*>(mContent)->
|
2012-07-30 18:20:58 +04:00
|
|
|
GetAnimatedLengthValues(&x, &y, &width, &height, nullptr);
|
2009-06-18 15:31:25 +04:00
|
|
|
|
2012-06-30 15:20:46 +04:00
|
|
|
gfxMatrix tm = GetCanvasTM(FOR_HIT_TESTING).Invert();
|
2009-06-18 15:31:25 +04:00
|
|
|
if (tm.IsSingular())
|
2012-07-30 18:20:58 +04:00
|
|
|
return nullptr;
|
2009-06-18 15:31:25 +04:00
|
|
|
|
|
|
|
// Convert aPoint from app units in canvas space to user space:
|
2001-12-12 10:59:31 +03:00
|
|
|
|
2009-06-18 15:31:25 +04:00
|
|
|
gfxPoint pt = gfxPoint(aPoint.x, aPoint.y) / PresContext()->AppUnitsPerDevPixel();
|
|
|
|
pt = tm.Transform(pt);
|
|
|
|
|
|
|
|
if (!gfxRect(0.0f, 0.0f, width, height).Contains(pt))
|
2012-07-30 18:20:58 +04:00
|
|
|
return nullptr;
|
2009-06-18 15:31:25 +04:00
|
|
|
|
|
|
|
// Convert pt to app units in *local* space:
|
|
|
|
|
|
|
|
pt = pt * nsPresContext::AppUnitsPerCSSPixel();
|
|
|
|
nsPoint point = nsPoint(NSToIntRound(pt.x), NSToIntRound(pt.y));
|
|
|
|
|
2010-07-15 12:10:59 +04:00
|
|
|
nsIFrame *frame = nsLayoutUtils::GetFrameForPoint(kid, point);
|
|
|
|
if (frame && nsSVGUtils::HitTestClip(this, aPoint))
|
|
|
|
return frame;
|
|
|
|
|
2012-07-30 18:20:58 +04:00
|
|
|
return nullptr;
|
2006-02-21 03:33:27 +03:00
|
|
|
}
|
|
|
|
|
2006-06-09 22:08:33 +04:00
|
|
|
NS_IMETHODIMP_(nsRect)
|
Landing of SVG_20020806_BRANCH, Bug 182533. Refactoring of SVG backend, new GDI+ and Libart rendering
backends, text support on Windows (GDI+), rudimentary text support on Linux (libart/freetype2), presentation
attributes, lots of bug fixes (see bug 182533 for dependency list).
Not part of default build; code is #ifdef'ed out.
r=sicking, sr=jst for dom and htmlparser changes
r=bsmedberg, sr=tor for config changes
r=dbaron, sr=bzbarsky for content and layout changes
r=tor, sr=bzbarsky for gfx changes
2004-02-07 15:39:26 +03:00
|
|
|
nsSVGForeignObjectFrame::GetCoveredRegion()
|
|
|
|
{
|
2012-07-23 15:00:40 +04:00
|
|
|
float x, y, w, h;
|
2013-01-06 10:25:55 +04:00
|
|
|
static_cast<SVGForeignObjectElement*>(mContent)->
|
2012-07-30 18:20:58 +04:00
|
|
|
GetAnimatedLengthValues(&x, &y, &w, &h, nullptr);
|
2012-07-23 15:00:40 +04:00
|
|
|
if (w < 0.0f) w = 0.0f;
|
|
|
|
if (h < 0.0f) h = 0.0f;
|
|
|
|
// GetCanvasTM includes the x,y translation
|
|
|
|
return ToCanvasBounds(gfxRect(0.0, 0.0, w, h), GetCanvasTM(FOR_OUTERSVG_TM),
|
|
|
|
PresContext());
|
2006-06-09 22:08:33 +04:00
|
|
|
}
|
|
|
|
|
2012-03-20 16:15:53 +04:00
|
|
|
void
|
2012-07-22 04:01:44 +04:00
|
|
|
nsSVGForeignObjectFrame::ReflowSVG()
|
2006-06-09 22:08:33 +04:00
|
|
|
{
|
2012-07-22 04:01:44 +04:00
|
|
|
NS_ASSERTION(nsSVGUtils::OuterSVGIsCallingReflowSVG(this),
|
|
|
|
"This call is probably a wasteful mistake");
|
2012-03-20 16:15:53 +04:00
|
|
|
|
|
|
|
NS_ABORT_IF_FALSE(!(GetStateBits() & NS_STATE_SVG_NONDISPLAY_CHILD),
|
2012-07-22 04:01:44 +04:00
|
|
|
"ReflowSVG mechanism not designed for this");
|
2012-03-20 16:15:53 +04:00
|
|
|
|
2012-07-22 04:01:44 +04:00
|
|
|
if (!nsSVGUtils::NeedsReflowSVG(this)) {
|
2012-03-20 16:15:53 +04:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
// We update mRect before the DoReflow call so that DoReflow uses the
|
|
|
|
// correct dimensions:
|
2007-01-16 14:12:08 +03:00
|
|
|
|
2007-06-22 03:01:10 +04:00
|
|
|
float x, y, w, h;
|
2013-01-06 10:25:55 +04:00
|
|
|
static_cast<SVGForeignObjectElement*>(mContent)->
|
2012-07-30 18:20:58 +04:00
|
|
|
GetAnimatedLengthValues(&x, &y, &w, &h, nullptr);
|
2006-06-09 22:08:33 +04:00
|
|
|
|
2007-06-25 12:31:31 +04:00
|
|
|
// If mRect's width or height are negative, reflow blows up! We must clamp!
|
|
|
|
if (w < 0.0f) w = 0.0f;
|
|
|
|
if (h < 0.0f) h = 0.0f;
|
|
|
|
|
2012-02-10 16:33:46 +04:00
|
|
|
mRect = nsLayoutUtils::RoundGfxRectToAppRect(
|
2012-05-16 14:04:31 +04:00
|
|
|
gfxRect(x, y, w, h),
|
2012-02-17 10:07:51 +04:00
|
|
|
PresContext()->AppUnitsPerCSSPixel());
|
2012-02-10 16:33:46 +04:00
|
|
|
|
2012-03-20 16:15:53 +04:00
|
|
|
// Fully mark our kid dirty so that it gets resized if necessary
|
|
|
|
// (NS_FRAME_HAS_DIRTY_CHILDREN isn't enough in that case):
|
|
|
|
nsIFrame* kid = GetFirstPrincipalChild();
|
|
|
|
kid->AddStateBits(NS_FRAME_IS_DIRTY);
|
2009-04-22 03:53:52 +04:00
|
|
|
|
2012-03-20 16:15:53 +04:00
|
|
|
// Make sure to not allow interrupts if we're not being reflown as a root:
|
2009-04-22 03:53:52 +04:00
|
|
|
nsPresContext::InterruptPreventer noInterrupts(PresContext());
|
2012-03-20 16:15:53 +04:00
|
|
|
|
2006-06-15 07:23:56 +04:00
|
|
|
DoReflow();
|
Bug 300030: Move intrinsic width computation out of nsIFrame::Reflow and into its own methods on nsIFrame. Replace reflow reasons, types, and commands with dirty bits/notifications. Thanks to bzbarsky for almost all of the HTML form controls (mozilla/layout/forms) changes, and many others for help testing and patching. For detailed commit logs, see REFLOW_YYYYMMDD_BRANCH, where YYYYMMDD is one of 20061031, 20060830, 20060603, 20060302, 20060119, 20051011, 20050804, 20050429, 20050315, 20050111, and 20041213.
2006-12-08 08:38:33 +03:00
|
|
|
|
2012-05-17 08:05:09 +04:00
|
|
|
if (mState & NS_FRAME_FIRST_REFLOW) {
|
|
|
|
// Make sure we have our filter property (if any) before calling
|
|
|
|
// FinishAndStoreOverflow (subsequent filter changes are handled off
|
|
|
|
// nsChangeHint_UpdateEffects):
|
|
|
|
nsSVGEffects::UpdateEffects(this);
|
|
|
|
}
|
|
|
|
|
|
|
|
// TODO: once we support |overflow:visible| on foreignObject, then we will
|
|
|
|
// need to take account of our descendants here.
|
|
|
|
nsRect overflow = nsRect(nsPoint(0,0), mRect.Size());
|
|
|
|
nsOverflowAreas overflowAreas(overflow, overflow);
|
|
|
|
FinishAndStoreOverflow(overflowAreas, mRect.Size());
|
|
|
|
|
2012-03-20 16:15:53 +04:00
|
|
|
// Now unset the various reflow bits:
|
Bug 300030: Move intrinsic width computation out of nsIFrame::Reflow and into its own methods on nsIFrame. Replace reflow reasons, types, and commands with dirty bits/notifications. Thanks to bzbarsky for almost all of the HTML form controls (mozilla/layout/forms) changes, and many others for help testing and patching. For detailed commit logs, see REFLOW_YYYYMMDD_BRANCH, where YYYYMMDD is one of 20061031, 20060830, 20060603, 20060302, 20060119, 20051011, 20050804, 20050429, 20050315, 20050111, and 20041213.
2006-12-08 08:38:33 +03:00
|
|
|
mState &= ~(NS_FRAME_FIRST_REFLOW | NS_FRAME_IS_DIRTY |
|
|
|
|
NS_FRAME_HAS_DIRTY_CHILDREN);
|
Landing of SVG_20020806_BRANCH, Bug 182533. Refactoring of SVG backend, new GDI+ and Libart rendering
backends, text support on Windows (GDI+), rudimentary text support on Linux (libart/freetype2), presentation
attributes, lots of bug fixes (see bug 182533 for dependency list).
Not part of default build; code is #ifdef'ed out.
r=sicking, sr=jst for dom and htmlparser changes
r=bsmedberg, sr=tor for config changes
r=dbaron, sr=bzbarsky for content and layout changes
r=tor, sr=bzbarsky for gfx changes
2004-02-07 15:39:26 +03:00
|
|
|
}
|
|
|
|
|
2008-01-25 12:27:03 +03:00
|
|
|
void
|
2012-08-22 19:56:38 +04:00
|
|
|
nsSVGForeignObjectFrame::NotifySVGChanged(uint32_t aFlags)
|
2001-12-12 10:59:31 +03:00
|
|
|
{
|
2012-03-11 19:53:36 +04:00
|
|
|
NS_ABORT_IF_FALSE(aFlags & (TRANSFORM_CHANGED | COORD_CONTEXT_CHANGED),
|
|
|
|
"Invalidation logic may need adjusting");
|
|
|
|
|
2012-03-20 16:15:53 +04:00
|
|
|
bool needNewBounds = false; // i.e. mRect or visual overflow rect
|
|
|
|
bool needReflow = false;
|
|
|
|
bool needNewCanvasTM = false;
|
2008-01-25 12:27:03 +03:00
|
|
|
|
2012-03-20 16:15:53 +04:00
|
|
|
if (aFlags & COORD_CONTEXT_CHANGED) {
|
2013-01-06 10:25:55 +04:00
|
|
|
SVGForeignObjectElement *fO =
|
|
|
|
static_cast<SVGForeignObjectElement*>(mContent);
|
2012-02-01 20:25:44 +04:00
|
|
|
// Coordinate context changes affect mCanvasTM if we have a
|
|
|
|
// percentage 'x' or 'y'
|
2013-01-06 10:25:55 +04:00
|
|
|
if (fO->mLengthAttributes[SVGForeignObjectElement::ATTR_X].IsPercentage() ||
|
|
|
|
fO->mLengthAttributes[SVGForeignObjectElement::ATTR_Y].IsPercentage()) {
|
2012-03-20 16:15:53 +04:00
|
|
|
needNewBounds = true;
|
|
|
|
needNewCanvasTM = true;
|
2012-02-01 20:25:44 +04:00
|
|
|
}
|
|
|
|
// Our coordinate context's width/height has changed. If we have a
|
|
|
|
// percentage width/height our dimensions will change so we must reflow.
|
2013-01-06 10:25:55 +04:00
|
|
|
if (fO->mLengthAttributes[SVGForeignObjectElement::ATTR_WIDTH].IsPercentage() ||
|
|
|
|
fO->mLengthAttributes[SVGForeignObjectElement::ATTR_HEIGHT].IsPercentage()) {
|
2012-03-20 16:15:53 +04:00
|
|
|
needNewBounds = true;
|
|
|
|
needReflow = true;
|
2008-01-25 12:27:03 +03:00
|
|
|
}
|
2007-11-20 12:10:18 +03:00
|
|
|
}
|
|
|
|
|
2012-03-20 16:15:53 +04:00
|
|
|
if (aFlags & TRANSFORM_CHANGED) {
|
2012-06-23 20:36:46 +04:00
|
|
|
if (mCanvasTM && mCanvasTM->IsSingular()) {
|
|
|
|
needNewBounds = true; // old bounds are bogus
|
|
|
|
}
|
2012-03-20 16:15:53 +04:00
|
|
|
needNewCanvasTM = true;
|
|
|
|
// In an ideal world we would reflow when our CTM changes. This is because
|
|
|
|
// glyph metrics do not necessarily scale uniformly with change in scale
|
|
|
|
// and, as a result, CTM changes may require text to break at different
|
|
|
|
// points. The problem would be how to keep performance acceptable when
|
|
|
|
// e.g. the transform of an ancestor is animated.
|
|
|
|
// We also seem to get some sort of infinite loop post bug 421584 if we
|
|
|
|
// reflow.
|
|
|
|
}
|
|
|
|
|
2012-06-23 20:36:46 +04:00
|
|
|
if (needNewBounds) {
|
|
|
|
// Ancestor changes can't affect how we render from the perspective of
|
|
|
|
// any rendering observers that we may have, so we don't need to
|
|
|
|
// invalidate them. We also don't need to invalidate ourself, since our
|
|
|
|
// changed ancestor will have invalidated its entire area, which includes
|
|
|
|
// our area.
|
2012-07-22 04:01:44 +04:00
|
|
|
nsSVGUtils::ScheduleReflowSVG(this);
|
2012-03-20 16:15:53 +04:00
|
|
|
}
|
|
|
|
|
|
|
|
// If we're called while the PresShell is handling reflow events then we
|
|
|
|
// must have been called as a result of the NotifyViewportChange() call in
|
|
|
|
// our nsSVGOuterSVGFrame's Reflow() method. We must not call RequestReflow
|
|
|
|
// at this point (i.e. during reflow) because it could confuse the
|
|
|
|
// PresShell and prevent it from reflowing us properly in future. Besides
|
|
|
|
// that, nsSVGOuterSVGFrame::DidReflow will take care of reflowing us
|
|
|
|
// synchronously, so there's no need.
|
|
|
|
if (needReflow && !PresContext()->PresShell()->IsReflowLocked()) {
|
|
|
|
RequestReflow(nsIPresShell::eResize);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (needNewCanvasTM) {
|
|
|
|
// Do this after calling InvalidateAndScheduleBoundsUpdate in case we
|
|
|
|
// change the code and it needs to use it.
|
2012-07-30 18:20:58 +04:00
|
|
|
mCanvasTM = nullptr;
|
2008-01-25 12:27:03 +03:00
|
|
|
}
|
2001-12-12 10:59:31 +03:00
|
|
|
}
|
|
|
|
|
2012-04-16 12:23:48 +04:00
|
|
|
SVGBBox
|
2011-09-30 13:25:37 +04:00
|
|
|
nsSVGForeignObjectFrame::GetBBoxContribution(const gfxMatrix &aToBBoxUserspace,
|
2012-08-22 19:56:38 +04:00
|
|
|
uint32_t aFlags)
|
2006-02-21 03:33:27 +03:00
|
|
|
{
|
2013-01-06 10:25:55 +04:00
|
|
|
SVGForeignObjectElement *content =
|
|
|
|
static_cast<SVGForeignObjectElement*>(mContent);
|
2007-01-16 14:12:08 +03:00
|
|
|
|
2006-02-21 03:33:27 +03:00
|
|
|
float x, y, w, h;
|
2012-07-30 18:20:58 +04:00
|
|
|
content->GetAnimatedLengthValues(&x, &y, &w, &h, nullptr);
|
2007-06-22 03:01:10 +04:00
|
|
|
|
2007-06-25 12:31:31 +04:00
|
|
|
if (w < 0.0f) w = 0.0f;
|
|
|
|
if (h < 0.0f) h = 0.0f;
|
|
|
|
|
2009-04-29 08:31:34 +04:00
|
|
|
if (aToBBoxUserspace.IsSingular()) {
|
|
|
|
// XXX ReportToConsole
|
2012-04-16 12:23:48 +04:00
|
|
|
return SVGBBox();
|
2009-04-29 08:31:34 +04:00
|
|
|
}
|
2009-06-18 15:31:25 +04:00
|
|
|
return aToBBoxUserspace.TransformBounds(gfxRect(0.0, 0.0, w, h));
|
Landing of SVG_20020806_BRANCH, Bug 182533. Refactoring of SVG backend, new GDI+ and Libart rendering
backends, text support on Windows (GDI+), rudimentary text support on Linux (libart/freetype2), presentation
attributes, lots of bug fixes (see bug 182533 for dependency list).
Not part of default build; code is #ifdef'ed out.
r=sicking, sr=jst for dom and htmlparser changes
r=bsmedberg, sr=tor for config changes
r=dbaron, sr=bzbarsky for content and layout changes
r=tor, sr=bzbarsky for gfx changes
2004-02-07 15:39:26 +03:00
|
|
|
}
|
2001-12-12 10:59:31 +03:00
|
|
|
|
Landing of SVG_20020806_BRANCH, Bug 182533. Refactoring of SVG backend, new GDI+ and Libart rendering
backends, text support on Windows (GDI+), rudimentary text support on Linux (libart/freetype2), presentation
attributes, lots of bug fixes (see bug 182533 for dependency list).
Not part of default build; code is #ifdef'ed out.
r=sicking, sr=jst for dom and htmlparser changes
r=bsmedberg, sr=tor for config changes
r=dbaron, sr=bzbarsky for content and layout changes
r=tor, sr=bzbarsky for gfx changes
2004-02-07 15:39:26 +03:00
|
|
|
//----------------------------------------------------------------------
|
|
|
|
|
2009-04-29 08:31:34 +04:00
|
|
|
gfxMatrix
|
2012-08-22 19:56:38 +04:00
|
|
|
nsSVGForeignObjectFrame::GetCanvasTM(uint32_t aFor)
|
2004-08-05 13:01:13 +04:00
|
|
|
{
|
2012-06-30 15:20:46 +04:00
|
|
|
if (!(GetStateBits() & NS_STATE_SVG_NONDISPLAY_CHILD)) {
|
|
|
|
if ((aFor == FOR_PAINTING && NS_SVGDisplayListPaintingEnabled()) ||
|
|
|
|
(aFor == FOR_HIT_TESTING && NS_SVGDisplayListHitTestingEnabled())) {
|
|
|
|
return nsSVGIntegrationUtils::GetCSSPxToDevPxMatrix(this);
|
|
|
|
}
|
|
|
|
}
|
2004-08-05 13:01:13 +04:00
|
|
|
if (!mCanvasTM) {
|
|
|
|
NS_ASSERTION(mParent, "null parent");
|
|
|
|
|
2009-04-29 08:31:34 +04:00
|
|
|
nsSVGContainerFrame *parent = static_cast<nsSVGContainerFrame*>(mParent);
|
2013-01-06 10:25:55 +04:00
|
|
|
SVGForeignObjectElement *content =
|
|
|
|
static_cast<SVGForeignObjectElement*>(mContent);
|
2009-04-29 08:31:34 +04:00
|
|
|
|
2012-06-30 15:20:46 +04:00
|
|
|
gfxMatrix tm = content->PrependLocalTransformsTo(parent->GetCanvasTM(aFor));
|
2009-04-29 08:31:34 +04:00
|
|
|
|
2011-09-26 01:04:32 +04:00
|
|
|
mCanvasTM = new gfxMatrix(tm);
|
2009-04-29 08:31:34 +04:00
|
|
|
}
|
2011-09-26 01:04:32 +04:00
|
|
|
return *mCanvasTM;
|
2004-08-05 13:01:13 +04:00
|
|
|
}
|
|
|
|
|
2001-12-12 10:59:31 +03:00
|
|
|
//----------------------------------------------------------------------
|
|
|
|
// Implementation helpers
|
|
|
|
|
2007-05-05 15:11:07 +04:00
|
|
|
void nsSVGForeignObjectFrame::RequestReflow(nsIPresShell::IntrinsicDirty aType)
|
2001-12-12 10:59:31 +03:00
|
|
|
{
|
2007-05-05 15:11:07 +04:00
|
|
|
if (GetStateBits() & NS_FRAME_FIRST_REFLOW)
|
2012-07-22 04:01:44 +04:00
|
|
|
// If we haven't had a ReflowSVG() yet, nothing to do.
|
2007-05-05 15:11:07 +04:00
|
|
|
return;
|
|
|
|
|
2011-08-25 00:54:30 +04:00
|
|
|
nsIFrame* kid = GetFirstPrincipalChild();
|
2006-06-15 07:23:56 +04:00
|
|
|
if (!kid)
|
|
|
|
return;
|
2007-05-05 15:11:07 +04:00
|
|
|
|
2007-05-06 23:16:51 +04:00
|
|
|
PresContext()->PresShell()->FrameNeedsReflow(kid, aType, NS_FRAME_IS_DIRTY);
|
2006-06-15 07:23:56 +04:00
|
|
|
}
|
Landing of SVG_20020806_BRANCH, Bug 182533. Refactoring of SVG backend, new GDI+ and Libart rendering
backends, text support on Windows (GDI+), rudimentary text support on Linux (libart/freetype2), presentation
attributes, lots of bug fixes (see bug 182533 for dependency list).
Not part of default build; code is #ifdef'ed out.
r=sicking, sr=jst for dom and htmlparser changes
r=bsmedberg, sr=tor for config changes
r=dbaron, sr=bzbarsky for content and layout changes
r=tor, sr=bzbarsky for gfx changes
2004-02-07 15:39:26 +03:00
|
|
|
|
2006-06-09 22:08:33 +04:00
|
|
|
void
|
Landing of SVG_20020806_BRANCH, Bug 182533. Refactoring of SVG backend, new GDI+ and Libart rendering
backends, text support on Windows (GDI+), rudimentary text support on Linux (libart/freetype2), presentation
attributes, lots of bug fixes (see bug 182533 for dependency list).
Not part of default build; code is #ifdef'ed out.
r=sicking, sr=jst for dom and htmlparser changes
r=bsmedberg, sr=tor for config changes
r=dbaron, sr=bzbarsky for content and layout changes
r=tor, sr=bzbarsky for gfx changes
2004-02-07 15:39:26 +03:00
|
|
|
nsSVGForeignObjectFrame::DoReflow()
|
2001-12-12 10:59:31 +03:00
|
|
|
{
|
2011-02-18 03:33:30 +03:00
|
|
|
// Skip reflow if we're zero-sized, unless this is our first reflow.
|
|
|
|
if (IsDisabled() &&
|
|
|
|
!(GetStateBits() & NS_FRAME_FIRST_REFLOW))
|
2007-06-25 12:31:31 +04:00
|
|
|
return;
|
|
|
|
|
2007-03-31 01:11:41 +04:00
|
|
|
nsPresContext *presContext = PresContext();
|
2011-08-25 00:54:30 +04:00
|
|
|
nsIFrame* kid = GetFirstPrincipalChild();
|
2006-06-07 03:13:15 +04:00
|
|
|
if (!kid)
|
2006-06-09 22:08:33 +04:00
|
|
|
return;
|
2001-12-12 10:59:31 +03:00
|
|
|
|
|
|
|
// initiate a synchronous reflow here and now:
|
Landing of SVG_20020806_BRANCH, Bug 182533. Refactoring of SVG backend, new GDI+ and Libart rendering
backends, text support on Windows (GDI+), rudimentary text support on Linux (libart/freetype2), presentation
attributes, lots of bug fixes (see bug 182533 for dependency list).
Not part of default build; code is #ifdef'ed out.
r=sicking, sr=jst for dom and htmlparser changes
r=bsmedberg, sr=tor for config changes
r=dbaron, sr=bzbarsky for content and layout changes
r=tor, sr=bzbarsky for gfx changes
2004-02-07 15:39:26 +03:00
|
|
|
nsIPresShell* presShell = presContext->PresShell();
|
|
|
|
NS_ASSERTION(presShell, "null presShell");
|
2011-04-08 05:04:40 +04:00
|
|
|
nsRefPtr<nsRenderingContext> renderingContext =
|
2010-08-20 23:29:01 +04:00
|
|
|
presShell->GetReferenceRenderingContext();
|
2006-06-09 22:08:33 +04:00
|
|
|
if (!renderingContext)
|
|
|
|
return;
|
2007-02-07 10:46:44 +03:00
|
|
|
|
2011-10-17 18:59:28 +04:00
|
|
|
mInReflow = true;
|
2006-06-15 07:23:56 +04:00
|
|
|
|
Bug 300030: Move intrinsic width computation out of nsIFrame::Reflow and into its own methods on nsIFrame. Replace reflow reasons, types, and commands with dirty bits/notifications. Thanks to bzbarsky for almost all of the HTML form controls (mozilla/layout/forms) changes, and many others for help testing and patching. For detailed commit logs, see REFLOW_YYYYMMDD_BRANCH, where YYYYMMDD is one of 20061031, 20060830, 20060603, 20060302, 20060119, 20051011, 20050804, 20050429, 20050315, 20050111, and 20041213.
2006-12-08 08:38:33 +03:00
|
|
|
nsHTMLReflowState reflowState(presContext, kid,
|
2007-01-25 05:01:07 +03:00
|
|
|
renderingContext,
|
2012-03-20 16:15:53 +04:00
|
|
|
nsSize(mRect.width, NS_UNCONSTRAINEDSIZE));
|
Bug 300030: Move intrinsic width computation out of nsIFrame::Reflow and into its own methods on nsIFrame. Replace reflow reasons, types, and commands with dirty bits/notifications. Thanks to bzbarsky for almost all of the HTML form controls (mozilla/layout/forms) changes, and many others for help testing and patching. For detailed commit logs, see REFLOW_YYYYMMDD_BRANCH, where YYYYMMDD is one of 20061031, 20060830, 20060603, 20060302, 20060119, 20051011, 20050804, 20050429, 20050315, 20050111, and 20041213.
2006-12-08 08:38:33 +03:00
|
|
|
nsHTMLReflowMetrics desiredSize;
|
2001-12-12 10:59:31 +03:00
|
|
|
nsReflowStatus status;
|
2007-01-25 05:01:07 +03:00
|
|
|
|
2012-03-20 16:15:53 +04:00
|
|
|
// We don't use mRect.height above because that tells the child to do
|
2007-01-25 05:01:07 +03:00
|
|
|
// page/column breaking at that height.
|
|
|
|
NS_ASSERTION(reflowState.mComputedBorderPadding == nsMargin(0, 0, 0, 0) &&
|
|
|
|
reflowState.mComputedMargin == nsMargin(0, 0, 0, 0),
|
2012-02-07 03:52:01 +04:00
|
|
|
"style system should ensure that :-moz-svg-foreign-content "
|
2007-01-25 05:01:07 +03:00
|
|
|
"does not get styled");
|
2012-03-20 16:15:53 +04:00
|
|
|
NS_ASSERTION(reflowState.ComputedWidth() == mRect.width,
|
2007-01-25 05:01:07 +03:00
|
|
|
"reflow state made child wrong size");
|
2012-03-20 16:15:53 +04:00
|
|
|
reflowState.SetComputedHeight(mRect.height);
|
|
|
|
|
2006-06-07 03:13:15 +04:00
|
|
|
ReflowChild(kid, presContext, desiredSize, reflowState, 0, 0,
|
|
|
|
NS_FRAME_NO_MOVE_FRAME, status);
|
2012-03-20 16:15:53 +04:00
|
|
|
NS_ASSERTION(mRect.width == desiredSize.width &&
|
|
|
|
mRect.height == desiredSize.height, "unexpected size");
|
2006-06-07 03:13:15 +04:00
|
|
|
FinishReflowChild(kid, presContext, &reflowState, desiredSize, 0, 0,
|
|
|
|
NS_FRAME_NO_MOVE_FRAME);
|
|
|
|
|
2011-10-17 18:59:28 +04:00
|
|
|
mInReflow = false;
|
2006-06-15 07:23:56 +04:00
|
|
|
}
|
2001-12-12 10:59:31 +03:00
|
|
|
|
2012-08-29 09:39:33 +04:00
|
|
|
nsRect
|
|
|
|
nsSVGForeignObjectFrame::GetInvalidRegion()
|
|
|
|
{
|
|
|
|
nsIFrame* kid = GetFirstPrincipalChild();
|
|
|
|
if (kid->HasInvalidFrameInSubtree()) {
|
|
|
|
gfxRect r(mRect.x, mRect.y, mRect.width, mRect.height);
|
|
|
|
r.Scale(1.0 / nsPresContext::AppUnitsPerCSSPixel());
|
|
|
|
nsRect rect = ToCanvasBounds(r, GetCanvasTM(FOR_PAINTING), PresContext());
|
|
|
|
rect = nsSVGUtils::GetPostFilterVisualOverflowRect(this, rect);
|
|
|
|
return rect;
|
|
|
|
}
|
|
|
|
return nsRect();
|
|
|
|
}
|
|
|
|
|
|
|
|
|