This commit is contained in:
Přemysl Eric Janouch 2021-11-09 03:07:24 +01:00
parent 527a081f54
commit 4361fdd1be
Signed by: p
GPG Key ID: A0420B94F92B9493
1 changed files with 30 additions and 34 deletions

View File

@ -166,38 +166,29 @@ draw_item_border(FastivBrowser *self, cairo_t *cr, int width, int height)
cairo_matrix_t matrix;
cairo_pattern_set_extend(mask, CAIRO_EXTEND_PAD);
cairo_save(cr);
cairo_translate(cr, -g_item_border, -g_item_border);
cairo_rectangle(cr, 0, 0, g_item_border + width, g_item_border + height);
cairo_clip(cr);
cairo_mask(cr, mask);
cairo_restore(cr);
cairo_save(cr);
cairo_translate(cr, width + g_item_border, height + g_item_border);
cairo_rectangle(cr, 0, 0, -g_item_border - width, -g_item_border - height);
cairo_clip(cr);
cairo_matrix_init_scale(&matrix, -1, -1);
cairo_pattern_set_matrix(mask, &matrix);
cairo_scale(cr, -1, -1);
cairo_mask(cr, mask);
cairo_restore(cr);
cairo_pattern_set_extend(mask, CAIRO_EXTEND_NONE);
cairo_save(cr);
cairo_translate(cr, width + g_item_border, -g_item_border);
cairo_matrix_init_scale(&matrix, -1, 1);
cairo_matrix_translate(&matrix, -width - g_item_border, g_item_border);
cairo_pattern_set_matrix(mask, &matrix);
cairo_mask(cr, mask);
cairo_restore(cr);
cairo_save(cr);
cairo_translate(cr, -g_item_border, height + g_item_border);
cairo_matrix_init_scale(&matrix, 1, -1);
cairo_matrix_translate(&matrix, g_item_border, -height - g_item_border);
cairo_pattern_set_matrix(mask, &matrix);
cairo_mask(cr, mask);
cairo_restore(cr);
// TODO(p): Distinguish between an inner and outer border,
// don't override part of the glow.
@ -209,6 +200,31 @@ draw_item_border(FastivBrowser *self, cairo_t *cr, int width, int height)
cairo_pattern_destroy(mask);
}
static void
draw_row(FastivBrowser *self, cairo_t *cr, const Row *row)
{
for (Item *item = row->items; item->entry; item++) {
cairo_surface_t *thumbnail = item->entry->thumbnail;
int width = cairo_image_surface_get_width(thumbnail);
int height = cairo_image_surface_get_height(thumbnail);
int x = row->x_offset + item->x_offset;
int y = row->y_offset + g_row_height - height;
cairo_save(cr);
cairo_translate(cr, x, y);
draw_item_border(self, cr, width, height);
// TODO(p): See if a mild checkerboard pattern would not look nice.
cairo_rectangle(cr, 0, 0, width, height);
cairo_set_source_rgb(cr, .25, .25, .25);
cairo_fill(cr);
cairo_set_source_surface(cr, thumbnail, 0, 0);
cairo_paint(cr);
cairo_restore(cr);
}
}
// --- Boilerplate -------------------------------------------------------------
// TODO(p): For proper navigation, we need to implement GtkScrollable.
@ -313,28 +329,8 @@ fastiv_browser_draw(GtkWidget *widget, cairo_t *cr)
allocation.width, allocation.height);
for (guint i = 0; i < self->layouted_rows->len; i++) {
const Row *row = &g_array_index(self->layouted_rows, Row, i);
for (Item *item = row->items; item->entry; item++) {
cairo_surface_t *thumbnail = item->entry->thumbnail;
int width = cairo_image_surface_get_width(thumbnail);
int height = cairo_image_surface_get_height(thumbnail);
int x = row->x_offset + item->x_offset;
int y = row->y_offset + g_row_height - height;
// TODO(p): Test whether we need to render this first.
cairo_save(cr);
cairo_translate (cr, x, y);
draw_item_border(self, cr, width, height);
cairo_rectangle(cr, 0, 0, width, height);
cairo_set_source_rgb(cr, .25, .25, .25);
cairo_fill(cr);
cairo_set_source_surface(cr, thumbnail, 0, 0);
cairo_paint(cr);
cairo_restore(cr);
}
// TODO(p): Test whether we need to render the row first.
draw_row(self, cr, &g_array_index(self->layouted_rows, Row, i));
}
return TRUE;
}