//--------------------------------------------------------------------------------------------------------- /// <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++; }