private ICanvasImage CreateComposite() { var compositeEffect = new CompositeEffect { Mode = CanvasComposite.SourceOver }; var transformEffects = new List <Transform3DEffect>(); const int petalCount = 12; for (int i = 0; i < petalCount; i++) { var transformEffect = new Transform3DEffect { Source = bitmapTiger }; compositeEffect.Sources.Add(transformEffect); transformEffects.Add(transformEffect); } // Animation rotates each copy of the image at a different speed. animationFunction = elapsedTime => { for (int i = 0; i < petalCount; i++) { transformEffects[i].TransformMatrix = Matrix4x4.CreateRotationZ(elapsedTime * i / 3); } }; currentEffectSize = Vector2.Zero; return(compositeEffect); }
private ICanvasImage CreateBlend() { var rotatedTiger = new Transform3DEffect { Source = bitmapTiger }; var blendEffect = new BlendEffect { Background = bitmapTiger, Foreground = rotatedTiger }; // Animation swings the second copy of the image back and forth, // while cycling through the different blend modes. int enumValueCount = Utils.GetEnumAsList <BlendEffectMode>().Count; animationFunction = elapsedTime => { blendEffect.Mode = (BlendEffectMode)(elapsedTime / Math.PI % enumValueCount); textLabel = "Mode: " + blendEffect.Mode; rotatedTiger.TransformMatrix = Matrix4x4.CreateRotationZ((float)Math.Sin(elapsedTime)); }; return(blendEffect); }
public void Transform3DEffectDoesNotSupportHighQualityInterpolation() { var effect = new Transform3DEffect(); var supportedModes = from mode in Enum.GetValues(typeof(CanvasImageInterpolation)).Cast <CanvasImageInterpolation>() where mode != CanvasImageInterpolation.HighQualityCubic select mode; foreach (var interpolationMode in supportedModes) { effect.InterpolationMode = interpolationMode; Assert.AreEqual(interpolationMode, effect.InterpolationMode); } Assert.ThrowsException <ArgumentException>(() => { effect.InterpolationMode = CanvasImageInterpolation.HighQualityCubic; }); }
private ICanvasImage CreateTransform3D() { var transformEffect = new Transform3DEffect { Source = bitmapTiger }; // Animation rotates the bitmap in 3D space. animationFunction = elapsedTime => { transformEffect.TransformMatrix = Matrix4x4.CreateFromYawPitchRoll(elapsedTime / 3, elapsedTime / 7, elapsedTime * 5); }; currentEffectSize = Vector2.Zero; return(transformEffect); }
private ICanvasImage CreateTransform3D() { var transformEffect = new Transform3DEffect { Source = bitmapTiger }; // Animation rotates the bitmap in 3D space. animationFunction = elapsedTime => { transformEffect.TransformMatrix = Matrix4x4.CreateFromYawPitchRoll(elapsedTime / 3, elapsedTime / 7, elapsedTime * 5); }; currentEffectSize = Vector2.Zero; return transformEffect; }
private ICanvasImage CreateComposite() { var compositeEffect = new CompositeEffect { Mode = CanvasComposite.SourceOver }; var transformEffects = new List<Transform3DEffect>(); const int petalCount = 12; for (int i = 0; i < petalCount; i++) { var transformEffect = new Transform3DEffect { Source = bitmapTiger }; compositeEffect.Sources.Add(transformEffect); transformEffects.Add(transformEffect); } // Animation rotates each copy of the image at a different speed. animationFunction = elapsedTime => { for (int i = 0; i < petalCount; i++) { transformEffects[i].TransformMatrix = Matrix4x4.CreateRotationZ(elapsedTime * i / 3); } }; currentEffectSize = Vector2.Zero; return compositeEffect; }
private ICanvasImage CreateBlend() { var rotatedTiger = new Transform3DEffect { Source = bitmapTiger }; var blendEffect = new BlendEffect { Background = bitmapTiger, Foreground = rotatedTiger }; // Animation swings the second copy of the image back and forth, // while cycling through the different blend modes. int enumValueCount = Utils.GetEnumAsList<BlendEffectMode>().Count; animationFunction = elapsedTime => { blendEffect.Mode = (BlendEffectMode)(elapsedTime / Math.PI % enumValueCount); textLabel = "Mode: " + blendEffect.Mode; rotatedTiger.TransformMatrix = Matrix4x4.CreateRotationZ((float)Math.Sin(elapsedTime)); }; return blendEffect; }
void DrawStuff(CanvasDrawingSession ds) { int horizontalLimit = (int)m_canvasControl.ActualWidth; int verticalLimit = (int)m_canvasControl.ActualHeight; const float thickStrokeWidth = 80.0f; DrawnContentType drawnContentType = (DrawnContentType)m_drawnContentTypeCombo.SelectedValue; ds.Clear(NextRandomColor()); Rect rect; Vector2 point; float radiusX; float radiusY; Random random = new Random(); switch (drawnContentType) { case DrawnContentType.Clear_Only: break; case DrawnContentType.Bitmap: if (m_bitmap_tiger != null) { ds.DrawImage(m_bitmap_tiger, NextRandomPoint(horizontalLimit, verticalLimit).ToVector2()); } else { DrawNoBitmapErrorMessage(ds, horizontalLimit / 2, verticalLimit / 2); } break; case DrawnContentType.Effect_GaussianBlur: if (m_bitmap_tiger != null) { GaussianBlurEffect blurEffect = new GaussianBlurEffect(); blurEffect.StandardDeviation = (float)random.NextDouble() * 5; blurEffect.Source = m_bitmap_tiger; ds.DrawImage(blurEffect, new Vector2(horizontalLimit / 2, verticalLimit / 2)); } else { DrawNoBitmapErrorMessage(ds, horizontalLimit / 2, verticalLimit / 2); } break; case DrawnContentType.Effect_Saturation: if (m_bitmap_tiger != null) { SaturationEffect saturationEffect = new SaturationEffect(); saturationEffect.Saturation = (float)random.NextDouble(); saturationEffect.Source = m_bitmap_tiger; ds.DrawImage(saturationEffect, new Vector2(horizontalLimit / 2, verticalLimit / 2)); } else { DrawNoBitmapErrorMessage(ds, horizontalLimit / 2, verticalLimit / 2); } break; case DrawnContentType.Effect_3DTransform: if (m_bitmap_tiger != null) { Transform3DEffect transformEffect = new Transform3DEffect(); transformEffect.Source = m_bitmap_tiger; transformEffect.InterpolationMode = CanvasImageInterpolation.Cubic; transformEffect.TransformMatrix = Matrix4x4.CreateRotationZ((float)random.NextDouble(), new Vector3(0, 0, 0)); ds.DrawImage(transformEffect, new Vector2(horizontalLimit / 2, verticalLimit / 2)); } else { DrawNoBitmapErrorMessage(ds, horizontalLimit / 2, verticalLimit / 2); } break; case DrawnContentType.Effect_Blend: if (m_bitmap_tiger != null) { Transform3DEffect transformEffect = new Transform3DEffect(); transformEffect.Source = m_bitmap_tiger; transformEffect.TransformMatrix = Matrix4x4.CreateRotationZ((float)random.NextDouble(), new Vector3(0, 0, 0)); BlendEffect blendEffect = new BlendEffect(); blendEffect.Background = m_bitmap_tiger; blendEffect.Foreground = transformEffect; blendEffect.Mode = BlendEffectMode.SoftLight; ds.DrawImage(blendEffect, new Vector2(horizontalLimit / 2, verticalLimit / 2)); } else { DrawNoBitmapErrorMessage(ds, horizontalLimit / 2, verticalLimit / 2); } break; case DrawnContentType.Effect_Composite: if (m_bitmap_tiger != null) { CompositeEffect compositeEffect = new CompositeEffect(); compositeEffect.Mode = CompositeEffectMode.SourceOver; float angle = 0.0f; float angleDelta = (float)random.NextDouble() + 0.05f; int imageNumber = (int)(2 * Math.PI / angleDelta) + 1; foreach (var i in Enumerable.Range(0, imageNumber)) { Transform3DEffect transformEffect = new Transform3DEffect(); transformEffect.Source = m_bitmap_tiger; transformEffect.TransformMatrix = Matrix4x4.CreateRotationZ(angle, new Vector3(0, 0, 0)); angle += angleDelta; compositeEffect.Inputs.Add(transformEffect); } ds.DrawImage(compositeEffect, new Vector2(horizontalLimit / 2, verticalLimit / 2)); } else { DrawNoBitmapErrorMessage(ds, horizontalLimit / 2, verticalLimit / 2); } break; case DrawnContentType.Line_Thin: ds.DrawLine( NextRandomPoint(horizontalLimit, verticalLimit).ToVector2(), NextRandomPoint(horizontalLimit, verticalLimit).ToVector2(), NextRandomColor()); break; case DrawnContentType.Line_Thick: ds.DrawLine( NextRandomPoint(horizontalLimit, verticalLimit).ToVector2(), NextRandomPoint(horizontalLimit, verticalLimit).ToVector2(), NextRandomColor(), thickStrokeWidth); break; case DrawnContentType.Rectangle_Thin: ds.DrawRectangle( NextRandomRect(horizontalLimit, verticalLimit), NextRandomColor()); break; case DrawnContentType.Rectangle_Thick: ds.DrawRectangle( NextRandomRect(horizontalLimit, verticalLimit), NextRandomColor(), thickStrokeWidth); break; case DrawnContentType.Rectangle_Filled: ds.FillRectangle( NextRandomRect(horizontalLimit, verticalLimit), NextRandomColor()); break; case DrawnContentType.RoundedRectangle_Thin: NextRandomRoundedRect(horizontalLimit, verticalLimit, out rect, out radiusX, out radiusY); ds.DrawRoundedRectangle( rect, radiusX, radiusY, NextRandomColor()); break; case DrawnContentType.RoundedRectangle_Thick: NextRandomRoundedRect(horizontalLimit, verticalLimit, out rect, out radiusX, out radiusY); ds.DrawRoundedRectangle( rect, radiusX, radiusY, NextRandomColor(), thickStrokeWidth); break; case DrawnContentType.Ellipse_Thin: NextRandomEllipse(horizontalLimit, verticalLimit, out point, out radiusX, out radiusY); ds.DrawEllipse( point, radiusX, radiusY, NextRandomColor()); break; case DrawnContentType.Ellipse_Thick: NextRandomEllipse(horizontalLimit, verticalLimit, out point, out radiusX, out radiusY); ds.DrawEllipse( point, radiusX, radiusY, NextRandomColor(), thickStrokeWidth); break; case DrawnContentType.Ellipse_Fill: NextRandomEllipse(horizontalLimit, verticalLimit, out point, out radiusX, out radiusY); ds.FillEllipse( point, radiusX, radiusY, NextRandomColor()); break; case DrawnContentType.Circle_Fill: ds.FillCircle( NextRandomPoint(horizontalLimit, verticalLimit).ToVector2(), 100, NextRandomColor()); break; case DrawnContentType.Dashed_Lines: DrawDashedLines(ds, NextRandomColor(), horizontalLimit, verticalLimit); break; case DrawnContentType.Text: var p = NextRandomPoint(horizontalLimit, verticalLimit); var x = (float)p.X; var y = (float)p.Y; var color = NextRandomColor(); ds.DrawLine(new Vector2(x, 0), new Vector2(x, verticalLimit), color); ds.DrawLine(new Vector2(0, y), new Vector2(horizontalLimit, y), color); ds.DrawText( "Centered", p.ToVector2(), color, new CanvasTextFormat() { FontSize = 18, VerticalAlignment = CanvasVerticalAlignment.Center, ParagraphAlignment = ParagraphAlignment.Center }); var r = NextRandomRect(horizontalLimit, verticalLimit); ds.DrawRectangle(r, color); ds.DrawText( m_quiteLongText, r, NextRandomColor(), new CanvasTextFormat() { FontFamily = "Comic Sans MS", FontSize = 18, ParagraphAlignment = ParagraphAlignment.Justify, Options = CanvasDrawTextOptions.Clip }); break; case DrawnContentType.ImageBrush: if (m_bitmap_tiger != null) { m_imageBrush.Image = m_bitmap_tiger; m_imageBrush.ExtendX = (CanvasEdgeBehavior)(m_random.Next(3)); m_imageBrush.ExtendY = (CanvasEdgeBehavior)(m_random.Next(3)); ds.FillRectangle(new Rect(0, 0, horizontalLimit, verticalLimit), m_imageBrush); } else { DrawNoBitmapErrorMessage(ds, horizontalLimit / 2, verticalLimit / 2); } break; case DrawnContentType.OffscreenTarget: m_imageBrush.Image = m_offscreenTarget; m_imageBrush.ExtendX = (CanvasEdgeBehavior)(m_random.Next(3)); m_imageBrush.ExtendY = (CanvasEdgeBehavior)(m_random.Next(3)); ds.FillRectangle(new Rect(0, 0, horizontalLimit, verticalLimit), m_imageBrush); break; case DrawnContentType.Test_Scene0_Default: GeometryTestScene0.DrawGeometryTestScene(ds, TestSceneRenderingType.Default); break; case DrawnContentType.Test_Scene0_Wireframe: GeometryTestScene0.DrawGeometryTestScene(ds, TestSceneRenderingType.Wireframe); break; case DrawnContentType.Test_Scene1_Default: GeometryTestScene1.DrawGeometryTestScene(ds, TestSceneRenderingType.Default); break; case DrawnContentType.Test_Scene1_Randomized: GeometryTestScene1.DrawGeometryTestScene(ds, TestSceneRenderingType.Randomized); break; case DrawnContentType.Test_Scene1_Wireframe: GeometryTestScene1.DrawGeometryTestScene(ds, TestSceneRenderingType.Wireframe); break; default: System.Diagnostics.Debug.Assert(false); // Unexpected break; } }
private void Canvas_Draw(CanvasControl sender, CanvasDrawEventArgs args) { var ds = args.DrawingSession; ds.Clear(Color.FromArgb(0, 0, 0, 0)); if (!isLoaded) { return; } Vector2 center = new Vector2(); center.X = (float)(sender.ActualWidth - bitmapTiger.Size.Width) / 2; center.Y = (float)(sender.ActualHeight - bitmapTiger.Size.Height) / 2; ICanvasImage effect = null; switch (CurrentEffect) { case EffectType.None: { effect = bitmapTiger; break; } case EffectType.GaussianBlur: { effect = new GaussianBlurEffect() { Source = bitmapTiger, StandardDeviation = 2.0f }; break; } case EffectType.Saturation: effect = new SaturationEffect() { Saturation = 0.2f, Source = bitmapTiger }; break; case EffectType.Transform3D: { effect = new Transform3DEffect() { Source = bitmapTiger, TransformMatrix = Matrix4x4.CreateRotationZ(0.5f, new Vector3(0, 0, 0)) }; break; } case EffectType.Blend: { Transform3DEffect transformEffect = new Transform3DEffect() { Source = bitmapTiger, TransformMatrix = Matrix4x4.CreateRotationZ(0.5f, new Vector3(0, 0, 0)) }; effect = new BlendEffect() { Background = bitmapTiger, Foreground = transformEffect, Mode = BlendEffectMode.SoftLight }; break; } case EffectType.Composite: { CompositeEffect compositeEffect = new CompositeEffect(); compositeEffect.Mode = CompositeEffectMode.SourceOver; float angle = 0.0f; float angleDelta = 0.5f; int imageNumber = (int)(2 * Math.PI / angleDelta) + 1; foreach (var i in Enumerable.Range(0, imageNumber)) { Transform3DEffect nextTransformEffect = new Transform3DEffect(); nextTransformEffect.Source = bitmapTiger; nextTransformEffect.TransformMatrix = Matrix4x4.CreateRotationZ(angle, new Vector3(0, 0, 0)); angle += angleDelta; compositeEffect.Inputs.Add(nextTransformEffect); } Matrix4x4 translationMatrix = Matrix4x4.CreateTranslation((float)bitmapTiger.Size.Width / 2, (float)bitmapTiger.Size.Height / 2, 0.0f); // Move composite effect so it appear on the screen center effect = new Transform3DEffect() { Source = compositeEffect, TransformMatrix = translationMatrix }; break; } } ds.DrawImage(effect, center); }