summaryrefslogtreecommitdiff
path: root/src/entry.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/entry.c')
-rw-r--r--src/entry.c118
1 files changed, 78 insertions, 40 deletions
diff --git a/src/entry.c b/src/entry.c
index fe2953c..95ab308 100644
--- a/src/entry.c
+++ b/src/entry.c
@@ -9,12 +9,34 @@
#include "log.h"
#include "nelem.h"
+#ifndef TWO_PI
+#define TWO_PI 6.283185307179586f
+#endif
+
static void calculate_font_extents(struct entry *entry, uint32_t scale);
+static void draw_circles(struct entry *entry);
void entry_init(struct entry *entry, uint32_t scale)
{
+ entry->dot_radius = entry->font_size >> 3;
+ /* Calculate the size of the entry from our font and various widths. */
calculate_font_extents(entry, scale);
- struct color color;
+
+ entry->surface.width = entry->text_bounds.width;
+ entry->surface.height = entry->text_bounds.height;
+ entry->surface.width += 2 * (
+ entry->border.width
+ + 2 * entry->border.outline_width
+ + entry->padding
+ );
+ entry->surface.height += 2 * (
+ entry->border.width
+ + 2 * entry->border.outline_width
+ + entry->padding
+ );
+ entry->surface.width *= scale;
+ entry->surface.height *= scale;
+
/*
* Cairo uses native 32 bit integers for pixels, so if this processor
@@ -40,7 +62,7 @@ void entry_init(struct entry *entry, uint32_t scale)
int32_t height = entry->surface.height / scale;
/* Draw the outer outline */
- color = entry->border.outline_color;
+ struct color color = entry->border.outline_color;
cairo_set_source_rgba(cr, color.r, color.g, color.b, color.a);
cairo_paint(cr);
@@ -100,22 +122,25 @@ void entry_init(struct entry *entry, uint32_t scale)
cairo_translate(cr, -entry->text_bounds.x, -entry->text_bounds.y);
/* Setup Pango. */
- PangoContext *context = pango_cairo_create_context(cr);
- PangoLayout *layout = pango_layout_new(context);
- pango_layout_set_text(layout, "", -1);
+ if (entry->use_pango) {
+ PangoContext *context = pango_cairo_create_context(cr);
+ PangoLayout *layout = pango_layout_new(context);
+ pango_layout_set_text(layout, "", -1);
- PangoFontDescription *font_description =
- pango_font_description_from_string(entry->font_name);
- pango_font_description_set_size(
- font_description,
- entry->font_size * PANGO_SCALE);
- pango_layout_set_font_description(layout, font_description);
- pango_font_description_free(font_description);
+ PangoFontDescription *font_description =
+ pango_font_description_from_string(entry->font_name);
+ pango_font_description_set_size(
+ font_description,
+ entry->font_size * PANGO_SCALE);
+ pango_layout_set_font_description(layout, font_description);
+ pango_font_description_free(font_description);
+
+ entry->pango.context = context;
+ entry->pango.layout = layout;
+ }
+ entry->cairo.surface = surface;
+ entry->cairo.cr = cr;
- entry->pangocairo.surface = surface;
- entry->pangocairo.cr = cr;
- entry->pangocairo.context = context;
- 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);
@@ -123,25 +148,34 @@ void entry_init(struct entry *entry, uint32_t scale)
void entry_destroy(struct entry *entry)
{
- g_object_unref(entry->pangocairo.layout);
- g_object_unref(entry->pangocairo.context);
- cairo_destroy(entry->pangocairo.cr);
- cairo_surface_destroy(entry->pangocairo.surface);
+ if (entry->use_pango) {
+ g_object_unref(entry->pango.layout);
+ g_object_unref(entry->pango.context);
+ }
+ cairo_destroy(entry->cairo.cr);
+ cairo_surface_destroy(entry->cairo.surface);
}
void entry_update(struct entry *entry)
{
- cairo_t *cr = entry->pangocairo.cr;
- PangoLayout *layout = entry->pangocairo.layout;
+ cairo_t *cr = entry->cairo.cr;
+ PangoLayout *layout = entry->pango.layout;
+
+ entry->image.redraw = true;
/* Redraw the background. */
struct color color = entry->background_color;
cairo_set_source_rgba(cr, color.r, color.g, color.b, color.a);
cairo_paint(cr);
- /* Draw our text with Pango. */
+ /* Draw our text. */
color = entry->foreground_color;
cairo_set_source_rgba(cr, color.r, color.g, color.b, color.a);
+
+ if (!entry->use_pango) {
+ draw_circles(entry);
+ return;
+ }
size_t len = 0;
for (unsigned int i = 0; i < entry->password_length; i++) {
len += wcrtomb(entry->password_mb_print + len, entry->password_character, NULL);
@@ -150,17 +184,21 @@ void entry_update(struct entry *entry)
pango_layout_set_text(layout, entry->password_mb_print, -1);
pango_cairo_update_layout(cr, layout);
pango_cairo_show_layout(cr, layout);
-
- entry->image.redraw = true;
}
void entry_set_scale(struct entry *entry, uint32_t scale)
{
- cairo_surface_set_device_scale(entry->pangocairo.surface, scale, scale);
+ cairo_surface_set_device_scale(entry->cairo.surface, scale, scale);
}
void calculate_font_extents(struct entry *entry, uint32_t scale)
{
+ if (!entry->use_pango) {
+ /* If we're not using pango, just do a simple calculation. */
+ entry->text_bounds.height = 2 * entry->dot_radius;
+ entry->text_bounds.width = 3 * entry->num_characters * entry->dot_radius;
+ return;
+ }
/*
* To calculate the size of the password box, we do the following:
* 1. Load the font we're going to use.
@@ -219,22 +257,22 @@ void calculate_font_extents(struct entry *entry, uint32_t scale)
rect.x -= 1;
rect.y -= 1;
- int width = rect.width;
- int height = rect.height;
- width += 2 * (
- entry->border.width
- + 2 * entry->border.outline_width
- + entry->padding
- );
- height += 2 * (
- entry->border.width
- + 2 * entry->border.outline_width
- + entry->padding
- );
- entry->surface.width = width * scale;
- entry->surface.height = height * scale;
entry->text_bounds = rect;
g_object_unref(layout);
g_object_unref(context);
}
+
+void draw_circles(struct entry *entry)
+{
+ cairo_t *cr = entry->cairo.cr;
+ uint32_t radius = entry->dot_radius;
+ cairo_save(cr);
+ cairo_translate(cr, radius, radius);
+ for (uint32_t i = 0; i < entry->password_length && i < entry->num_characters; i++) {
+ /* Draw circles with a one-radius gap between them. */
+ cairo_arc(cr, 3 * i * radius, 0, radius, 0, TWO_PI);
+ }
+ cairo_fill(cr);
+ cairo_restore(cr);
+}