Bug 419746 - SVG crash in gfxASurface::SetDeviceOffset() via nsSVGMaskFrame::ComputeMaskAlpha(). r+sr=vladimir,a1.9=blocking1.9+

This commit is contained in:
longsonr@gmail.com 2008-03-17 10:15:43 -07:00
Родитель d17dce207c
Коммит fb8dee4003
3 изменённых файлов: 8 добавлений и 5 удалений

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

@ -346,7 +346,7 @@ nsSVGGradientFrame::SetupPaintServer(gfxContext *aContext,
patternMatrix.Invert();
nsRefPtr<gfxPattern> gradient = CreateGradient();
if (!gradient)
if (!gradient || gradient->CairoStatus())
return PR_FALSE;
PRUint16 aSpread = GetSpreadMethod();

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

@ -166,10 +166,13 @@ nsSVGMaskFrame::ComputeMaskAlpha(nsSVGRenderState *aContext,
gfx->Restore();
nsRefPtr<gfxPattern> pattern = gfx->PopGroup();
if (!pattern)
if (!pattern || pattern->CairoStatus())
return nsnull;
nsRefPtr<gfxASurface> surface = pattern->GetSurface();
if (!surface || surface->CairoStatus())
return nsnull;
surface->SetDeviceOffset(gfxPoint(0,0));
gfxRect clipExtents = gfx->GetClipExtents();
@ -210,8 +213,8 @@ nsSVGMaskFrame::ComputeMaskAlpha(nsSVGRenderState *aContext,
nsSVGUtils::UnPremultiplyImageDataAlpha(data, stride, rect);
nsSVGUtils::ConvertImageDataToLinearRGB(data, stride, rect);
for (PRUint32 y = 0; y < surfaceSize.height; y++)
for (PRUint32 x = 0; x < surfaceSize.width; x++) {
for (PRInt32 y = 0; y < surfaceSize.height; y++)
for (PRInt32 x = 0; x < surfaceSize.width; x++) {
PRUint8 *pixel = data + stride * y + 4 * x;
/* linearRGB -> intensity */

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

@ -862,7 +862,7 @@ nsSVGPatternFrame::SetupPaintServer(gfxContext *aContext,
nsRefPtr<gfxPattern> pattern = new gfxPattern(surface);
if (!pattern)
if (!pattern || pattern->CairoStatus())
return PR_FALSE;
pattern->SetMatrix(pMatrix);