GeometryNode.cs 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. // Copyright (c) The Avalonia Project. All rights reserved.
  2. // Licensed under the MIT license. See licence.md file in the project root for full license information.
  3. using System;
  4. using System.Collections.Generic;
  5. using Avalonia.Media;
  6. using Avalonia.Platform;
  7. using Avalonia.VisualTree;
  8. namespace Avalonia.Rendering.SceneGraph
  9. {
  10. internal class GeometryNode : BrushDrawOperation
  11. {
  12. public GeometryNode(
  13. Matrix transform,
  14. IBrush brush,
  15. Pen pen,
  16. IGeometryImpl geometry,
  17. IDictionary<IVisual, Scene> childScenes = null)
  18. {
  19. Bounds = geometry.GetRenderBounds(pen.Thickness).TransformToAABB(transform);
  20. Transform = transform;
  21. Brush = Convert(brush);
  22. Pen = Convert(pen);
  23. Geometry = geometry;
  24. ChildScenes = childScenes;
  25. }
  26. public override Rect Bounds { get; }
  27. public Matrix Transform { get; }
  28. public IBrush Brush { get; }
  29. public Pen Pen { get; }
  30. public IGeometryImpl Geometry { get; }
  31. public override IDictionary<IVisual, Scene> ChildScenes { get; }
  32. public bool Equals(Matrix transform, IBrush brush, Pen pen, IGeometryImpl geometry)
  33. {
  34. return transform == Transform &&
  35. Equals(brush, Brush) &&
  36. pen == Pen &&
  37. Equals(geometry, Geometry);
  38. }
  39. public override void Render(IDrawingContextImpl context)
  40. {
  41. context.Transform = Transform;
  42. context.DrawGeometry(Brush, Pen, Geometry);
  43. }
  44. public override bool HitTest(Point p)
  45. {
  46. p *= Transform.Invert();
  47. return (Brush != null && Geometry.FillContains(p)) ||
  48. (Pen != null && Geometry.StrokeContains(Pen, p));
  49. }
  50. }
  51. }