/// <summary> /// Updates the view bounds. /// </summary> private void UpdateViewBounds() { Vector2 tl = Vector2.Zero; Vector2 br = new Vector2(_renderControl.Width, _renderControl.Height); tl = Vector2.Transform(tl, InverseViewMatrix); br = Vector2.Transform(br, InverseViewMatrix); _bounds = Numerics.Rectangle.ContainingPoints(tl, br); if (!_layoutSuspended) { ViewBoundsChanged?.Invoke(this, EventArgs.Empty); } }
/// <summary> /// Gets the transform matricies used for printing. /// </summary> /// <param name="bounds">The bounds.</param> /// <param name="transform">The transform.</param> /// <param name="inverseTransform">The inverse transform.</param> /// <exception cref="System.ArgumentOutOfRangeException"></exception> private void GetPrintTransform( Numerics.Rectangle bounds, out Matrix3x2 transform, out Matrix3x2 inverseTransform) { float minDim = Math.Min(bounds.Width, bounds.Height); Vector2 center = bounds.Center; Matrix3x2 scale = Matrix3x2.CreateScale((minDim * _zoom) / 10000f, center); Matrix3x2 invScale = Matrix3x2.CreateScale(10000f / (minDim * _zoom), center); Matrix3x2 centerTranslate = Matrix3x2.CreateTranslation(center); Matrix3x2 invCenterTranslate = Matrix3x2.CreateTranslation(-center); Matrix3x2 translate, invTranslate; switch (_printDocument.PrintMode) { case TilingPrintMode.TilingFull: case TilingPrintMode.TilingLines: translate = Matrix3x2.CreateTranslation(_bounds.Center); invTranslate = Matrix3x2.CreateTranslation(-_bounds.Center); break; case TilingPrintMode.SingleTileFull: case TilingPrintMode.SingleTileLines: Debug.Assert(_printDocument.Tile != null, "_printDocument.Tile != null"); Vector2 centroid = _printDocument.Tile.Centroid; translate = Matrix3x2.CreateTranslation(centroid); invTranslate = Matrix3x2.CreateTranslation(-centroid); break; default: throw new ArgumentOutOfRangeException(); } transform = centerTranslate * translate * scale; inverseTransform = invScale * invTranslate * invCenterTranslate; }