/* gcc -o png2pdf png2pdf.c -Wall -O3 `pkg-config --cflags --libs cairo cairo-pdf glib-2.0` */

#include <stdio.h>
#include <string.h>
#include <glib.h>
#include <cairo.h>
#include <cairo-pdf.h>

int
main (int argc, char **argv)
{
  GDir *dir;
  cairo_t *cr;
  const gchar *file;
  cairo_surface_t *pdf;

  GList *files = NULL;
  GError *error = NULL;
  
  if (argc < 3)
    {
      printf ("Usage: %s <directory> <output>\n", argv[0]);
      return 1;
    }
  
  pdf = cairo_pdf_surface_create (argv[2], 0, 0);
  if (cairo_surface_status (pdf) != CAIRO_STATUS_SUCCESS)
    {
      cairo_surface_destroy (pdf);
      g_critical ("Error creating PDF surface");
      return 2;
    }
  
  cr = cairo_create (pdf);
  
  if (!(dir = g_dir_open (argv[1], 0, &error)))
    {
      g_critical ("Error opening directory: %s", error->message);
      g_error_free (error);
      return 3;
    }
  
  while ((file = g_dir_read_name (dir)))
    {
      gchar *full_file;
      
      full_file = g_build_filename (argv[1], file, NULL);
      
      if (!g_file_test (full_file, G_FILE_TEST_IS_REGULAR))
        goto skip_file;
      
      if (!g_str_has_suffix (full_file, ".png"))
        goto skip_file;
      
      files = g_list_prepend (files, full_file);
      continue;

skip_file:
      g_free (full_file);
    }
  
  g_dir_close (dir);
  
  files = g_list_sort (files, (GCompareFunc)strcmp);
  
  while (files)
    {
      cairo_surface_t *png;
      
      gchar *file = (gchar *)files->data;
      
      png = cairo_image_surface_create_from_png (file);
      if (cairo_surface_status (png) != CAIRO_STATUS_SUCCESS)
        {
          cairo_surface_destroy (png);
          goto end_loop;
        }
      
      printf ("Writing %s...\n", file);
      cairo_pdf_surface_set_size (pdf,
                                  cairo_image_surface_get_width (png),
                                  cairo_image_surface_get_height (png));
      cairo_set_source_surface (cr, png, 0, 0);
      cairo_paint (cr);
      cairo_surface_show_page (pdf);
      
      cairo_surface_destroy (png);
      
end_loop:
      g_free (file);
      files = g_list_delete_link (files, files);
    }
  
  cairo_destroy (cr);
  cairo_surface_destroy (pdf);
  
  return 0;
}

