Blame gtk/theme-bits/decompose-bits.c

Packit Service fb6fa5
/* GTK - The GIMP Toolkit
Packit Service fb6fa5
 * Copyright (C) 2002, Owen Taylor
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * This library is free software; you can redistribute it and/or
Packit Service fb6fa5
 * modify it under the terms of the GNU Lesser General Public
Packit Service fb6fa5
 * License as published by the Free Software Foundation; either
Packit Service fb6fa5
 * version 2 of the License, or (at your option) any later version.
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * This library is distributed in the hope that it will be useful,
Packit Service fb6fa5
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit Service fb6fa5
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit Service fb6fa5
 * Lesser General Public License for more details.
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * You should have received a copy of the GNU Lesser General Public
Packit Service fb6fa5
 * License along with this library; if not, write to the
Packit Service fb6fa5
 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Packit Service fb6fa5
 * Boston, MA 02111-1307, USA.
Packit Service fb6fa5
 */
Packit Service fb6fa5
Packit Service fb6fa5
#include "config.h"
Packit Service fb6fa5
#include <gdk-pixbuf/gdk-pixbuf.h>
Packit Service fb6fa5
#include <glib/gprintf.h>
Packit Service fb6fa5
#include <stdlib.h>
Packit Service fb6fa5
#include <string.h>
Packit Service fb6fa5
Packit Service fb6fa5
#define BYTES_PER_OUTPUT_LINE 15
Packit Service fb6fa5
Packit Service fb6fa5
static gint
Packit Service fb6fa5
output_byte (guchar byte,
Packit Service fb6fa5
	     gint   online)
Packit Service fb6fa5
{
Packit Service fb6fa5
  if (online == BYTES_PER_OUTPUT_LINE)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      g_printf (",\n  ");
Packit Service fb6fa5
      online = 0;
Packit Service fb6fa5
    }
Packit Service fb6fa5
  else if (online)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      g_printf (",");
Packit Service fb6fa5
    }
Packit Service fb6fa5
Packit Service fb6fa5
  g_printf ("0x%02x", byte);
Packit Service fb6fa5
  return online + 1;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
do_part (GdkPixbuf  *pixbuf,
Packit Service fb6fa5
	 gint        part1_index,
Packit Service fb6fa5
	 gint        part2_index,
Packit Service fb6fa5
	 gint        part3_index,
Packit Service fb6fa5
	 const char *base_name,
Packit Service fb6fa5
	 const char *part_name)
Packit Service fb6fa5
{
Packit Service fb6fa5
  const guchar *pixels = gdk_pixbuf_get_pixels (pixbuf);
Packit Service fb6fa5
  const guchar *color1;
Packit Service fb6fa5
  const guchar *color2;
Packit Service fb6fa5
  const guchar *color3;
Packit Service fb6fa5
  gint rowstride = gdk_pixbuf_get_rowstride (pixbuf);
Packit Service fb6fa5
  gint n_channels = gdk_pixbuf_get_n_channels (pixbuf);
Packit Service fb6fa5
  gint width = gdk_pixbuf_get_width (pixbuf);
Packit Service fb6fa5
  gint height = gdk_pixbuf_get_height (pixbuf);
Packit Service fb6fa5
  gint online = 0;
Packit Service fb6fa5
Packit Service fb6fa5
  color1 = pixels + part1_index * n_channels;
Packit Service fb6fa5
  color2 = pixels + part2_index * n_channels;
Packit Service fb6fa5
  color3 = pixels + part3_index * n_channels;
Packit Service fb6fa5
  pixels += rowstride;
Packit Service fb6fa5
  
Packit Service fb6fa5
  g_printf ("static const guchar %s_%s_bits[] = {\n", base_name, part_name);
Packit Service fb6fa5
  g_printf ("  ");
Packit Service fb6fa5
Packit Service fb6fa5
  while (height--)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      guchar bit = 1;
Packit Service fb6fa5
      guchar byte = 0;
Packit Service fb6fa5
      const guchar *p = pixels;
Packit Service fb6fa5
      gint n = width;
Packit Service fb6fa5
Packit Service fb6fa5
      while (n--)
Packit Service fb6fa5
	{
Packit Service fb6fa5
	  if ((part1_index >= 0 && memcmp (p, color1, n_channels) == 0) ||
Packit Service fb6fa5
	      (part2_index >= 0 && memcmp (p, color2, n_channels) == 0) ||
Packit Service fb6fa5
	      (part3_index >= 0 && memcmp (p, color3, n_channels) == 0))
Packit Service fb6fa5
	    byte |= bit;
Packit Service fb6fa5
Packit Service fb6fa5
	  if (bit == 0x80)
Packit Service fb6fa5
	    {
Packit Service fb6fa5
	      online = output_byte (byte, online);
Packit Service fb6fa5
	      byte = 0;
Packit Service fb6fa5
	      bit = 1;
Packit Service fb6fa5
	    }
Packit Service fb6fa5
	  else
Packit Service fb6fa5
	    bit <<= 1;
Packit Service fb6fa5
Packit Service fb6fa5
	  p += n_channels;
Packit Service fb6fa5
	}
Packit Service fb6fa5
Packit Service fb6fa5
      if (width & 7)		/* a leftover partial byte */
Packit Service fb6fa5
	online = output_byte (byte, online);
Packit Service fb6fa5
Packit Service fb6fa5
      pixels += rowstride;
Packit Service fb6fa5
    }
Packit Service fb6fa5
  
Packit Service fb6fa5
  g_printf ("};\n");
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
typedef enum {
Packit Service fb6fa5
  PART_BLACK,
Packit Service fb6fa5
  PART_DARK,
Packit Service fb6fa5
  PART_MID,
Packit Service fb6fa5
  PART_LIGHT,
Packit Service fb6fa5
  PART_TEXT,
Packit Service fb6fa5
  PART_TEXT_AA,
Packit Service fb6fa5
  PART_BASE,
Packit Service fb6fa5
  PART_LAST
Packit Service fb6fa5
} Part;
Packit Service fb6fa5
Packit Service fb6fa5
static const char *part_names[PART_LAST] = {
Packit Service fb6fa5
  "black",
Packit Service fb6fa5
  "dark",
Packit Service fb6fa5
  "mid",
Packit Service fb6fa5
  "light",
Packit Service fb6fa5
  "text",
Packit Service fb6fa5
  "aa",
Packit Service fb6fa5
  "base",
Packit Service fb6fa5
};
Packit Service fb6fa5
Packit Service fb6fa5
int main (int argc, char **argv)
Packit Service fb6fa5
{
Packit Service fb6fa5
  gchar *progname = g_path_get_basename (argv[0]);
Packit Service fb6fa5
  GdkPixbuf *pixbuf;
Packit Service fb6fa5
  GError *error = NULL;
Packit Service fb6fa5
  gint i;
Packit Service fb6fa5
Packit Service fb6fa5
  if (argc != 3)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      g_fprintf (stderr, "%s: Usage: %s FILE BASE\n", progname, progname);
Packit Service fb6fa5
      exit (1);
Packit Service fb6fa5
    }
Packit Service fb6fa5
Packit Service fb6fa5
  g_type_init ();
Packit Service fb6fa5
  
Packit Service fb6fa5
  pixbuf = gdk_pixbuf_new_from_file (argv[1], &error);
Packit Service fb6fa5
  if (!pixbuf)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      g_fprintf (stderr, "%s: cannot open file '%s': %s\n", progname, argv[1], error->message);
Packit Service fb6fa5
      exit (1);
Packit Service fb6fa5
    }
Packit Service fb6fa5
  
Packit Service fb6fa5
  if (gdk_pixbuf_get_width (pixbuf) < PART_LAST)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      g_fprintf (stderr, "%s: source image must be at least %d pixels wide\n", progname, PART_LAST);
Packit Service fb6fa5
      exit (1);
Packit Service fb6fa5
    }
Packit Service fb6fa5
Packit Service fb6fa5
  if (gdk_pixbuf_get_height (pixbuf) < 1)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      g_fprintf (stderr, "%s: source image must be at least 1 pixel height\n", progname);
Packit Service fb6fa5
      exit (1);
Packit Service fb6fa5
    }
Packit Service fb6fa5
Packit Service fb6fa5
  g_printf ("/*\n * Extracted from %s, width=%d, height=%d\n */\n", argv[1],
Packit Service fb6fa5
	  gdk_pixbuf_get_width (pixbuf), gdk_pixbuf_get_height (pixbuf) - 1);
Packit Service fb6fa5
Packit Service fb6fa5
  for (i = 0; i < PART_LAST; i++)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      /* As a bit of a hack, we want the base image to extend over the text
Packit Service fb6fa5
       * and text_aa parts so that we can draw the image either with or without
Packit Service fb6fa5
       * the indicator
Packit Service fb6fa5
       */
Packit Service fb6fa5
      if (i == PART_BASE)
Packit Service fb6fa5
	do_part (pixbuf, PART_BASE, PART_TEXT_AA, PART_TEXT, argv[2], part_names[i]);
Packit Service fb6fa5
      else
Packit Service fb6fa5
	do_part (pixbuf, i, -1, -1, argv[2], part_names[i]);
Packit Service fb6fa5
    }
Packit Service fb6fa5
  return 0;
Packit Service fb6fa5
}