diff options
Diffstat (limited to 'src/book.c')
-rw-r--r-- | src/book.c | 76 |
1 files changed, 61 insertions, 15 deletions
@@ -73,14 +73,13 @@ page_changed_cb (Page *page, Book *book) Page * -book_append_page (Book *book, gint width, gint height, gint dpi, Orientation orientation) +book_append_page (Book *book, gint width, gint height, gint dpi, ScanDirection scan_direction) { Page *page; - page = page_new (); - g_signal_connect (page, "image-changed", G_CALLBACK (page_changed_cb), book); + page = page_new (width, height, dpi, scan_direction); + g_signal_connect (page, "pixels-changed", G_CALLBACK (page_changed_cb), book); g_signal_connect (page, "crop-changed", G_CALLBACK (page_changed_cb), book); - page_setup (page, width, height, dpi, orientation); book->priv->pages = g_list_append (book->priv->pages, page); @@ -222,7 +221,7 @@ book_save_ps (Book *book, GFile *file, GError **error) double width, height; GdkPixbuf *image; - image = page_get_cropped_image (page); + image = page_get_image (page, TRUE); width = gdk_pixbuf_get_width (image) * 72.0 / page_get_dpi (page); height = gdk_pixbuf_get_height (image) * 72.0 / page_get_dpi (page); @@ -444,7 +443,7 @@ book_save_pdf (Book *book, GFile *file, GError **error) height = page_get_height (page); page_width = width * 72. / page_get_dpi (page); page_height = height * 72. / page_get_dpi (page); - image = page_get_cropped_image (page); + image = page_get_image (page, TRUE); pixels = gdk_pixbuf_get_pixels (image); if (page_is_color (page)) { @@ -470,13 +469,53 @@ book_save_pdf (Book *book, GFile *file, GError **error) } } } + else if (page_get_depth (page) == 2) { + int row, shift_count = 6; + guchar *write_ptr; + + depth = 2; + color_space = "DeviceGray"; + data_length = height * ((width * 2 + 7) / 8); + data = g_malloc (sizeof (guchar) * data_length); + write_ptr = data; + write_ptr[0] = 0; + for (row = 0; row < height; row++) { + int x; + guchar *in_line; + + /* Pad to the next line */ + if (shift_count != 6) { + write_ptr++; + write_ptr[0] = 0; + shift_count = 6; + } + + in_line = pixels + row * gdk_pixbuf_get_rowstride (image); + for (x = 0; x < width; x++) { + guchar *in_p = in_line + x*3; + if (in_p[0] >= 192) + write_ptr[0] |= 3 << shift_count; + else if (in_p[0] >= 128) + write_ptr[0] |= 2 << shift_count; + else if (in_p[0] >= 64) + write_ptr[0] |= 1 << shift_count; + if (shift_count == 0) { + write_ptr++; + write_ptr[0] = 0; + shift_count = 6; + } + else + shift_count -= 2; + } + } + } else if (page_get_depth (page) == 1) { - int row, offset = 7; + int row, mask = 0x80; guchar *write_ptr; depth = 1; color_space = "DeviceGray"; - data_length = (height * width + 7) / 8; + data_length = height * ((width + 7) / 8); data = g_malloc (sizeof (guchar) * data_length); write_ptr = data; write_ptr[0] = 0; @@ -484,16 +523,23 @@ book_save_pdf (Book *book, GFile *file, GError **error) int x; guchar *in_line; + /* Pad to the next line */ + if (mask != 0x80) { + write_ptr++; + write_ptr[0] = 0; + mask = 0x80; + } + in_line = pixels + row * gdk_pixbuf_get_rowstride (image); for (x = 0; x < width; x++) { guchar *in_p = in_line + x*3; - if (in_p[0]) - write_ptr[0] |= 1 << offset; - offset--; - if (offset < 0) { + if (in_p[0] != 0) + write_ptr[0] |= mask; + mask >>= 1; + if (mask == 0) { write_ptr++; write_ptr[0] = 0; - offset = 7; + mask = 0x80; } } } @@ -583,9 +629,9 @@ book_save_pdf (Book *book, GFile *file, GError **error) /* Page contents */ command = g_strdup_printf ("q\n" - "%d 0 0 %d 0 0 cm\n" + "%f 0 0 %f 0 0 cm\n" "/Im%d Do\n" - "Q", width, height, i); + "Q", page_width, page_height, i); pdf_printf (writer, "\n"); number = pdf_start_object (writer); pdf_printf (writer, "%d 0 obj\n", number); |