diff options
Diffstat (limited to 'src/entry.c')
-rw-r--r-- | src/entry.c | 126 |
1 files changed, 126 insertions, 0 deletions
diff --git a/src/entry.c b/src/entry.c new file mode 100644 index 0000000..61b0211 --- /dev/null +++ b/src/entry.c @@ -0,0 +1,126 @@ +#include <arpa/inet.h> +#include <cairo/cairo.h> +#include <glib.h> +#include <pango/pangocairo.h> +#include <pango/pango.h> +#include <wchar.h> +#include "client.h" +#include "entry.h" +#include "log.h" +#include "nelem.h" + +static void calculate_font_extents(struct entry *entry); + +void entry_init(struct entry *entry) +{ + calculate_font_extents(entry); + + /* + * Cairo uses native 32 bit integers for pixels, so if this computer is + * little endian we have to tell OpenGL to swizzle the texture. + */ + if (htonl(0xFFu) != 0xFFu) { + entry->image.swizzle = true; + } + + cairo_surface_t *surface = cairo_image_surface_create( + CAIRO_FORMAT_ARGB32, + entry->surface.width, + entry->surface.height + ); + cairo_t *cr = cairo_create(surface); + cairo_set_source_rgb(cr, 0.031, 0.031, 0); + cairo_paint(cr); + + cairo_translate(cr, entry->border.outline_width, entry->border.outline_width); + cairo_rectangle(cr, + 0, + 0, + entry->surface.width - 2*entry->border.outline_width, + entry->surface.height - 2*entry->border.outline_width + ); + cairo_clip(cr); + cairo_set_source_rgb(cr, 0.976, 0.149, 0.447); + cairo_paint(cr); + + cairo_translate(cr, entry->border.width, entry->border.width); + cairo_rectangle(cr, + 0, + 0, + entry->surface.width - 2*(entry->border.outline_width + entry->border.width), + entry->surface.height - 2*(entry->border.outline_width + entry->border.width) + ); + cairo_clip(cr); + cairo_set_source_rgb(cr, 0.106, 0.114, 0.118); + cairo_paint(cr); + + PangoLayout *layout = pango_cairo_create_layout(cr); + pango_layout_set_text(layout, "", -1); + + PangoFontDescription *font_description = pango_font_description_from_string("Rubik Bold 48"); + pango_layout_set_font_description(layout, font_description); + pango_font_description_free(font_description); + + cairo_set_source_rgb(cr, 0.973, 0.973, 0.941); + pango_cairo_update_layout(cr, layout); + pango_cairo_show_layout(cr, layout); + + entry->pangocairo.surface = surface; + entry->pangocairo.cr = cr; + entry->pangocairo.layout = layout; + entry->image.width = entry->surface.width; + entry->image.height = entry->surface.height; + entry->image.buffer = cairo_image_surface_get_data(surface); +} + +void entry_update(struct entry *entry) +{ + cairo_t *cr = entry->pangocairo.cr; + PangoLayout *layout = entry->pangocairo.layout; + cairo_set_source_rgb(cr, 0.106, 0.114, 0.118); + cairo_paint(cr); + cairo_set_source_rgb(cr, 0.973, 0.973, 0.941); + //const wchar_t *src = entry->password; + //wcsrtombs(entry->password_mb, &src, N_ELEM(entry->password_mb), NULL); + for (unsigned int i = 0; i < entry->password_length; i++) { + entry->password_mb[2 * i] = '\xC2'; + entry->password_mb[2 * i + 1] = '\xB7'; + } + entry->password_mb[2 * entry->password_length] = '\0'; + fprintf(stderr, "%s\n", entry->password_mb); + pango_layout_set_text(layout, entry->password_mb, -1); + pango_cairo_update_layout(cr, layout); + pango_cairo_show_layout(cr, layout); + entry->image.redraw = true; +} + +void calculate_font_extents(struct entry *entry) +{ + PangoFontMap *font_map = pango_cairo_font_map_get_default(); + PangoContext *context = pango_font_map_create_context(font_map); + PangoLayout *layout = pango_layout_new(context); + { + PangoFontDescription *font_description = pango_font_description_from_string("Rubik Bold 48"); + pango_layout_set_font_description(layout, font_description); + PangoFont *font = pango_font_map_load_font(font_map, context, font_description); + g_object_unref(font); + pango_font_description_free(font_description); + + font_description = pango_context_get_font_description(context); + log_info("Using family: %s\n", pango_font_description_get_family(font_description)); + } + pango_layout_set_text(layout, "············", -1); + + int width; + int height; + pango_layout_get_pixel_size(layout, &width, &height); + fprintf(stderr, "%d x %d\n", width, height); + fprintf(stderr, "%d, %d\n", entry->border.width, entry->border.outline_width); + width += 2 * (entry->border.width + entry->border.outline_width); + height += 2 * (entry->border.width + entry->border.outline_width); + entry->surface.width = width; + entry->surface.height = height; + + g_object_unref(layout); + g_object_unref(context); +} |