//---------------------------------------------------------------------------------------------------------
            /// <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;
            }
예제 #4
0
            //---------------------------------------------------------------------------------------------------------
            /// <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;
            }
예제 #5
0
            //---------------------------------------------------------------------------------------------------------
            /// <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);
            }
예제 #9
0
            //---------------------------------------------------------------------------------------------------------
            /// <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();
            }