Bug 390193 - incorrect gradient transform inside filter. r=longsonr, sr=roc, a=vlad

This commit is contained in:
tor@cs.brown.edu 2007-08-30 11:45:06 -07:00
Родитель 3c1ab9901d
Коммит 2521c277ce
15 изменённых файлов: 64 добавлений и 3 удалений

Просмотреть файл

@ -51,7 +51,8 @@ class nsSVGRenderState;
struct nsRect;
#define NS_ISVGCHILDFRAME_IID \
{ 0x154fa60f, 0xc605, 0x49c7, { 0x88, 0xc4, 0xc5, 0xb4, 0xdc, 0x12, 0x47, 0xeb } }
{ 0x93560e72, 0x6818, 0x4218, \
{ 0xa1, 0xe9, 0xf3, 0xb9, 0x63, 0x6a, 0xff, 0xc2 } }
class nsISVGChildFrame : public nsISupports {
public:
@ -85,9 +86,10 @@ public:
NS_IMETHOD SetMatrixPropagation(PRBool aPropagate)=0;
// Set the current transformation matrix to a particular matrix.
// Value is only used if matrix propogation is prevented
// Value is only used if matrix propagation is prevented
// (SetMatrixPropagation()). nsnull aCTM means identity transform.
NS_IMETHOD SetOverrideCTM(nsIDOMSVGMatrix *aCTM)=0;
virtual already_AddRefed<nsIDOMSVGMatrix> GetOverrideCTM()=0;
// XXX move this function into interface nsISVGLocatableMetrics
NS_IMETHOD GetBBox(nsIDOMSVGRect **_retval)=0; // bbox in local coords

Просмотреть файл

@ -111,6 +111,7 @@ public:
NS_IMETHOD NotifyRedrawUnsuspended();
NS_IMETHOD SetMatrixPropagation(PRBool aPropagate) { return NS_ERROR_FAILURE; }
NS_IMETHOD SetOverrideCTM(nsIDOMSVGMatrix *aCTM) { return NS_ERROR_FAILURE; }
virtual already_AddRefed<nsIDOMSVGMatrix> GetOverrideCTM() { return nsnull; }
NS_IMETHOD GetBBox(nsIDOMSVGRect **_retval);
NS_IMETHOD_(PRBool) IsDisplayContainer() { return PR_TRUE; }
NS_IMETHOD_(PRBool) HasValidCoveredRect() { return PR_FALSE; }

Просмотреть файл

@ -425,6 +425,14 @@ nsSVGForeignObjectFrame::SetOverrideCTM(nsIDOMSVGMatrix *aCTM)
return NS_OK;
}
already_AddRefed<nsIDOMSVGMatrix>
nsSVGForeignObjectFrame::GetOverrideCTM()
{
nsIDOMSVGMatrix *matrix = mOverrideCTM.get();
NS_IF_ADDREF(matrix);
return matrix;
}
NS_IMETHODIMP
nsSVGForeignObjectFrame::GetBBox(nsIDOMSVGRect **_retval)
{

Просмотреть файл

@ -121,6 +121,7 @@ public:
NS_IMETHOD NotifyRedrawUnsuspended();
NS_IMETHOD SetMatrixPropagation(PRBool aPropagate);
NS_IMETHOD SetOverrideCTM(nsIDOMSVGMatrix *aCTM);
virtual already_AddRefed<nsIDOMSVGMatrix> GetOverrideCTM();
NS_IMETHOD GetBBox(nsIDOMSVGRect **_retval);
NS_IMETHOD_(PRBool) IsDisplayContainer() { return PR_TRUE; }
NS_IMETHOD_(PRBool) HasValidCoveredRect() { return PR_FALSE; }

Просмотреть файл

@ -92,6 +92,14 @@ nsSVGGFrame::SetOverrideCTM(nsIDOMSVGMatrix *aCTM)
return NS_OK;
}
already_AddRefed<nsIDOMSVGMatrix>
nsSVGGFrame::GetOverrideCTM()
{
nsIDOMSVGMatrix *matrix = mOverrideCTM.get();
NS_IF_ADDREF(matrix);
return matrix;
}
already_AddRefed<nsIDOMSVGMatrix>
nsSVGGFrame::GetCanvasTM()
{

Просмотреть файл

@ -76,6 +76,7 @@ public:
NS_IMETHOD NotifyCanvasTMChanged(PRBool suppressInvalidation);
NS_IMETHOD SetMatrixPropagation(PRBool aPropagate);
NS_IMETHOD SetOverrideCTM(nsIDOMSVGMatrix *aCTM);
virtual already_AddRefed<nsIDOMSVGMatrix> GetOverrideCTM();
// nsSVGContainerFrame methods:
virtual already_AddRefed<nsIDOMSVGMatrix> GetCanvasTM();

Просмотреть файл

@ -117,6 +117,7 @@ public:
NS_IMETHOD NotifyRedrawUnsuspended();
NS_IMETHOD SetMatrixPropagation(PRBool aPropagate) { return NS_OK; }
NS_IMETHOD SetOverrideCTM(nsIDOMSVGMatrix *aCTM) { return NS_ERROR_FAILURE; }
virtual already_AddRefed<nsIDOMSVGMatrix> GetOverrideCTM() { return nsnull; }
NS_IMETHOD GetBBox(nsIDOMSVGRect **_retval);
NS_IMETHOD_(PRBool) IsDisplayContainer() { return PR_FALSE; }
NS_IMETHOD_(PRBool) HasValidCoveredRect() { return PR_TRUE; }

Просмотреть файл

@ -269,10 +269,13 @@ nsSVGGradientFrame::GetGradientTransform(nsSVGGeometryFrame *aSource)
}
nsCOMPtr<nsIDOMSVGRect> rect;
if (frame) {
nsCOMPtr<nsIDOMSVGMatrix> matrix = frame->GetOverrideCTM();
frame->SetMatrixPropagation(PR_FALSE);
frame->SetOverrideCTM(nsnull);
frame->NotifyCanvasTMChanged(PR_TRUE);
frame->GetBBox(getter_AddRefs(rect));
frame->SetMatrixPropagation(PR_TRUE);
frame->SetOverrideCTM(matrix);
frame->NotifyCanvasTMChanged(PR_TRUE);
}
if (rect) {

Просмотреть файл

@ -90,6 +90,7 @@ public:
NS_IMETHOD NotifyCanvasTMChanged(PRBool suppressInvalidation);
NS_IMETHOD SetMatrixPropagation(PRBool aPropagate);
NS_IMETHOD SetOverrideCTM(nsIDOMSVGMatrix *aCTM);
virtual already_AddRefed<nsIDOMSVGMatrix> GetOverrideCTM();
NS_IMETHOD GetFrameForPointSVG(float x, float y, nsIFrame** hit);
// nsSVGContainerFrame methods:
@ -213,6 +214,14 @@ nsSVGInnerSVGFrame::SetOverrideCTM(nsIDOMSVGMatrix *aCTM)
return NS_OK;
}
already_AddRefed<nsIDOMSVGMatrix>
nsSVGInnerSVGFrame::GetOverrideCTM()
{
nsIDOMSVGMatrix *matrix = mOverrideCTM.get();
NS_IF_ADDREF(matrix);
return matrix;
}
NS_IMETHODIMP
nsSVGInnerSVGFrame::GetFrameForPointSVG(float x, float y, nsIFrame** hit)
{

Просмотреть файл

@ -496,6 +496,14 @@ nsSVGPathGeometryFrame::SetOverrideCTM(nsIDOMSVGMatrix *aCTM)
return NS_OK;
}
already_AddRefed<nsIDOMSVGMatrix>
nsSVGPathGeometryFrame::GetOverrideCTM()
{
nsIDOMSVGMatrix *matrix = mOverrideCTM.get();
NS_IF_ADDREF(matrix);
return matrix;
}
NS_IMETHODIMP
nsSVGPathGeometryFrame::GetBBox(nsIDOMSVGRect **_retval)
{

Просмотреть файл

@ -113,6 +113,7 @@ protected:
NS_IMETHOD NotifyRedrawUnsuspended();
NS_IMETHOD SetMatrixPropagation(PRBool aPropagate);
NS_IMETHOD SetOverrideCTM(nsIDOMSVGMatrix *aCTM);
virtual already_AddRefed<nsIDOMSVGMatrix> GetOverrideCTM();
NS_IMETHOD GetBBox(nsIDOMSVGRect **_retval);
NS_IMETHOD_(PRBool) IsDisplayContainer() { return PR_FALSE; }
NS_IMETHOD_(PRBool) HasValidCoveredRect() { return PR_TRUE; }

Просмотреть файл

@ -116,6 +116,14 @@ nsSVGTSpanFrame::SetOverrideCTM(nsIDOMSVGMatrix *aCTM)
return NS_OK;
}
already_AddRefed<nsIDOMSVGMatrix>
nsSVGTSpanFrame::GetOverrideCTM()
{
nsIDOMSVGMatrix *matrix = mOverrideCTM.get();
NS_IF_ADDREF(matrix);
return matrix;
}
//----------------------------------------------------------------------
// nsSVGContainerFrame methods:

Просмотреть файл

@ -83,7 +83,8 @@ public:
// nsISVGChildFrame interface:
NS_IMETHOD SetMatrixPropagation(PRBool aPropagate);
NS_IMETHOD SetOverrideCTM(nsIDOMSVGMatrix *aCTM);
virtual already_AddRefed<nsIDOMSVGMatrix> GetOverrideCTM();
// nsSVGContainerFrame methods:
virtual already_AddRefed<nsIDOMSVGMatrix> GetCanvasTM();

Просмотреть файл

@ -238,6 +238,14 @@ nsSVGTextFrame::SetOverrideCTM(nsIDOMSVGMatrix *aCTM)
return NS_OK;
}
already_AddRefed<nsIDOMSVGMatrix>
nsSVGTextFrame::GetOverrideCTM()
{
nsIDOMSVGMatrix *matrix = mOverrideCTM.get();
NS_IF_ADDREF(matrix);
return matrix;
}
NS_IMETHODIMP
nsSVGTextFrame::GetBBox(nsIDOMSVGRect **_retval)
{

Просмотреть файл

@ -80,6 +80,7 @@ public:
// nsISVGChildFrame interface:
NS_IMETHOD SetMatrixPropagation(PRBool aPropagate);
NS_IMETHOD SetOverrideCTM(nsIDOMSVGMatrix *aCTM);
virtual already_AddRefed<nsIDOMSVGMatrix> GetOverrideCTM();
NS_IMETHOD NotifyCanvasTMChanged(PRBool suppressInvalidation);
NS_IMETHOD NotifyRedrawSuspended();
NS_IMETHOD NotifyRedrawUnsuspended();