1
0
mirror of https://codeberg.org/vyivel/dulcepan/ synced 2025-03-12 18:59:15 +02:00

implement png compression levels

This commit is contained in:
psykose 2024-06-19 20:07:06 +02:00 committed by Kirill Primak
parent 3f7609a5d3
commit 7652fb16bd
4 changed files with 15 additions and 2 deletions

View File

@ -11,3 +11,6 @@ border-size = 2
# If true, dulcepan will save immediately when interactive selection is stopped # If true, dulcepan will save immediately when interactive selection is stopped
# or when a whole output is selected with a mouse button. # or when a whole output is selected with a mouse button.
quick-select = false quick-select = false
# PNG (zlib) compression level, 0-9
png-compression = 6

View File

@ -76,6 +76,7 @@ void dp_config_load(struct dp_config *config, const char *user_path) {
*config = (struct dp_config){ *config = (struct dp_config){
.border_size = 2, .border_size = 2,
.png_compression = 6,
.quick_select = false, .quick_select = false,
}; };
bytes_to_color((uint32_t[]){0xff, 0xff, 0xff, 0x40}, &config->unselected_color); bytes_to_color((uint32_t[]){0xff, 0xff, 0xff, 0x40}, &config->unselected_color);
@ -168,6 +169,12 @@ void dp_config_load(struct dp_config *config, const char *user_path) {
load_color(value, line_idx, &config->border_color); load_color(value, line_idx, &config->border_color);
} else if (strcmp(key, "border-size") == 0) { } else if (strcmp(key, "border-size") == 0) {
load_int(value, line_idx, &config->border_size); load_int(value, line_idx, &config->border_size);
} else if (strcmp(key, "png-compression") == 0) {
load_int(value, line_idx, &config->png_compression);
if (config->png_compression > 9) {
dp_log_fatal(
"Config: invalid value %d for png-compression", config->png_compression);
}
} else if (strcmp(key, "quick-select") == 0) { } else if (strcmp(key, "quick-select") == 0) {
load_bool(value, line_idx, &config->quick_select); load_bool(value, line_idx, &config->quick_select);
} else { } else {

View File

@ -105,6 +105,7 @@ struct dp_config {
pixman_color_t selected_color; pixman_color_t selected_color;
pixman_color_t border_color; pixman_color_t border_color;
int border_size; // 0 if disabled int border_size; // 0 if disabled
int png_compression;
bool quick_select; bool quick_select;
}; };

View File

@ -61,7 +61,7 @@ static pixman_format_code_t shm_to_pixman(enum wl_shm_format shm_format) {
return 0; // Unreachable, actually return 0; // Unreachable, actually
} }
static void write_png(FILE *fp, pixman_image_t *image, int width, int height) { static void write_png(FILE *fp, pixman_image_t *image, int width, int height, int level) {
void *data = pixman_image_get_data(image); void *data = pixman_image_get_data(image);
size_t size = (size_t)(width * height * 4); size_t size = (size_t)(width * height * 4);
@ -75,6 +75,7 @@ static void write_png(FILE *fp, pixman_image_t *image, int width, int height) {
spng_set_ihdr(spng_ctx, &ihdr); spng_set_ihdr(spng_ctx, &ihdr);
spng_set_png_file(spng_ctx, fp); spng_set_png_file(spng_ctx, fp);
spng_set_option(spng_ctx, SPNG_IMG_COMPRESSION_LEVEL, level);
int err = spng_encode_image(spng_ctx, data, size, SPNG_FMT_PNG, SPNG_ENCODE_FINALIZE); int err = spng_encode_image(spng_ctx, data, size, SPNG_FMT_PNG, SPNG_ENCODE_FINALIZE);
if (err != 0) { if (err != 0) {
@ -158,7 +159,8 @@ void dp_save(struct dp_state *state) {
case DP_FILE_UNKNOWN: case DP_FILE_UNKNOWN:
abort(); // Unreachable abort(); // Unreachable
case DP_FILE_PNG: case DP_FILE_PNG:
write_png(fp, out_image, selection->width, selection->height); write_png(
fp, out_image, selection->width, selection->height, state->config.png_compression);
break; break;
case DP_FILE_PPM: case DP_FILE_PPM:
write_ppm(fp, out_image, selection->width, selection->height); write_ppm(fp, out_image, selection->width, selection->height);