[libgepub] Added custom font-size and line-height modifiers



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]