//---------------------------------------------------------------------------------------------------------
            /// <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>
            /// Изменение имени ресурса кисти.
            /// Метод автоматически вызывается после установки соответствующего свойства
            /// </summary>
            //---------------------------------------------------------------------------------------------------------
            protected virtual void RaiseResourceNameChanged()
            {
#if USE_WINDOWS
                System.Windows.Media.ImageBrush image_brush = mWindowsBrush as System.Windows.Media.ImageBrush;
                image_brush.ImageSource = XWindowsLoaderBitmap.LoadBitmapFromResource(Properties.Resources.ResourceManager, mResourceName);
                image_brush.Viewport    = new System.Windows.Rect(0, 0, image_brush.ImageSource.Width, image_brush.ImageSource.Height);

                // 2) Информируем об изменении
                NotifyPropertyChanged(PropertyArgsWindowsBrush);
#endif
#if USE_GDI
                if (mDrawingBrush != null)
                {
                    mDrawingBrush.Dispose();
                }
                Object image = Properties.Resources.ResourceManager.GetObject(mResourceName);
                System.Drawing.Bitmap source = (System.Drawing.Bitmap)image;
                mDrawingBrush = new System.Drawing.TextureBrush(source, (System.Drawing.Drawing2D.WrapMode)GetTileMode());
#endif
#if USE_SHARPDX
                if (mD2DBrush != null)
                {
                    SharpDX.Direct2D1.BitmapBrush d2d_image_brush = mD2DBrush as SharpDX.Direct2D1.BitmapBrush;
                    d2d_image_brush.Bitmap = XDirect2DManager.LoadFromResource(mResourceName);
                }
#endif
            }
            //---------------------------------------------------------------------------------------------------------
            /// <summary>
            /// Установка в качестве источника поверхности ренденинга текстуры Direct3D11
            /// </summary>
            /// <param name="render_target">Текстура Direct3D11</param>
            //---------------------------------------------------------------------------------------------------------
            public void SetRenderTarget(Direct3D11.Texture2D render_target)
            {
                // Если есть наша поверхность ренденинга то обнуляем ее
                if (mRenderTarget != null)
                {
                    mRenderTarget = null;

                    base.Lock();
                    base.SetBackBuffer(D3DResourceType.IDirect3DSurface9, IntPtr.Zero);
                    base.Unlock();
                }

                if (render_target == null)
                {
                    return;
                }

                if (!XDirect2DManager.IsShareable(render_target))
                {
                    throw new ArgumentException("Texture must be created with ResourceOptionFlags.Shared");
                }

                Direct3D9.Format format = XDirect2DManager.TranslateFormat(render_target);
                if (format == Direct3D9.Format.Unknown)
                {
                    throw new ArgumentException("Texture format is not compatible with OpenSharedResource");
                }

                IntPtr handle = XDirect2DManager.GetSharedHandle(render_target);

                if (handle == IntPtr.Zero)
                {
                    throw new ArgumentNullException("Handle");
                }

                // Создаем в текстура для ренденинга
                mRenderTarget = new Direct3D9.Texture(XDirect2DManager.D3DDevice, render_target.Description.Width,
                                                      render_target.Description.Height, 1, Direct3D9.Usage.RenderTarget, format, Direct3D9.Pool.Default, ref handle);

                // Получаем поверхность и обновляем представление
                using (Direct3D9.Surface surface = mRenderTarget.GetSurfaceLevel(0))
                {
                    base.Lock();
                    base.SetBackBuffer(D3DResourceType.IDirect3DSurface9, surface.NativePointer);
                    base.Unlock();
                }
            }
            //---------------------------------------------------------------------------------------------------------
            /// <summary>
            /// Обновление данных изображения
            /// </summary>
            //---------------------------------------------------------------------------------------------------------
            public override void Update()
            {
                if (mSource.IsCorrectPath)
                {
                    if (mSource.TypeData == TCadImageSourceType.File)
                    {
                        mD2DBitmap = XDirect2DManager.LoadFromFile(mSource.PathData);
                    }
                    else
                    {
                        mD2DBitmap = XDirect2DManager.LoadFromResource(mSource.PathData);
                    }

                    mBoundsRect.Width  = (Single)mD2DBitmap.PixelSize.Width;
                    mBoundsRect.Height = (Single)mD2DBitmap.PixelSize.Height;
                }
            }
            //---------------------------------------------------------------------------------------------------------
            /// <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>
 /// Конструктор по умолчанию инициализирует объект класса предустановленными значениями
 /// </summary>
 //---------------------------------------------------------------------------------------------------------
 public CDirect2DImageSource()
 {
     XDirect2DManager.StartDirect3D9();
     XDirect2DManager.ActiveClients++;
 }