Blame gdk-pixbuf/gdk-pixbuf-csource.c

Packit a4058c
/* Gdk-Pixbuf-CSource - GdkPixbuf based image CSource generator
Packit a4058c
 * Copyright (C) 1999, 2001 Tim Janik
Packit a4058c
 *
Packit a4058c
 * This library is free software; you can redistribute it and/or
Packit a4058c
 * modify it under the terms of the GNU Lesser General Public
Packit a4058c
 * License as published by the Free Software Foundation; either
Packit a4058c
 * version 2 of the License, or (at your option) any later version.
Packit a4058c
 *
Packit a4058c
 * This library is distributed in the hope that it will be useful,
Packit a4058c
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit a4058c
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit a4058c
 * Lesser General Public License for more details.
Packit a4058c
 *
Packit a4058c
 * You should have received a copy of the GNU Lesser General Public
Packit a4058c
 * License along with this library; if not, see <http://www.gnu.org/licenses/>.
Packit a4058c
 */
Packit a4058c
#include "config.h"
Packit a4058c
Packit a4058c
#include "gdk-pixbuf.h"
Packit a4058c
#include "gdk-pixdata.h"
Packit a4058c
#include <glib/gprintf.h>
Packit a4058c
#include <stdlib.h>
Packit a4058c
#include <string.h>
Packit a4058c
Packit a4058c
Packit a4058c
/* --- defines --- */
Packit a4058c
#undef	G_LOG_DOMAIN
Packit a4058c
#define	G_LOG_DOMAIN	"Gdk-Pixbuf-CSource"
Packit a4058c
#define PRG_NAME        "gdk-pixbuf-csource-3.0"
Packit a4058c
#define PKG_NAME        "gdk-pixbuf"
Packit a4058c
#define PKG_HTTP_HOME   "http://www.gtk.org"
Packit a4058c
Packit a4058c
Packit a4058c
/* --- prototypes --- */
Packit a4058c
static void	parse_args	(gint    *argc_p,
Packit a4058c
				 gchar ***argv_p);
Packit a4058c
static void	print_blurb	(FILE    *bout,
Packit a4058c
				 gboolean print_help);
Packit a4058c
Packit a4058c
Packit a4058c
/* --- variables --- */
Packit a4058c
static guint    gen_type = GDK_PIXDATA_DUMP_PIXDATA_STREAM;
Packit a4058c
static guint    gen_ctype = GDK_PIXDATA_DUMP_GTYPES | GDK_PIXDATA_DUMP_STATIC | GDK_PIXDATA_DUMP_CONST;
Packit a4058c
static gboolean use_rle = TRUE;
Packit a4058c
static gboolean with_decoder = FALSE;
Packit a4058c
static gchar   *image_name = "my_pixbuf";
Packit a4058c
static gboolean	build_list = FALSE;
Packit a4058c
Packit a4058c
Packit a4058c
/* --- functions --- */
Packit a4058c
static void
Packit a4058c
print_csource (FILE *f_out,
Packit a4058c
	       GdkPixbuf *pixbuf)
Packit a4058c
{
Packit a4058c
G_GNUC_BEGIN_IGNORE_DEPRECATIONS
Packit a4058c
  GdkPixdata pixdata;
Packit a4058c
  gpointer free_me;
Packit a4058c
  GString *gstring;
Packit a4058c
Packit a4058c
  free_me = gdk_pixdata_from_pixbuf (&pixdata, pixbuf, use_rle);
Packit a4058c
  gstring = gdk_pixdata_to_csource (&pixdata, image_name,
Packit a4058c
				    gen_type | gen_ctype |
Packit a4058c
				    (with_decoder ? GDK_PIXDATA_DUMP_RLE_DECODER : 0));
Packit a4058c
Packit a4058c
  g_fprintf (f_out, "%s\n", gstring->str);
Packit a4058c
Packit a4058c
  g_free (free_me);
Packit a4058c
G_GNUC_END_IGNORE_DEPRECATIONS
Packit a4058c
}
Packit a4058c
Packit a4058c
int
Packit a4058c
main (int   argc,
Packit a4058c
      char *argv[])
Packit a4058c
{
Packit a4058c
  GdkPixbuf *pixbuf;
Packit a4058c
  GError *error = NULL;
Packit a4058c
  gchar *infilename;
Packit a4058c
Packit a4058c
  /* parse args and do fast exits */
Packit a4058c
  parse_args (&argc, &argv);
Packit a4058c
Packit a4058c
  if (!build_list)
Packit a4058c
    {
Packit a4058c
      if (argc != 2)
Packit a4058c
	{
Packit a4058c
	  print_blurb (stderr, TRUE);
Packit a4058c
	  return 1;
Packit a4058c
	}
Packit a4058c
      
Packit a4058c
#ifdef G_OS_WIN32
Packit a4058c
      infilename = g_locale_to_utf8 (argv[1], -1, NULL, NULL, NULL);
Packit a4058c
#else
Packit a4058c
      infilename = argv[1];
Packit a4058c
#endif
Packit a4058c
Packit a4058c
      pixbuf = gdk_pixbuf_new_from_file (infilename, &error);
Packit a4058c
      if (!pixbuf)
Packit a4058c
	{
Packit a4058c
	  g_fprintf (stderr, "failed to load \"%s\": %s\n",
Packit a4058c
		   argv[1],
Packit a4058c
		   error->message);
Packit a4058c
	  g_error_free (error);
Packit a4058c
	  return 1;
Packit a4058c
	}
Packit a4058c
      
Packit a4058c
      print_csource (stdout, pixbuf);
Packit a4058c
      g_object_unref (pixbuf);
Packit a4058c
    }
Packit a4058c
  else /* parse name, file pairs */
Packit a4058c
    {
Packit a4058c
      gchar **p = argv + 1;
Packit a4058c
      guint j = argc - 1;
Packit a4058c
      gboolean toggle = FALSE;
Packit a4058c
Packit a4058c
      while (j--)
Packit a4058c
	{
Packit a4058c
#ifdef G_OS_WIN32
Packit a4058c
	  infilename = g_locale_to_utf8 (*p, -1, NULL, NULL, NULL);
Packit a4058c
#else
Packit a4058c
	  infilename = *p;
Packit a4058c
#endif
Packit a4058c
Packit a4058c
	  if (!toggle)
Packit a4058c
	    {
Packit a4058c
	      image_name = infilename;
Packit a4058c
	      p++;
Packit a4058c
	    }
Packit a4058c
	  else
Packit a4058c
	    {
Packit a4058c
	      pixbuf = gdk_pixbuf_new_from_file (infilename, &error);
Packit a4058c
	      if (!pixbuf)
Packit a4058c
		{
Packit a4058c
		  g_fprintf (stderr, "failed to load \"%s\": %s\n",
Packit a4058c
			   *p,
Packit a4058c
			   error->message);
Packit a4058c
		  g_error_free (error);
Packit a4058c
		  return 1;
Packit a4058c
		}
Packit a4058c
	      print_csource (stdout, pixbuf);
Packit a4058c
	      g_object_unref (pixbuf);
Packit a4058c
	      p++;
Packit a4058c
	    }
Packit a4058c
	  toggle = !toggle;
Packit a4058c
	}
Packit a4058c
    }
Packit a4058c
  
Packit a4058c
  return 0;
Packit a4058c
}
Packit a4058c
Packit a4058c
static void
Packit a4058c
parse_args (gint    *argc_p,
Packit a4058c
	    gchar ***argv_p)
Packit a4058c
{
Packit a4058c
  guint argc = *argc_p;
Packit a4058c
  gchar **argv = *argv_p;
Packit a4058c
  guint i, e;
Packit a4058c
Packit a4058c
  for (i = 1; i < argc; i++)
Packit a4058c
    {
Packit a4058c
      if (strcmp ("--macros", argv[i]) == 0)
Packit a4058c
	{
Packit a4058c
	  gen_type = GDK_PIXDATA_DUMP_MACROS;
Packit a4058c
	  argv[i] = NULL;
Packit a4058c
	}
Packit a4058c
      else if (strcmp ("--struct", argv[i]) == 0)
Packit a4058c
	{
Packit a4058c
	  gen_type = GDK_PIXDATA_DUMP_PIXDATA_STRUCT;
Packit a4058c
	  argv[i] = NULL;
Packit a4058c
	}
Packit a4058c
      else if (strcmp ("--stream", argv[i]) == 0)
Packit a4058c
	{
Packit a4058c
	  gen_type = GDK_PIXDATA_DUMP_PIXDATA_STREAM;
Packit a4058c
	  argv[i] = NULL;
Packit a4058c
	}
Packit a4058c
      else if (strcmp ("--rle", argv[i]) == 0)
Packit a4058c
	{
Packit a4058c
	  use_rle = TRUE;
Packit a4058c
	  argv[i] = NULL;
Packit a4058c
	}
Packit a4058c
      else if (strcmp ("--raw", argv[i]) == 0)
Packit a4058c
	{
Packit a4058c
	  use_rle = FALSE;
Packit a4058c
	  argv[i] = NULL;
Packit a4058c
	}
Packit a4058c
      else if (strcmp ("--extern", argv[i]) == 0)
Packit a4058c
	{
Packit a4058c
	  gen_ctype &= ~GDK_PIXDATA_DUMP_STATIC;
Packit a4058c
	  argv[i] = NULL;
Packit a4058c
	}
Packit a4058c
      else if (strcmp ("--static", argv[i]) == 0)
Packit a4058c
	{
Packit a4058c
	  gen_ctype |= GDK_PIXDATA_DUMP_STATIC;
Packit a4058c
	  argv[i] = NULL;
Packit a4058c
	}
Packit a4058c
      else if (strcmp ("--decoder", argv[i]) == 0)
Packit a4058c
	{
Packit a4058c
	  with_decoder = TRUE;
Packit a4058c
	  argv[i] = NULL;
Packit a4058c
	}
Packit a4058c
      else if ((strcmp ("--name", argv[i]) == 0) ||
Packit a4058c
	       (strncmp ("--name=", argv[i], 7) == 0))
Packit a4058c
	{
Packit a4058c
	  gchar *equal = argv[i] + 6;
Packit a4058c
Packit a4058c
	  if (*equal == '=')
Packit a4058c
	    image_name = g_strdup (equal + 1);
Packit a4058c
	  else if (i + 1 < argc)
Packit a4058c
	    {
Packit a4058c
	      image_name = g_strdup (argv[i + 1]);
Packit a4058c
	      argv[i] = NULL;
Packit a4058c
	      i += 1;
Packit a4058c
	    }
Packit a4058c
	  argv[i] = NULL;
Packit a4058c
	}
Packit a4058c
      else if (strcmp ("--build-list", argv[i]) == 0)
Packit a4058c
	{
Packit a4058c
	  build_list = TRUE;
Packit a4058c
	  argv[i] = NULL;
Packit a4058c
	}
Packit a4058c
      else if (strcmp ("-h", argv[i]) == 0 ||
Packit a4058c
	       strcmp ("--help", argv[i]) == 0)
Packit a4058c
	{
Packit a4058c
	  print_blurb (stderr, TRUE);
Packit a4058c
	  argv[i] = NULL;
Packit a4058c
	  exit (0);
Packit a4058c
	}
Packit a4058c
      else if (strcmp ("-v", argv[i]) == 0 ||
Packit a4058c
	       strcmp ("--version", argv[i]) == 0)
Packit a4058c
	{
Packit a4058c
	  print_blurb (stderr, FALSE);
Packit a4058c
	  argv[i] = NULL;
Packit a4058c
	  exit (0);
Packit a4058c
	}
Packit a4058c
      else if (strcmp (argv[i], "--g-fatal-warnings") == 0)
Packit a4058c
	{
Packit a4058c
	  GLogLevelFlags fatal_mask;
Packit a4058c
Packit a4058c
	  fatal_mask = g_log_set_always_fatal (G_LOG_FATAL_MASK);
Packit a4058c
	  fatal_mask |= G_LOG_LEVEL_WARNING | G_LOG_LEVEL_CRITICAL;
Packit a4058c
	  g_log_set_always_fatal (fatal_mask);
Packit a4058c
Packit a4058c
	  argv[i] = NULL;
Packit a4058c
	}
Packit a4058c
    }
Packit a4058c
Packit a4058c
  e = 0;
Packit a4058c
  for (i = 1; i < argc; i++)
Packit a4058c
    {
Packit a4058c
      if (e)
Packit a4058c
	{
Packit a4058c
	  if (argv[i])
Packit a4058c
	    {
Packit a4058c
	      argv[e++] = argv[i];
Packit a4058c
	      argv[i] = NULL;
Packit a4058c
	    }
Packit a4058c
	}
Packit a4058c
      else if (!argv[i])
Packit a4058c
	e = i;
Packit a4058c
    }
Packit a4058c
  if (e)
Packit a4058c
    *argc_p = e;
Packit a4058c
}
Packit a4058c
Packit a4058c
static void
Packit a4058c
print_blurb (FILE    *bout,
Packit a4058c
	     gboolean print_help)
Packit a4058c
{
Packit a4058c
  if (!print_help)
Packit a4058c
    {
Packit a4058c
      g_fprintf (bout, "%s version ", PRG_NAME);
Packit a4058c
      g_fprintf (bout, "%s", GDK_PIXBUF_VERSION);
Packit a4058c
      g_fprintf (bout, "\n");
Packit a4058c
      g_fprintf (bout, "%s comes with ABSOLUTELY NO WARRANTY.\n", PRG_NAME);
Packit a4058c
      g_fprintf (bout, "You may redistribute copies of %s under the terms of\n", PRG_NAME);
Packit a4058c
      g_fprintf (bout, "the GNU Lesser General Public License which can be found in the\n");
Packit a4058c
      g_fprintf (bout, "%s source package. Sources, examples and contact\n", PKG_NAME);
Packit a4058c
      g_fprintf (bout, "information are available at %s\n", PKG_HTTP_HOME);
Packit a4058c
    }
Packit a4058c
  else
Packit a4058c
    {
Packit a4058c
      g_fprintf (bout, "Usage: %s [options] [image]\n", PRG_NAME);
Packit a4058c
      g_fprintf (bout, "       %s [options] --build-list [[name image]...]\n", PRG_NAME);
Packit a4058c
      g_fprintf (bout, "  --stream                   generate pixbuf data stream\n");
Packit a4058c
      g_fprintf (bout, "  --struct                   generate GdkPixdata structure\n");
Packit a4058c
      g_fprintf (bout, "  --macros                   generate image size/pixel macros\n");
Packit a4058c
      g_fprintf (bout, "  --rle                      use one byte run-length-encoding\n");
Packit a4058c
      g_fprintf (bout, "  --raw                      provide raw image data copy\n");
Packit a4058c
      g_fprintf (bout, "  --extern                   generate extern symbols\n");
Packit a4058c
      g_fprintf (bout, "  --static                   generate static symbols\n");
Packit a4058c
      g_fprintf (bout, "  --decoder                  provide rle decoder\n");
Packit a4058c
      g_fprintf (bout, "  --name=identifier          C macro/variable name\n");
Packit a4058c
      g_fprintf (bout, "  --build-list               parse (name, image) pairs\n");
Packit a4058c
      g_fprintf (bout, "  -h, --help                 show this help message\n");
Packit a4058c
      g_fprintf (bout, "  -v, --version              print version informations\n");
Packit a4058c
      g_fprintf (bout, "  --g-fatal-warnings         make warnings fatal (abort)\n");
Packit a4058c
    }
Packit a4058c
}
Packit a4058c