CustomRenderTests.cs 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205
  1. using System;
  2. using System.Threading.Tasks;
  3. using Avalonia.Controls;
  4. using Avalonia.Layout;
  5. using Avalonia.Media;
  6. using Xunit;
  7. #if AVALONIA_SKIA
  8. namespace Avalonia.Skia.RenderTests
  9. #else
  10. namespace Avalonia.Direct2D1.RenderTests.Controls
  11. #endif
  12. {
  13. public class CustomRenderTests : TestBase
  14. {
  15. public CustomRenderTests()
  16. : base(@"Controls\CustomRender")
  17. {
  18. }
  19. [Fact]
  20. public async Task Clip()
  21. {
  22. Decorator target = new Decorator
  23. {
  24. Padding = new Thickness(8),
  25. Width = 200,
  26. Height = 200,
  27. Child = new CustomRenderer((control, context) =>
  28. {
  29. context.FillRectangle(
  30. Brushes.Red,
  31. new Rect(control.Bounds.Size),
  32. 4);
  33. using (context.PushClip(new Rect(control.Bounds.Size).Deflate(10)))
  34. {
  35. context.FillRectangle(
  36. Brushes.Blue,
  37. new Rect(control.Bounds.Size),
  38. 4);
  39. }
  40. }),
  41. };
  42. await RenderToFile(target);
  43. CompareImages();
  44. }
  45. [Fact]
  46. public async Task GeometryClip()
  47. {
  48. Decorator target = new Decorator
  49. {
  50. Padding = new Thickness(8),
  51. Width = 200,
  52. Height = 200,
  53. Child = new CustomRenderer((control, context) =>
  54. {
  55. var clip = new EllipseGeometry(new Rect(control.Bounds.Size));
  56. context.FillRectangle(
  57. Brushes.Red,
  58. new Rect(control.Bounds.Size),
  59. 4);
  60. using (context.PushGeometryClip(clip))
  61. {
  62. context.FillRectangle(
  63. Brushes.Blue,
  64. new Rect(control.Bounds.Size),
  65. 4);
  66. }
  67. }),
  68. };
  69. await RenderToFile(target);
  70. CompareImages();
  71. }
  72. [Fact]
  73. public async Task GeometryClip_With_Transform()
  74. {
  75. var target = new Border
  76. {
  77. Background = Brushes.White,
  78. Width = 200,
  79. Height = 200,
  80. Child = new CustomRenderer((control, context) =>
  81. {
  82. using (var transform = context.PushTransform(Matrix.CreateTranslation(100, 100)))
  83. using (var clip = context.PushClip(new Rect(0, 0, 100, 100)))
  84. {
  85. context.FillRectangle(Brushes.Blue, new Rect(0, 0, 200, 200));
  86. }
  87. context.FillRectangle(Brushes.Red, new Rect(0, 0, 100, 100));
  88. }),
  89. };
  90. await RenderToFile(target);
  91. CompareImages();
  92. }
  93. [Fact]
  94. public async Task Clip_With_Transform()
  95. {
  96. var target = new Border
  97. {
  98. Background = Brushes.White,
  99. Width = 200,
  100. Height = 200,
  101. Child = new CustomRenderer((control, context) =>
  102. {
  103. using (var transform = context.PushTransform(Matrix.CreateTranslation(100, 100)))
  104. using (var clip = context.PushClip(new Rect(0, 0, 100, 100)))
  105. {
  106. context.FillRectangle(Brushes.Blue, new Rect(0, 0, 200, 200));
  107. }
  108. context.FillRectangle(Brushes.Red, new Rect(0, 0, 100, 100));
  109. }),
  110. };
  111. await RenderToFile(target);
  112. CompareImages();
  113. }
  114. [Fact]
  115. public async Task Opacity()
  116. {
  117. Decorator target = new Decorator
  118. {
  119. Padding = new Thickness(8),
  120. Width = 200,
  121. Height = 200,
  122. Child = new CustomRenderer((control, context) =>
  123. {
  124. context.FillRectangle(
  125. Brushes.Red,
  126. new Rect(control.Bounds.Size),
  127. 4);
  128. using (context.PushOpacity(0.5, control.Bounds))
  129. {
  130. context.FillRectangle(
  131. Brushes.Blue,
  132. new Rect(control.Bounds.Size).Deflate(10),
  133. 4);
  134. }
  135. }),
  136. };
  137. await RenderToFile(target);
  138. CompareImages();
  139. }
  140. [Fact]
  141. public async Task OpacityMask()
  142. {
  143. Decorator target = new Decorator
  144. {
  145. Padding = new Thickness(8),
  146. Width = 200,
  147. Height = 200,
  148. Child = new CustomRenderer((control, context) =>
  149. {
  150. var mask = new LinearGradientBrush
  151. {
  152. StartPoint = new RelativePoint(0, 0, RelativeUnit.Relative),
  153. EndPoint = new RelativePoint(1, 1, RelativeUnit.Relative),
  154. GradientStops =
  155. {
  156. new GradientStop(Color.FromUInt32(0xffffffff), 0),
  157. new GradientStop(Color.FromUInt32(0x00ffffff), 1)
  158. },
  159. };
  160. context.FillRectangle(
  161. Brushes.Red,
  162. new Rect(control.Bounds.Size),
  163. 4);
  164. using (context.PushOpacityMask(mask, new Rect(control.Bounds.Size)))
  165. {
  166. context.FillRectangle(
  167. Brushes.Blue,
  168. new Rect(control.Bounds.Size).Deflate(10),
  169. 4);
  170. }
  171. }),
  172. };
  173. await RenderToFile(target);
  174. CompareImages();
  175. }
  176. class CustomRenderer : Control
  177. {
  178. private Action<CustomRenderer, DrawingContext> _render;
  179. public CustomRenderer(Action<CustomRenderer, DrawingContext> render) => _render = render;
  180. public override void Render(DrawingContext context) => _render(this, context);
  181. }
  182. }
  183. }