render: implement coordinate-based anchor positioning

Not to be confused with Minecraft coordinates.

Signed-off-by: NotAShelf <raf@notashelf.dev>
Change-Id: Ifdb90fc92a1565ba1d30b85c91d6e1ab6a6a6964
This commit is contained in:
raf 2026-04-15 11:54:30 +03:00
commit dadba853e8
Signed by: NotAShelf
GPG key ID: 29D95B64378DB4BF
4 changed files with 168 additions and 85 deletions

View file

@ -113,20 +113,29 @@ static int assign_wallpaper_to_output(chroma_state_t *state,
chroma_scale_mode_t old_scale_mode = output->scale_mode;
chroma_filter_quality_t old_filter_quality = output->filter_quality;
chroma_anchor_t old_anchor = output->anchor;
float old_anchor_x = output->anchor_x;
float old_anchor_y = output->anchor_y;
bool had_config = output->config_loaded;
// Load configuration for this output (scale mode, filter quality, anchor)
// Load configuration for this output (scale mode, filter quality, anchor,
// anchor coords)
if (chroma_config_get_mapping_for_output(
&state->config, output->name ? output->name : "unknown",
&output->scale_mode, &output->filter_quality, &output->anchor) == CHROMA_OK) {
&output->scale_mode, &output->filter_quality, &output->anchor,
&output->anchor_x, &output->anchor_y) == CHROMA_OK) {
output->config_loaded = true;
chroma_log("DEBUG", "Loaded config for output %u: scale=%d, filter=%d, anchor=%d",
output->id, output->scale_mode, output->filter_quality, output->anchor);
chroma_log("DEBUG",
"Loaded config for output %u: scale=%d, filter=%d, anchor=%d @ "
"%.1f,%.1f",
output->id, output->scale_mode, output->filter_quality,
output->anchor, output->anchor_x, output->anchor_y);
// Check if configuration changed and invalidate texture if needed
if (had_config && (old_scale_mode != output->scale_mode ||
old_filter_quality != output->filter_quality ||
old_anchor != output->anchor)) {
if (had_config &&
(old_scale_mode != output->scale_mode ||
old_filter_quality != output->filter_quality ||
old_anchor != output->anchor || old_anchor_x != output->anchor_x ||
old_anchor_y != output->anchor_y)) {
chroma_output_invalidate_texture(output);
output->vbo_dirty = true; // VBO needs update for new scale mode
chroma_log("DEBUG",
@ -380,14 +389,16 @@ void chroma_log(const char *level, const char *format, ...) {
gettimeofday(&tv, NULL);
tm_info = localtime(&tv.tv_sec);
truncation_check = snprintf(timestamp, sizeof(timestamp), "%04d-%02d-%02d %02d:%02d:%02d.%03d",
tm_info->tm_year + 1900, tm_info->tm_mon + 1, tm_info->tm_mday,
tm_info->tm_hour, tm_info->tm_min, tm_info->tm_sec,
(int)(tv.tv_usec / 1000));
truncation_check =
snprintf(timestamp, sizeof(timestamp),
"%04d-%02d-%02d %02d:%02d:%02d.%03d", tm_info->tm_year + 1900,
tm_info->tm_mon + 1, tm_info->tm_mday, tm_info->tm_hour,
tm_info->tm_min, tm_info->tm_sec, (int)(tv.tv_usec / 1000));
if(truncation_check > 32 || truncation_check < 0) {
// Something went seriously wrong with the snprintf, this is a fairly serious error as
// the timestamp may be incomplete or corrupted, so print a warning
if (truncation_check > 32 || truncation_check < 0) {
// Something went seriously wrong with the snprintf, this is a fairly
// serious error as the timestamp may be incomplete or corrupted, so print a
// warning
printf("Following timestamp may be incomplete, truncated or corrupted!\n");
}
printf("[%s] %s: ", timestamp, level);