Split background drawing from render_layout
This commit is contained in:
parent
562dbe3918
commit
781267f30d
71
src/draw.c
71
src/draw.c
@ -380,6 +380,40 @@ static void free_layouts(GSList *layouts)
|
|||||||
g_slist_free_full(layouts, free_colored_layout);
|
g_slist_free_full(layouts, free_colored_layout);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static cairo_surface_t *render_background(cairo_surface_t *srf, colored_layout *cl, colored_layout *cl_next, int y, int width, int height, bool first, bool last)
|
||||||
|
{
|
||||||
|
int x = 0;
|
||||||
|
|
||||||
|
cairo_t *c = cairo_create(srf);
|
||||||
|
|
||||||
|
if (first) height += settings.frame_width;
|
||||||
|
if (last) height += settings.frame_width;
|
||||||
|
else height += settings.separator_height;
|
||||||
|
|
||||||
|
cairo_set_source_rgb(c, cl->frame.r, cl->frame.g, cl->frame.b);
|
||||||
|
cairo_rectangle(c, x, y, width, height);
|
||||||
|
cairo_fill(c);
|
||||||
|
|
||||||
|
/* adding frame */
|
||||||
|
x += settings.frame_width;
|
||||||
|
if (first) {
|
||||||
|
y += settings.frame_width;
|
||||||
|
height -= settings.frame_width;
|
||||||
|
}
|
||||||
|
width -= 2 * settings.frame_width;
|
||||||
|
if (last)
|
||||||
|
height -= settings.frame_width;
|
||||||
|
else
|
||||||
|
height -= settings.separator_height;
|
||||||
|
|
||||||
|
cairo_set_source_rgb(c, cl->bg.r, cl->bg.g, cl->bg.b);
|
||||||
|
cairo_rectangle(c, x, y, width, height);
|
||||||
|
cairo_fill(c);
|
||||||
|
|
||||||
|
cairo_destroy(c);
|
||||||
|
return cairo_surface_create_for_rectangle(srf, x, y, width, height);
|
||||||
|
}
|
||||||
|
|
||||||
static struct dimensions layout_render(cairo_surface_t *srf, colored_layout *cl, colored_layout *cl_next, struct dimensions dim, bool first, bool last)
|
static struct dimensions layout_render(cairo_surface_t *srf, colored_layout *cl, colored_layout *cl_next, struct dimensions dim, bool first, bool last)
|
||||||
{
|
{
|
||||||
int h;
|
int h;
|
||||||
@ -390,38 +424,17 @@ static struct dimensions layout_render(cairo_surface_t *srf, colored_layout *cl,
|
|||||||
h = MAX(cairo_image_surface_get_height(cl->icon), h);
|
h = MAX(cairo_image_surface_get_height(cl->icon), h);
|
||||||
}
|
}
|
||||||
|
|
||||||
int bg_x = 0;
|
|
||||||
int bg_y = dim.y;
|
|
||||||
int bg_width = dim.w;
|
|
||||||
int bg_height = MAX(settings.notification_height, (2 * settings.padding) + h);
|
int bg_height = MAX(settings.notification_height, (2 * settings.padding) + h);
|
||||||
double bg_half_height = settings.notification_height/2.0;
|
double bg_half_height = settings.notification_height/2.0;
|
||||||
int pango_offset = (int) floor(h/2.0);
|
int pango_offset = (int) floor(h/2.0);
|
||||||
|
|
||||||
cairo_t *c = cairo_create(srf);
|
cairo_surface_t *content = render_background(srf, cl, cl_next, dim.y, dim.w, bg_height, first, last);
|
||||||
|
cairo_t *c = cairo_create(content);
|
||||||
if (first) bg_height += settings.frame_width;
|
|
||||||
if (last) bg_height += settings.frame_width;
|
|
||||||
else bg_height += settings.separator_height;
|
|
||||||
|
|
||||||
cairo_set_source_rgb(c, cl->frame.r, cl->frame.g, cl->frame.b);
|
|
||||||
cairo_rectangle(c, bg_x, bg_y, bg_width, bg_height);
|
|
||||||
cairo_fill(c);
|
|
||||||
|
|
||||||
/* adding frame */
|
/* adding frame */
|
||||||
bg_x += settings.frame_width;
|
|
||||||
if (first) {
|
if (first) {
|
||||||
dim.y += settings.frame_width;
|
dim.y += settings.frame_width;
|
||||||
bg_y += settings.frame_width;
|
|
||||||
bg_height -= settings.frame_width;
|
|
||||||
if (!last) bg_height -= settings.separator_height;
|
|
||||||
}
|
}
|
||||||
bg_width -= 2 * settings.frame_width;
|
|
||||||
if (last)
|
|
||||||
bg_height -= settings.frame_width;
|
|
||||||
|
|
||||||
cairo_set_source_rgb(c, cl->bg.r, cl->bg.g, cl->bg.b);
|
|
||||||
cairo_rectangle(c, bg_x, bg_y, bg_width, bg_height);
|
|
||||||
cairo_fill(c);
|
|
||||||
|
|
||||||
bool use_padding = settings.notification_height <= (2 * settings.padding) + h;
|
bool use_padding = settings.notification_height <= (2 * settings.padding) + h;
|
||||||
if (use_padding)
|
if (use_padding)
|
||||||
@ -430,11 +443,11 @@ static struct dimensions layout_render(cairo_surface_t *srf, colored_layout *cl,
|
|||||||
dim.y += (int) (ceil(bg_half_height) - pango_offset);
|
dim.y += (int) (ceil(bg_half_height) - pango_offset);
|
||||||
|
|
||||||
if (cl->icon && settings.icon_position == icons_left) {
|
if (cl->icon && settings.icon_position == icons_left) {
|
||||||
cairo_move_to(c, settings.frame_width + cairo_image_surface_get_width(cl->icon) + 2 * settings.h_padding, bg_y + settings.padding + h/2 - h_text/2);
|
cairo_move_to(c, settings.frame_width + cairo_image_surface_get_width(cl->icon) + 2 * settings.h_padding, settings.padding + h/2 - h_text/2);
|
||||||
} else if (cl->icon && settings.icon_position == icons_right) {
|
} else if (cl->icon && settings.icon_position == icons_right) {
|
||||||
cairo_move_to(c, settings.frame_width + settings.h_padding, bg_y + settings.padding + h/2 - h_text/2);
|
cairo_move_to(c, settings.frame_width + settings.h_padding, settings.padding + h/2 - h_text/2);
|
||||||
} else {
|
} else {
|
||||||
cairo_move_to(c, settings.frame_width + settings.h_padding, bg_y + settings.padding);
|
cairo_move_to(c, settings.frame_width + settings.h_padding, settings.padding);
|
||||||
}
|
}
|
||||||
|
|
||||||
cairo_set_source_rgb(c, cl->fg.r, cl->fg.g, cl->fg.b);
|
cairo_set_source_rgb(c, cl->fg.r, cl->fg.g, cl->fg.b);
|
||||||
@ -465,12 +478,13 @@ static struct dimensions layout_render(cairo_surface_t *srf, colored_layout *cl,
|
|||||||
unsigned int image_width = cairo_image_surface_get_width(cl->icon),
|
unsigned int image_width = cairo_image_surface_get_width(cl->icon),
|
||||||
image_height = cairo_image_surface_get_height(cl->icon),
|
image_height = cairo_image_surface_get_height(cl->icon),
|
||||||
image_x,
|
image_x,
|
||||||
image_y = bg_y + settings.padding + h/2 - image_height/2;
|
image_y = settings.padding + h/2 - image_height/2;
|
||||||
|
|
||||||
if (settings.icon_position == icons_left) {
|
if (settings.icon_position == icons_left) {
|
||||||
image_x = settings.frame_width + settings.h_padding;
|
image_x = settings.frame_width + settings.h_padding;
|
||||||
} else {
|
} else {
|
||||||
image_x = bg_width - settings.h_padding - image_width + settings.frame_width;
|
int bg_width = dim.w - 2 * settings.frame_width;
|
||||||
|
image_x = bg_width - settings.h_padding - image_width;
|
||||||
}
|
}
|
||||||
|
|
||||||
cairo_set_source_surface(c, cl->icon, image_x, image_y);
|
cairo_set_source_surface(c, cl->icon, image_x, image_y);
|
||||||
@ -479,6 +493,7 @@ static struct dimensions layout_render(cairo_surface_t *srf, colored_layout *cl,
|
|||||||
}
|
}
|
||||||
|
|
||||||
cairo_destroy(c);
|
cairo_destroy(c);
|
||||||
|
cairo_surface_destroy(content);
|
||||||
return dim;
|
return dim;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user