//--------------------------------------------------------------------------------------------------------- /// <summary> /// Обновление ресурса Direct2D /// </summary> /// <param name="forced">Принудительное создание ресурса Direct2D</param> //--------------------------------------------------------------------------------------------------------- public override void UpdateDirect2DResource(Boolean forced = false) { if (XDirect2DManager.D2DRenderTarget != null) { // Принудительное создание ресурса if (forced) { XDisposer.SafeDispose(ref mD2DBrush); } if (mD2DBrush == null) { SharpDX.Direct2D1.BitmapBrushProperties bbp = new SharpDX.Direct2D1.BitmapBrushProperties(); bbp.ExtendModeX = (SharpDX.Direct2D1.ExtendMode)mExtendModeX; bbp.ExtendModeY = (SharpDX.Direct2D1.ExtendMode)mExtendModeY; bbp.InterpolationMode = SharpDX.Direct2D1.BitmapInterpolationMode.NearestNeighbor; mD2DBrush = new SharpDX.Direct2D1.BitmapBrush(XDirect2DManager.D2DRenderTarget, XDirect2DManager.LoadFromResource(mResourceName), bbp); mD2DBrush.Transform = SharpDX.Matrix3x2.Scaling(mScale); } else { SharpDX.Direct2D1.BitmapBrush d2d_image_brush = mD2DBrush as SharpDX.Direct2D1.BitmapBrush; d2d_image_brush.Bitmap = XDirect2DManager.LoadFromResource(mResourceName); d2d_image_brush.ExtendModeX = (SharpDX.Direct2D1.ExtendMode)mExtendModeX; d2d_image_brush.ExtendModeY = (SharpDX.Direct2D1.ExtendMode)mExtendModeY; d2d_image_brush.Transform = SharpDX.Matrix3x2.Scaling(mScale); d2d_image_brush.InterpolationMode = SharpDX.Direct2D1.BitmapInterpolationMode.NearestNeighbor; } } }
//--------------------------------------------------------------------------------------------------------- /// <summary> /// Окончание работы подсистемы представления Direct3D9 /// </summary> //--------------------------------------------------------------------------------------------------------- public static void EndDirect3D9() { if (mActiveClients != 0) { return; } XDisposer.SafeDispose(ref mD3DDevice); XDisposer.SafeDispose(ref mD3DContext); }
//--------------------------------------------------------------------------------------------------------- /// <summary> /// Создание текстуры Direct3D11 для ренденинга /// </summary> //--------------------------------------------------------------------------------------------------------- private void CreateAndBindTargets() { mD3DSurface.SetRenderTarget(null); XDisposer.SafeDispose(ref mD2DRenderTarget); XDisposer.SafeDispose(ref mD3DRenderTarget); XDisposer.SafeDispose(ref XDirect2DManager.mD2DDevice); XDisposer.SafeDispose(ref XDirect2DManager.mD2DFactory); XDisposer.SafeDispose(ref XDirect2DManager.mD2DWriteFactory); XDisposer.SafeDispose(ref XDirect2DManager.mD2DImagingFactory); var width = (Int32)Math.Max(ActualWidth, mWidthRenderTargetDip); var height = (Int32)Math.Max(ActualHeight, mHeightRenderTargetDip); var colordesc = new Direct3D11.Texture2DDescription { BindFlags = Direct3D11.BindFlags.RenderTarget | Direct3D11.BindFlags.ShaderResource, Format = DXGI.Format.B8G8R8A8_UNorm, Width = width, Height = height, MipLevels = 1, SampleDescription = new DXGI.SampleDescription(1, 0), Usage = Direct3D11.ResourceUsage.Default, OptionFlags = Direct3D11.ResourceOptionFlags.Shared, CpuAccessFlags = Direct3D11.CpuAccessFlags.None, ArraySize = 1 }; // Создаем текстуру Direct3D11 mD3DRenderTarget = new Direct3D11.Texture2D(mD3DDevice, colordesc); var surface = mD3DRenderTarget.QueryInterface <DXGI.Surface>(); // Фабрика ресурсов DirectD2 XDirect2DManager.mD2DFactory = new Direct2D.Factory(); //XNativeD2DFactory.mD2DDevice = new Direct2D.Device(XNativeD2DFactory.mD2DFactory, XNativeD2DFactory.mDXGIDevice); XDirect2DManager.mD2DWriteFactory = new DirectWrite.Factory(DirectWrite.FactoryType.Shared); XDirect2DManager.mD2DImagingFactory = new ImagingFactory(); // Создаем поверхность отображения DirectD2 var render_target_properties = new Direct2D.RenderTargetProperties(new Direct2D.PixelFormat(DXGI.Format.Unknown, Direct2D.AlphaMode.Premultiplied)); render_target_properties.Type = Direct2D.RenderTargetType.Default; render_target_properties.Usage = Direct2D.RenderTargetUsage.None; mD2DRenderTarget = new Direct2D.RenderTarget(XDirect2DManager.mD2DFactory, surface, render_target_properties); mD3DSurface.SetRenderTarget(mD3DRenderTarget); // Определяем область отображения mD3DDevice.ImmediateContext.Rasterizer.SetViewport(0, 0, width, height, 0.0f, 1.0f); // Сохраняем XDirect2DManager.mD2DRenderTarget = mD2DRenderTarget; }
//--------------------------------------------------------------------------------------------------------- /// <summary> /// Обновление данных текста /// </summary> //--------------------------------------------------------------------------------------------------------- public override void Update() { XDisposer.SafeDispose(ref mD2DTextFormat); //mD2DTextFormat = new DirectWrite.TextFormat(XDirect2DManager.mD2DWriteFactory, // "Arial", (DirectWrite.FontWeight)mFontWeight, (DirectWrite.FontStyle)mFontStyle, // (DirectWrite.FontStretch)mFontStretch, mFontSize); //mD2DTextFormat.TextAlignment = (DirectWrite.TextAlignment)mAlignment; //mD2DTextFormat.ParagraphAlignment = (DirectWrite.ParagraphAlignment)mParagraphAlignment; //mD2DTextFormat.WordWrapping = DirectWrite.WordWrapping.NoWrap; }
//--------------------------------------------------------------------------------------------------------- /// <summary> /// Обновление ресурса Direct2D /// </summary> /// <param name="forced">Принудительное создание ресурса Direct2D</param> //--------------------------------------------------------------------------------------------------------- public override void UpdateDirect2DResource(Boolean forced = false) { if (XDirect2DManager.D2DRenderTarget != null) { // Принудительное создание ресурса if (forced) { XDisposer.SafeDispose(ref mD2DBrush); } if (mD2DBrush == null) { mD2DBrush = new SharpDX.Direct2D1.SolidColorBrush(XDirect2DManager.D2DRenderTarget, mColor); } else { SharpDX.Direct2D1.SolidColorBrush d2d_solid_brush = mD2DBrush as SharpDX.Direct2D1.SolidColorBrush; d2d_solid_brush.Color = mColor; } } }
//--------------------------------------------------------------------------------------------------------- /// <summary> /// Обновление данных арки /// </summary> //--------------------------------------------------------------------------------------------------------- public override void Update() { XDisposer.SafeDispose(ref mD2DGeometry); mD2DGeometry = new Direct2D.PathGeometry(XDirect2DManager.D2DFactory); mD2DGeometrySink = mD2DGeometry.Open(); mD2DGeometrySink.BeginFigure(mStartPoint.ToRawVector2(), mIsFilled ? Direct2D.FigureBegin.Filled : Direct2D.FigureBegin.Hollow); Direct2D.ArcSegment arc_segment = new Direct2D.ArcSegment(); arc_segment.ArcSize = mIsLargeArc ? Direct2D.ArcSize.Large : Direct2D.ArcSize.Small; arc_segment.Point = mEndPoint.ToRawVector2(); arc_segment.RotationAngle = mRotationAngle; arc_segment.Size = new SharpDX.Size2F(mRadiusX, mRadiusY); arc_segment.SweepDirection = mIsClockwiseDirection ? Direct2D.SweepDirection.Clockwise : Direct2D.SweepDirection.CounterClockwise; mD2DGeometrySink.AddArc(arc_segment); mD2DGeometrySink.EndFigure(mIsClosed ? Direct2D.FigureEnd.Closed : Direct2D.FigureEnd.Open); mD2DGeometrySink.Close(); XDisposer.SafeDispose(ref mD2DGeometrySink); mBoundsRect = mD2DGeometry.GetWidenedBounds(2).ToRect(); }
//--------------------------------------------------------------------------------------------------------- /// <summary> /// Освобождение управляемых ресурсов /// </summary> /// <param name="disposing">Статус освобождения</param> //--------------------------------------------------------------------------------------------------------- private void Dispose(Boolean disposing) { // Освобождаем только управляемые ресурсы if (disposing) { if (mRenderTarget != null) { mRenderTarget = null; base.Lock(); base.SetBackBuffer(D3DResourceType.IDirect3DSurface9, IntPtr.Zero); base.Unlock(); } // Here, we have our Dispose call XDisposer.SafeDispose(ref mRenderTarget); // Уменьшаем количество клиентов XDirect2DManager.ActiveClients--; // При необходимости удаляем ресурсы XDirect2DManager.EndDirect3D9(); } }
//--------------------------------------------------------------------------------------------------------- /// <summary> /// Удаление ресурсов подсистемы Direct3D11 /// </summary> //--------------------------------------------------------------------------------------------------------- public void DeleteD3D() { if (mD3DSurface != null) { mD3DSurface.IsFrontBufferAvailableChanged -= OnIsFrontBufferAvailableChanged; } Source = null; DeleteGraphicsResourсe(); XDisposer.SafeDispose(ref mD2DRenderTarget); XDisposer.SafeDispose(ref mD3DSurface); XDisposer.SafeDispose(ref mD3DRenderTarget); XDisposer.SafeDispose(ref XDirect2DManager.mD2DFactory); XDisposer.SafeDispose(ref XDirect2DManager.mD2DDevice); XDisposer.SafeDispose(ref XDirect2DManager.mD2DWriteFactory); XDisposer.SafeDispose(ref XDirect2DManager.mD2DImagingFactory); XDisposer.SafeDispose(ref mD3DDevice); XDisposer.SafeDispose(ref XDirect2DManager.mDXGIDevice); XDisposer.SafeDispose(ref XDirect2DManager.mDXGIFactory); }
//--------------------------------------------------------------------------------------------------------- /// <summary> /// Обновление данных геометрии /// </summary> //--------------------------------------------------------------------------------------------------------- public override void Update() { XDisposer.SafeDispose(ref mD2DGeometry); mD2DGeometry = new Direct2D.PathGeometry(XDirect2DManager.D2DFactory); mD2DGeometrySink = mD2DGeometry.Open(); CCadSegment current_figure = mSegments[0]; mD2DGeometrySink.BeginFigure(current_figure.BasePoint.ToRawVector2(), current_figure.IsFilled ? Direct2D.FigureBegin.Filled : Direct2D.FigureBegin.Hollow); Int32 current_new_figure = 0; for (Int32 i = 0; i < mSegments.Count; i++) { CCadSegment current_segment = mSegments[i]; // Если новая фигура if (current_segment.IsNewFigure && current_new_figure != i) { // Закрывает текущую фигуру mD2DGeometrySink.EndFigure(current_figure.IsClosed ? Direct2D.FigureEnd.Closed : Direct2D.FigureEnd.Open); // Открываем новую фигуру mD2DGeometrySink.BeginFigure(current_segment.BasePoint.ToRawVector2(), current_segment.IsFilled ? Direct2D.FigureBegin.Filled : Direct2D.FigureBegin.Hollow); current_figure = current_segment; current_new_figure = i; } switch (current_segment.SegmentType) { case TCadSegmentType.Points: { CCadSegmentPoints points = current_segment as CCadSegmentPoints; mD2DGeometrySink.AddLines(points.Points.ConvertToDirect2DRawVectors()); } break; case TCadSegmentType.Line: { CCadSegmentLine line = current_segment as CCadSegmentLine; mD2DGeometrySink.AddLine(line.EndPoint.ToRawVector2()); } break; case TCadSegmentType.Arc: { CCadSegmentArc arc = current_segment as CCadSegmentArc; Direct2D.ArcSegment arc_segment = new Direct2D.ArcSegment(); arc_segment.ArcSize = arc.mIsLargeArc ? Direct2D.ArcSize.Large : Direct2D.ArcSize.Small; arc_segment.Point = arc.mEndPoint.ToRawVector2(); arc_segment.RotationAngle = arc.mRotationAngle; arc_segment.Size = new Size2F(arc.mRadiusX, arc.mRadiusY); arc_segment.SweepDirection = arc.mIsClockwiseDirection ? Direct2D.SweepDirection.Clockwise : Direct2D.SweepDirection.CounterClockwise; mD2DGeometrySink.AddArc(arc_segment); } break; case TCadSegmentType.Bezier: break; default: break; } } // Закрывает текущую фигуру mD2DGeometrySink.EndFigure(current_figure.IsClosed ? Direct2D.FigureEnd.Closed : Direct2D.FigureEnd.Open); mD2DGeometrySink.Close(); XDisposer.SafeDispose(ref mD2DGeometrySink); mBoundsRect = mD2DGeometry.GetWidenedBounds(2).ToRect(); }