drawing.mod 2.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. MODULE drawing ;
  2. (*
  3. m2-GTK4 example - drawing with GtkDrawingArea, Cairo and Pango.
  4. Draws a filled circle, a line and a Pango text layout.
  5. Build: make examples
  6. Run: ./build/examples/drawing
  7. *)
  8. FROM Gio IMPORT g_application_run;
  9. FROM GtkApplication IMPORT gtk_application_new;
  10. FROM GtkWindow IMPORT gtk_application_window_new, gtk_window_set_title,
  11. gtk_window_set_default_size, gtk_window_set_child, gtk_window_present;
  12. FROM GtkDrawingArea IMPORT gtk_drawing_area_new,
  13. gtk_drawing_area_set_content_width,
  14. gtk_drawing_area_set_content_height, gtk_drawing_area_set_draw_func;
  15. FROM Cairo IMPORT cairo_set_source_rgb, cairo_rectangle, cairo_fill,
  16. cairo_arc, cairo_set_line_width, cairo_stroke, cairo_move_to, cairo_line_to;
  17. FROM Pango IMPORT pango_font_description_from_string,
  18. pango_font_description_free, pango_layout_set_text,
  19. pango_layout_set_font_description;
  20. FROM PangoCairo IMPORT pango_cairo_create_layout, pango_cairo_show_layout;
  21. FROM GObject IMPORT g_object_unref;
  22. FROM GtkClosures IMPORT Connect2;
  23. FROM SYSTEM IMPORT ADDRESS, ADR;
  24. FROM libc IMPORT printf;
  25. CONST
  26. AppId = "org.example.m2gtk4.Drawing";
  27. PROCEDURE Draw (area: ADDRESS; cr: ADDRESS; width, height: INTEGER;
  28. data: ADDRESS);
  29. VAR
  30. layout, desc: ADDRESS;
  31. BEGIN
  32. cairo_set_source_rgb(cr, 0.95, 0.95, 0.97);
  33. cairo_rectangle(cr, 0.0, 0.0, VAL(REAL, width), VAL(REAL, height));
  34. cairo_fill(cr);
  35. cairo_set_source_rgb(cr, 0.20, 0.50, 0.90);
  36. cairo_arc(cr, 80.0, 80.0, 50.0, 0.0, 6.2831853);
  37. cairo_fill(cr);
  38. cairo_set_source_rgb(cr, 0.90, 0.20, 0.20);
  39. cairo_set_line_width(cr, 6.0);
  40. cairo_move_to(cr, 150.0, 40.0);
  41. cairo_line_to(cr, 330.0, 140.0);
  42. cairo_stroke(cr);
  43. layout := pango_cairo_create_layout(cr);
  44. desc := pango_font_description_from_string("Sans Bold 18");
  45. pango_layout_set_font_description(layout, desc);
  46. pango_font_description_free(desc);
  47. pango_layout_set_text(layout, "Cairo + Pango from Modula-2", -1);
  48. cairo_set_source_rgb(cr, 0.10, 0.10, 0.10);
  49. cairo_move_to(cr, 20.0, 160.0);
  50. pango_cairo_show_layout(cr, layout);
  51. g_object_unref(layout)
  52. END Draw;
  53. PROCEDURE OnActivate (application: ADDRESS; data: ADDRESS);
  54. VAR
  55. window, area: ADDRESS;
  56. BEGIN
  57. area := gtk_drawing_area_new();
  58. gtk_drawing_area_set_content_width(area, 360);
  59. gtk_drawing_area_set_content_height(area, 200);
  60. gtk_drawing_area_set_draw_func(area, ADR(Draw), NIL, NIL);
  61. window := gtk_application_window_new(application);
  62. gtk_window_set_title(window, "m2-GTK4 Drawing");
  63. gtk_window_set_default_size(window, 400, 240);
  64. gtk_window_set_child(window, area);
  65. gtk_window_present(window)
  66. END OnActivate;
  67. VAR
  68. app: ADDRESS;
  69. BEGIN
  70. app := gtk_application_new(AppId, 0);
  71. IF app = NIL THEN
  72. printf("gtk_application_new failed\n");
  73. HALT(1)
  74. END;
  75. Connect2(app, "activate", OnActivate, NIL);
  76. g_application_run(app, 0, NIL)
  77. END drawing.