test_cairo.mod 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. MODULE test_cairo ;
  2. (*
  3. m2-GTK4 test - Cairo + Pango on an off-screen image surface.
  4. Draws a filled rectangle and lays out text, checks the surface/text
  5. extents, and writes a PNG (build/m2cairo.png). Needs no display.
  6. *)
  7. FROM Cairo IMPORT cairo_image_surface_create, cairo_create, cairo_destroy,
  8. cairo_surface_destroy, cairo_surface_status, cairo_status,
  9. cairo_set_source_rgb, cairo_rectangle, cairo_fill,
  10. cairo_surface_write_to_png, CairoFormatARGB32;
  11. FROM Pango IMPORT pango_font_description_from_string,
  12. pango_font_description_free, pango_layout_set_text,
  13. pango_layout_set_font_description, pango_layout_get_pixel_size,
  14. pango_layout_get_pixel_extents, PangoRectangle;
  15. FROM PangoCairo IMPORT pango_cairo_create_layout, pango_cairo_show_layout;
  16. FROM GObject IMPORT g_object_unref;
  17. FROM SYSTEM IMPORT ADDRESS;
  18. FROM libc IMPORT printf;
  19. VAR
  20. failed: BOOLEAN;
  21. PROCEDURE Check (condition: BOOLEAN; what: ARRAY OF CHAR);
  22. BEGIN
  23. IF NOT condition THEN
  24. printf("FAIL: %s\n", what);
  25. failed := TRUE
  26. END
  27. END Check;
  28. VAR
  29. surface, cr, layout, desc: ADDRESS;
  30. ink, logical: PangoRectangle;
  31. w, h: INTEGER;
  32. BEGIN
  33. failed := FALSE;
  34. surface := cairo_image_surface_create(CairoFormatARGB32, 200, 100);
  35. Check(cairo_surface_status(surface) = 0, "image surface status");
  36. cr := cairo_create(surface);
  37. Check(cairo_status(cr) = 0, "cairo context status");
  38. cairo_set_source_rgb(cr, 0.20, 0.40, 0.80);
  39. cairo_rectangle(cr, 10.0, 10.0, 180.0, 80.0);
  40. cairo_fill(cr);
  41. layout := pango_cairo_create_layout(cr);
  42. desc := pango_font_description_from_string("Sans 14");
  43. pango_layout_set_font_description(layout, desc);
  44. pango_font_description_free(desc);
  45. pango_layout_set_text(layout, "Hello Pango", -1);
  46. pango_layout_get_pixel_size(layout, w, h);
  47. Check((w > 0) AND (h > 0), "layout pixel size > 0");
  48. pango_layout_get_pixel_extents(layout, ink, logical);
  49. Check(logical.width > 0, "logical extent width > 0");
  50. cairo_set_source_rgb(cr, 0.0, 0.0, 0.0);
  51. pango_cairo_show_layout(cr, layout);
  52. Check(cairo_surface_write_to_png(surface, "/tmp/opencode/m2cairo.png") = 0,
  53. "write PNG");
  54. g_object_unref(layout);
  55. cairo_destroy(cr);
  56. cairo_surface_destroy(surface);
  57. IF failed THEN
  58. printf("test_cairo: FAIL\n");
  59. HALT(1)
  60. ELSE
  61. printf("test_cairo: PASS\n");
  62. HALT(0)
  63. END
  64. END test_cairo.