diff --git a/sixel.c b/sixel.c index 4bb7a28e..fdad65a9 100644 --- a/sixel.c +++ b/sixel.c @@ -37,14 +37,22 @@ sixel_init(struct terminal *term) /* TODO: default palette */ } +void +sixel_destroy(struct sixel *sixel) +{ + pixman_image_unref(sixel->pix); + free(sixel->data); + + sixel->pix = NULL; + sixel->data = NULL; +} + void sixel_unhook(struct terminal *term) { free(term->sixel.palette); term->sixel.palette = NULL; - LOG_DBG("generating %dx%d pixman image", term->sixel.row * 6, term->sixel.max_col); - if (term->sixel.col > term->sixel.max_col) term->sixel.max_col = term->sixel.col; term->sixel.row++; @@ -58,6 +66,8 @@ sixel_unhook(struct terminal *term) .pos = (struct coord){term->cursor.point.col, term->grid->offset + term->cursor.point.row}, }; + LOG_DBG("generating %dx%d pixman image", image.width, image.height); + image.pix = pixman_image_create_bits_no_clear( PIXMAN_a8r8g8b8, image.width, image.height, @@ -66,8 +76,7 @@ sixel_unhook(struct terminal *term) tll_foreach(term->sixel_images, it) { if (it->item.pos.row == image.pos.row) { - pixman_image_unref(it->item.pix); - free(it->item.data); + sixel_destroy(&it->item); tll_remove(term->sixel_images, it); } } diff --git a/sixel.h b/sixel.h index 0cb24bfe..5933cf81 100644 --- a/sixel.h +++ b/sixel.h @@ -5,3 +5,5 @@ void sixel_init(struct terminal *term); void sixel_put(struct terminal *term, uint8_t c); void sixel_unhook(struct terminal *term); + +void sixel_destroy(struct sixel *sixel); diff --git a/terminal.c b/terminal.c index c6c349c3..cb7c08e9 100644 --- a/terminal.c +++ b/terminal.c @@ -19,12 +19,13 @@ #include "log.h" #include "async.h" +#include "config.h" #include "grid.h" #include "render.h" -#include "vt.h" #include "selection.h" -#include "config.h" +#include "sixel.h" #include "slave.h" +#include "vt.h" #define min(x, y) ((x) < (y) ? (x) : (y)) #define max(x, y) ((x) > (y) ? (x) : (y)) @@ -994,10 +995,8 @@ term_destroy(struct terminal *term) tll_free(term->ptmx_buffer); tll_free(term->tab_stops); - tll_foreach(term->sixel_images, it) { - pixman_image_unref(it->item.pix); - free(it->item.data); - } + tll_foreach(term->sixel_images, it) + sixel_destroy(&it->item); tll_free(term->sixel_images); free(term->foot_exe); @@ -1538,8 +1537,7 @@ term_scroll_partial(struct terminal *term, struct scroll_region region, int rows int new_row = (term->grid->offset + r) & (term->grid->num_rows - 1); if (img_top_row == new_row) { - pixman_image_unref(it->item.pix); - free(it->item.data); + sixel_destroy(&it->item); tll_remove(term->sixel_images, it); } } @@ -1605,8 +1603,7 @@ term_scroll_reverse_partial(struct terminal *term, int new_row = (term->grid->offset + r) & (term->grid->num_rows - 1); if (img_bottom_row == new_row) { - pixman_image_unref(it->item.pix); - free(it->item.data); + sixel_destroy(&it->item); tll_remove(term->sixel_images, it); } }