[libgepub] Added custom font-size and line-height modifiers
- From: Daniel Garcia Moreno <danigm src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [libgepub] Added custom font-size and line-height modifiers
- Date: Sun, 21 May 2017 09:42:44 +0000 (UTC)
commit add069a1213a95a107b31143aecb074efe78096e
Author: Daniel GarcĂa Moreno <danigm wadobo com>
Date: Sun May 21 11:39:21 2017 +0200
Added custom font-size and line-height modifiers
I've added font size and line height methods to be able to modify this
properties in the book. If we set to 0, this properties doesn't change
in the book styles, but if we set to a valid number we'll force our
styles.
https://bugzilla.gnome.org/show_bug.cgi?id=782886
libgepub/gepub-widget.c | 120 ++++++++++++++++++++++++++++++++++++++--------
libgepub/gepub-widget.h | 8 +++
tests/test-gepub.c | 43 +++++++++++++++++
3 files changed, 150 insertions(+), 21 deletions(-)
---
diff --git a/libgepub/gepub-widget.c b/libgepub/gepub-widget.c
index 1db1863..05cb06c 100644
--- a/libgepub/gepub-widget.c
+++ b/libgepub/gepub-widget.c
@@ -20,6 +20,7 @@
#include <config.h>
#include <gtk/gtk.h>
#include <JavaScriptCore/JSValueRef.h>
+#include <locale.h>
#include "gepub-widget.h"
@@ -32,7 +33,9 @@ struct _GepubWidget {
gint chapter_pos; // position in the chapter, a percentage based on chapter_length
gint length;
gint init_chapter_pos;
- gint margin;
+ gint margin; // lateral margin in px
+ gint font_size; // font size in pt
+ gfloat line_height;
};
struct _GepubWidgetClass {
@@ -163,33 +166,47 @@ reload_length_cb (GtkWidget *widget,
"window.innerWidth",
NULL, get_length_finished, (gpointer)widget);
- if (gwidget->paginate) {
- gint m = GEPUB_WIDGET (widget)->margin;
- gchar *script;
+ gint m = GEPUB_WIDGET (widget)->margin;
+ gint f = GEPUB_WIDGET (widget)->font_size;
+ gfloat l = GEPUB_WIDGET (widget)->line_height;
- script = g_strdup_printf (
- "document.body.style.overflow = 'hidden';"
- "document.body.style.margin = '20px 0px 20px 0px';"
- "document.body.style.padding = '0px';"
- "document.body.style.columnWidth = window.innerWidth+'px';"
- "document.body.style.height = (window.innerHeight - 40) +'px';"
- "document.body.style.columnGap = '0px';"
+ gchar *script;
+ script = g_strdup_printf (
+ "if (!document.querySelector('#gepubwrap'))"
+ "document.body.innerHTML = '<div id=\"gepubwrap\">' + document.body.innerHTML + '</div>';"
- "if (!document.querySelector('#gepubwrap'))"
- "document.body.innerHTML = '<div id=\"gepubwrap\">' + document.body.innerHTML + '</div>';"
+ "document.querySelector('#gepubwrap').style.marginLeft = '%dpx';"
+ "document.querySelector('#gepubwrap').style.marginRight = '%dpx';"
+ , m, m);
+ webkit_web_view_run_javascript (web_view, script, NULL, NULL, NULL);
+ g_free (script);
- "document.querySelector('#gepubwrap').style.marginLeft = '%dpx';"
- "document.querySelector('#gepubwrap').style.marginRight = '%dpx';"
+ if (f) {
+ script = g_strdup_printf (
+ "document.querySelector('#gepubwrap').style.fontSize = '%dpt';"
+ , f);
+ webkit_web_view_run_javascript (web_view, script, NULL, NULL, NULL);
+ g_free (script);
+ }
- "document.body.scrollWidth"
- ,
- m, m);
+ if (l) {
+ script = g_strdup_printf (
+ "document.querySelector('#gepubwrap').style.lineHeight = %f;"
+ , l);
+ webkit_web_view_run_javascript (web_view, script, NULL, NULL, NULL);
+ g_free (script);
+ }
+ if (gwidget->paginate) {
webkit_web_view_run_javascript (web_view,
- script,
+ "document.body.style.overflow = 'hidden';"
+ "document.body.style.margin = '20px 0px 20px 0px';"
+ "document.body.style.padding = '0px';"
+ "document.body.style.columnWidth = window.innerWidth+'px';"
+ "document.body.style.height = (window.innerHeight - 40) +'px';"
+ "document.body.style.columnGap = '0px';"
+ "document.body.scrollWidth",
NULL, pagination_initialize_finished, (gpointer)widget);
-
- g_free (script);
}
}
@@ -314,6 +331,11 @@ gepub_widget_init (GepubWidget *widget)
widget->length = 0;
widget->init_chapter_pos = 0;
widget->margin = 20;
+ widget->font_size = 0;
+ widget->line_height = 0;
+
+ // locale to avoid '1,2' in line_height string composition
+ setlocale(LC_NUMERIC, "C");
}
static void
@@ -660,3 +682,59 @@ gepub_widget_get_margin (GepubWidget *widget)
{
return widget->margin;
}
+
+/**
+ * gepub_widget_get_fontsize:
+ * @widget: a #GepubWidget
+ *
+ * Gets the widget custom font size in pt, if 0, it's not set
+ */
+gint
+gepub_widget_get_fontsize (GepubWidget *widget)
+{
+ return widget->font_size;
+}
+
+/**
+ * gepub_widget_set_fontsize:
+ * @widget: a #GepubWidget
+ * @size: the custom font size in pt
+ *
+ * Sets the widget custom font size, use 0 to show book's styles
+ */
+void
+gepub_widget_set_fontsize (GepubWidget *widget,
+ gint size)
+{
+ widget->font_size = size;
+ reload_length_cb (GTK_WIDGET (widget), NULL, NULL);
+}
+
+/**
+ * gepub_widget_get_lineheight:
+ * @widget: a #GepubWidget
+ *
+ * Gets the widget custom line height, if 0, it's not set
+ */
+gfloat
+gepub_widget_get_lineheight (GepubWidget *widget)
+{
+ return widget->line_height;
+}
+
+/**
+ * gepub_widget_set_lineheight:
+ * @widget: a #GepubWidget
+ * @size: the custom line height
+ *
+ * Sets the widget custom line height, the real size will be this
+ * number multiplied by the font size.
+ * Use 0 to show book's styles
+ */
+void
+gepub_widget_set_lineheight (GepubWidget *widget,
+ gfloat size)
+{
+ widget->line_height = size;
+ reload_length_cb (GTK_WIDGET (widget), NULL, NULL);
+}
diff --git a/libgepub/gepub-widget.h b/libgepub/gepub-widget.h
index 3b1792f..9c141a8 100644
--- a/libgepub/gepub-widget.h
+++ b/libgepub/gepub-widget.h
@@ -66,6 +66,14 @@ gint gepub_widget_get_margin (GepubWidget *wid
void gepub_widget_set_margin (GepubWidget *widget,
gint margin);
+gint gepub_widget_get_fontsize (GepubWidget *widget);
+void gepub_widget_set_fontsize (GepubWidget *widget,
+ gint size);
+
+gfloat gepub_widget_get_lineheight (GepubWidget *widget);
+void gepub_widget_set_lineheight (GepubWidget *widget,
+ gfloat size);
+
G_END_DECLS
#endif /* __GEPUB_WIDGET_H__ */
diff --git a/tests/test-gepub.c b/tests/test-gepub.c
index 6c7a025..01cc511 100644
--- a/tests/test-gepub.c
+++ b/tests/test-gepub.c
@@ -95,6 +95,24 @@ button_pressed (GtkButton *button, GepubWidget *widget)
gepub_widget_set_margin (widget, gepub_widget_get_margin (widget) + 20);
} else if (!strcmp (gtk_button_get_label (button), "margin -")) {
gepub_widget_set_margin (widget, gepub_widget_get_margin (widget) - 20);
+ } else if (!strcmp (gtk_button_get_label (button), "font +")) {
+ gint f = gepub_widget_get_fontsize (widget);
+ f = f ? f : 12;
+ printf ("font %d\n", f);
+ gepub_widget_set_fontsize (widget, f + 2);
+ } else if (!strcmp (gtk_button_get_label (button), "font -")) {
+ gint f = gepub_widget_get_fontsize (widget);
+ f = f ? f : 12;
+ printf ("font %d\n", f);
+ gepub_widget_set_fontsize (widget, f - 2);
+ } else if (!strcmp (gtk_button_get_label (button), "line height +")) {
+ gfloat l = gepub_widget_get_lineheight (widget);
+ l = l ? l : 1.5;
+ gepub_widget_set_lineheight (widget, l + 0.1);
+ } else if (!strcmp (gtk_button_get_label (button), "line height -")) {
+ gfloat l = gepub_widget_get_lineheight (widget);
+ l = l ? l : 1.5;
+ gepub_widget_set_lineheight (widget, l - 0.1);
}
update_text (doc);
//print_replaced_text (doc);
@@ -273,6 +291,12 @@ main (int argc, char **argv)
GtkWidget *margin1;
GtkWidget *margin2;
+ GtkWidget *font1;
+ GtkWidget *font2;
+
+ GtkWidget *lh1;
+ GtkWidget *lh2;
+
GtkWidget *paginate;
GtkTextBuffer *buffer;
@@ -281,6 +305,9 @@ main (int argc, char **argv)
GtkWidget *textview2;
GtkWidget *widget = gepub_widget_new ();
+ webkit_settings_set_enable_developer_extras (
+ webkit_web_view_get_settings (WEBKIT_WEB_VIEW (widget)), TRUE);
+
if (argc < 2) {
printf ("you should provide an .epub file\n");
return 1;
@@ -331,6 +358,16 @@ main (int argc, char **argv)
margin2 = gtk_button_new_with_label ("margin -");
g_signal_connect (margin2, "clicked", (GCallback)button_pressed, GEPUB_WIDGET (widget));
+ font1 = gtk_button_new_with_label ("font +");
+ g_signal_connect (font1, "clicked", (GCallback)button_pressed, GEPUB_WIDGET (widget));
+ font2 = gtk_button_new_with_label ("font -");
+ g_signal_connect (font2, "clicked", (GCallback)button_pressed, GEPUB_WIDGET (widget));
+
+ lh1 = gtk_button_new_with_label ("line height +");
+ g_signal_connect (lh1, "clicked", (GCallback)button_pressed, GEPUB_WIDGET (widget));
+ lh2 = gtk_button_new_with_label ("line height -");
+ g_signal_connect (lh2, "clicked", (GCallback)button_pressed, GEPUB_WIDGET (widget));
+
PAGE_LABEL = gtk_label_new ("0");
g_signal_connect_swapped (widget, "notify",
@@ -351,6 +388,12 @@ main (int argc, char **argv)
gtk_container_add (GTK_CONTAINER (hbox2), margin1);
gtk_container_add (GTK_CONTAINER (hbox2), margin2);
+ gtk_container_add (GTK_CONTAINER (hbox2), font1);
+ gtk_container_add (GTK_CONTAINER (hbox2), font2);
+
+ gtk_container_add (GTK_CONTAINER (hbox2), lh1);
+ gtk_container_add (GTK_CONTAINER (hbox2), lh2);
+
gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 5);
gtk_box_pack_start (GTK_BOX (vbox), hbox2, FALSE, FALSE, 5);
gtk_box_pack_start (GTK_BOX (vbox), scrolled, TRUE, TRUE, 5);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]