commit
						d885e93b73
					
				
							
								
								
									
										55
									
								
								src/draw.c
									
									
									
									
									
								
							
							
						
						
									
										55
									
								
								src/draw.c
									
									
									
									
									
								
							| @ -9,6 +9,7 @@ | |||||||
| #include <pango/pango-layout.h> | #include <pango/pango-layout.h> | ||||||
| #include <pango/pango-types.h> | #include <pango/pango-types.h> | ||||||
| #include <stdlib.h> | #include <stdlib.h> | ||||||
|  | #include <inttypes.h> | ||||||
| 
 | 
 | ||||||
| #include "dunst.h" | #include "dunst.h" | ||||||
| #include "icon.h" | #include "icon.h" | ||||||
| @ -33,6 +34,8 @@ struct window_x11 *win; | |||||||
| 
 | 
 | ||||||
| PangoFontDescription *pango_fdesc; | PangoFontDescription *pango_fdesc; | ||||||
| 
 | 
 | ||||||
|  | #define UINT_MAX_N(bits) ((1 << bits) - 1) | ||||||
|  | 
 | ||||||
| void draw_setup(void) | void draw_setup(void) | ||||||
| { | { | ||||||
|         x_setup(); |         x_setup(); | ||||||
| @ -41,12 +44,16 @@ void draw_setup(void) | |||||||
|         pango_fdesc = pango_font_description_from_string(settings.font); |         pango_fdesc = pango_font_description_from_string(settings.font); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| static struct color hex_to_color(int hexValue) | static struct color hex_to_color(uint32_t hexValue, int dpc) | ||||||
| { | { | ||||||
|  |         const int bpc = 4 * dpc; | ||||||
|  |         const unsigned single_max = UINT_MAX_N(bpc); | ||||||
|  | 
 | ||||||
|         struct color ret; |         struct color ret; | ||||||
|         ret.r = ((hexValue >> 16) & 0xFF) / 255.0; |         ret.r = ((hexValue >> 3 * bpc) & single_max) / (double)single_max; | ||||||
|         ret.g = ((hexValue >> 8) & 0xFF) / 255.0; |         ret.g = ((hexValue >> 2 * bpc) & single_max) / (double)single_max; | ||||||
|         ret.b = ((hexValue) & 0xFF) / 255.0; |         ret.b = ((hexValue >> 1 * bpc) & single_max) / (double)single_max; | ||||||
|  |         ret.a = ((hexValue)            & single_max) / (double)single_max; | ||||||
| 
 | 
 | ||||||
|         return ret; |         return ret; | ||||||
| } | } | ||||||
| @ -54,15 +61,24 @@ static struct color hex_to_color(int hexValue) | |||||||
| static struct color string_to_color(const char *str) | static struct color string_to_color(const char *str) | ||||||
| { | { | ||||||
|         char *end; |         char *end; | ||||||
|         long int val = strtol(str+1, &end, 16); |         uint_fast32_t val = strtoul(str+1, &end, 16); | ||||||
|         if (*end != '\0' && *(end+1) != '\0') { |         if (end[0] != '\0' && end[1] != '\0') { | ||||||
|                 LOG_W("Invalid color string: '%s'", str); |                 LOG_W("Invalid color string: '%s'", str); | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         return hex_to_color(val); |         switch (end - (str+1)) { | ||||||
|  |                 case 3:  return hex_to_color((val << 4) | 0xF, 1); | ||||||
|  |                 case 6:  return hex_to_color((val << 8) | 0xFF, 2); | ||||||
|  |                 case 4:  return hex_to_color(val, 1); | ||||||
|  |                 case 8:  return hex_to_color(val, 2); | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
| static double color_apply_delta(double base, double delta) |         /* return black on error */ | ||||||
|  |         LOG_W("Invalid color string: '%s'", str); | ||||||
|  |         return hex_to_color(0xF, 1); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | static inline double color_apply_delta(double base, double delta) | ||||||
| { | { | ||||||
|         base += delta; |         base += delta; | ||||||
|         if (base > 1) |         if (base > 1) | ||||||
| @ -481,6 +497,12 @@ static cairo_surface_t *render_background(cairo_surface_t *srf, | |||||||
| 
 | 
 | ||||||
|         cairo_t *c = cairo_create(srf); |         cairo_t *c = cairo_create(srf); | ||||||
| 
 | 
 | ||||||
|  |         /* stroke area doesn't intersect with main area */ | ||||||
|  |         cairo_set_fill_rule(c, CAIRO_FILL_RULE_EVEN_ODD); | ||||||
|  | 
 | ||||||
|  |         /* for correct combination of adjacent areas */ | ||||||
|  |         cairo_set_operator(c, CAIRO_OPERATOR_ADD); | ||||||
|  | 
 | ||||||
|         if (first) |         if (first) | ||||||
|                 height += settings.frame_width; |                 height += settings.frame_width; | ||||||
|         if (last) |         if (last) | ||||||
| @ -488,11 +510,8 @@ static cairo_surface_t *render_background(cairo_surface_t *srf, | |||||||
|         else |         else | ||||||
|                 height += settings.separator_height; |                 height += settings.separator_height; | ||||||
| 
 | 
 | ||||||
|         if (settings.frame_width > 0) |         if (settings.frame_width > 0) { | ||||||
|         { |  | ||||||
|                 cairo_set_source_rgb(c, cl->frame.r, cl->frame.g, cl->frame.b); |  | ||||||
|                 draw_rounded_rect(c, x, y, width, height, corner_radius, first, last); |                 draw_rounded_rect(c, x, y, width, height, corner_radius, first, last); | ||||||
|                 cairo_fill(c); |  | ||||||
| 
 | 
 | ||||||
|                 /* adding frame */ |                 /* adding frame */ | ||||||
|                 x += settings.frame_width; |                 x += settings.frame_width; | ||||||
| @ -509,17 +528,23 @@ static cairo_surface_t *render_background(cairo_surface_t *srf, | |||||||
|                         height -= settings.separator_height; |                         height -= settings.separator_height; | ||||||
| 
 | 
 | ||||||
|                 radius_int = frame_internal_radius (corner_radius, settings.frame_width, height); |                 radius_int = frame_internal_radius (corner_radius, settings.frame_width, height); | ||||||
|  | 
 | ||||||
|  |                 draw_rounded_rect(c, x, y, width, height, radius_int, first, last); | ||||||
|  |                 cairo_set_source_rgba(c, cl->frame.r, cl->frame.g, cl->frame.b, cl->frame.a); | ||||||
|  |                 cairo_fill(c); | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         cairo_set_source_rgb(c, cl->bg.r, cl->bg.g, cl->bg.b); |  | ||||||
|         draw_rounded_rect(c, x, y, width, height, radius_int, first, last); |         draw_rounded_rect(c, x, y, width, height, radius_int, first, last); | ||||||
|  |         cairo_set_source_rgba(c, cl->bg.r, cl->bg.g, cl->bg.b, cl->bg.a); | ||||||
|         cairo_fill(c); |         cairo_fill(c); | ||||||
| 
 | 
 | ||||||
|  |         cairo_set_operator(c, CAIRO_OPERATOR_SOURCE); | ||||||
|  | 
 | ||||||
|         if (   settings.sep_color.type != SEP_FRAME |         if (   settings.sep_color.type != SEP_FRAME | ||||||
|             && settings.separator_height > 0 |             && settings.separator_height > 0 | ||||||
|             && !last) { |             && !last) { | ||||||
|                 struct color sep_color = layout_get_sepcolor(cl, cl_next); |                 struct color sep_color = layout_get_sepcolor(cl, cl_next); | ||||||
|                 cairo_set_source_rgb(c, sep_color.r, sep_color.g, sep_color.b); |                 cairo_set_source_rgba(c, sep_color.r, sep_color.g, sep_color.b, sep_color.a); | ||||||
| 
 | 
 | ||||||
|                 cairo_rectangle(c, settings.frame_width, y + height, width, settings.separator_height); |                 cairo_rectangle(c, settings.frame_width, y + height, width, settings.separator_height); | ||||||
| 
 | 
 | ||||||
| @ -561,7 +586,7 @@ static void render_content(cairo_t *c, struct colored_layout *cl, int width) | |||||||
|         } |         } | ||||||
|         cairo_move_to(c, text_x, text_y); |         cairo_move_to(c, text_x, text_y); | ||||||
| 
 | 
 | ||||||
|         cairo_set_source_rgb(c, cl->fg.r, cl->fg.g, cl->fg.b); |         cairo_set_source_rgba(c, cl->fg.r, cl->fg.g, cl->fg.b, cl->fg.a); | ||||||
|         pango_cairo_update_layout(c, cl->l); |         pango_cairo_update_layout(c, cl->l); | ||||||
|         pango_cairo_show_layout(c, cl->l); |         pango_cairo_show_layout(c, cl->l); | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -44,6 +44,7 @@ struct color { | |||||||
|         double r; |         double r; | ||||||
|         double g; |         double g; | ||||||
|         double b; |         double b; | ||||||
|  |         double a; | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| extern struct x_context xctx; | extern struct x_context xctx; | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 Nikos Tsipinakis
						Nikos Tsipinakis