Bug 1073974, part 2 - Make complex SVG clipPath clipping use a Moz2D Path object directly. r=longsonr

This commit is contained in:
Jonathan Watt 2014-09-29 14:15:19 +01:00
Родитель 537966729a
Коммит f43374ef3d
1 изменённых файлов: 21 добавлений и 7 удалений

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

@ -627,18 +627,32 @@ nsSVGPathGeometryFrame::Render(nsRenderingContext *aContext,
}
if (renderMode == SVGAutoRenderState::CLIP_MASK) {
gfxContextMatrixAutoSaveRestore autoSaveRestore(gfx);
FillRule newFillRule = nsSVGUtils::ToFillRule(StyleSVG()->mClipRule);
RefPtr<PathBuilder> builder =
aContext->GetDrawTarget()->CreatePathBuilder(newFillRule);
if (!builder) {
return;
}
GeneratePath(gfx, ToMatrix(aTransform));
RefPtr<Path> path =
static_cast<nsSVGPathGeometryElement*>(mContent)->BuildPath(builder);
if (!path) {
return;
}
gfxMatrix newMatrix =
gfx->CurrentMatrix().PreMultiply(aTransform).NudgeToIntegers();
if (newMatrix.IsSingular()) {
return;
}
gfxContextMatrixAutoSaveRestore autoSaveRestore(gfx);
gfx->SetMatrix(newMatrix);
FillRule oldFillRule = gfx->CurrentFillRule();
if (StyleSVG()->mClipRule == NS_STYLE_FILL_RULE_EVENODD)
gfx->SetFillRule(FillRule::FILL_EVEN_ODD);
else
gfx->SetFillRule(FillRule::FILL_WINDING);
gfx->SetFillRule(newFillRule);
gfx->SetColor(gfxRGBA(1.0f, 1.0f, 1.0f, 1.0f));
gfx->SetPath(path);
gfx->Fill();
gfx->SetFillRule(oldFillRule);
gfx->NewPath();