16
#include <glib-object.h>
13
18
#include <string.h>
21
#include <gdk-pixbuf/gdk-pixdata.h>
16
27
#include <jpeglib.h>
18
#include <gdk-pixbuf/gdk-pixbuf.h>
19
#include <cairo/cairo-pdf.h>
20
#include <cairo/cairo-ps.h>
36
static guint signals[LAST_SIGNAL] = { 0, };
42
gboolean needs_saving;
45
G_DEFINE_TYPE (Book, book, G_TYPE_OBJECT);
51
return g_object_new (BOOK_TYPE, NULL);
56
book_clear (Book *book)
59
for (iter = book->priv->pages; iter; iter = iter->next) {
60
Page *page = iter->data;
61
g_object_unref (page);
63
g_list_free (book->priv->pages);
64
book->priv->pages = NULL;
65
g_signal_emit (book, signals[CLEARED], 0);
70
page_changed_cb (Page *page, Book *book)
72
book_set_needs_saving (book, TRUE);
77
book_append_page (Book *book, gint width, gint height, gint dpi, ScanDirection scan_direction)
81
page = page_new (width, height, dpi, scan_direction);
82
g_signal_connect (page, "pixels-changed", G_CALLBACK (page_changed_cb), book);
83
g_signal_connect (page, "crop-changed", G_CALLBACK (page_changed_cb), book);
85
book->priv->pages = g_list_append (book->priv->pages, page);
87
g_signal_emit (book, signals[PAGE_ADDED], 0, page);
89
book_set_needs_saving (book, TRUE);
96
book_move_page (Book *book, Page *page, gint location)
98
book->priv->pages = g_list_remove (book->priv->pages, page);
99
book->priv->pages = g_list_insert (book->priv->pages, page, location);
101
g_signal_emit (book, signals[REORDERED], 0, page);
103
book_set_needs_saving (book, TRUE);
108
book_delete_page (Book *book, Page *page)
110
g_signal_handlers_disconnect_by_func (page, page_changed_cb, book);
112
g_signal_emit (book, signals[PAGE_REMOVED], 0, page);
114
book->priv->pages = g_list_remove (book->priv->pages, page);
115
g_object_unref (page);
117
book_set_needs_saving (book, TRUE);
122
book_get_n_pages (Book *book)
124
return g_list_length (book->priv->pages);
129
book_get_page (Book *book, gint page_number)
132
page_number = g_list_length (book->priv->pages) + page_number;
133
return g_list_nth_data (book->priv->pages, page_number);
138
book_get_page_index (Book *book, Page *page)
140
return g_list_index (book->priv->pages, page);
145
make_indexed_file (const gchar *uri, gint i)
147
gchar *basename, *suffix, *indexed_uri;
151
return g_file_new_for_uri (uri);
153
basename = g_path_get_basename (uri);
154
suffix = g_strrstr (basename, ".");
157
indexed_uri = g_strdup_printf ("%.*s-%d%s", (int) (strlen (uri) - strlen (suffix)), uri, i, suffix);
159
indexed_uri = g_strdup_printf ("%s-%d", uri, i);
162
file = g_file_new_for_uri (indexed_uri);
163
g_free (indexed_uri);
170
book_save_multi_file (Book *book, const gchar *type, GFile *file, GError **error)
173
gboolean result = TRUE;
177
uri = g_file_get_uri (file);
178
for (iter = book->priv->pages, i = 0; iter && result; iter = iter->next, i++) {
179
Page *page = iter->data;
182
file = make_indexed_file (uri, i);
183
result = page_save (page, type, file, error);
184
g_object_unref (file);
193
save_ps_pdf_surface (cairo_surface_t *surface, GdkPixbuf *image, gdouble dpi)
197
context = cairo_create (surface);
199
cairo_scale (context, 72.0 / dpi, 72.0 / dpi);
200
gdk_cairo_set_source_pixbuf (context, image, 0, 0);
201
cairo_pattern_set_filter (cairo_get_source (context), CAIRO_FILTER_BEST);
202
cairo_paint (context);
204
cairo_destroy (context);
208
static cairo_status_t
209
write_cairo_data (GFileOutputStream *stream, unsigned char *data, unsigned int length)
212
GError *error = NULL;
214
result = g_output_stream_write_all (G_OUTPUT_STREAM (stream), data, length, NULL, NULL, &error);
217
g_warning ("Error writing data: %s", error->message);
218
g_error_free (error);
221
return result ? CAIRO_STATUS_SUCCESS : CAIRO_STATUS_WRITE_ERROR;
226
book_save_ps (Book *book, GFile *file, GError **error)
228
GFileOutputStream *stream;
230
cairo_surface_t *surface;
232
stream = g_file_replace (file, NULL, FALSE, G_FILE_CREATE_NONE, NULL, error);
236
surface = cairo_ps_surface_create_for_stream ((cairo_write_func_t) write_cairo_data,
239
for (iter = book->priv->pages; iter; iter = iter->next) {
240
Page *page = iter->data;
241
double width, height;
244
image = page_get_image (page, TRUE);
246
width = gdk_pixbuf_get_width (image) * 72.0 / page_get_dpi (page);
247
height = gdk_pixbuf_get_height (image) * 72.0 / page_get_dpi (page);
248
cairo_ps_surface_set_size (surface, width, height);
249
save_ps_pdf_surface (surface, image, page_get_dpi (page));
250
cairo_surface_show_page (surface);
252
g_object_unref (image);
255
cairo_surface_destroy (surface);
257
g_object_unref (stream);
267
GList *object_offsets;
268
GFileOutputStream *stream;
273
pdf_writer_new (GFileOutputStream *stream)
276
writer = g_malloc0 (sizeof (PDFWriter));
277
writer->stream = g_object_ref (stream);
283
pdf_writer_free (PDFWriter *writer)
285
g_object_unref (writer->stream);
286
g_list_free (writer->object_offsets);
292
pdf_write (PDFWriter *writer, const unsigned char *data, size_t length)
294
g_output_stream_write_all (G_OUTPUT_STREAM (writer->stream), data, length, NULL, NULL, NULL);
295
writer->offset += length;
300
pdf_printf (PDFWriter *writer, const char *format, ...)
305
va_start (args, format);
306
string = g_strdup_vprintf (format, args);
308
pdf_write (writer, (unsigned char *)string, strlen (string));
315
pdf_start_object (PDFWriter *writer)
318
writer->object_offsets = g_list_append (writer->object_offsets, GINT_TO_POINTER (writer->offset));
319
return writer->n_objects;
324
compress_zlib (guchar *data, size_t length, size_t *n_written)
329
out_data = g_malloc (sizeof (guchar) * length);
331
stream.zalloc = Z_NULL;
332
stream.zfree = Z_NULL;
333
stream.opaque = Z_NULL;
334
if (deflateInit (&stream, Z_BEST_COMPRESSION) != Z_OK)
337
stream.next_in = data;
338
stream.avail_in = length;
339
stream.next_out = out_data;
340
stream.avail_out = length;
341
while (stream.avail_in > 0) {
342
if (deflate (&stream, Z_FINISH) == Z_STREAM_ERROR)
346
deflateEnd (&stream);
348
if (stream.avail_in > 0) {
353
*n_written = length - stream.avail_out;
359
static void jpeg_init_cb (struct jpeg_compress_struct *info) {}
360
static boolean jpeg_empty_cb (struct jpeg_compress_struct *info) { return TRUE; }
361
static void jpeg_term_cb (struct jpeg_compress_struct *info) {}
364
compress_jpeg (GdkPixbuf *image, size_t *n_written)
366
struct jpeg_compress_struct info;
367
struct jpeg_error_mgr jerr;
368
struct jpeg_destination_mgr dest_mgr;
374
info.err = jpeg_std_error (&jerr);
375
jpeg_create_compress (&info);
377
pixels = gdk_pixbuf_get_pixels (image);
378
info.image_width = gdk_pixbuf_get_width (image);
379
info.image_height = gdk_pixbuf_get_height (image);
380
info.input_components = 3;
381
info.in_color_space = JCS_RGB; /* TODO: JCS_GRAYSCALE? */
382
jpeg_set_defaults (&info);
384
max_length = info.image_width * info.image_height * info.input_components;
385
data = g_malloc (sizeof (guchar) * max_length);
386
dest_mgr.next_output_byte = data;
387
dest_mgr.free_in_buffer = max_length;
388
dest_mgr.init_destination = jpeg_init_cb;
389
dest_mgr.empty_output_buffer = jpeg_empty_cb;
390
dest_mgr.term_destination = jpeg_term_cb;
391
info.dest = &dest_mgr;
393
jpeg_start_compress (&info, TRUE);
394
for (r = 0; r < info.image_height; r++) {
396
row[0] = pixels + r * gdk_pixbuf_get_rowstride (image);
397
jpeg_write_scanlines (&info, row, 1);
399
jpeg_finish_compress (&info);
400
*n_written = max_length - dest_mgr.free_in_buffer;
402
jpeg_destroy_compress (&info);
409
book_save_pdf (Book *book, GFile *file, GError **error)
411
GFileOutputStream *stream;
413
int catalog_number, pages_number, info_number;
417
stream = g_file_replace (file, NULL, FALSE, G_FILE_CREATE_NONE, NULL, error);
421
writer = pdf_writer_new (stream);
422
g_object_unref (stream);
425
pdf_printf (writer, "%%PDF-1.3\n");
427
/* Comment with binary as recommended so file is treated as binary */
428
pdf_printf (writer, "%%\xe2\xe3\xcf\xd3\n");
431
catalog_number = pdf_start_object (writer);
432
pdf_printf (writer, "%d 0 obj\n", catalog_number);
433
pdf_printf (writer, "<<\n");
434
pdf_printf (writer, "/Type /Catalog\n");
435
//FIXMEpdf_printf (writer, "/Metadata %d 0 R\n", catalog_number + 1);
436
pdf_printf (writer, "/Pages %d 0 R\n", catalog_number + 1); //+2
437
pdf_printf (writer, ">>\n");
438
pdf_printf (writer, "endobj\n");
441
/* FIXME pdf_printf (writer, "\n");
442
number = pdf_start_object (writer);
443
pdf_printf (writer, "%d 0 obj\n", number);
444
pdf_printf (writer, "<<\n");
445
pdf_printf (writer, "/Type /Metadata\n");
446
pdf_printf (writer, "/Subtype /XML\n");
447
pdf_printf (writer, "/Length %d\n", ...);
448
pdf_printf (writer, ">>\n");
449
pdf_printf (writer, "stream\n");
451
pdf_printf (writer, "\n");
452
pdf_printf (writer, "endstream\n");
453
pdf_printf (writer, "endobj\n");*/
456
pdf_printf (writer, "\n");
457
pages_number = pdf_start_object (writer);
458
pdf_printf (writer, "%d 0 obj\n", pages_number);
459
pdf_printf (writer, "<<\n");
460
pdf_printf (writer, "/Type /Pages\n");
461
pdf_printf (writer, "/Kids [");
462
for (i = 0; i < book_get_n_pages (book); i++) {
463
pdf_printf (writer, " %d 0 R", pages_number + 1 + (i*3));
465
pdf_printf (writer, " ]\n");
466
pdf_printf (writer, "/Count %d\n", book_get_n_pages (book));
467
pdf_printf (writer, ">>\n");
468
pdf_printf (writer, "endobj\n");
470
for (i = 0; i < book_get_n_pages (book); i++) {
471
int number, width, height, depth;
472
size_t data_length, compressed_length;
475
guchar *pixels, *data, *compressed_data;
476
gchar *command, width_buffer[G_ASCII_DTOSTR_BUF_SIZE], height_buffer[G_ASCII_DTOSTR_BUF_SIZE];
477
const gchar *color_space, *filter = NULL;
478
float page_width, page_height;
480
page = book_get_page (book, i);
481
image = page_get_image (page, TRUE);
482
width = gdk_pixbuf_get_width (image);
483
height = gdk_pixbuf_get_height (image);
484
pixels = gdk_pixbuf_get_pixels (image);
485
page_width = width * 72. / page_get_dpi (page);
486
page_height = height * 72. / page_get_dpi (page);
488
if (page_is_color (page)) {
492
color_space = "DeviceRGB";
493
data_length = height * width * 3 + 1;
494
data = g_malloc (sizeof (guchar) * data_length);
495
for (row = 0; row < height; row++) {
497
guchar *in_line, *out_line;
499
in_line = pixels + row * gdk_pixbuf_get_rowstride (image);
500
out_line = data + row * width * 3;
501
for (x = 0; x < width; x++) {
502
guchar *in_p = in_line + x*3;
503
guchar *out_p = out_line + x*3;
511
else if (page_get_depth (page) == 2) {
512
int row, shift_count = 6;
516
color_space = "DeviceGray";
517
data_length = height * ((width * 2 + 7) / 8);
518
data = g_malloc (sizeof (guchar) * data_length);
521
for (row = 0; row < height; row++) {
525
/* Pad to the next line */
526
if (shift_count != 6) {
532
in_line = pixels + row * gdk_pixbuf_get_rowstride (image);
533
for (x = 0; x < width; x++) {
534
guchar *in_p = in_line + x*3;
536
write_ptr[0] |= 3 << shift_count;
537
else if (in_p[0] >= 128)
538
write_ptr[0] |= 2 << shift_count;
539
else if (in_p[0] >= 64)
540
write_ptr[0] |= 1 << shift_count;
541
if (shift_count == 0) {
551
else if (page_get_depth (page) == 1) {
552
int row, mask = 0x80;
556
color_space = "DeviceGray";
557
data_length = height * ((width + 7) / 8);
558
data = g_malloc (sizeof (guchar) * data_length);
561
for (row = 0; row < height; row++) {
565
/* Pad to the next line */
572
in_line = pixels + row * gdk_pixbuf_get_rowstride (image);
573
for (x = 0; x < width; x++) {
574
guchar *in_p = in_line + x*3;
576
write_ptr[0] |= mask;
590
color_space = "DeviceGray";
591
data_length = height * width + 1;
592
data = g_malloc (sizeof (guchar) * data_length);
593
for (row = 0; row < height; row++) {
595
guchar *in_line, *out_line;
597
in_line = pixels + row * gdk_pixbuf_get_rowstride (image);
598
out_line = data + row * width;
599
for (x = 0; x < width; x++) {
600
guchar *in_p = in_line + x*3;
601
guchar *out_p = out_line + x;
609
compressed_data = compress_zlib (data, data_length, &compressed_length);
610
if (compressed_data) {
611
/* Try if JPEG compression is better */
616
jpeg_data = compress_jpeg (image, &jpeg_length);
617
if (jpeg_length < compressed_length) {
618
filter = "DCTDecode";
620
g_free (compressed_data);
622
data_length = jpeg_length;
627
filter = "FlateDecode";
629
data = compressed_data;
630
data_length = compressed_length;
635
pdf_printf (writer, "\n");
636
number = pdf_start_object (writer);
637
pdf_printf (writer, "%d 0 obj\n", number);
638
pdf_printf (writer, "<<\n");
639
pdf_printf (writer, "/Type /Page\n");
640
pdf_printf (writer, "/Parent %d 0 R\n", pages_number);
641
pdf_printf (writer, "/Resources << /XObject << /Im%d %d 0 R >> >>\n", i, number+1);
642
pdf_printf (writer, "/MediaBox [ 0 0 %s %s ]\n",
643
g_ascii_formatd (width_buffer, sizeof (width_buffer), "%.2f", page_width),
644
g_ascii_formatd (height_buffer, sizeof (height_buffer), "%.2f", page_height));
645
pdf_printf (writer, "/Contents %d 0 R\n", number+2);
646
pdf_printf (writer, ">>\n");
647
pdf_printf (writer, "endobj\n");
650
pdf_printf (writer, "\n");
651
number = pdf_start_object (writer);
652
pdf_printf (writer, "%d 0 obj\n", number);
653
pdf_printf (writer, "<<\n");
654
pdf_printf (writer, "/Type /XObject\n");
655
pdf_printf (writer, "/Subtype /Image\n");
656
pdf_printf (writer, "/Width %d\n", width);
657
pdf_printf (writer, "/Height %d\n", height);
658
pdf_printf (writer, "/ColorSpace /%s\n", color_space);
659
pdf_printf (writer, "/BitsPerComponent %d\n", depth);
660
pdf_printf (writer, "/Length %d\n", data_length);
662
pdf_printf (writer, "/Filter /%s\n", filter);
663
pdf_printf (writer, ">>\n");
664
pdf_printf (writer, "stream\n");
665
pdf_write (writer, data, data_length);
667
pdf_printf (writer, "\n");
668
pdf_printf (writer, "endstream\n");
669
pdf_printf (writer, "endobj\n");
672
command = g_strdup_printf ("q\n"
676
g_ascii_formatd (width_buffer, sizeof (width_buffer), "%f", page_width),
677
g_ascii_formatd (height_buffer, sizeof (height_buffer), "%f", page_height),
679
pdf_printf (writer, "\n");
680
number = pdf_start_object (writer);
681
pdf_printf (writer, "%d 0 obj\n", number);
682
pdf_printf (writer, "<<\n");
683
pdf_printf (writer, "/Length %d\n", strlen (command) + 1);
684
pdf_printf (writer, ">>\n");
685
pdf_printf (writer, "stream\n");
686
pdf_write (writer, (unsigned char *)command, strlen (command));
687
pdf_printf (writer, "\n");
688
pdf_printf (writer, "endstream\n");
689
pdf_printf (writer, "endobj\n");
692
g_object_unref (image);
696
pdf_printf (writer, "\n");
697
info_number = pdf_start_object (writer);
698
pdf_printf (writer, "%d 0 obj\n", info_number);
699
pdf_printf (writer, "<<\n");
700
pdf_printf (writer, "/Creator (Simple Scan " VERSION ")\n");
701
pdf_printf (writer, ">>\n");
702
pdf_printf (writer, "endobj\n");
704
/* Cross-reference table */
705
xref_offset = writer->offset;
706
pdf_printf (writer, "xref\n");
707
pdf_printf (writer, "1 %d\n", writer->n_objects);
709
for (link = writer->object_offsets; link != NULL; link = link->next) {
710
int offset = GPOINTER_TO_INT (link->data);
711
pdf_printf (writer, "%010d 0000 n\n", offset);
715
pdf_printf (writer, "trailer\n");
716
pdf_printf (writer, "<<\n");
717
pdf_printf (writer, "/Size %d\n", writer->n_objects);
718
pdf_printf (writer, "/Info %d 0 R\n", info_number);
719
pdf_printf (writer, "/Root %d 0 R\n", catalog_number);
720
//FIXME: pdf_printf (writer, "/ID [<...> <...>]\n");
721
pdf_printf (writer, ">>\n");
722
pdf_printf (writer, "startxref\n");
723
pdf_printf (writer, "%d\n", xref_offset);
724
pdf_printf (writer, "%%%%EOF\n");
726
pdf_writer_free (writer);
733
book_save (Book *book, const gchar *type, GFile *file, GError **error)
735
gboolean result = FALSE;
737
if (strcmp (type, "jpeg") == 0)
738
result = book_save_multi_file (book, "jpeg", file, error);
739
else if (strcmp (type, "png") == 0)
740
result = book_save_multi_file (book, "png", file, error);
741
else if (strcmp (type, "tiff") == 0)
742
result = book_save_multi_file (book, "tiff", file, error);
743
else if (strcmp (type, "ps") == 0)
744
result = book_save_ps (book, file, error);
745
else if (strcmp (type, "pdf") == 0)
746
result = book_save_pdf (book, file, error);
753
book_set_needs_saving (Book *book, gboolean needs_saving)
755
gboolean needed_saving = book->priv->needs_saving;
756
book->priv->needs_saving = needs_saving;
757
if (needed_saving != needs_saving)
758
g_object_notify (G_OBJECT (book), "needs-saving");
763
book_get_needs_saving (Book *book)
765
return book->priv->needs_saving;
770
book_set_property (GObject *object,
777
self = BOOK (object);
780
case PROP_NEEDS_SAVING:
781
book_set_needs_saving (self, g_value_get_boolean (value));
784
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
791
book_get_property (GObject *object,
798
self = BOOK (object);
801
case PROP_NEEDS_SAVING:
802
g_value_set_boolean (value, book_get_needs_saving (self));
805
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
812
book_finalize (GObject *object)
814
Book *book = BOOK (object);
816
G_OBJECT_CLASS (book_parent_class)->finalize (object);
821
book_class_init (BookClass *klass)
823
GObjectClass *object_class = G_OBJECT_CLASS (klass);
825
object_class->get_property = book_get_property;
826
object_class->set_property = book_set_property;
827
object_class->finalize = book_finalize;
829
g_object_class_install_property (object_class,
831
g_param_spec_boolean ("needs-saving",
833
"TRUE if this book needs saving",
837
signals[PAGE_ADDED] =
838
g_signal_new ("page-added",
839
G_TYPE_FROM_CLASS (klass),
841
G_STRUCT_OFFSET (BookClass, page_added),
843
g_cclosure_marshal_VOID__OBJECT,
844
G_TYPE_NONE, 1, page_get_type ());
845
signals[PAGE_REMOVED] =
846
g_signal_new ("page-removed",
847
G_TYPE_FROM_CLASS (klass),
849
G_STRUCT_OFFSET (BookClass, page_removed),
851
g_cclosure_marshal_VOID__OBJECT,
852
G_TYPE_NONE, 1, page_get_type ());
854
g_signal_new ("reordered",
855
G_TYPE_FROM_CLASS (klass),
857
G_STRUCT_OFFSET (BookClass, reordered),
859
g_cclosure_marshal_VOID__VOID,
862
g_signal_new ("cleared",
863
G_TYPE_FROM_CLASS (klass),
865
G_STRUCT_OFFSET (BookClass, cleared),
867
g_cclosure_marshal_VOID__VOID,
870
g_type_class_add_private (klass, sizeof (BookPrivate));
875
book_init (Book *book)
877
book->priv = G_TYPE_INSTANCE_GET_PRIVATE (book, BOOK_TYPE, BookPrivate);
29
#include <gobject/gvaluecollector.h>
32
#define TYPE_BOOK (book_get_type ())
33
#define BOOK(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), TYPE_BOOK, Book))
34
#define BOOK_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), TYPE_BOOK, BookClass))
35
#define IS_BOOK(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), TYPE_BOOK))
36
#define IS_BOOK_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), TYPE_BOOK))
37
#define BOOK_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), TYPE_BOOK, BookClass))
39
typedef struct _Book Book;
40
typedef struct _BookClass BookClass;
41
typedef struct _BookPrivate BookPrivate;
43
#define TYPE_PAGE (page_get_type ())
44
#define PAGE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), TYPE_PAGE, Page))
45
#define PAGE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), TYPE_PAGE, PageClass))
46
#define IS_PAGE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), TYPE_PAGE))
47
#define IS_PAGE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), TYPE_PAGE))
48
#define PAGE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), TYPE_PAGE, PageClass))
50
typedef struct _Page Page;
51
typedef struct _PageClass PageClass;
52
#define __g_list_free__page_unref0_0(var) ((var == NULL) ? NULL : (var = (_g_list_free__page_unref0_ (var), NULL)))
54
#define TYPE_SCAN_DIRECTION (scan_direction_get_type ())
55
#define _page_unref0(var) ((var == NULL) ? NULL : (var = (page_unref (var), NULL)))
56
#define _g_free0(var) (var = (g_free (var), NULL))
57
#define _g_object_unref0(var) ((var == NULL) ? NULL : (var = (g_object_unref (var), NULL)))
58
#define _cairo_destroy0(var) ((var == NULL) ? NULL : (var = (cairo_destroy (var), NULL)))
60
#define TYPE_PS_WRITER (ps_writer_get_type ())
61
#define PS_WRITER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), TYPE_PS_WRITER, PsWriter))
62
#define PS_WRITER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), TYPE_PS_WRITER, PsWriterClass))
63
#define IS_PS_WRITER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), TYPE_PS_WRITER))
64
#define IS_PS_WRITER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), TYPE_PS_WRITER))
65
#define PS_WRITER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), TYPE_PS_WRITER, PsWriterClass))
67
typedef struct _PsWriter PsWriter;
68
typedef struct _PsWriterClass PsWriterClass;
69
typedef struct _PsWriterPrivate PsWriterPrivate;
70
#define _cairo_surface_destroy0(var) ((var == NULL) ? NULL : (var = (cairo_surface_destroy (var), NULL)))
71
#define _ps_writer_unref0(var) ((var == NULL) ? NULL : (var = (ps_writer_unref (var), NULL)))
73
#define TYPE_PDF_WRITER (pdf_writer_get_type ())
74
#define PDF_WRITER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), TYPE_PDF_WRITER, PDFWriter))
75
#define PDF_WRITER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), TYPE_PDF_WRITER, PDFWriterClass))
76
#define IS_PDF_WRITER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), TYPE_PDF_WRITER))
77
#define IS_PDF_WRITER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), TYPE_PDF_WRITER))
78
#define PDF_WRITER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), TYPE_PDF_WRITER, PDFWriterClass))
80
typedef struct _PDFWriter PDFWriter;
81
typedef struct _PDFWriterClass PDFWriterClass;
82
typedef struct _PDFWriterPrivate PDFWriterPrivate;
83
#define _pdf_writer_unref0(var) ((var == NULL) ? NULL : (var = (pdf_writer_unref (var), NULL)))
84
typedef struct _ParamSpecBook ParamSpecBook;
85
#define _g_list_free0(var) ((var == NULL) ? NULL : (var = (g_list_free (var), NULL)))
86
#define _g_error_free0(var) ((var == NULL) ? NULL : (var = (g_error_free (var), NULL)))
87
typedef struct _ParamSpecPDFWriter ParamSpecPDFWriter;
88
typedef struct _ParamSpecPsWriter ParamSpecPsWriter;
91
GTypeInstance parent_instance;
92
volatile int ref_count;
97
GTypeClass parent_class;
98
void (*finalize) (Book *self);
101
struct _BookPrivate {
103
gboolean needs_saving;
107
SCAN_DIRECTION_TOP_TO_BOTTOM,
108
SCAN_DIRECTION_LEFT_TO_RIGHT,
109
SCAN_DIRECTION_BOTTOM_TO_TOP,
110
SCAN_DIRECTION_RIGHT_TO_LEFT
114
GTypeInstance parent_instance;
115
volatile int ref_count;
116
PsWriterPrivate * priv;
117
cairo_surface_t* surface;
118
GFileOutputStream* stream;
121
struct _PsWriterClass {
122
GTypeClass parent_class;
123
void (*finalize) (PsWriter *self);
127
GTypeInstance parent_instance;
128
volatile int ref_count;
129
PDFWriterPrivate * priv;
131
GList* object_offsets;
134
struct _PDFWriterClass {
135
GTypeClass parent_class;
136
void (*finalize) (PDFWriter *self);
139
struct _ParamSpecBook {
140
GParamSpec parent_instance;
143
struct _PDFWriterPrivate {
144
GFileOutputStream* stream;
147
struct _ParamSpecPDFWriter {
148
GParamSpec parent_instance;
151
struct _ParamSpecPsWriter {
152
GParamSpec parent_instance;
156
static gpointer book_parent_class = NULL;
157
static gpointer pdf_writer_parent_class = NULL;
158
static gpointer ps_writer_parent_class = NULL;
160
gpointer book_ref (gpointer instance);
161
void book_unref (gpointer instance);
162
GParamSpec* param_spec_book (const gchar* name, const gchar* nick, const gchar* blurb, GType object_type, GParamFlags flags);
163
void value_set_book (GValue* value, gpointer v_object);
164
void value_take_book (GValue* value, gpointer v_object);
165
gpointer value_get_book (const GValue* value);
166
GType book_get_type (void) G_GNUC_CONST;
167
gpointer page_ref (gpointer instance);
168
void page_unref (gpointer instance);
169
GParamSpec* param_spec_page (const gchar* name, const gchar* nick, const gchar* blurb, GType object_type, GParamFlags flags);
170
void value_set_page (GValue* value, gpointer v_object);
171
void value_take_page (GValue* value, gpointer v_object);
172
gpointer value_get_page (const GValue* value);
173
GType page_get_type (void) G_GNUC_CONST;
174
#define BOOK_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), TYPE_BOOK, BookPrivate))
178
static void _page_unref0_ (gpointer var);
179
static void _g_list_free__page_unref0_ (GList* self);
180
Book* book_new (void);
181
Book* book_construct (GType object_type);
182
void book_clear (Book* self);
183
static void book_page_changed_cb (Book* self, Page* page);
184
void book_set_needs_saving (Book* self, gboolean needs_saving);
185
GType scan_direction_get_type (void) G_GNUC_CONST;
186
Page* book_append_page (Book* self, gint width, gint height, gint dpi, ScanDirection scan_direction);
187
Page* page_new (gint width, gint height, gint dpi, ScanDirection scan_direction);
188
Page* page_construct (GType object_type, gint width, gint height, gint dpi, ScanDirection scan_direction);
189
static void _book_page_changed_cb_page_pixels_changed (Page* _sender, gpointer self);
190
static void _book_page_changed_cb_page_crop_changed (Page* _sender, gpointer self);
191
void book_move_page (Book* self, Page* page, guint location);
192
void book_delete_page (Book* self, Page* page);
193
guint book_get_n_pages (Book* self);
194
Page* book_get_page (Book* self, gint page_number);
195
guint book_get_page_index (Book* self, Page* page);
196
static GFile* book_make_indexed_file (Book* self, const gchar* uri, gint i);
197
static void book_save_multi_file (Book* self, const gchar* type, GFile* file, GError** error);
198
void page_save (Page* self, const gchar* type, GFile* file, GError** error);
199
static void book_save_ps_pdf_surface (Book* self, cairo_surface_t* surface, GdkPixbuf* image, gdouble dpi);
200
static void book_save_ps (Book* self, GFile* file, GError** error);
201
PsWriter* ps_writer_new (GFileOutputStream* stream);
202
PsWriter* ps_writer_construct (GType object_type, GFileOutputStream* stream);
203
gpointer ps_writer_ref (gpointer instance);
204
void ps_writer_unref (gpointer instance);
205
GParamSpec* param_spec_ps_writer (const gchar* name, const gchar* nick, const gchar* blurb, GType object_type, GParamFlags flags);
206
void value_set_ps_writer (GValue* value, gpointer v_object);
207
void value_take_ps_writer (GValue* value, gpointer v_object);
208
gpointer value_get_ps_writer (const GValue* value);
209
GType ps_writer_get_type (void) G_GNUC_CONST;
210
GdkPixbuf* page_get_image (Page* self, gboolean apply_crop);
211
gint page_get_dpi (Page* self);
212
static guint8* book_compress_zlib (Book* self, guint8* data, int data_length1, int* result_length1);
213
static void book_jpeg_init_cb (struct jpeg_compress_struct* info);
214
static gboolean book_jpeg_empty_cb (struct jpeg_compress_struct* info);
215
static void book_jpeg_term_cb (struct jpeg_compress_struct* info);
216
static guint8* book_compress_jpeg (Book* self, GdkPixbuf* image, gsize* n_written, int* result_length1);
217
static void _book_jpeg_init_cb_jpeg_initdestinationfunc (struct jpeg_compress_struct* cinfo);
218
static gboolean _book_jpeg_empty_cb_jpeg_emptyoutputbufferfunc (struct jpeg_compress_struct* cinfo);
219
static void _book_jpeg_term_cb_jpeg_termdestinationfunc (struct jpeg_compress_struct* cinfo);
220
static void book_save_pdf (Book* self, GFile* file, GError** error);
221
PDFWriter* pdf_writer_new (GFileOutputStream* stream);
222
PDFWriter* pdf_writer_construct (GType object_type, GFileOutputStream* stream);
223
gpointer pdf_writer_ref (gpointer instance);
224
void pdf_writer_unref (gpointer instance);
225
GParamSpec* param_spec_pdf_writer (const gchar* name, const gchar* nick, const gchar* blurb, GType object_type, GParamFlags flags);
226
void value_set_pdf_writer (GValue* value, gpointer v_object);
227
void value_take_pdf_writer (GValue* value, gpointer v_object);
228
gpointer value_get_pdf_writer (const GValue* value);
229
GType pdf_writer_get_type (void) G_GNUC_CONST;
230
void pdf_writer_write_string (PDFWriter* self, const gchar* text);
231
guint pdf_writer_start_object (PDFWriter* self);
232
gboolean page_is_color (Page* self);
233
gint page_get_depth (Page* self);
234
static guint8* _vala_array_dup1 (guint8* self, int length);
235
static guint8* _vala_array_dup2 (guint8* self, int length);
236
void pdf_writer_write (PDFWriter* self, guint8* data, int data_length1);
237
void book_save (Book* self, const gchar* type, GFile* file, GError** error);
238
gboolean book_get_needs_saving (Book* self);
239
static void g_cclosure_user_marshal_VOID__PAGE (GClosure * closure, GValue * return_value, guint n_param_values, const GValue * param_values, gpointer invocation_hint, gpointer marshal_data);
240
static void book_finalize (Book* obj);
241
#define PDF_WRITER_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), TYPE_PDF_WRITER, PDFWriterPrivate))
243
PDF_WRITER_DUMMY_PROPERTY
245
static void pdf_writer_finalize (PDFWriter* obj);
247
PS_WRITER_DUMMY_PROPERTY
249
static cairo_status_t ps_writer_write_cairo_data (PsWriter* self, guint8* data, int data_length1);
250
static cairo_status_t _ps_writer_write_cairo_data_cairo_write_func_t (gpointer self, guchar* data, int data_length1);
251
static void ps_writer_finalize (PsWriter* obj);
254
static void _page_unref0_ (gpointer var) {
255
(var == NULL) ? NULL : (var = (page_unref (var), NULL));
259
static void _g_list_free__page_unref0_ (GList* self) {
260
g_list_foreach (self, (GFunc) _page_unref0_, NULL);
265
Book* book_construct (GType object_type) {
267
self = (Book*) g_type_create_instance (object_type);
272
Book* book_new (void) {
273
return book_construct (TYPE_BOOK);
277
void book_clear (Book* self) {
278
g_return_if_fail (self != NULL);
279
__g_list_free__page_unref0_0 (self->priv->pages);
280
self->priv->pages = NULL;
281
g_signal_emit_by_name (self, "cleared");
285
static void book_page_changed_cb (Book* self, Page* page) {
286
g_return_if_fail (self != NULL);
287
g_return_if_fail (page != NULL);
288
book_set_needs_saving (self, TRUE);
292
static void _book_page_changed_cb_page_pixels_changed (Page* _sender, gpointer self) {
293
book_page_changed_cb (self, _sender);
297
static void _book_page_changed_cb_page_crop_changed (Page* _sender, gpointer self) {
298
book_page_changed_cb (self, _sender);
302
static gpointer _page_ref0 (gpointer self) {
303
return self ? page_ref (self) : NULL;
307
Page* book_append_page (Book* self, gint width, gint height, gint dpi, ScanDirection scan_direction) {
312
g_return_val_if_fail (self != NULL, NULL);
313
_tmp0_ = page_new (width, height, dpi, scan_direction);
315
g_signal_connect (page, "pixels-changed", (GCallback) _book_page_changed_cb_page_pixels_changed, self);
316
g_signal_connect (page, "crop-changed", (GCallback) _book_page_changed_cb_page_crop_changed, self);
317
_tmp1_ = _page_ref0 (page);
318
self->priv->pages = g_list_append (self->priv->pages, _tmp1_);
319
g_signal_emit_by_name (self, "page-added", page);
320
book_set_needs_saving (self, TRUE);
326
void book_move_page (Book* self, Page* page, guint location) {
328
g_return_if_fail (self != NULL);
329
g_return_if_fail (page != NULL);
330
self->priv->pages = g_list_remove (self->priv->pages, page);
331
_tmp0_ = _page_ref0 (page);
332
self->priv->pages = g_list_insert (self->priv->pages, _tmp0_, (gint) location);
333
g_signal_emit_by_name (self, "reordered");
334
book_set_needs_saving (self, TRUE);
338
void book_delete_page (Book* self, Page* page) {
341
g_return_if_fail (self != NULL);
342
g_return_if_fail (page != NULL);
343
g_signal_parse_name ("pixels-changed", TYPE_PAGE, &_tmp0_, NULL, FALSE);
344
g_signal_handlers_disconnect_matched (page, G_SIGNAL_MATCH_ID | G_SIGNAL_MATCH_FUNC | G_SIGNAL_MATCH_DATA, _tmp0_, 0, NULL, (GCallback) _book_page_changed_cb_page_pixels_changed, self);
345
g_signal_parse_name ("crop-changed", TYPE_PAGE, &_tmp1_, NULL, FALSE);
346
g_signal_handlers_disconnect_matched (page, G_SIGNAL_MATCH_ID | G_SIGNAL_MATCH_FUNC | G_SIGNAL_MATCH_DATA, _tmp1_, 0, NULL, (GCallback) _book_page_changed_cb_page_crop_changed, self);
347
g_signal_emit_by_name (self, "page-removed", page);
348
self->priv->pages = g_list_remove (self->priv->pages, page);
349
book_set_needs_saving (self, TRUE);
353
guint book_get_n_pages (Book* self) {
356
g_return_val_if_fail (self != NULL, 0U);
357
_tmp0_ = g_list_length (self->priv->pages);
363
Page* book_get_page (Book* self, gint page_number) {
365
gconstpointer _tmp1_ = NULL;
367
g_return_val_if_fail (self != NULL, NULL);
368
if (page_number < 0) {
370
_tmp0_ = g_list_length (self->priv->pages);
371
page_number = ((gint) _tmp0_) + page_number;
373
_tmp1_ = g_list_nth_data (self->priv->pages, (guint) page_number);
374
_tmp2_ = _page_ref0 ((Page*) _tmp1_);
380
guint book_get_page_index (Book* self, Page* page) {
383
g_return_val_if_fail (self != NULL, 0U);
384
g_return_val_if_fail (page != NULL, 0U);
385
_tmp0_ = g_list_index (self->priv->pages, page);
386
result = (guint) _tmp0_;
391
static gint string_last_index_of_char (const gchar* self, gunichar c, gint start_index) {
393
gchar* _tmp0_ = NULL;
395
g_return_val_if_fail (self != NULL, 0);
396
_tmp0_ = g_utf8_strrchr (((gchar*) self) + start_index, (gssize) (-1), c);
398
if (_result_ != NULL) {
399
result = (gint) (_result_ - ((gchar*) self));
408
static gchar* string_slice (const gchar* self, glong start, glong end) {
409
gchar* result = NULL;
412
gboolean _tmp1_ = FALSE;
413
gboolean _tmp2_ = FALSE;
414
gchar* _tmp3_ = NULL;
415
g_return_val_if_fail (self != NULL, NULL);
416
_tmp0_ = strlen (self);
417
string_length = (glong) _tmp0_;
419
start = string_length + start;
422
end = string_length + end;
425
_tmp1_ = start <= string_length;
429
g_return_val_if_fail (_tmp1_, NULL);
431
_tmp2_ = end <= string_length;
435
g_return_val_if_fail (_tmp2_, NULL);
436
g_return_val_if_fail (start <= end, NULL);
437
_tmp3_ = g_strndup (((gchar*) self) + start, (gsize) (end - start));
443
static GFile* book_make_indexed_file (Book* self, const gchar* uri, gint i) {
444
GFile* result = NULL;
445
gchar* _tmp1_ = NULL;
452
gint extension_index;
453
gchar* _tmp10_ = NULL;
455
GFile* _tmp12_ = NULL;
457
g_return_val_if_fail (self != NULL, NULL);
458
g_return_val_if_fail (uri != NULL, NULL);
460
GFile* _tmp0_ = NULL;
461
_tmp0_ = g_file_new_for_uri (uri);
465
_tmp1_ = g_path_get_basename (uri);
467
_tmp2_ = g_strdup (uri);
469
_tmp3_ = g_strdup ("");
471
_tmp4_ = string_last_index_of_char (basename, (gunichar) '.', 0);
472
extension_index = _tmp4_;
473
if (extension_index >= 0) {
475
gchar* _tmp6_ = NULL;
478
gchar* _tmp9_ = NULL;
479
_tmp5_ = strlen (basename);
480
_tmp6_ = string_slice (basename, (glong) extension_index, (glong) _tmp5_);
483
_tmp7_ = strlen (uri);
484
_tmp8_ = strlen (suffix);
485
_tmp9_ = string_slice (uri, (glong) 0, (glong) (_tmp7_ - _tmp8_));
489
_tmp10_ = g_strdup_printf ("%s-%d%s", prefix, i, suffix);
491
_tmp12_ = g_file_new_for_uri (_tmp11_);
502
static void book_save_multi_file (Book* self, const gchar* type, GFile* file, GError** error) {
504
GError * _inner_error_ = NULL;
505
g_return_if_fail (self != NULL);
506
g_return_if_fail (type != NULL);
507
g_return_if_fail (file != NULL);
510
GList* page_collection = NULL;
511
GList* page_it = NULL;
512
page_collection = self->priv->pages;
513
for (page_it = page_collection; page_it != NULL; page_it = page_it->next) {
516
_tmp0_ = _page_ref0 ((Page*) page_it->data);
519
gchar* _tmp1_ = NULL;
521
GFile* _tmp3_ = NULL;
523
_tmp1_ = g_file_get_uri (file);
525
_tmp3_ = book_make_indexed_file (self, _tmp2_, i);
527
page_save (page, type, _tmp4_, &_inner_error_);
528
_g_object_unref0 (_tmp4_);
530
if (_inner_error_ != NULL) {
531
g_propagate_error (error, _inner_error_);
543
static void book_save_ps_pdf_surface (Book* self, cairo_surface_t* surface, GdkPixbuf* image, gdouble dpi) {
544
cairo_t* _tmp0_ = NULL;
546
cairo_pattern_t* _tmp1_ = NULL;
547
g_return_if_fail (self != NULL);
548
g_return_if_fail (surface != NULL);
549
g_return_if_fail (image != NULL);
550
_tmp0_ = cairo_create (surface);
552
cairo_scale (context, 72.0 / dpi, 72.0 / dpi);
553
gdk_cairo_set_source_pixbuf (context, image, (gdouble) 0, (gdouble) 0);
554
_tmp1_ = cairo_get_source (context);
555
cairo_pattern_set_filter (_tmp1_, CAIRO_FILTER_BEST);
556
cairo_paint (context);
557
_cairo_destroy0 (context);
561
static gpointer _cairo_surface_reference0 (gpointer self) {
562
return self ? cairo_surface_reference (self) : NULL;
566
static void book_save_ps (Book* self, GFile* file, GError** error) {
567
GFileOutputStream* _tmp0_ = NULL;
568
GFileOutputStream* stream;
569
PsWriter* _tmp1_ = NULL;
571
cairo_surface_t* _tmp2_;
572
cairo_surface_t* surface;
573
GError * _inner_error_ = NULL;
574
g_return_if_fail (self != NULL);
575
g_return_if_fail (file != NULL);
576
_tmp0_ = g_file_replace (file, NULL, FALSE, G_FILE_CREATE_NONE, NULL, &_inner_error_);
578
if (_inner_error_ != NULL) {
579
g_propagate_error (error, _inner_error_);
582
_tmp1_ = ps_writer_new (stream);
584
_tmp2_ = _cairo_surface_reference0 (writer->surface);
587
GList* page_collection = NULL;
588
GList* page_it = NULL;
589
page_collection = self->priv->pages;
590
for (page_it = page_collection; page_it != NULL; page_it = page_it->next) {
593
_tmp3_ = _page_ref0 ((Page*) page_it->data);
596
GdkPixbuf* _tmp4_ = NULL;
605
_tmp4_ = page_get_image (page, TRUE);
607
_tmp5_ = gdk_pixbuf_get_width (image);
608
_tmp6_ = page_get_dpi (page);
609
width = (_tmp5_ * 72.0) / _tmp6_;
610
_tmp7_ = gdk_pixbuf_get_height (image);
611
_tmp8_ = page_get_dpi (page);
612
height = (_tmp7_ * 72.0) / _tmp8_;
613
cairo_ps_surface_set_size (surface, width, height);
614
_tmp9_ = page_get_dpi (page);
615
book_save_ps_pdf_surface (self, surface, image, (gdouble) _tmp9_);
616
cairo_surface_show_page (surface);
617
_g_object_unref0 (image);
622
_cairo_surface_destroy0 (surface);
623
_ps_writer_unref0 (writer);
624
_g_object_unref0 (stream);
628
static guint8* book_compress_zlib (Book* self, guint8* data, int data_length1, int* result_length1) {
629
guint8* result = NULL;
630
z_stream stream = {0};
631
guint8* _tmp0_ = NULL;
633
gint out_data_length1;
634
gint _out_data_size_;
638
g_return_val_if_fail (self != NULL, NULL);
639
deflateInit (&stream, (gint) Z_BEST_COMPRESSION);
640
_tmp0_ = g_new0 (guint8, data_length1);
642
out_data_length1 = data_length1;
643
_out_data_size_ = out_data_length1;
644
stream.next_in = data;
645
stream.avail_in = data_length1;
646
stream.next_out = out_data;
647
stream.avail_out = out_data_length1;
650
if (!(stream.avail_in > 0)) {
653
_tmp1_ = deflate (&stream, (gint) Z_FINISH);
654
if (_tmp1_ == Z_STREAM_ERROR) {
658
if (stream.avail_in > 0) {
661
if (result_length1) {
665
out_data = (g_free (out_data), NULL);
666
deflateEnd (&stream);
669
n_written = data_length1 - stream.avail_out;
670
_tmp3_ = (gint) n_written;
671
out_data = g_renew (guint8, out_data, (gint) n_written);
672
(_tmp3_ > out_data_length1) ? memset (out_data + out_data_length1, 0, sizeof (guint8) * (_tmp3_ - out_data_length1)) : NULL;
673
out_data_length1 = _tmp3_;
674
_out_data_size_ = _tmp3_;
676
if (result_length1) {
677
*result_length1 = out_data_length1;
680
deflateEnd (&stream);
685
static void book_jpeg_init_cb (struct jpeg_compress_struct* info) {
689
static gboolean book_jpeg_empty_cb (struct jpeg_compress_struct* info) {
690
gboolean result = FALSE;
696
static void book_jpeg_term_cb (struct jpeg_compress_struct* info) {
700
static void _book_jpeg_init_cb_jpeg_initdestinationfunc (struct jpeg_compress_struct* cinfo) {
701
book_jpeg_init_cb (cinfo);
705
static gboolean _book_jpeg_empty_cb_jpeg_emptyoutputbufferfunc (struct jpeg_compress_struct* cinfo) {
707
result = book_jpeg_empty_cb (cinfo);
712
static void _book_jpeg_term_cb_jpeg_termdestinationfunc (struct jpeg_compress_struct* cinfo) {
713
book_jpeg_term_cb (cinfo);
717
static guint8* book_compress_jpeg (Book* self, GdkPixbuf* image, gsize* n_written, int* result_length1) {
718
gsize _n_written = 0UL;
719
guint8* result = NULL;
720
struct jpeg_compress_struct info = {0};
721
struct jpeg_error_mgr jerr = {0};
722
struct jpeg_destination_mgr dest_mgr = {0};
723
struct jpeg_error_mgr* _tmp0_ = NULL;
727
guint8* _tmp3_ = NULL;
731
guint8* _tmp4_ = NULL;
736
g_return_val_if_fail (self != NULL, NULL);
737
g_return_val_if_fail (image != NULL, NULL);
738
memset (&info, 0, sizeof (struct jpeg_compress_struct));
739
memset (&jerr, 0, sizeof (struct jpeg_error_mgr));
740
memset (&dest_mgr, 0, sizeof (struct jpeg_destination_mgr));
741
_tmp0_ = jpeg_std_error (&jerr);
743
jpeg_create_compress (&info);
744
_tmp1_ = gdk_pixbuf_get_width (image);
745
info.image_width = _tmp1_;
746
_tmp2_ = gdk_pixbuf_get_height (image);
747
info.image_height = _tmp2_;
748
info.input_components = 3;
749
info.in_color_space = JCS_RGB;
750
jpeg_set_defaults (&info);
751
max_length = (info.image_width * info.image_height) * info.input_components;
752
_tmp3_ = g_new0 (guint8, max_length);
754
data_length1 = max_length;
755
_data_size_ = data_length1;
756
dest_mgr.next_output_byte = data;
757
dest_mgr.free_in_buffer = max_length;
758
dest_mgr.init_destination = _book_jpeg_init_cb_jpeg_initdestinationfunc;
759
dest_mgr.empty_output_buffer = _book_jpeg_empty_cb_jpeg_emptyoutputbufferfunc;
760
dest_mgr.term_destination = _book_jpeg_term_cb_jpeg_termdestinationfunc;
761
info.dest = &dest_mgr;
762
jpeg_start_compress (&info, TRUE);
763
_tmp4_ = gdk_pixbuf_get_pixels (image);
766
_pixels_size_ = pixels_length1;
774
guint8* row[1] = {0};
780
if (!(r < info.image_height)) {
783
_tmp6_ = gdk_pixbuf_get_rowstride (image);
784
row[0] = ((guint8*) pixels) + (r * _tmp6_);
785
jpeg_write_scanlines (&info, row, 1);
789
jpeg_finish_compress (&info);
790
_n_written = (gsize) (max_length - dest_mgr.free_in_buffer);
792
if (result_length1) {
793
*result_length1 = data_length1;
796
jpeg_destroy_compress (&info);
798
*n_written = _n_written;
804
static guint8* _vala_array_dup1 (guint8* self, int length) {
805
return g_memdup (self, length * sizeof (guint8));
809
static guint8* _vala_array_dup2 (guint8* self, int length) {
810
return g_memdup (self, length * sizeof (guint8));
814
static void book_save_pdf (Book* self, GFile* file, GError** error) {
815
GFileOutputStream* _tmp0_ = NULL;
816
GFileOutputStream* stream;
817
PDFWriter* _tmp1_ = NULL;
820
guint catalog_number;
821
gchar* _tmp3_ = NULL;
823
gchar* _tmp5_ = NULL;
827
gchar* _tmp8_ = NULL;
830
gchar* _tmp15_ = NULL;
834
gchar* _tmp101_ = NULL;
836
gchar* _tmp103_ = NULL;
840
gchar* _tmp106_ = NULL;
843
gchar* _tmp111_ = NULL;
845
gchar* _tmp113_ = NULL;
847
gchar* _tmp115_ = NULL;
849
gchar* _tmp117_ = NULL;
851
GError * _inner_error_ = NULL;
852
g_return_if_fail (self != NULL);
853
g_return_if_fail (file != NULL);
854
_tmp0_ = g_file_replace (file, NULL, FALSE, G_FILE_CREATE_NONE, NULL, &_inner_error_);
856
if (_inner_error_ != NULL) {
857
g_propagate_error (error, _inner_error_);
860
_tmp1_ = pdf_writer_new (stream);
862
pdf_writer_write_string (writer, "%%PDF-1.3\n");
863
pdf_writer_write_string (writer, "%%\xe2\xe3\xcf\xd3\n");
864
_tmp2_ = pdf_writer_start_object (writer);
865
catalog_number = _tmp2_;
866
_tmp3_ = g_strdup_printf ("%u 0 obj\n", catalog_number);
868
pdf_writer_write_string (writer, _tmp4_);
870
pdf_writer_write_string (writer, "<<\n");
871
pdf_writer_write_string (writer, "/Type /Catalog\n");
872
_tmp5_ = g_strdup_printf ("/Pages %u 0 R\n", catalog_number + 1);
874
pdf_writer_write_string (writer, _tmp6_);
876
pdf_writer_write_string (writer, ">>\n");
877
pdf_writer_write_string (writer, "endobj\n");
878
pdf_writer_write_string (writer, "\n");
879
_tmp7_ = pdf_writer_start_object (writer);
880
pages_number = _tmp7_;
881
_tmp8_ = g_strdup_printf ("%u 0 obj\n", pages_number);
883
pdf_writer_write_string (writer, _tmp9_);
885
pdf_writer_write_string (writer, "<<\n");
886
pdf_writer_write_string (writer, "/Type /Pages\n");
887
pdf_writer_write_string (writer, "/Kids [");
896
gchar* _tmp12_ = NULL;
902
_tmp11_ = book_get_n_pages (self);
903
if (!(i < _tmp11_)) {
906
_tmp12_ = g_strdup_printf (" %u 0 R", (pages_number + 1) + (i * 3));
908
pdf_writer_write_string (writer, _tmp13_);
913
pdf_writer_write_string (writer, " ]\n");
914
_tmp14_ = book_get_n_pages (self);
915
_tmp15_ = g_strdup_printf ("/Count %u\n", _tmp14_);
917
pdf_writer_write_string (writer, _tmp16_);
919
pdf_writer_write_string (writer, ">>\n");
920
pdf_writer_write_string (writer, "endobj\n");
929
Page* _tmp19_ = NULL;
931
GdkPixbuf* _tmp20_ = NULL;
937
guint8* _tmp23_ = NULL;
949
gchar* _tmp27_ = NULL;
951
gint width_buffer_length1;
952
gint _width_buffer_size_;
953
gchar* _tmp28_ = NULL;
954
gchar* height_buffer;
955
gint height_buffer_length1;
956
gint _height_buffer_size_;
958
gint data_length1 = 0;
959
gint _data_size_ = 0;
962
guint8* _tmp53_ = NULL;
963
guint8* compressed_data;
964
gint compressed_data_length1;
965
gint _compressed_data_size_;
968
gchar* _tmp64_ = NULL;
970
gchar* _tmp66_ = NULL;
972
gchar* _tmp68_ = NULL;
974
const gchar* _tmp70_ = NULL;
975
const gchar* _tmp71_ = NULL;
976
gchar* _tmp72_ = NULL;
978
gchar* _tmp74_ = NULL;
981
gchar* _tmp77_ = NULL;
983
gchar* _tmp79_ = NULL;
985
gchar* _tmp81_ = NULL;
987
gchar* _tmp83_ = NULL;
989
gchar* _tmp85_ = NULL;
991
gchar* _tmp87_ = NULL;
993
const gchar* _tmp91_ = NULL;
994
const gchar* _tmp92_ = NULL;
995
gchar* _tmp93_ = NULL;
998
gchar* _tmp95_ = NULL;
1001
gchar* _tmp98_ = NULL;
1007
_tmp18_ = book_get_n_pages (self);
1008
if (!(i < _tmp18_)) {
1011
_tmp19_ = book_get_page (self, i);
1013
_tmp20_ = page_get_image (page, TRUE);
1015
_tmp21_ = gdk_pixbuf_get_width (image);
1017
_tmp22_ = gdk_pixbuf_get_height (image);
1019
_tmp23_ = gdk_pixbuf_get_pixels (image);
1021
pixels_length1 = -1;
1022
_pixels_size_ = pixels_length1;
1023
_tmp24_ = page_get_dpi (page);
1024
page_width = (width * 72.0) / _tmp24_;
1025
_tmp25_ = page_get_dpi (page);
1026
page_height = (height * 72.0) / _tmp25_;
1028
_tmp26_ = g_strdup ("DeviceRGB");
1029
color_space = _tmp26_;
1031
_tmp27_ = g_new0 (gchar, G_ASCII_DTOSTR_BUF_SIZE);
1032
width_buffer = _tmp27_;
1033
width_buffer_length1 = G_ASCII_DTOSTR_BUF_SIZE;
1034
_width_buffer_size_ = width_buffer_length1;
1035
_tmp28_ = g_new0 (gchar, G_ASCII_DTOSTR_BUF_SIZE);
1036
height_buffer = _tmp28_;
1037
height_buffer_length1 = G_ASCII_DTOSTR_BUF_SIZE;
1038
_height_buffer_size_ = height_buffer_length1;
1039
_tmp29_ = page_is_color (page);
1043
guint8* _tmp31_ = NULL;
1045
_tmp30_ = g_strdup ("DeviceRGB");
1046
_g_free0 (color_space);
1047
color_space = _tmp30_;
1048
data_length = ((height * width) * 3) + 1;
1049
_tmp31_ = g_new0 (guint8, data_length);
1050
data = (g_free (data), NULL);
1052
data_length1 = data_length;
1053
_data_size_ = data_length1;
1068
if (!(row < height)) {
1071
_tmp33_ = gdk_pixbuf_get_rowstride (image);
1072
in_offset = row * _tmp33_;
1073
out_offset = (row * width) * 3;
1090
in_o = in_offset + (x * 3);
1091
out_o = out_offset + (x * 3);
1092
data[out_o] = pixels[in_o];
1093
data[out_o + 1] = pixels[in_o + 1];
1094
data[out_o + 2] = pixels[in_o + 2];
1103
_tmp35_ = page_get_depth (page);
1108
guint8* _tmp37_ = NULL;
1112
_tmp36_ = g_strdup ("DeviceGray");
1113
_g_free0 (color_space);
1114
color_space = _tmp36_;
1115
data_length = height * (((width * 2) + 7) / 8);
1116
_tmp37_ = g_new0 (guint8, data_length);
1117
data = (g_free (data), NULL);
1119
data_length1 = data_length;
1120
_data_size_ = data_length1;
1122
data[offset] = (guint8) 0;
1136
if (!(row < height)) {
1139
if (shift_count != 6) {
1141
data[offset] = (guint8) 0;
1144
_tmp39_ = gdk_pixbuf_get_rowstride (image);
1145
in_offset = row * _tmp39_;
1161
p = pixels[in_offset + (x * 3)];
1163
data[offset] |= (guint8) (3 << shift_count);
1166
data[offset] |= (guint8) (2 << shift_count);
1169
data[offset] |= (guint8) (1 << shift_count);
1173
if (shift_count == 0) {
1175
data[offset] = (guint8) 0;
1178
shift_count = shift_count - 2;
1188
_tmp41_ = page_get_depth (page);
1193
guint8* _tmp43_ = NULL;
1197
_tmp42_ = g_strdup ("DeviceGray");
1198
_g_free0 (color_space);
1199
color_space = _tmp42_;
1200
data_length = height * ((width + 7) / 8);
1201
_tmp43_ = g_new0 (guint8, data_length);
1202
data = (g_free (data), NULL);
1204
data_length1 = data_length;
1205
_data_size_ = data_length1;
1207
data[offset] = (guint8) 0;
1221
if (!(row < height)) {
1226
data[offset] = (guint8) 0;
1229
_tmp45_ = gdk_pixbuf_get_rowstride (image);
1230
in_offset = row * _tmp45_;
1245
if (pixels[in_offset + (x * 3)] != 0) {
1246
data[offset] |= (guint8) mask;
1251
data[offset] = (guint8) 0;
1263
guint8* _tmp48_ = NULL;
1265
_tmp47_ = g_strdup ("DeviceGray");
1266
_g_free0 (color_space);
1267
color_space = _tmp47_;
1268
data_length = (height * width) + 1;
1269
_tmp48_ = g_new0 (guint8, data_length);
1270
data = (g_free (data), NULL);
1272
data_length1 = data_length;
1273
_data_size_ = data_length1;
1288
if (!(row < height)) {
1291
_tmp50_ = gdk_pixbuf_get_rowstride (image);
1292
in_offset = row * _tmp50_;
1293
out_offset = row * width;
1308
data[out_offset + x] = pixels[in_offset + (x * 3)];
1318
_tmp53_ = book_compress_zlib (self, data, data_length1, &_tmp52_);
1319
compressed_data = _tmp53_;
1320
compressed_data_length1 = _tmp52_;
1321
_compressed_data_size_ = compressed_data_length1;
1322
if (compressed_data != NULL) {
1324
gsize jpeg_length = 0UL;
1327
guint8* _tmp56_ = NULL;
1329
gint jpeg_data_length1;
1330
gint _jpeg_data_size_;
1331
_tmp56_ = book_compress_jpeg (self, image, &_tmp54_, &_tmp55_);
1332
jpeg_length = _tmp54_;
1333
jpeg_data = _tmp56_;
1334
jpeg_data_length1 = _tmp55_;
1335
_jpeg_data_size_ = jpeg_data_length1;
1336
if (jpeg_length < compressed_data_length1) {
1340
_tmp57_ = g_strdup ("DCTDecode");
1343
_tmp59_ = (_tmp58_ = jpeg_data, (_tmp58_ == NULL) ? ((gpointer) _tmp58_) : _vala_array_dup1 (_tmp58_, jpeg_data_length1));
1344
data = (g_free (data), NULL);
1346
data_length1 = jpeg_data_length1;
1347
_data_size_ = data_length1;
1349
jpeg_data = (g_free (jpeg_data), NULL);
1351
if (filter == NULL) {
1355
_tmp60_ = g_strdup ("FlateDecode");
1358
_tmp62_ = (_tmp61_ = compressed_data, (_tmp61_ == NULL) ? ((gpointer) _tmp61_) : _vala_array_dup2 (_tmp61_, compressed_data_length1));
1359
data = (g_free (data), NULL);
1361
data_length1 = compressed_data_length1;
1362
_data_size_ = data_length1;
1365
pdf_writer_write_string (writer, "\n");
1366
_tmp63_ = pdf_writer_start_object (writer);
1368
_tmp64_ = g_strdup_printf ("%u 0 obj\n", number);
1370
pdf_writer_write_string (writer, _tmp65_);
1372
pdf_writer_write_string (writer, "<<\n");
1373
pdf_writer_write_string (writer, "/Type /Page\n");
1374
_tmp66_ = g_strdup_printf ("/Parent %u 0 R\n", pages_number);
1376
pdf_writer_write_string (writer, _tmp67_);
1378
_tmp68_ = g_strdup_printf ("/Resources << /XObject << /Im%d %u 0 R >> >>\n", i, number + 1);
1380
pdf_writer_write_string (writer, _tmp69_);
1382
_tmp70_ = g_ascii_formatd (width_buffer, width_buffer_length1, "%.2f", page_width);
1383
_tmp71_ = g_ascii_formatd (height_buffer, height_buffer_length1, "%.2f", page_height);
1384
_tmp72_ = g_strdup_printf ("/MediaBox [ 0 0 %s %s ]\n", _tmp70_, _tmp71_);
1386
pdf_writer_write_string (writer, _tmp73_);
1388
_tmp74_ = g_strdup_printf ("/Contents %u 0 R\n", number + 2);
1390
pdf_writer_write_string (writer, _tmp75_);
1392
pdf_writer_write_string (writer, ">>\n");
1393
pdf_writer_write_string (writer, "endobj\n");
1394
pdf_writer_write_string (writer, "\n");
1395
_tmp76_ = pdf_writer_start_object (writer);
1397
_tmp77_ = g_strdup_printf ("%u 0 obj\n", number);
1399
pdf_writer_write_string (writer, _tmp78_);
1401
pdf_writer_write_string (writer, "<<\n");
1402
pdf_writer_write_string (writer, "/Type /XObject\n");
1403
pdf_writer_write_string (writer, "/Subtype /Image\n");
1404
_tmp79_ = g_strdup_printf ("/Width %d\n", width);
1406
pdf_writer_write_string (writer, _tmp80_);
1408
_tmp81_ = g_strdup_printf ("/Height %d\n", height);
1410
pdf_writer_write_string (writer, _tmp82_);
1412
_tmp83_ = g_strdup_printf ("/ColorSpace /%s\n", color_space);
1414
pdf_writer_write_string (writer, _tmp84_);
1416
_tmp85_ = g_strdup_printf ("/BitsPerComponent %d\n", depth);
1418
pdf_writer_write_string (writer, _tmp86_);
1420
_tmp87_ = g_strdup_printf ("/Length %d\n", data_length1);
1422
pdf_writer_write_string (writer, _tmp88_);
1424
if (filter != NULL) {
1425
gchar* _tmp89_ = NULL;
1427
_tmp89_ = g_strdup_printf ("/Filter /%s\n", filter);
1429
pdf_writer_write_string (writer, _tmp90_);
1432
pdf_writer_write_string (writer, ">>\n");
1433
pdf_writer_write_string (writer, "stream\n");
1434
pdf_writer_write (writer, data, data_length1);
1435
pdf_writer_write_string (writer, "\n");
1436
pdf_writer_write_string (writer, "endstream\n");
1437
pdf_writer_write_string (writer, "endobj\n");
1438
_tmp91_ = g_ascii_formatd (width_buffer, width_buffer_length1, "%f", page_width);
1439
_tmp92_ = g_ascii_formatd (height_buffer, height_buffer_length1, "%f", page_height);
1440
_tmp93_ = g_strdup_printf ("q\n%s 0 0 %s 0 0 cm\n/Im%d Do\nQ", _tmp91_, _tmp92_, i);
1442
pdf_writer_write_string (writer, "\n");
1443
_tmp94_ = pdf_writer_start_object (writer);
1445
_tmp95_ = g_strdup_printf ("%u 0 obj\n", number);
1447
pdf_writer_write_string (writer, _tmp96_);
1449
pdf_writer_write_string (writer, "<<\n");
1450
_tmp97_ = strlen (command);
1451
_tmp98_ = g_strdup_printf ("/Length %d\n", _tmp97_ + 1);
1453
pdf_writer_write_string (writer, _tmp99_);
1455
pdf_writer_write_string (writer, ">>\n");
1456
pdf_writer_write_string (writer, "stream\n");
1457
pdf_writer_write_string (writer, command);
1458
pdf_writer_write_string (writer, "\n");
1459
pdf_writer_write_string (writer, "endstream\n");
1460
pdf_writer_write_string (writer, "endobj\n");
1462
compressed_data = (g_free (compressed_data), NULL);
1463
data = (g_free (data), NULL);
1464
height_buffer = (g_free (height_buffer), NULL);
1465
width_buffer = (g_free (width_buffer), NULL);
1467
_g_free0 (color_space);
1468
_g_object_unref0 (image);
1469
_page_unref0 (page);
1473
pdf_writer_write_string (writer, "\n");
1474
_tmp100_ = pdf_writer_start_object (writer);
1475
info_number = _tmp100_;
1476
_tmp101_ = g_strdup_printf ("%u 0 obj\n", info_number);
1477
_tmp102_ = _tmp101_;
1478
pdf_writer_write_string (writer, _tmp102_);
1479
_g_free0 (_tmp102_);
1480
pdf_writer_write_string (writer, "<<\n");
1481
_tmp103_ = g_strdup_printf ("/Creator (Simple Scan %s)\n", VERSION);
1482
_tmp104_ = _tmp103_;
1483
pdf_writer_write_string (writer, _tmp104_);
1484
_g_free0 (_tmp104_);
1485
pdf_writer_write_string (writer, ">>\n");
1486
pdf_writer_write_string (writer, "endobj\n");
1487
xref_offset = writer->offset;
1488
pdf_writer_write_string (writer, "xref\n");
1489
_tmp105_ = g_list_length (writer->object_offsets);
1490
_tmp106_ = g_strdup_printf ("1 %zu\n", (gsize) _tmp105_);
1491
_tmp107_ = _tmp106_;
1492
pdf_writer_write_string (writer, _tmp107_);
1493
_g_free0 (_tmp107_);
1495
GList* offset_collection = NULL;
1496
GList* offset_it = NULL;
1497
offset_collection = writer->object_offsets;
1498
for (offset_it = offset_collection; offset_it != NULL; offset_it = offset_it->next) {
1500
offset = GPOINTER_TO_UINT (offset_it->data);
1502
gchar* _tmp108_ = NULL;
1504
_tmp108_ = g_strdup_printf ("%010zu 0000 n\n", (gsize) offset);
1505
_tmp109_ = _tmp108_;
1506
pdf_writer_write_string (writer, _tmp109_);
1507
_g_free0 (_tmp109_);
1511
pdf_writer_write_string (writer, "trailer\n");
1512
pdf_writer_write_string (writer, "<<\n");
1513
_tmp110_ = g_list_length (writer->object_offsets);
1514
_tmp111_ = g_strdup_printf ("/Size %zu\n", (gsize) _tmp110_);
1515
_tmp112_ = _tmp111_;
1516
pdf_writer_write_string (writer, _tmp112_);
1517
_g_free0 (_tmp112_);
1518
_tmp113_ = g_strdup_printf ("/Info %u 0 R\n", info_number);
1519
_tmp114_ = _tmp113_;
1520
pdf_writer_write_string (writer, _tmp114_);
1521
_g_free0 (_tmp114_);
1522
_tmp115_ = g_strdup_printf ("/Root %u 0 R\n", catalog_number);
1523
_tmp116_ = _tmp115_;
1524
pdf_writer_write_string (writer, _tmp116_);
1525
_g_free0 (_tmp116_);
1526
pdf_writer_write_string (writer, ">>\n");
1527
pdf_writer_write_string (writer, "startxref\n");
1528
_tmp117_ = g_strdup_printf ("%zu\n", xref_offset);
1529
_tmp118_ = _tmp117_;
1530
pdf_writer_write_string (writer, _tmp118_);
1531
_g_free0 (_tmp118_);
1532
pdf_writer_write_string (writer, "%%%%EOF\n");
1533
_pdf_writer_unref0 (writer);
1534
_g_object_unref0 (stream);
1538
void book_save (Book* self, const gchar* type, GFile* file, GError** error) {
1540
GError * _inner_error_ = NULL;
1541
g_return_if_fail (self != NULL);
1542
g_return_if_fail (type != NULL);
1543
g_return_if_fail (file != NULL);
1544
_tmp0_ = g_strcmp0 (type, "jpeg");
1546
book_save_multi_file (self, "jpeg", file, &_inner_error_);
1547
if (_inner_error_ != NULL) {
1548
g_propagate_error (error, _inner_error_);
1553
_tmp1_ = g_strcmp0 (type, "png");
1555
book_save_multi_file (self, "png", file, &_inner_error_);
1556
if (_inner_error_ != NULL) {
1557
g_propagate_error (error, _inner_error_);
1562
_tmp2_ = g_strcmp0 (type, "tiff");
1564
book_save_multi_file (self, "tiff", file, &_inner_error_);
1565
if (_inner_error_ != NULL) {
1566
g_propagate_error (error, _inner_error_);
1571
_tmp3_ = g_strcmp0 (type, "ps");
1573
book_save_ps (self, file, &_inner_error_);
1574
if (_inner_error_ != NULL) {
1575
g_propagate_error (error, _inner_error_);
1580
_tmp4_ = g_strcmp0 (type, "pdf");
1582
book_save_pdf (self, file, &_inner_error_);
1583
if (_inner_error_ != NULL) {
1584
g_propagate_error (error, _inner_error_);
1595
void book_set_needs_saving (Book* self, gboolean needs_saving) {
1596
gboolean needed_saving;
1597
g_return_if_fail (self != NULL);
1598
needed_saving = self->priv->needs_saving;
1599
self->priv->needs_saving = needs_saving;
1600
if (needed_saving != needs_saving) {
1601
g_signal_emit_by_name (self, "needs-saving-changed");
1606
gboolean book_get_needs_saving (Book* self) {
1607
gboolean result = FALSE;
1608
g_return_val_if_fail (self != NULL, FALSE);
1609
result = self->priv->needs_saving;
1614
static void g_cclosure_user_marshal_VOID__PAGE (GClosure * closure, GValue * return_value, guint n_param_values, const GValue * param_values, gpointer invocation_hint, gpointer marshal_data) {
1615
typedef void (*GMarshalFunc_VOID__PAGE) (gpointer data1, gpointer arg_1, gpointer data2);
1616
register GMarshalFunc_VOID__PAGE callback;
1617
register GCClosure * cc;
1618
register gpointer data1;
1619
register gpointer data2;
1620
cc = (GCClosure *) closure;
1621
g_return_if_fail (n_param_values == 2);
1622
if (G_CCLOSURE_SWAP_DATA (closure)) {
1623
data1 = closure->data;
1624
data2 = param_values->data[0].v_pointer;
1626
data1 = param_values->data[0].v_pointer;
1627
data2 = closure->data;
1629
callback = (GMarshalFunc_VOID__PAGE) (marshal_data ? marshal_data : cc->callback);
1630
callback (data1, value_get_page (param_values + 1), data2);
1634
static void value_book_init (GValue* value) {
1635
value->data[0].v_pointer = NULL;
1639
static void value_book_free_value (GValue* value) {
1640
if (value->data[0].v_pointer) {
1641
book_unref (value->data[0].v_pointer);
1646
static void value_book_copy_value (const GValue* src_value, GValue* dest_value) {
1647
if (src_value->data[0].v_pointer) {
1648
dest_value->data[0].v_pointer = book_ref (src_value->data[0].v_pointer);
1650
dest_value->data[0].v_pointer = NULL;
1655
static gpointer value_book_peek_pointer (const GValue* value) {
1656
return value->data[0].v_pointer;
1660
static gchar* value_book_collect_value (GValue* value, guint n_collect_values, GTypeCValue* collect_values, guint collect_flags) {
1661
if (collect_values[0].v_pointer) {
1663
object = collect_values[0].v_pointer;
1664
if (object->parent_instance.g_class == NULL) {
1665
return g_strconcat ("invalid unclassed object pointer for value type `", G_VALUE_TYPE_NAME (value), "'", NULL);
1666
} else if (!g_value_type_compatible (G_TYPE_FROM_INSTANCE (object), G_VALUE_TYPE (value))) {
1667
return g_strconcat ("invalid object type `", g_type_name (G_TYPE_FROM_INSTANCE (object)), "' for value type `", G_VALUE_TYPE_NAME (value), "'", NULL);
1669
value->data[0].v_pointer = book_ref (object);
1671
value->data[0].v_pointer = NULL;
1677
static gchar* value_book_lcopy_value (const GValue* value, guint n_collect_values, GTypeCValue* collect_values, guint collect_flags) {
1679
object_p = collect_values[0].v_pointer;
1681
return g_strdup_printf ("value location for `%s' passed as NULL", G_VALUE_TYPE_NAME (value));
1683
if (!value->data[0].v_pointer) {
1685
} else if (collect_flags & G_VALUE_NOCOPY_CONTENTS) {
1686
*object_p = value->data[0].v_pointer;
1688
*object_p = book_ref (value->data[0].v_pointer);
1694
GParamSpec* param_spec_book (const gchar* name, const gchar* nick, const gchar* blurb, GType object_type, GParamFlags flags) {
1695
ParamSpecBook* spec;
1696
g_return_val_if_fail (g_type_is_a (object_type, TYPE_BOOK), NULL);
1697
spec = g_param_spec_internal (G_TYPE_PARAM_OBJECT, name, nick, blurb, flags);
1698
G_PARAM_SPEC (spec)->value_type = object_type;
1699
return G_PARAM_SPEC (spec);
1703
gpointer value_get_book (const GValue* value) {
1704
g_return_val_if_fail (G_TYPE_CHECK_VALUE_TYPE (value, TYPE_BOOK), NULL);
1705
return value->data[0].v_pointer;
1709
void value_set_book (GValue* value, gpointer v_object) {
1711
g_return_if_fail (G_TYPE_CHECK_VALUE_TYPE (value, TYPE_BOOK));
1712
old = value->data[0].v_pointer;
1714
g_return_if_fail (G_TYPE_CHECK_INSTANCE_TYPE (v_object, TYPE_BOOK));
1715
g_return_if_fail (g_value_type_compatible (G_TYPE_FROM_INSTANCE (v_object), G_VALUE_TYPE (value)));
1716
value->data[0].v_pointer = v_object;
1717
book_ref (value->data[0].v_pointer);
1719
value->data[0].v_pointer = NULL;
1727
void value_take_book (GValue* value, gpointer v_object) {
1729
g_return_if_fail (G_TYPE_CHECK_VALUE_TYPE (value, TYPE_BOOK));
1730
old = value->data[0].v_pointer;
1732
g_return_if_fail (G_TYPE_CHECK_INSTANCE_TYPE (v_object, TYPE_BOOK));
1733
g_return_if_fail (g_value_type_compatible (G_TYPE_FROM_INSTANCE (v_object), G_VALUE_TYPE (value)));
1734
value->data[0].v_pointer = v_object;
1736
value->data[0].v_pointer = NULL;
1744
static void book_class_init (BookClass * klass) {
1745
book_parent_class = g_type_class_peek_parent (klass);
1746
BOOK_CLASS (klass)->finalize = book_finalize;
1747
g_type_class_add_private (klass, sizeof (BookPrivate));
1748
g_signal_new ("page_added", TYPE_BOOK, G_SIGNAL_RUN_LAST, 0, NULL, NULL, g_cclosure_user_marshal_VOID__PAGE, G_TYPE_NONE, 1, TYPE_PAGE);
1749
g_signal_new ("page_removed", TYPE_BOOK, G_SIGNAL_RUN_LAST, 0, NULL, NULL, g_cclosure_user_marshal_VOID__PAGE, G_TYPE_NONE, 1, TYPE_PAGE);
1750
g_signal_new ("reordered", TYPE_BOOK, G_SIGNAL_RUN_LAST, 0, NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0);
1751
g_signal_new ("cleared", TYPE_BOOK, G_SIGNAL_RUN_LAST, 0, NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0);
1752
g_signal_new ("needs_saving_changed", TYPE_BOOK, G_SIGNAL_RUN_LAST, 0, NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0);
1756
static void book_instance_init (Book * self) {
1757
self->priv = BOOK_GET_PRIVATE (self);
1758
self->ref_count = 1;
1762
static void book_finalize (Book* obj) {
1765
__g_list_free__page_unref0_0 (self->priv->pages);
1769
GType book_get_type (void) {
1770
static volatile gsize book_type_id__volatile = 0;
1771
if (g_once_init_enter (&book_type_id__volatile)) {
1772
static const GTypeValueTable g_define_type_value_table = { value_book_init, value_book_free_value, value_book_copy_value, value_book_peek_pointer, "p", value_book_collect_value, "p", value_book_lcopy_value };
1773
static const GTypeInfo g_define_type_info = { sizeof (BookClass), (GBaseInitFunc) NULL, (GBaseFinalizeFunc) NULL, (GClassInitFunc) book_class_init, (GClassFinalizeFunc) NULL, NULL, sizeof (Book), 0, (GInstanceInitFunc) book_instance_init, &g_define_type_value_table };
1774
static const GTypeFundamentalInfo g_define_type_fundamental_info = { (G_TYPE_FLAG_CLASSED | G_TYPE_FLAG_INSTANTIATABLE | G_TYPE_FLAG_DERIVABLE | G_TYPE_FLAG_DEEP_DERIVABLE) };
1776
book_type_id = g_type_register_fundamental (g_type_fundamental_next (), "Book", &g_define_type_info, &g_define_type_fundamental_info, 0);
1777
g_once_init_leave (&book_type_id__volatile, book_type_id);
1779
return book_type_id__volatile;
1783
gpointer book_ref (gpointer instance) {
1786
g_atomic_int_inc (&self->ref_count);
1791
void book_unref (gpointer instance) {
1794
if (g_atomic_int_dec_and_test (&self->ref_count)) {
1795
BOOK_GET_CLASS (self)->finalize (self);
1796
g_type_free_instance ((GTypeInstance *) self);
1801
static gpointer _g_object_ref0 (gpointer self) {
1802
return self ? g_object_ref (self) : NULL;
1806
PDFWriter* pdf_writer_construct (GType object_type, GFileOutputStream* stream) {
1807
PDFWriter* self = NULL;
1808
GFileOutputStream* _tmp0_;
1809
g_return_val_if_fail (stream != NULL, NULL);
1810
self = (PDFWriter*) g_type_create_instance (object_type);
1811
_tmp0_ = _g_object_ref0 (stream);
1812
_g_object_unref0 (self->priv->stream);
1813
self->priv->stream = _tmp0_;
1818
PDFWriter* pdf_writer_new (GFileOutputStream* stream) {
1819
return pdf_writer_construct (TYPE_PDF_WRITER, stream);
1823
void pdf_writer_write (PDFWriter* self, guint8* data, int data_length1) {
1824
GError * _inner_error_ = NULL;
1825
g_return_if_fail (self != NULL);
1827
g_output_stream_write_all ((GOutputStream*) self->priv->stream, data, (gsize) data_length1, NULL, NULL, &_inner_error_);
1828
if (_inner_error_ != NULL) {
1829
goto __catch0_g_error;
1837
_inner_error_ = NULL;
1838
g_warning ("book.vala:529: Error writing PDF: %s", e->message);
1842
if (_inner_error_ != NULL) {
1843
g_critical ("file %s: line %d: uncaught error: %s (%s, %d)", __FILE__, __LINE__, _inner_error_->message, g_quark_to_string (_inner_error_->domain), _inner_error_->code);
1844
g_clear_error (&_inner_error_);
1847
self->offset = self->offset + data_length1;
1851
static gchar* string_to_utf8 (const gchar* self, int* result_length1) {
1852
gchar* result = NULL;
1854
gchar* _tmp1_ = NULL;
1856
gint _result__length1;
1857
gint __result__size_;
1860
g_return_val_if_fail (self != NULL, NULL);
1861
_tmp0_ = strlen (self);
1862
_tmp1_ = g_new0 (gchar, _tmp0_ + 1);
1864
_result__length1 = _tmp0_ + 1;
1865
__result__size_ = _result__length1;
1867
_tmp2_ = strlen (self);
1868
memcpy (_result_, self, (gsize) _tmp2_);
1870
if (result_length1) {
1871
*result_length1 = _result__length1;
1878
void pdf_writer_write_string (PDFWriter* self, const gchar* text) {
1880
gchar* _tmp1_ = NULL;
1882
gint _tmp2__length1;
1883
g_return_if_fail (self != NULL);
1884
g_return_if_fail (text != NULL);
1885
_tmp1_ = string_to_utf8 (text, &_tmp0_);
1886
_tmp2_ = (guint8*) _tmp1_;
1887
_tmp2__length1 = _tmp0_;
1888
pdf_writer_write (self, _tmp2_, _tmp0_);
1889
_tmp2_ = (g_free (_tmp2_), NULL);
1893
guint pdf_writer_start_object (PDFWriter* self) {
1896
g_return_val_if_fail (self != NULL, 0U);
1897
self->object_offsets = g_list_append (self->object_offsets, GUINT_TO_POINTER ((guint) self->offset));
1898
_tmp0_ = g_list_length (self->object_offsets);
1904
static void value_pdf_writer_init (GValue* value) {
1905
value->data[0].v_pointer = NULL;
1909
static void value_pdf_writer_free_value (GValue* value) {
1910
if (value->data[0].v_pointer) {
1911
pdf_writer_unref (value->data[0].v_pointer);
1916
static void value_pdf_writer_copy_value (const GValue* src_value, GValue* dest_value) {
1917
if (src_value->data[0].v_pointer) {
1918
dest_value->data[0].v_pointer = pdf_writer_ref (src_value->data[0].v_pointer);
1920
dest_value->data[0].v_pointer = NULL;
1925
static gpointer value_pdf_writer_peek_pointer (const GValue* value) {
1926
return value->data[0].v_pointer;
1930
static gchar* value_pdf_writer_collect_value (GValue* value, guint n_collect_values, GTypeCValue* collect_values, guint collect_flags) {
1931
if (collect_values[0].v_pointer) {
1933
object = collect_values[0].v_pointer;
1934
if (object->parent_instance.g_class == NULL) {
1935
return g_strconcat ("invalid unclassed object pointer for value type `", G_VALUE_TYPE_NAME (value), "'", NULL);
1936
} else if (!g_value_type_compatible (G_TYPE_FROM_INSTANCE (object), G_VALUE_TYPE (value))) {
1937
return g_strconcat ("invalid object type `", g_type_name (G_TYPE_FROM_INSTANCE (object)), "' for value type `", G_VALUE_TYPE_NAME (value), "'", NULL);
1939
value->data[0].v_pointer = pdf_writer_ref (object);
1941
value->data[0].v_pointer = NULL;
1947
static gchar* value_pdf_writer_lcopy_value (const GValue* value, guint n_collect_values, GTypeCValue* collect_values, guint collect_flags) {
1948
PDFWriter** object_p;
1949
object_p = collect_values[0].v_pointer;
1951
return g_strdup_printf ("value location for `%s' passed as NULL", G_VALUE_TYPE_NAME (value));
1953
if (!value->data[0].v_pointer) {
1955
} else if (collect_flags & G_VALUE_NOCOPY_CONTENTS) {
1956
*object_p = value->data[0].v_pointer;
1958
*object_p = pdf_writer_ref (value->data[0].v_pointer);
1964
GParamSpec* param_spec_pdf_writer (const gchar* name, const gchar* nick, const gchar* blurb, GType object_type, GParamFlags flags) {
1965
ParamSpecPDFWriter* spec;
1966
g_return_val_if_fail (g_type_is_a (object_type, TYPE_PDF_WRITER), NULL);
1967
spec = g_param_spec_internal (G_TYPE_PARAM_OBJECT, name, nick, blurb, flags);
1968
G_PARAM_SPEC (spec)->value_type = object_type;
1969
return G_PARAM_SPEC (spec);
1973
gpointer value_get_pdf_writer (const GValue* value) {
1974
g_return_val_if_fail (G_TYPE_CHECK_VALUE_TYPE (value, TYPE_PDF_WRITER), NULL);
1975
return value->data[0].v_pointer;
1979
void value_set_pdf_writer (GValue* value, gpointer v_object) {
1981
g_return_if_fail (G_TYPE_CHECK_VALUE_TYPE (value, TYPE_PDF_WRITER));
1982
old = value->data[0].v_pointer;
1984
g_return_if_fail (G_TYPE_CHECK_INSTANCE_TYPE (v_object, TYPE_PDF_WRITER));
1985
g_return_if_fail (g_value_type_compatible (G_TYPE_FROM_INSTANCE (v_object), G_VALUE_TYPE (value)));
1986
value->data[0].v_pointer = v_object;
1987
pdf_writer_ref (value->data[0].v_pointer);
1989
value->data[0].v_pointer = NULL;
1992
pdf_writer_unref (old);
1997
void value_take_pdf_writer (GValue* value, gpointer v_object) {
1999
g_return_if_fail (G_TYPE_CHECK_VALUE_TYPE (value, TYPE_PDF_WRITER));
2000
old = value->data[0].v_pointer;
2002
g_return_if_fail (G_TYPE_CHECK_INSTANCE_TYPE (v_object, TYPE_PDF_WRITER));
2003
g_return_if_fail (g_value_type_compatible (G_TYPE_FROM_INSTANCE (v_object), G_VALUE_TYPE (value)));
2004
value->data[0].v_pointer = v_object;
2006
value->data[0].v_pointer = NULL;
2009
pdf_writer_unref (old);
2014
static void pdf_writer_class_init (PDFWriterClass * klass) {
2015
pdf_writer_parent_class = g_type_class_peek_parent (klass);
2016
PDF_WRITER_CLASS (klass)->finalize = pdf_writer_finalize;
2017
g_type_class_add_private (klass, sizeof (PDFWriterPrivate));
2021
static void pdf_writer_instance_init (PDFWriter * self) {
2022
self->priv = PDF_WRITER_GET_PRIVATE (self);
2023
self->offset = (gsize) 0;
2024
self->ref_count = 1;
2028
static void pdf_writer_finalize (PDFWriter* obj) {
2030
self = PDF_WRITER (obj);
2031
_g_list_free0 (self->object_offsets);
2032
_g_object_unref0 (self->priv->stream);
2036
GType pdf_writer_get_type (void) {
2037
static volatile gsize pdf_writer_type_id__volatile = 0;
2038
if (g_once_init_enter (&pdf_writer_type_id__volatile)) {
2039
static const GTypeValueTable g_define_type_value_table = { value_pdf_writer_init, value_pdf_writer_free_value, value_pdf_writer_copy_value, value_pdf_writer_peek_pointer, "p", value_pdf_writer_collect_value, "p", value_pdf_writer_lcopy_value };
2040
static const GTypeInfo g_define_type_info = { sizeof (PDFWriterClass), (GBaseInitFunc) NULL, (GBaseFinalizeFunc) NULL, (GClassInitFunc) pdf_writer_class_init, (GClassFinalizeFunc) NULL, NULL, sizeof (PDFWriter), 0, (GInstanceInitFunc) pdf_writer_instance_init, &g_define_type_value_table };
2041
static const GTypeFundamentalInfo g_define_type_fundamental_info = { (G_TYPE_FLAG_CLASSED | G_TYPE_FLAG_INSTANTIATABLE | G_TYPE_FLAG_DERIVABLE | G_TYPE_FLAG_DEEP_DERIVABLE) };
2042
GType pdf_writer_type_id;
2043
pdf_writer_type_id = g_type_register_fundamental (g_type_fundamental_next (), "PDFWriter", &g_define_type_info, &g_define_type_fundamental_info, 0);
2044
g_once_init_leave (&pdf_writer_type_id__volatile, pdf_writer_type_id);
2046
return pdf_writer_type_id__volatile;
2050
gpointer pdf_writer_ref (gpointer instance) {
2053
g_atomic_int_inc (&self->ref_count);
2058
void pdf_writer_unref (gpointer instance) {
2061
if (g_atomic_int_dec_and_test (&self->ref_count)) {
2062
PDF_WRITER_GET_CLASS (self)->finalize (self);
2063
g_type_free_instance ((GTypeInstance *) self);
2068
static cairo_status_t _ps_writer_write_cairo_data_cairo_write_func_t (gpointer self, guchar* data, int data_length1) {
2069
cairo_status_t result;
2070
result = ps_writer_write_cairo_data (self, data, data_length1);
2075
PsWriter* ps_writer_construct (GType object_type, GFileOutputStream* stream) {
2076
PsWriter* self = NULL;
2077
GFileOutputStream* _tmp0_;
2078
cairo_surface_t* _tmp1_ = NULL;
2079
g_return_val_if_fail (stream != NULL, NULL);
2080
self = (PsWriter*) g_type_create_instance (object_type);
2081
_tmp0_ = _g_object_ref0 (stream);
2082
_g_object_unref0 (self->stream);
2083
self->stream = _tmp0_;
2084
_tmp1_ = cairo_ps_surface_create_for_stream (_ps_writer_write_cairo_data_cairo_write_func_t, self, (gdouble) 0, (gdouble) 0);
2085
_cairo_surface_destroy0 (self->surface);
2086
self->surface = _tmp1_;
2091
PsWriter* ps_writer_new (GFileOutputStream* stream) {
2092
return ps_writer_construct (TYPE_PS_WRITER, stream);
2096
static cairo_status_t ps_writer_write_cairo_data (PsWriter* self, guint8* data, int data_length1) {
2097
cairo_status_t result = 0;
2098
GError * _inner_error_ = NULL;
2099
g_return_val_if_fail (self != NULL, 0);
2101
g_output_stream_write_all ((GOutputStream*) self->stream, data, (gsize) data_length1, NULL, NULL, &_inner_error_);
2102
if (_inner_error_ != NULL) {
2103
goto __catch1_g_error;
2111
_inner_error_ = NULL;
2112
g_warning ("book.vala:565: Error writing data: %s", e->message);
2113
result = CAIRO_STATUS_WRITE_ERROR;
2118
if (_inner_error_ != NULL) {
2119
g_critical ("file %s: line %d: uncaught error: %s (%s, %d)", __FILE__, __LINE__, _inner_error_->message, g_quark_to_string (_inner_error_->domain), _inner_error_->code);
2120
g_clear_error (&_inner_error_);
2123
result = CAIRO_STATUS_SUCCESS;
2128
static void value_ps_writer_init (GValue* value) {
2129
value->data[0].v_pointer = NULL;
2133
static void value_ps_writer_free_value (GValue* value) {
2134
if (value->data[0].v_pointer) {
2135
ps_writer_unref (value->data[0].v_pointer);
2140
static void value_ps_writer_copy_value (const GValue* src_value, GValue* dest_value) {
2141
if (src_value->data[0].v_pointer) {
2142
dest_value->data[0].v_pointer = ps_writer_ref (src_value->data[0].v_pointer);
2144
dest_value->data[0].v_pointer = NULL;
2149
static gpointer value_ps_writer_peek_pointer (const GValue* value) {
2150
return value->data[0].v_pointer;
2154
static gchar* value_ps_writer_collect_value (GValue* value, guint n_collect_values, GTypeCValue* collect_values, guint collect_flags) {
2155
if (collect_values[0].v_pointer) {
2157
object = collect_values[0].v_pointer;
2158
if (object->parent_instance.g_class == NULL) {
2159
return g_strconcat ("invalid unclassed object pointer for value type `", G_VALUE_TYPE_NAME (value), "'", NULL);
2160
} else if (!g_value_type_compatible (G_TYPE_FROM_INSTANCE (object), G_VALUE_TYPE (value))) {
2161
return g_strconcat ("invalid object type `", g_type_name (G_TYPE_FROM_INSTANCE (object)), "' for value type `", G_VALUE_TYPE_NAME (value), "'", NULL);
2163
value->data[0].v_pointer = ps_writer_ref (object);
2165
value->data[0].v_pointer = NULL;
2171
static gchar* value_ps_writer_lcopy_value (const GValue* value, guint n_collect_values, GTypeCValue* collect_values, guint collect_flags) {
2172
PsWriter** object_p;
2173
object_p = collect_values[0].v_pointer;
2175
return g_strdup_printf ("value location for `%s' passed as NULL", G_VALUE_TYPE_NAME (value));
2177
if (!value->data[0].v_pointer) {
2179
} else if (collect_flags & G_VALUE_NOCOPY_CONTENTS) {
2180
*object_p = value->data[0].v_pointer;
2182
*object_p = ps_writer_ref (value->data[0].v_pointer);
2188
GParamSpec* param_spec_ps_writer (const gchar* name, const gchar* nick, const gchar* blurb, GType object_type, GParamFlags flags) {
2189
ParamSpecPsWriter* spec;
2190
g_return_val_if_fail (g_type_is_a (object_type, TYPE_PS_WRITER), NULL);
2191
spec = g_param_spec_internal (G_TYPE_PARAM_OBJECT, name, nick, blurb, flags);
2192
G_PARAM_SPEC (spec)->value_type = object_type;
2193
return G_PARAM_SPEC (spec);
2197
gpointer value_get_ps_writer (const GValue* value) {
2198
g_return_val_if_fail (G_TYPE_CHECK_VALUE_TYPE (value, TYPE_PS_WRITER), NULL);
2199
return value->data[0].v_pointer;
2203
void value_set_ps_writer (GValue* value, gpointer v_object) {
2205
g_return_if_fail (G_TYPE_CHECK_VALUE_TYPE (value, TYPE_PS_WRITER));
2206
old = value->data[0].v_pointer;
2208
g_return_if_fail (G_TYPE_CHECK_INSTANCE_TYPE (v_object, TYPE_PS_WRITER));
2209
g_return_if_fail (g_value_type_compatible (G_TYPE_FROM_INSTANCE (v_object), G_VALUE_TYPE (value)));
2210
value->data[0].v_pointer = v_object;
2211
ps_writer_ref (value->data[0].v_pointer);
2213
value->data[0].v_pointer = NULL;
2216
ps_writer_unref (old);
2221
void value_take_ps_writer (GValue* value, gpointer v_object) {
2223
g_return_if_fail (G_TYPE_CHECK_VALUE_TYPE (value, TYPE_PS_WRITER));
2224
old = value->data[0].v_pointer;
2226
g_return_if_fail (G_TYPE_CHECK_INSTANCE_TYPE (v_object, TYPE_PS_WRITER));
2227
g_return_if_fail (g_value_type_compatible (G_TYPE_FROM_INSTANCE (v_object), G_VALUE_TYPE (value)));
2228
value->data[0].v_pointer = v_object;
2230
value->data[0].v_pointer = NULL;
2233
ps_writer_unref (old);
2238
static void ps_writer_class_init (PsWriterClass * klass) {
2239
ps_writer_parent_class = g_type_class_peek_parent (klass);
2240
PS_WRITER_CLASS (klass)->finalize = ps_writer_finalize;
2244
static void ps_writer_instance_init (PsWriter * self) {
2245
self->ref_count = 1;
2249
static void ps_writer_finalize (PsWriter* obj) {
2251
self = PS_WRITER (obj);
2252
_cairo_surface_destroy0 (self->surface);
2253
_g_object_unref0 (self->stream);
2257
GType ps_writer_get_type (void) {
2258
static volatile gsize ps_writer_type_id__volatile = 0;
2259
if (g_once_init_enter (&ps_writer_type_id__volatile)) {
2260
static const GTypeValueTable g_define_type_value_table = { value_ps_writer_init, value_ps_writer_free_value, value_ps_writer_copy_value, value_ps_writer_peek_pointer, "p", value_ps_writer_collect_value, "p", value_ps_writer_lcopy_value };
2261
static const GTypeInfo g_define_type_info = { sizeof (PsWriterClass), (GBaseInitFunc) NULL, (GBaseFinalizeFunc) NULL, (GClassInitFunc) ps_writer_class_init, (GClassFinalizeFunc) NULL, NULL, sizeof (PsWriter), 0, (GInstanceInitFunc) ps_writer_instance_init, &g_define_type_value_table };
2262
static const GTypeFundamentalInfo g_define_type_fundamental_info = { (G_TYPE_FLAG_CLASSED | G_TYPE_FLAG_INSTANTIATABLE | G_TYPE_FLAG_DERIVABLE | G_TYPE_FLAG_DEEP_DERIVABLE) };
2263
GType ps_writer_type_id;
2264
ps_writer_type_id = g_type_register_fundamental (g_type_fundamental_next (), "PsWriter", &g_define_type_info, &g_define_type_fundamental_info, 0);
2265
g_once_init_leave (&ps_writer_type_id__volatile, ps_writer_type_id);
2267
return ps_writer_type_id__volatile;
2271
gpointer ps_writer_ref (gpointer instance) {
2274
g_atomic_int_inc (&self->ref_count);
2279
void ps_writer_unref (gpointer instance) {
2282
if (g_atomic_int_dec_and_test (&self->ref_count)) {
2283
PS_WRITER_GET_CLASS (self)->finalize (self);
2284
g_type_free_instance ((GTypeInstance *) self);