summaryrefslogtreecommitdiff
path: root/applications/goldman/source/main.cpp
blob: d74eaada5f616372e4f751a177b15c59acc56b5e (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
#include <daguerre/framebuffer.hpp>
#include <daguerre/ppm.hpp>

daguerre::hilbert_color trans_color;

void convert_pointer(
  daguerre::hilbert_color &dest, const daguerre::hilbert_color &src) {
  if (src != trans_color)
    dest = src;
}

int main(int, char **) {

  trans_color = euler::syscall::encode_color(0xff, 0x00, 0xff);

  daguerre::image<daguerre::hilbert_color> framebuffer =
    daguerre::get_hilbert_framebuffer();

  int fw = framebuffer.width;
  int fh = framebuffer.height;

  daguerre::image<daguerre::hilbert_color> double_buffer(fw, fh);

  std::optional<daguerre::image<daguerre::hilbert_color>>
    background_original = daguerre::try_load_ppm("/assets/background.ppm");

  daguerre::image<daguerre::hilbert_color> background;

  if (background_original.has_value())
    background = background_original->stretch(fw, fh);
  else {
    background = daguerre::image<daguerre::hilbert_color>(fw, fh);
    background.fill(euler::syscall::encode_color(0, 0, 0));
  }

  std::optional<daguerre::image<daguerre::hilbert_color>>
    pointer_original = daguerre::try_load_ppm("/assets/pointer.ppm");

  if (!pointer_original.has_value())
    //TODO
    while (1)
      ;

  daguerre::image<daguerre::hilbert_color>
    pointer = std::move(*pointer_original);

  int mouse_x = fw / 2;
  int mouse_y = fh / 2;

  while (true) {

    double_buffer.copy_from(background, 0, 0);
    double_buffer.convert_from(pointer, mouse_x, mouse_y, 0, 0,
      std::min(pointer. width, double_buffer. width - mouse_x),
      std::min(pointer.height, double_buffer.height - mouse_y),
      &convert_pointer);

    framebuffer.copy_from(double_buffer, 0, 0);

    auto result = euler::syscall::get_input_packet();
    if (std::holds_alternative<euler::syscall::mouse_packet>(result)) {
      const auto &packet = std::get<euler::syscall::mouse_packet>(result);
      mouse_x += packet.x_changed;
      mouse_y += packet.y_changed;
      if (mouse_x < 0)
        mouse_x = 0;
      else if (mouse_x >= fw)
        mouse_x = fw - 1;
      if (mouse_y < 0)
        mouse_y = 0;
      else if (mouse_y >= fh)
        mouse_y = fh - 1;
    }

  }

  return 0;

}