зеркало из https://github.com/mozilla/gecko-dev.git
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:
Родитель
d4320b65c4
Коммит
e7d21ca23b
|
@ -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)
|
||||||
|
|
||||||
|
|
Загрузка…
Ссылка в новой задаче