test_snapshot.mod 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. MODULE test_snapshot ;
  2. (*
  3. m2-GTK4 test - a GdkPaintable whose snapshot uses GtkSnapshot and
  4. Graphene from Modula-2 (via the shim). Requires a display.
  5. *)
  6. FROM Gio IMPORT g_application_run, g_application_quit;
  7. FROM GtkApplication IMPORT gtk_application_new;
  8. FROM GtkWindow IMPORT gtk_application_window_new, gtk_window_set_child,
  9. gtk_window_present;
  10. FROM GtkPicture IMPORT gtk_picture_new, gtk_picture_set_paintable;
  11. FROM GtkWidget IMPORT gtk_widget_set_size_request;
  12. FROM M2GtkShim IMPORT m2_snapshot_paintable_new;
  13. FROM GtkSnapshot IMPORT gtk_snapshot_append_color,
  14. gtk_snapshot_append_cairo;
  15. FROM Graphene IMPORT GrapheneRect, graphene_rect_init;
  16. FROM Gdk IMPORT GdkRGBA;
  17. FROM Cairo IMPORT cairo_set_source_rgb, cairo_rectangle, cairo_fill,
  18. cairo_destroy;
  19. FROM GLib IMPORT g_timeout_add, GSourceRemove;
  20. FROM GtkUtils IMPORT Connect;
  21. FROM SYSTEM IMPORT ADDRESS, ADR;
  22. FROM libc IMPORT printf;
  23. CONST
  24. AppId = "org.example.m2gtk4.TestSnapshot";
  25. VAR
  26. app: ADDRESS;
  27. passed, drew: BOOLEAN;
  28. (* void draw(GtkSnapshot *snapshot, int width, int height, gpointer user) *)
  29. PROCEDURE Draw (snapshot: ADDRESS; width, height: INTEGER; user: ADDRESS);
  30. VAR
  31. rect: GrapheneRect;
  32. color: GdkRGBA;
  33. cr: ADDRESS;
  34. BEGIN
  35. drew := TRUE;
  36. graphene_rect_init(rect, 0.0, 0.0, VAL(REAL, width), VAL(REAL, height));
  37. color.red := 0.16;
  38. color.green := 0.50;
  39. color.blue := 0.72;
  40. color.alpha := 1.0;
  41. gtk_snapshot_append_color(snapshot, color, rect);
  42. cr := gtk_snapshot_append_cairo(snapshot, rect);
  43. IF cr # NIL THEN
  44. cairo_set_source_rgb(cr, 1.0, 1.0, 1.0);
  45. cairo_rectangle(cr, 8.0, 8.0, 24.0, 24.0);
  46. cairo_fill(cr);
  47. cairo_destroy(cr)
  48. END
  49. END Draw;
  50. PROCEDURE AfterMap (data: ADDRESS) : INTEGER;
  51. BEGIN
  52. IF NOT drew THEN
  53. printf("snapshot draw did not run\n");
  54. passed := FALSE
  55. END;
  56. g_application_quit(app);
  57. RETURN GSourceRemove
  58. END AfterMap;
  59. PROCEDURE OnActivate (application: ADDRESS; data: ADDRESS);
  60. VAR
  61. window, picture, paintable: ADDRESS;
  62. BEGIN
  63. drew := FALSE;
  64. paintable := m2_snapshot_paintable_new(ADR(Draw), 80, 60, NIL, NIL);
  65. picture := gtk_picture_new();
  66. gtk_picture_set_paintable(picture, paintable);
  67. gtk_widget_set_size_request(picture, 80, 60);
  68. window := gtk_application_window_new(application);
  69. gtk_window_set_child(window, picture);
  70. gtk_window_present(window);
  71. passed := TRUE;
  72. g_timeout_add(300, AfterMap, NIL)
  73. END OnActivate;
  74. VAR
  75. rc: INTEGER;
  76. BEGIN
  77. passed := FALSE;
  78. app := gtk_application_new(AppId, 0);
  79. IF app = NIL THEN
  80. printf("test_snapshot: FAIL (no app)\n");
  81. HALT(1)
  82. END;
  83. Connect(app, "activate", ADR(OnActivate), NIL);
  84. rc := g_application_run(app, 0, NIL);
  85. IF passed THEN
  86. printf("test_snapshot: PASS\n");
  87. HALT(0)
  88. ELSE
  89. printf("test_snapshot: FAIL\n");
  90. HALT(1)
  91. END
  92. END test_snapshot.