Bug 317708 - cairo renderer leaks memory and uses uninitialised

variables with text in SVG.  Patch by longsonr@gmail.com, r=tor, sr=jst
This commit is contained in:
tor%cs.brown.edu 2005-12-02 19:28:38 +00:00
Родитель d4320b65c4
Коммит e7d21ca23b
1 изменённых файлов: 31 добавлений и 21 удалений

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

@ -188,7 +188,6 @@ nsSVGCairoGlyphGeometry::Render(nsISVGRendererCanvas *canvas)
return NS_OK; return NS_OK;
nsSVGCharacterPosition *cp; nsSVGCharacterPosition *cp;
mSource->GetCharacterPosition(&cp);
if (NS_FAILED(mSource->GetCharacterPosition(&cp))) if (NS_FAILED(mSource->GetCharacterPosition(&cp)))
return NS_ERROR_FAILURE; return NS_ERROR_FAILURE;
@ -229,9 +228,11 @@ nsSVGCairoGlyphGeometry::Render(nsISVGRendererCanvas *canvas)
metrics->SelectFont(ctx); metrics->SelectFont(ctx);
float x,y; float x,y;
mSource->GetX(&x); if (!cp) {
mSource->GetY(&y); mSource->GetX(&x);
cairo_move_to(ctx, x, y); mSource->GetY(&y);
cairo_move_to(ctx, x, y);
}
if (renderMode != nsISVGRendererCanvas::SVG_RENDER_MODE_NORMAL) { if (renderMode != nsISVGRendererCanvas::SVG_RENDER_MODE_NORMAL) {
PRUint16 rule; PRUint16 rule;
@ -502,10 +503,21 @@ nsSVGCairoGlyphGeometry::GetCoveredRegion(nsISVGRendererRegion **_retval)
metrics->SelectFont(ctx); metrics->SelectFont(ctx);
nsSVGCharacterPosition *cp;
if (NS_FAILED(mSource->GetCharacterPosition(&cp))) {
cairo_destroy(ctx);
return NS_ERROR_FAILURE;
}
float x,y; float x,y;
mSource->GetX(&x); if (!cp) {
mSource->GetY(&y); mSource->GetX(&x);
cairo_move_to(ctx, x, y); mSource->GetY(&y);
cairo_move_to(ctx, x, y);
} else {
x = 0.0, y = 0.0;
}
PRUint16 type; PRUint16 type;
mSource->GetFillPaintType(&type); mSource->GetFillPaintType(&type);
@ -522,16 +534,10 @@ nsSVGCairoGlyphGeometry::GetCoveredRegion(nsISVGRendererRegion **_retval)
double xx = x, yy = y; double xx = x, yy = y;
cairo_user_to_device(ctx, &xx, &yy); cairo_user_to_device(ctx, &xx, &yy);
cairo_destroy(ctx); cairo_destroy(ctx);
delete [] cp;
return NS_NewSVGCairoRectRegion(_retval, xx, yy, 0, 0); return NS_NewSVGCairoRectRegion(_retval, xx, yy, 0, 0);
} }
nsSVGCharacterPosition *cp;
if (NS_FAILED(mSource->GetCharacterPosition(&cp))) {
cairo_destroy(ctx);
return NS_ERROR_FAILURE;
}
if (!cp) { if (!cp) {
if (hasCoveredStroke) { if (hasCoveredStroke) {
cairo_text_path(ctx, NS_ConvertUCS2toUTF8(text).get()); cairo_text_path(ctx, NS_ConvertUCS2toUTF8(text).get());
@ -588,7 +594,7 @@ nsSVGCairoGlyphGeometry::GetCoveredRegion(nsISVGRendererRegion **_retval)
cairo_set_line_cap(ctx, CAIRO_LINE_CAP_SQUARE); cairo_set_line_cap(ctx, CAIRO_LINE_CAP_SQUARE);
break; break;
} }
float miterlimit; float miterlimit;
mSource->GetStrokeMiterlimit(&miterlimit); mSource->GetStrokeMiterlimit(&miterlimit);
cairo_set_miter_limit(ctx, double(miterlimit)); cairo_set_miter_limit(ctx, double(miterlimit));
@ -656,8 +662,10 @@ nsSVGCairoGlyphGeometry::ContainsPoint(float x, float y, PRBool *_retval)
} }
float xx, yy; float xx, yy;
mSource->GetX(&xx); if (!cp) {
mSource->GetY(&yy); mSource->GetX(&xx);
mSource->GetY(&yy);
}
cairo_matrix_t matrix; cairo_matrix_t matrix;
@ -756,7 +764,7 @@ nsSVGCairoGlyphGeometry::GetBoundingBox(nsIDOMSVGRect * *aBoundingBox)
return NS_OK; return NS_OK;
nsSVGCharacterPosition *cp; nsSVGCharacterPosition *cp;
mSource->GetCharacterPosition(&cp);
if (NS_FAILED(mSource->GetCharacterPosition(&cp))) if (NS_FAILED(mSource->GetCharacterPosition(&cp)))
return NS_ERROR_FAILURE; return NS_ERROR_FAILURE;
@ -786,9 +794,11 @@ nsSVGCairoGlyphGeometry::GetBoundingBox(nsIDOMSVGRect * *aBoundingBox)
metrics->SelectFont(ctx); metrics->SelectFont(ctx);
float x,y; float x,y;
mSource->GetX(&x); if (!cp) {
mSource->GetY(&y); mSource->GetX(&x);
cairo_move_to(ctx, x, y); mSource->GetY(&y);
cairo_move_to(ctx, x, y);
}
LOOP_CHARS(cairo_text_path) LOOP_CHARS(cairo_text_path)