ElementObserver.cs 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. using System.Diagnostics;
  2. using QuestPDF.Drawing.DrawingCanvases;
  3. using QuestPDF.Drawing.Proxy;
  4. using QuestPDF.Elements;
  5. using QuestPDF.Helpers;
  6. namespace QuestPDF.LayoutTests.TestEngine;
  7. internal class ElementObserver : ContainerElement
  8. {
  9. public string? ObserverId { get; set; }
  10. public DrawingRecorder? DrawingRecorder { get; set; }
  11. internal override void Draw(Size availableSpace)
  12. {
  13. Debug.Assert(ObserverId != null);
  14. Debug.Assert(DrawingRecorder != null);
  15. var matrix = Canvas.GetCurrentMatrix();
  16. var drawingEvent = new ElementDrawingEvent
  17. {
  18. ObserverId = ObserverId,
  19. PageNumber = PageContext.CurrentPage,
  20. Position = new Position(matrix.TranslateX, matrix.TranslateY),
  21. Size = ObserverId == "$document" ? Child.Measure(availableSpace) : availableSpace
  22. };
  23. if (!Canvas.Is<DiscardDrawingCanvas>())
  24. DrawingRecorder?.Record(drawingEvent);
  25. var matrixBeforeDraw = Canvas.GetCurrentMatrix().ToMatrix4x4();
  26. base.Draw(availableSpace);
  27. var matrixAfterDraw = Canvas.GetCurrentMatrix().ToMatrix4x4();
  28. if (matrixAfterDraw != matrixBeforeDraw)
  29. throw new InvalidOperationException("Canvas state was not restored after drawing operation.");
  30. drawingEvent.StateAfterDrawing = (GetRealChild() as IStateful)?.GetState();
  31. }
  32. private Element GetRealChild()
  33. {
  34. var result = Child;
  35. while (true)
  36. {
  37. if (result is ElementProxy proxy)
  38. {
  39. result = proxy.Child;
  40. continue;
  41. }
  42. if (result is DebugPointer debugPointer)
  43. {
  44. result = debugPointer.Child;
  45. continue;
  46. }
  47. break;
  48. }
  49. return result;
  50. }
  51. }