brewery
notashelf /
ebdc3fe08e4cdde737abc0080b067fd6c86e093c

chroma

public

Lightweight wallpaper daemon for Wayland

Star0tarball
clone
ssh://git@git.notashelf.dev:33/notashelf/chroma.git
src/transition.cC108 lines2.5 KB
1
#include <stdio.h>
2
#include <stdlib.h>
3
#include <string.h>
4
5
#include "../include/chroma.h"
6
7
void chroma_transition_init_output(chroma_output_t *output, int duration_ms) {
8
  if (!output) {
9
    return;
10
  }
11
12
  if (duration_ms <= 0) {
13
    chroma_log("DEBUG", "Transition skipped for output %u: duration_ms=%d",
14
               output->id, duration_ms);
15
    return;
16
  }
17
18
  output->transition_duration_ms = duration_ms;
19
  output->transition_start_ms = chroma_get_time_ms();
20
  output->in_transition = true;
21
22
  chroma_log("DEBUG", "Transition started for output %u: %dms", output->id,
23
             duration_ms);
24
}
25
26
void chroma_transition_cleanup_output(chroma_output_t *output) {
27
  if (!output) {
28
    return;
29
  }
30
31
  if (output->transition_prev) {
32
    free(output->transition_prev);
33
    output->transition_prev = NULL;
34
    output->transition_prev_size = 0;
35
  }
36
37
  output->in_transition = false;
38
  output->transition_start_ms = 0;
39
}
40
41
bool chroma_transition_is_active(chroma_output_t *output) {
42
  if (!output || !output->in_transition) {
43
    return false;
44
  }
45
46
  long long now = chroma_get_time_ms();
47
  long long elapsed = now - output->transition_start_ms;
48
49
  if (elapsed >= output->transition_duration_ms) {
50
    chroma_transition_cleanup_output(output);
51
    return false;
52
  }
53
54
  return true;
55
}
56
57
float chroma_transition_get_alpha(chroma_output_t *output,
58
                                  long long current_time_ms) {
59
  if (!output || !output->in_transition) {
60
    return 1.0f;
61
  }
62
63
  long long elapsed = current_time_ms - output->transition_start_ms;
64
  if (elapsed <= 0)
65
    return 0.0f;
66
  if (elapsed >= output->transition_duration_ms)
67
    return 1.0f;
68
69
  float alpha = (float)elapsed / (float)output->transition_duration_ms;
70
  return alpha;
71
}
72
73
bool chroma_transition_needs_redraw(chroma_state_t *state) {
74
  if (!state) {
75
    return false;
76
  }
77
78
  for (int i = 0; i < state->output_count; i++) {
79
    if (chroma_transition_is_active(&state->outputs[i])) {
80
      return true;
81
    }
82
  }
83
84
  return false;
85
}
86
87
int chroma_transition_update_outputs(chroma_state_t *state) {
88
  if (!state) {
89
    return CHROMA_ERROR_INIT;
90
  }
91
92
  int updated = 0;
93
  for (int i = 0; i < state->output_count; i++) {
94
    chroma_output_t *output = &state->outputs[i];
95
    if (chroma_transition_is_active(output)) {
96
      int ret = chroma_render_wallpaper(state, output);
97
      if (ret == CHROMA_OK) {
98
        updated++;
99
      }
100
    }
101
  }
102
103
  if (updated > 0) {
104
    chroma_log("DEBUG", "Transition frames rendered: %d outputs", updated);
105
  }
106
107
  return CHROMA_OK;
108
}