linuxOS_AP06/app/lvgl_demo/common/ui_scaler.c

71 lines
1.5 KiB
C
Raw Normal View History

2025-06-03 04:28:32 +00:00
#include <stdio.h>
#include <stdlib.h>
typedef struct
{
int width;
int height;
int refer_width;
int refer_height;
float scale_rate;
float match_rate;
} ui_scaler;
void *ui_scaler_new(int width, int height)
{
ui_scaler *scaler;
scaler = malloc(sizeof(ui_scaler));
if (!scaler) return NULL;
scaler->width = width;
scaler->height = height;
scaler->scale_rate = 1.0f;
scaler->match_rate = 0.5f;
return scaler;
}
void ui_scaler_set_refer_size(void *scaler, int width, int height)
{
ui_scaler *_scaler = (ui_scaler *)scaler;
float rate_hor, rate_ver;
if (!scaler) return;
rate_hor = (float)width / _scaler->width;
rate_ver = (float)height / _scaler->height;
_scaler->refer_width = width;
_scaler->refer_height = height;
_scaler->scale_rate = rate_hor * (1.0f - _scaler->match_rate) +
rate_ver * _scaler->match_rate;
printf("%d %d %f\n", width, height, _scaler->scale_rate);
}
void ui_scaler_set_match_rate(void *scaler, float rate)
{
ui_scaler *_scaler = (ui_scaler *)scaler;
if (!scaler) return;
_scaler->match_rate = rate;
ui_scaler_set_refer_size(scaler, _scaler->refer_width,
_scaler->refer_height);
}
int ui_scaler_calc(void *scaler, int value)
{
ui_scaler *_scaler = (ui_scaler *)scaler;
if (!scaler) return value;
return (int)(value * _scaler->scale_rate);
}
void ui_scaler_del(void *scaler)
{
free(scaler);
}