/// <summary> /// Pops a layer change info. /// </summary> private void PopLayer() { var layer = _layers.Pop(); if (layer != null) { _renderTarget.PopLayer(); _layerPool.Push(layer); } }
public void PopOpacity() { var layer = _layers.Pop(); if (layer != null) { _renderTarget.PopLayer(); _layerPool.Push(layer); } }
internal static async Task Render(CompositionEngine compositionEngine, SharpDX.Direct2D1.RenderTarget renderTarget, FrameworkElement rootElement, Ellipse ellipse) { var rect = ellipse.GetBoundingRect(rootElement).ToSharpDX(); var d2dEllipse = new D2D.Ellipse( new Vector2( (float)((rect.Left + rect.Right) * 0.5), (float)((rect.Top + rect.Bottom) * 0.5)), (float)(0.5 * rect.Width), (float)(0.5 * rect.Height)); var fill = await ellipse.Fill.ToSharpDX(renderTarget, rect); var layer = ellipse.CreateAndPushLayerIfNecessary(renderTarget, rootElement); var stroke = await ellipse.Stroke.ToSharpDX(renderTarget, rect); if (ellipse.StrokeThickness > 0 && stroke != null) { var halfStrokeThickness = (float)(ellipse.StrokeThickness * 0.5); d2dEllipse.RadiusX -= halfStrokeThickness; d2dEllipse.RadiusY -= halfStrokeThickness; if (fill != null) { renderTarget.FillEllipse(d2dEllipse, fill); } renderTarget.DrawEllipse( d2dEllipse, stroke, (float)ellipse.StrokeThickness, ellipse.GetStrokeStyle(compositionEngine.D2DFactory)); } else if (fill != null) { renderTarget.FillEllipse(d2dEllipse, fill); } if (layer != null) { renderTarget.PopLayer(); layer.Dispose(); } }
internal static async Task Render(CompositionEngine compositionEngine, RenderTarget renderTarget, FrameworkElement rootElement, TextBlock textBlock) { using (var textFormat = new TextFormat( compositionEngine.DWriteFactory, textBlock.FontFamily.Source, (float)textBlock.FontSize) { TextAlignment = textBlock.TextAlignment.ToSharpDX(), ParagraphAlignment = ParagraphAlignment.Near }) { var rect = textBlock.GetBoundingRect(rootElement).ToSharpDX(); // For some reason we need a bigger rect for the TextBlock rendering to fit in the same boundaries rect.Right++; rect.Bottom++; using ( var textBrush = await textBlock.Foreground.ToSharpDX(renderTarget, rect)) { if (textBrush == null) { return; } var layer = textBlock.CreateAndPushLayerIfNecessary(renderTarget, rootElement); // You can render the bounding rectangle to debug composition //renderTarget.DrawRectangle( // rect, // textBrush); renderTarget.DrawText( textBlock.Text, textFormat, rect, textBrush); if (layer != null) { renderTarget.PopLayer(); layer.Dispose(); } //} } } }
internal static async Task Render(CompositionEngine compositionEngine, SharpDX.Direct2D1.RenderTarget renderTarget, FrameworkElement rootElement, Border border) { var rect = border.GetBoundingRect(rootElement).ToSharpDX(); var brush = await border.Background.ToSharpDX(renderTarget, rect); if (brush != null) { var geometry = GetBorderFillGeometry(compositionEngine, border, rect); var layer = border.CreateAndPushLayerIfNecessary(renderTarget, rootElement); renderTarget.FillGeometry(geometry, brush); if (layer != null) { renderTarget.PopLayer(); layer.Dispose(); } } await compositionEngine.RenderChildren(renderTarget, rootElement, border); }
internal static async Task Render(CompositionEngine compositionEngine, SharpDX.Direct2D1.RenderTarget renderTarget, Jupiter.FrameworkElement rootElement, Jupiter.Controls.Image image) { var rect = image.GetBoundingRect(rootElement).ToSharpDX(); if (rect.Width == 0 || rect.Height == 0) { return; } var bitmap = await image.Source.ToSharpDX(renderTarget); if (bitmap == null) { return; } try { var layer = image.CreateAndPushLayerIfNecessary(renderTarget, rootElement); renderTarget.DrawBitmap( bitmap, rect, (float)image.Opacity, D2D.BitmapInterpolationMode.Linear); if (layer != null) { renderTarget.PopLayer(); layer.Dispose(); } } finally { bitmap.Dispose(); } }
internal static async Task Render(CompositionEngine compositionEngine, SharpDX.Direct2D1.RenderTarget renderTarget, FrameworkElement rootElement, Jupiter.Shapes.Path path) { var rect = path.GetBoundingRect(rootElement).ToSharpDX(); var fill = await path.Fill.ToSharpDX(renderTarget, rect); var stroke = await path.Stroke.ToSharpDX(renderTarget, rect); var layer = path.CreateAndPushLayerIfNecessary(renderTarget, rootElement); var oldTransform = renderTarget.Transform; renderTarget.Transform = new Matrix3x2( 1, 0, 0, 1, rect.Left, rect.Top); //renderTarget.PushLayer(ref layerParameters, layer); var d2dGeometry = path.Data.ToSharpDX(compositionEngine.D2DFactory, rect); if (fill != null) { renderTarget.FillGeometry(d2dGeometry, fill, null); } if (stroke != null && path.StrokeThickness > 0) { renderTarget.DrawGeometry( d2dGeometry, stroke, (float)path.StrokeThickness, path.GetStrokeStyle(compositionEngine.D2DFactory)); } //if (path.StrokeThickness > 0 && // stroke != null) //{ // var halfThickness = (float)(path.StrokeThickness * 0.5); // roundedRect.Rect = rect.Eroded(halfThickness); // if (fill != null) // { // renderTarget.FillRoundedRectangle(roundedRect, fill); // } // renderTarget.DrawRoundedRectangle( // roundedRect, // stroke, // (float)path.StrokeThickness, // path.GetStrokeStyle(compositionEngine.D2DFactory)); //} //else //{ // renderTarget.FillRoundedRectangle(roundedRect, fill); //} if (layer != null) { renderTarget.PopLayer(); layer.Dispose(); } renderTarget.Transform = oldTransform; }
public void Dispose() { _geometry?.Dispose(); _target.PopLayer(); }