public void AddViewBoxTransform(BoxRegion region, AspectRatio aspectRatio, SVGSVGElement frag) { // Get the tags computed style: Css.ComputedStyle tagStyle = (frag == null) ? null : frag.Style.Computed; float x = (tagStyle == null ? 0 : tagStyle.OffsetLeft); float y = (tagStyle == null ? 0 : tagStyle.OffsetTop); if (region.IsEmpty) { PushMatrix(TranslateMatrix(x, y)); return; } float width = (tagStyle == null ? region.Width : tagStyle.PixelWidth); float height = (tagStyle == null ? region.Height : tagStyle.PixelHeight); float fScaleX = width / region.Width; float fScaleY = height / region.Height; //(this.MinY < 0 ? -1 : 1) * float fMinX = -region.X * fScaleX; float fMinY = -region.Y * fScaleY; if (aspectRatio == null) { aspectRatio = new AspectRatio(SVGPreserveAspectRatio.xMidYMid, false); } if (aspectRatio.Align != SVGPreserveAspectRatio.none) { if (aspectRatio.Slice) { fScaleX = (float)Math.Max(fScaleX, fScaleY); fScaleY = (float)Math.Max(fScaleX, fScaleY); } else { fScaleX = (float)Math.Min(fScaleX, fScaleY); fScaleY = (float)Math.Min(fScaleX, fScaleY); } float fViewMidX = (region.Width / 2) * fScaleX; float fViewMidY = (region.Height / 2) * fScaleY; float fMidX = width / 2; float fMidY = height / 2; fMinX = -region.X * fScaleX; fMinY = -region.Y * fScaleY; switch (aspectRatio.Align) { case SVGPreserveAspectRatio.xMinYMin: break; case SVGPreserveAspectRatio.xMidYMin: fMinX += fMidX - fViewMidX; break; case SVGPreserveAspectRatio.xMaxYMin: fMinX += width - region.Width * fScaleX; break; case SVGPreserveAspectRatio.xMinYMid: fMinY += fMidY - fViewMidY; break; case SVGPreserveAspectRatio.xMidYMid: fMinX += fMidX - fViewMidX; fMinY += fMidY - fViewMidY; break; case SVGPreserveAspectRatio.xMaxYMid: fMinX += width - region.Width * fScaleX; fMinY += fMidY - fViewMidY; break; case SVGPreserveAspectRatio.xMinYMax: fMinY += height - region.Height * fScaleY; break; case SVGPreserveAspectRatio.xMidYMax: fMinX += fMidX - fViewMidX; fMinY += height - region.Height * fScaleY; break; case SVGPreserveAspectRatio.xMaxYMax: fMinX += width - region.Width * fScaleX; fMinY += height - region.Height * fScaleY; break; default: break; } } // Clip now: SetClip(new BoxRegion(x, y, width, height), false); Matrix4x4 matrix = ScaleMatrix(fScaleX, fScaleY); matrix *= TranslateMatrix(x, y); matrix *= TranslateMatrix(fMinX, fMinY); // Push it: PushMatrix(matrix); }