ContinuousBlock.cs 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. using QuestPDF.Drawing;
  2. using QuestPDF.Helpers;
  3. using QuestPDF.Skia;
  4. namespace QuestPDF.LayoutTests.TestEngine;
  5. internal class ContinuousBlock : Element
  6. {
  7. public float TotalWidth { get; set; }
  8. public float TotalHeight { get; set; }
  9. private float HeightOffset { get; set; }
  10. internal override SpacePlan Measure(Size availableSpace)
  11. {
  12. if (TotalWidth > availableSpace.Width)
  13. return SpacePlan.Wrap("The content requires more horizontal space than available.");
  14. if (availableSpace.Height < Size.Epsilon)
  15. return SpacePlan.Wrap("The content requires more vertical space than available.");
  16. var remainingHeight = TotalHeight - HeightOffset;
  17. if (remainingHeight < Size.Epsilon)
  18. return SpacePlan.FullRender(Size.Zero);
  19. if (remainingHeight > availableSpace.Height)
  20. return SpacePlan.PartialRender(TotalWidth, availableSpace.Height);
  21. return SpacePlan.FullRender(TotalWidth, remainingHeight);
  22. }
  23. internal override void Draw(Size availableSpace)
  24. {
  25. var height = Math.Min(TotalHeight - HeightOffset, availableSpace.Height);
  26. var size = new Size(TotalWidth, height);
  27. HeightOffset += height;
  28. using var paint = new SkPaint();
  29. paint.SetSolidColor(Colors.Grey.Medium);
  30. Canvas.DrawRectangle(Position.Zero, size, paint);
  31. if (HeightOffset > TotalHeight - Size.Epsilon)
  32. HeightOffset = 0;
  33. }
  34. }