hello_stubs.c 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. #include <stdio.h>
  2. #include <stdbool.h>
  3. #include <caml/mlvalues.h>
  4. #include <cairo.h>
  5. #include <SDL2/SDL.h>
  6. #define SCREEN_WIDTH 800
  7. #define SCREEN_HEIGHT 600
  8. CAMLprim value
  9. caml_print_hello(value unit)
  10. {
  11. SDL_Rect screen_rect = {
  12. .x = 0, .y = 0,
  13. .w = SCREEN_WIDTH,
  14. .h = SCREEN_HEIGHT
  15. };
  16. SDL_Init(SDL_INIT_EVERYTHING);
  17. SDL_Window *const window = SDL_CreateWindow(
  18. "Multik",
  19. 100, 100,
  20. SCREEN_WIDTH, SCREEN_HEIGHT,
  21. SDL_WINDOW_SHOWN | SDL_WINDOW_RESIZABLE);
  22. SDL_Renderer *const renderer = SDL_CreateRenderer(
  23. window, -1,
  24. SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC);
  25. SDL_Texture *texture = SDL_CreateTexture(
  26. renderer,
  27. SDL_PIXELFORMAT_ARGB8888,
  28. SDL_TEXTUREACCESS_STREAMING,
  29. SCREEN_WIDTH, SCREEN_HEIGHT);
  30. float a = 0.0f;
  31. bool stop = false;
  32. SDL_Event event;
  33. /* TODO: FPS is not shown */
  34. while (!stop) {
  35. while (!stop && SDL_PollEvent(&event)) {
  36. switch (event.type) {
  37. case SDL_QUIT:
  38. stop = true;
  39. break;
  40. }
  41. }
  42. SDL_RenderClear(renderer);
  43. void *pixels;
  44. int pitch;
  45. SDL_LockTexture(texture, NULL, &pixels, &pitch);
  46. cairo_surface_t *surface =
  47. cairo_image_surface_create_for_data(
  48. pixels,
  49. CAIRO_FORMAT_ARGB32,
  50. SCREEN_WIDTH, SCREEN_HEIGHT, pitch);
  51. cairo_t *cr = cairo_create(surface);
  52. cairo_set_source_rgb (cr, 0, 0, 0);
  53. cairo_paint (cr);
  54. cairo_select_font_face(
  55. cr, "serif",
  56. CAIRO_FONT_SLANT_NORMAL,
  57. CAIRO_FONT_WEIGHT_BOLD);
  58. cairo_set_font_size(cr, 32.0);
  59. cairo_set_source_rgb(cr, 0.0, 1.0, 1.0);
  60. cairo_move_to(cr, 10.0, 50.0);
  61. cairo_show_text(cr, "4HEad");
  62. cairo_set_source_rgb(cr, 1.0, 0.0, 0.0);
  63. cairo_move_to(cr, 0.0, 0.0);
  64. cairo_curve_to(cr, 0.0 + a, SCREEN_HEIGHT + a,
  65. SCREEN_WIDTH - a, SCREEN_HEIGHT - a,
  66. SCREEN_WIDTH, 0.0);
  67. cairo_set_line_width(cr, 5);
  68. cairo_stroke(cr);
  69. cairo_destroy(cr);
  70. cairo_surface_destroy(surface);
  71. SDL_UnlockTexture(texture);
  72. SDL_RenderCopy(renderer, texture,
  73. &screen_rect,
  74. &screen_rect);
  75. SDL_RenderPresent(renderer);
  76. a += 1.0f;
  77. }
  78. SDL_DestroyTexture(texture);
  79. SDL_DestroyRenderer(renderer);
  80. SDL_DestroyWindow(window);
  81. SDL_Quit();
  82. return Val_unit;
  83. }