SkCanvas.cs 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214
  1. using System;
  2. using System.Runtime.InteropServices;
  3. using QuestPDF.Skia.Text;
  4. namespace QuestPDF.Skia;
  5. internal sealed class SkCanvas : IDisposable
  6. {
  7. public IntPtr Instance { get; private set; }
  8. private bool DisposeNativeObject { get; }
  9. public SkCanvas(IntPtr instance, bool disposeNativeObject = true)
  10. {
  11. Instance = instance;
  12. SkiaAPI.EnsureNotNull(Instance);
  13. DisposeNativeObject = disposeNativeObject;
  14. }
  15. public static SkCanvas CreateFromBitmap(SkBitmap bitmap)
  16. {
  17. var instance = API.canvas_create_from_bitmap(bitmap.Instance);
  18. return new SkCanvas(instance);
  19. }
  20. public void Save()
  21. {
  22. API.canvas_save(Instance);
  23. }
  24. public void Restore()
  25. {
  26. API.canvas_restore(Instance);
  27. }
  28. public void Translate(float x, float y)
  29. {
  30. API.canvas_translate(Instance, x, y);
  31. }
  32. public void Scale(float factorX, float factorY)
  33. {
  34. API.canvas_scale(Instance, factorX, factorY);
  35. }
  36. public void Rotate(float degrees)
  37. {
  38. API.canvas_rotate(Instance, degrees);
  39. }
  40. public void DrawFilledRectangle(SkRect position, uint color)
  41. {
  42. API.canvas_draw_filled_rectangle(Instance, position, color);
  43. }
  44. public void DrawStrokeRectangle(SkRect position, float strokeWidth, uint strokeColor)
  45. {
  46. API.canvas_draw_stroke_rectangle(Instance, position, strokeWidth, strokeColor);
  47. }
  48. public void DrawImage(SkImage image, float width, float height)
  49. {
  50. API.canvas_draw_image(Instance, image.Instance, width, height);
  51. }
  52. public void DrawPicture(SkPicture picture)
  53. {
  54. API.canvas_draw_picture(Instance, picture.Instance);
  55. }
  56. public void DrawParagraph(SkParagraph paragraph)
  57. {
  58. API.canvas_draw_paragraph(Instance, paragraph.Instance);
  59. }
  60. public void DrawSvgPath(string svg, uint color)
  61. {
  62. API.canvas_draw_svg_path(Instance, svg, color);
  63. }
  64. public void DrawSvg(SkSvgImage svgImage, float width, float height)
  65. {
  66. API.canvas_draw_svg(Instance, svgImage.Instance, width, height);
  67. }
  68. /// <summary>
  69. /// draws stripe pattern (red lines at 45 deegree angle)
  70. /// </summary>
  71. public void DrawOverflowArea(SkRect position)
  72. {
  73. API.canvas_draw_overflow_area(Instance, position);
  74. }
  75. public void ClipOverflowArea(SkRect availableSpace, SkRect requiredSpace)
  76. {
  77. API.canvas_clip_overflow_area(Instance, availableSpace, requiredSpace);
  78. }
  79. public void ClipRectangle(SkRect clipArea)
  80. {
  81. API.canvas_clip_rectangle(Instance, clipArea);
  82. }
  83. public void AnnotateUrl(float width, float height, string url)
  84. {
  85. API.canvas_annotate_url(Instance, width, height, url);
  86. }
  87. public void AnnotateDestination(string destinationName)
  88. {
  89. API.canvas_annotate_destination(Instance, destinationName);
  90. }
  91. public void AnnotateDestinationLink(float width, float height, string destinationName)
  92. {
  93. API.canvas_annotate_destination_link(Instance, width, height, destinationName);
  94. }
  95. public CanvasMatrix GetCurrentTotalMatrix()
  96. {
  97. return API.canvas_get_matrix(Instance);
  98. }
  99. ~SkCanvas()
  100. {
  101. Dispose();
  102. }
  103. public void Dispose()
  104. {
  105. if (Instance == IntPtr.Zero)
  106. return;
  107. if (DisposeNativeObject)
  108. API.canvas_delete(Instance);
  109. Instance = IntPtr.Zero;
  110. }
  111. public struct CanvasMatrix
  112. {
  113. public float ScaleX;
  114. public float TranslateX;
  115. public float ScaleY;
  116. public float TranslateY;
  117. }
  118. private static class API
  119. {
  120. [DllImport(SkiaAPI.LibraryName, CallingConvention = CallingConvention.Cdecl)]
  121. public static extern IntPtr canvas_create_from_bitmap(IntPtr bitmap);
  122. [DllImport(SkiaAPI.LibraryName, CallingConvention = CallingConvention.Cdecl)]
  123. public static extern void canvas_delete(IntPtr canvas);
  124. [DllImport(SkiaAPI.LibraryName, CallingConvention = CallingConvention.Cdecl)]
  125. public static extern void canvas_save(IntPtr canvas);
  126. [DllImport(SkiaAPI.LibraryName, CallingConvention = CallingConvention.Cdecl)]
  127. public static extern void canvas_restore(IntPtr canvas);
  128. [DllImport(SkiaAPI.LibraryName, CallingConvention = CallingConvention.Cdecl)]
  129. public static extern void canvas_translate(IntPtr canvas, float x, float y);
  130. [DllImport(SkiaAPI.LibraryName, CallingConvention = CallingConvention.Cdecl)]
  131. public static extern void canvas_rotate(IntPtr canvas, float angle);
  132. [DllImport(SkiaAPI.LibraryName, CallingConvention = CallingConvention.Cdecl)]
  133. public static extern void canvas_scale(IntPtr canvas, float factorX, float factorY);
  134. [DllImport(SkiaAPI.LibraryName, CallingConvention = CallingConvention.Cdecl)]
  135. public static extern void canvas_draw_image(IntPtr canvas, IntPtr image, float width, float height);
  136. [DllImport(SkiaAPI.LibraryName, CallingConvention = CallingConvention.Cdecl)]
  137. public static extern void canvas_draw_picture(IntPtr canvas, IntPtr picture);
  138. [DllImport(SkiaAPI.LibraryName, CallingConvention = CallingConvention.Cdecl)]
  139. public static extern void canvas_draw_filled_rectangle(IntPtr canvas, SkRect position, uint color);
  140. [DllImport(SkiaAPI.LibraryName, CallingConvention = CallingConvention.Cdecl)]
  141. public static extern void canvas_draw_stroke_rectangle(IntPtr canvas, SkRect position, float strokeWidth, uint color);
  142. [DllImport(SkiaAPI.LibraryName, CallingConvention = CallingConvention.Cdecl)]
  143. public static extern void canvas_draw_paragraph(IntPtr canvas, IntPtr paragraph);
  144. [DllImport(SkiaAPI.LibraryName, CallingConvention = CallingConvention.Cdecl)]
  145. public static extern void canvas_draw_svg_path(IntPtr canvas, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(Utf8StringMarshaller))] string svg, uint color);
  146. [DllImport(SkiaAPI.LibraryName, CallingConvention = CallingConvention.Cdecl)]
  147. public static extern void canvas_draw_svg(IntPtr canvas, IntPtr svg, float width, float height);
  148. [DllImport(SkiaAPI.LibraryName, CallingConvention = CallingConvention.Cdecl)]
  149. public static extern void canvas_draw_overflow_area(IntPtr canvas, SkRect position);
  150. [DllImport(SkiaAPI.LibraryName, CallingConvention = CallingConvention.Cdecl)]
  151. public static extern void canvas_clip_overflow_area(IntPtr canvas, SkRect availableSpace, SkRect requiredSpace);
  152. [DllImport(SkiaAPI.LibraryName, CallingConvention = CallingConvention.Cdecl)]
  153. public static extern void canvas_clip_rectangle(IntPtr canvas, SkRect clipArea);
  154. [DllImport(SkiaAPI.LibraryName, CallingConvention = CallingConvention.Cdecl)]
  155. public static extern void canvas_annotate_url(IntPtr canvas, float width, float height, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(Utf8StringMarshaller))] string url);
  156. [DllImport(SkiaAPI.LibraryName, CallingConvention = CallingConvention.Cdecl)]
  157. public static extern void canvas_annotate_destination(IntPtr canvas, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(Utf8StringMarshaller))] string destinationName);
  158. [DllImport(SkiaAPI.LibraryName, CallingConvention = CallingConvention.Cdecl)]
  159. public static extern void canvas_annotate_destination_link(IntPtr canvas, float width, float height, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(Utf8StringMarshaller))] string destinationName);
  160. [DllImport(SkiaAPI.LibraryName, CallingConvention = CallingConvention.Cdecl)]
  161. public static extern CanvasMatrix canvas_get_matrix(IntPtr canvas);
  162. }
  163. }