*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
#include <config.h>
+#include <glib.h>
#include "ev-jobs.h"
#include "ev-job-scheduler.h"
-#include "ev-mapping.h"
+#include "ev-mapping-list.h"
#include "ev-selection.h"
#include "ev-document-links.h"
#include "ev-document-forms.h"
#include "ev-document-images.h"
#include "ev-document-annotations.h"
+#include "ev-document-text.h"
#include "ev-page-cache.h"
typedef struct _EvPageCacheData {
- EvJob *job;
- gboolean done : 1;
-
- GList *link_mapping;
- GList *image_mapping;
- GList *form_field_mapping;
- GList *annot_mapping;
- GdkRegion *text_mapping;
+ EvJob *job;
+ gboolean done : 1;
+
+ EvMappingList *link_mapping;
+ EvMappingList *image_mapping;
+ EvMappingList *form_field_mapping;
+ EvMappingList *annot_mapping;
+ cairo_region_t *text_mapping;
+ EvRectangle *text_layout;
+ guint text_layout_length;
+ gchar *text;
} EvPageCacheData;
struct _EvPageCache {
}
if (data->link_mapping) {
- ev_mapping_list_free (data->link_mapping, g_object_unref);
+ ev_mapping_list_unref (data->link_mapping);
data->link_mapping = NULL;
}
if (data->image_mapping) {
- ev_mapping_list_free (data->image_mapping, g_object_unref);
+ ev_mapping_list_unref (data->image_mapping);
data->image_mapping = NULL;
}
if (data->form_field_mapping) {
- ev_mapping_list_free (data->form_field_mapping, g_object_unref);
+ ev_mapping_list_unref (data->form_field_mapping);
data->form_field_mapping = NULL;
}
if (data->annot_mapping) {
- ev_mapping_list_free (data->annot_mapping, g_object_unref);
+ ev_mapping_list_unref (data->annot_mapping);
data->annot_mapping = NULL;
}
if (data->text_mapping) {
- gdk_region_destroy (data->text_mapping);
+ cairo_region_destroy (data->text_mapping);
data->text_mapping = NULL;
}
+
+ if (data->text_layout) {
+ g_free (data->text_layout);
+ data->text_layout = NULL;
+ data->text_layout_length = 0;
+ }
+
+ if (data->text) {
+ g_free (data->text);
+ data->text = NULL;
+ }
}
static void
flags |= EV_PAGE_DATA_INCLUDE_FORMS;
if (EV_IS_DOCUMENT_ANNOTATIONS (document))
flags |= EV_PAGE_DATA_INCLUDE_ANNOTS;
- if (EV_IS_SELECTION (document))
- flags |= EV_PAGE_DATA_INCLUDE_TEXT;
+ if (EV_IS_SELECTION (document) && EV_IS_DOCUMENT_TEXT (document))
+ flags |= EV_PAGE_DATA_INCLUDE_TEXT_MAPPING;
+ if (EV_IS_DOCUMENT_TEXT (document))
+ flags |= EV_PAGE_DATA_INCLUDE_TEXT | EV_PAGE_DATA_INCLUDE_TEXT_LAYOUT;
return flags;
}
data->form_field_mapping = job_data->form_field_mapping;
data->annot_mapping = job_data->annot_mapping;
data->text_mapping = job_data->text_mapping;
+ data->text_layout = job_data->text_layout;
+ data->text_layout_length = job_data->text_layout_length;
+ data->text = job_data->text;
data->done = TRUE;
g_object_unref (data->job);
}
}
-GList *
+EvJobPageDataFlags
+ev_page_cache_get_flags (EvPageCache *cache)
+{
+ return cache->flags;
+}
+
+void
+ev_page_cache_set_flags (EvPageCache *cache,
+ EvJobPageDataFlags flags)
+{
+ cache->flags = flags;
+}
+
+EvMappingList *
ev_page_cache_get_link_mapping (EvPageCache *cache,
gint page)
{
return data->link_mapping;
}
-GList *
+EvMappingList *
ev_page_cache_get_image_mapping (EvPageCache *cache,
gint page)
{
return data->image_mapping;
}
-GList *
+EvMappingList *
ev_page_cache_get_form_field_mapping (EvPageCache *cache,
gint page)
{
return data->form_field_mapping;
}
-GList *
+EvMappingList *
ev_page_cache_get_annot_mapping (EvPageCache *cache,
gint page)
{
return data->annot_mapping;
}
-GdkRegion *
+cairo_region_t *
ev_page_cache_get_text_mapping (EvPageCache *cache,
gint page)
{
g_return_val_if_fail (EV_IS_PAGE_CACHE (cache), NULL);
g_return_val_if_fail (page >= 0 && page < cache->n_pages, NULL);
- if (!(cache->flags & EV_PAGE_DATA_INCLUDE_TEXT))
+ if (!(cache->flags & EV_PAGE_DATA_INCLUDE_TEXT_MAPPING))
return NULL;
data = &cache->page_list[page];
return data->text_mapping;
}
+const gchar *
+ev_page_cache_get_text (EvPageCache *cache,
+ gint page)
+{
+ EvPageCacheData *data;
+
+ g_return_val_if_fail (EV_IS_PAGE_CACHE (cache), NULL);
+ g_return_val_if_fail (page >= 0 && page < cache->n_pages, NULL);
+
+ if (!(cache->flags & EV_PAGE_DATA_INCLUDE_TEXT))
+ return NULL;
+
+ data = &cache->page_list[page];
+ if (data->done)
+ return data->text;
+
+ if (data->job)
+ return EV_JOB_PAGE_DATA (data->job)->text;
+
+ return data->text;
+}
+
+gboolean
+ev_page_cache_get_text_layout (EvPageCache *cache,
+ gint page,
+ EvRectangle **areas,
+ guint *n_areas)
+{
+ 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_LAYOUT))
+ return FALSE;
+
+ data = &cache->page_list[page];
+ if (data->done) {
+ *areas = data->text_layout;
+ *n_areas = data->text_layout_length;
+
+ return TRUE;
+ }
+
+ if (data->job) {
+ *areas = EV_JOB_PAGE_DATA (data->job)->text_layout;
+ *n_areas = EV_JOB_PAGE_DATA (data->job)->text_layout_length;
+
+ return TRUE;
+ }
+
+ return FALSE;
+}