[evince] libview: Add a way to get the text logical attributes from the page cache
- From: Carlos Garcia Campos <carlosgc src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [evince] libview: Add a way to get the text logical attributes from the page cache
- Date: Tue, 11 Jun 2013 12:31:29 +0000 (UTC)
commit 6870279699b2d250fdaa7b53fa6d4ee48047f597
Author: Carlos Garcia Campos <carlosgc gnome org>
Date: Tue Jun 11 14:22:41 2013 +0200
libview: Add a way to get the text logical attributes from the page cache
It returns an array of PangoLogAttr with the logical attributes of the
text for the given page.
libview/ev-jobs.c | 7 ++++++
libview/ev-jobs.h | 21 +++++++++++--------
libview/ev-page-cache.c | 50 +++++++++++++++++++++++++++++++++++++++++++++++
libview/ev-page-cache.h | 5 +++-
4 files changed, 73 insertions(+), 10 deletions(-)
---
diff --git a/libview/ev-jobs.c b/libview/ev-jobs.c
index 507411e..2bf7a3c 100644
--- a/libview/ev-jobs.c
+++ b/libview/ev-jobs.c
@@ -747,6 +747,13 @@ ev_job_page_data_run (EvJob *job)
ev_page,
&(job_pd->text_layout),
&(job_pd->text_layout_length));
+ if ((job_pd->flags & EV_PAGE_DATA_INCLUDE_TEXT_LOG_ATTRS) && job_pd->text) {
+ job_pd->text_log_attrs_length = g_utf8_strlen (job_pd->text, -1);
+ job_pd->text_log_attrs = g_new0 (PangoLogAttr, job_pd->text_log_attrs_length + 1);
+
+ /* FIXME: We need API to get the language of the document */
+ pango_get_log_attrs (job_pd->text, -1, -1, NULL, job_pd->text_log_attrs,
job_pd->text_log_attrs_length + 1);
+ }
if ((job_pd->flags & EV_PAGE_DATA_INCLUDE_LINKS) && EV_IS_DOCUMENT_LINKS (job->document))
job_pd->link_mapping =
ev_document_links_get_links (EV_DOCUMENT_LINKS (job->document), ev_page);
diff --git a/libview/ev-jobs.h b/libview/ev-jobs.h
index cc9b7ad..a436100 100644
--- a/libview/ev-jobs.h
+++ b/libview/ev-jobs.h
@@ -261,15 +261,16 @@ struct _EvJobRenderClass
};
typedef enum {
- EV_PAGE_DATA_INCLUDE_NONE = 0,
- EV_PAGE_DATA_INCLUDE_LINKS = 1 << 0,
- EV_PAGE_DATA_INCLUDE_TEXT = 1 << 1,
- EV_PAGE_DATA_INCLUDE_TEXT_MAPPING = 1 << 2,
- EV_PAGE_DATA_INCLUDE_TEXT_LAYOUT = 1 << 3,
- EV_PAGE_DATA_INCLUDE_IMAGES = 1 << 4,
- EV_PAGE_DATA_INCLUDE_FORMS = 1 << 5,
- EV_PAGE_DATA_INCLUDE_ANNOTS = 1 << 6,
- EV_PAGE_DATA_INCLUDE_ALL = (1 << 7) - 1
+ EV_PAGE_DATA_INCLUDE_NONE = 0,
+ EV_PAGE_DATA_INCLUDE_LINKS = 1 << 0,
+ EV_PAGE_DATA_INCLUDE_TEXT = 1 << 1,
+ EV_PAGE_DATA_INCLUDE_TEXT_MAPPING = 1 << 2,
+ EV_PAGE_DATA_INCLUDE_TEXT_LAYOUT = 1 << 3,
+ EV_PAGE_DATA_INCLUDE_TEXT_LOG_ATTRS = 1 << 4,
+ EV_PAGE_DATA_INCLUDE_IMAGES = 1 << 5,
+ EV_PAGE_DATA_INCLUDE_FORMS = 1 << 6,
+ EV_PAGE_DATA_INCLUDE_ANNOTS = 1 << 7,
+ EV_PAGE_DATA_INCLUDE_ALL = (1 << 8) - 1
} EvJobPageDataFlags;
struct _EvJobPageData
@@ -287,6 +288,8 @@ struct _EvJobPageData
gchar *text;
EvRectangle *text_layout;
guint text_layout_length;
+ PangoLogAttr *text_log_attrs;
+ gulong text_log_attrs_length;
};
struct _EvJobPageDataClass
diff --git a/libview/ev-page-cache.c b/libview/ev-page-cache.c
index c3c5704..598dcda 100644
--- a/libview/ev-page-cache.c
+++ b/libview/ev-page-cache.c
@@ -45,6 +45,8 @@ typedef struct _EvPageCacheData {
EvRectangle *text_layout;
guint text_layout_length;
gchar *text;
+ PangoLogAttr *text_log_attrs;
+ gulong text_log_attrs_length;
} EvPageCacheData;
struct _EvPageCache {
@@ -123,6 +125,12 @@ ev_page_cache_data_free (EvPageCacheData *data)
g_free (data->text);
data->text = NULL;
}
+
+ if (data->text_log_attrs) {
+ g_free (data->text_log_attrs);
+ data->text_log_attrs = NULL;
+ data->text_log_attrs_length = 0;
+ }
}
static void
@@ -226,6 +234,12 @@ ev_page_cache_get_flags_for_data (EvPageCache *cache,
flags | EV_PAGE_DATA_INCLUDE_TEXT_LAYOUT;
}
+ if (cache->flags & EV_PAGE_DATA_INCLUDE_TEXT_LOG_ATTRS) {
+ flags = (data->text_log_attrs) ?
+ flags & ~EV_PAGE_DATA_INCLUDE_TEXT_LOG_ATTRS :
+ flags | EV_PAGE_DATA_INCLUDE_TEXT_LOG_ATTRS;
+ }
+
return flags;
}
@@ -270,6 +284,10 @@ job_page_data_finished_cb (EvJob *job,
}
if (job_data->flags & EV_PAGE_DATA_INCLUDE_TEXT)
data->text = job_data->text;
+ if (job_data->flags & EV_PAGE_DATA_INCLUDE_TEXT_LOG_ATTRS) {
+ data->text_log_attrs = job_data->text_log_attrs;
+ data->text_log_attrs_length = job_data->text_log_attrs_length;
+ }
data->done = TRUE;
data->dirty = FALSE;
@@ -519,3 +537,35 @@ ev_page_cache_get_text_layout (EvPageCache *cache,
return FALSE;
}
+
+gboolean
+ev_page_cache_get_text_log_attrs (EvPageCache *cache,
+ gint page,
+ PangoLogAttr **log_attrs,
+ gulong *n_attrs)
+{
+ EvPageCacheData *data;
+
+ g_return_val_if_fail (EV_IS_PAGE_CACHE (cache), FALSE);
+ g_return_val_if_fail (page >= 0 && page < cache->n_pages, FALSE);
+
+ if (!(cache->flags & EV_PAGE_DATA_INCLUDE_TEXT_LOG_ATTRS))
+ return FALSE;
+
+ data = &cache->page_list[page];
+ if (data->done) {
+ *log_attrs = data->text_log_attrs;
+ *n_attrs = data->text_log_attrs_length;
+
+ return TRUE;
+ }
+
+ if (data->job) {
+ *log_attrs = EV_JOB_PAGE_DATA (data->job)->text_log_attrs;
+ *n_attrs = EV_JOB_PAGE_DATA (data->job)->text_log_attrs_length;
+
+ return TRUE;
+ }
+
+ return FALSE;
+}
diff --git a/libview/ev-page-cache.h b/libview/ev-page-cache.h
index 1c2e5cd..5166e63 100644
--- a/libview/ev-page-cache.h
+++ b/libview/ev-page-cache.h
@@ -65,7 +65,10 @@ gboolean ev_page_cache_get_text_layout (EvPageCache *cach
gint page,
EvRectangle **areas,
guint *n_areas);
-
+gboolean ev_page_cache_get_text_log_attrs (EvPageCache *cache,
+ gint page,
+ PangoLogAttr **log_attrs,
+ gulong *n_attrs);
G_END_DECLS
#endif /* EV_PAGE_CACHE_H */
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]