From eecdd652d5c3dc09b2fa7eca89a89151c574602e Mon Sep 17 00:00:00 2001 From: "tor%cs.brown.edu" Date: Sat, 2 Jul 2005 23:45:33 +0000 Subject: [PATCH] Bug 298283 - fix overflow property for inner , implement for and . r=jwatt, a=asa. git-svn-id: svn://10.0.0.236/trunk@175543 18797224-902f-48f8-a5cc-f745e15eee43 --- .../layout/svg/base/src/nsSVGImageFrame.cpp | 17 ++++---- .../svg/base/src/nsSVGInnerSVGFrame.cpp | 39 ++++++++++++------- .../layout/svg/base/src/nsSVGMarkerFrame.cpp | 37 ++++++++++++++++++ 3 files changed, 71 insertions(+), 22 deletions(-) diff --git a/mozilla/layout/svg/base/src/nsSVGImageFrame.cpp b/mozilla/layout/svg/base/src/nsSVGImageFrame.cpp index 504b01b1596..bb4b3bee7d6 100644 --- a/mozilla/layout/svg/base/src/nsSVGImageFrame.cpp +++ b/mozilla/layout/svg/base/src/nsSVGImageFrame.cpp @@ -333,6 +333,8 @@ nsSVGImageFrame::PaintSVG(nsISVGRendererCanvas* canvas, const nsRect& dirtyRectT } } + canvas->PushClip(); + /* check for a clip path */ nsIURI *aURI; nsSVGClipPathFrame *clip = NULL; @@ -343,7 +345,6 @@ nsSVGImageFrame::PaintSVG(nsISVGRendererCanvas* canvas, const nsRect& dirtyRectT if (clip) { nsCOMPtr matrix; GetCanvasTM(getter_AddRefs(matrix)); - canvas->PushClip(); clip->ClipPaint(canvas, this, matrix); } } @@ -352,9 +353,15 @@ nsSVGImageFrame::PaintSVG(nsISVGRendererCanvas* canvas, const nsRect& dirtyRectT nsCOMPtr ctm; GetCanvasTM(getter_AddRefs(ctm)); - float width, height; + float x, y, width, height; + mX->GetValue(&x); + mY->GetValue(&y); mWidth->GetValue(&width); mHeight->GetValue(&height); + + if (GetStyleDisplay()->IsScrollableOverflow()) + canvas->SetClipRect(ctm, x, y, width, height); + PRUint32 nativeWidth, nativeHeight; mSurface->GetWidth(&nativeWidth); mSurface->GetHeight(&nativeHeight); @@ -429,9 +436,6 @@ nsSVGImageFrame::PaintSVG(nsISVGRendererCanvas* canvas, const nsRect& dirtyRectT else NS_NOTREACHED("Unknown value for meetOrSlice"); } - float x, y; - mX->GetValue(&x); - mY->GetValue(&y); nsCOMPtr trans; ctm->Translate(x + e, y + f, getter_AddRefs(trans)); @@ -443,8 +447,7 @@ nsSVGImageFrame::PaintSVG(nsISVGRendererCanvas* canvas, const nsRect& dirtyRectT mStyleContext->GetStyleDisplay()->mOpacity); } - if (clip) - canvas->PopClip(); + canvas->PopClip(); return NS_OK; } diff --git a/mozilla/layout/svg/base/src/nsSVGInnerSVGFrame.cpp b/mozilla/layout/svg/base/src/nsSVGInnerSVGFrame.cpp index 644cd9e1835..976ea27a4fc 100644 --- a/mozilla/layout/svg/base/src/nsSVGInnerSVGFrame.cpp +++ b/mozilla/layout/svg/base/src/nsSVGInnerSVGFrame.cpp @@ -360,23 +360,32 @@ nsSVGInnerSVGFrame::PaintSVG(nsISVGRendererCanvas* canvas, const nsRect& dirtyRe canvas->PushClip(); if (GetStyleDisplay()->IsScrollableOverflow()) { - nsCOMPtr vb; - nsCOMPtr viewBox; - nsCOMPtr svgElement = do_QueryInterface(mContent); + nsCOMPtr anim; + nsCOMPtr val; + nsCOMPtr svg = do_QueryInterface(mContent); - if (svgElement) - svgElement->GetViewBox(getter_AddRefs(viewBox)); - if (viewBox) - viewBox->GetAnimVal(getter_AddRefs(vb)); - if (vb) { - float x, y, width, height; - vb->GetX(&x); - vb->GetY(&y); - vb->GetWidth(&width); - vb->GetHeight(&height); - nsCOMPtr ctm = GetCanvasTM(); - canvas->SetClipRect(ctm, x, y, width, height); + float x, y, width, height; + mX->GetValue(&x); + mY->GetValue(&y); + svg->GetWidth(getter_AddRefs(anim)); + anim->GetAnimVal(getter_AddRefs(val)); + val->GetValue(&width); + svg->GetHeight(getter_AddRefs(anim)); + anim->GetAnimVal(getter_AddRefs(val)); + val->GetValue(&height); + + nsCOMPtr clipTransform; + if (!mPropagateTransform) { + NS_NewSVGMatrix(getter_AddRefs(clipTransform)); + } else { + nsISVGContainerFrame *parent; + CallQueryInterface(mParent, &parent); + if (parent) + clipTransform = parent->GetCanvasTM(); } + + if (clipTransform) + canvas->SetClipRect(clipTransform, x, y, width, height); } for (nsIFrame* kid = mFrames.FirstChild(); kid; diff --git a/mozilla/layout/svg/base/src/nsSVGMarkerFrame.cpp b/mozilla/layout/svg/base/src/nsSVGMarkerFrame.cpp index 3fcb61b6944..bdf074057c1 100644 --- a/mozilla/layout/svg/base/src/nsSVGMarkerFrame.cpp +++ b/mozilla/layout/svg/base/src/nsSVGMarkerFrame.cpp @@ -54,6 +54,7 @@ #include "nsIDocument.h" #include "nsSVGMarkerFrame.h" #include "nsSVGPathGeometryFrame.h" +#include "nsISVGRendererCanvas.h" NS_IMETHODIMP_(nsrefcnt) nsSVGMarkerFrame::AddRef() @@ -335,6 +336,38 @@ nsSVGMarkerFrame::PaintMark(nsISVGRendererCanvas *aCanvas, mAngle = aMark->angle; mMarkerParent = aParent; + if (GetStyleDisplay()->IsScrollableOverflow()) { + aCanvas->PushClip(); + + nsCOMPtr parentTransform, markerTransform, clipTransform; + nsCOMPtr viewTransform; + + nsISVGGeometrySource *parent; + CallQueryInterface(mMarkerParent, &parent); + if (parent) + parent->GetCanvasTM(getter_AddRefs(parentTransform)); + + nsCOMPtr element = do_QueryInterface(mContent); + element->GetMarkerTransform(mStrokeWidth, mX, mY, mAngle, + getter_AddRefs(markerTransform)); + + element->GetViewboxToViewportTransform(getter_AddRefs(viewTransform)); + + if (parentTransform && markerTransform) + parentTransform->Multiply(markerTransform, + getter_AddRefs(clipTransform)); + + if (clipTransform && viewTransform) { + float x, y, width, height; + + viewTransform->GetE(&x); + viewTransform->GetF(&y); + mMarkerWidth->GetValue(&width); + mMarkerHeight->GetValue(&height); + aCanvas->SetClipRect(clipTransform, x, y, width, height); + } + } + nsRect dirtyRectTwips; for (nsIFrame* kid = mFrames.FirstChild(); kid; kid = kid->GetNextSibling()) { @@ -345,6 +378,10 @@ nsSVGMarkerFrame::PaintMark(nsISVGRendererCanvas *aCanvas, SVGFrame->PaintSVG(aCanvas, dirtyRectTwips); } } + + if (GetStyleDisplay()->IsScrollableOverflow()) + aCanvas->PopClip(); + mMarkerParent = nsnull; mInUse = PR_FALSE; }