File: dummy.c

package info (click to toggle)
libmng 1.0.9-1
  • links: PTS
  • area: main
  • in suites: etch, etch-m68k, lenny
  • size: 4,100 kB
  • ctags: 6,056
  • sloc: ansic: 67,786; pascal: 1,726; sh: 150; makefile: 142
file content (139 lines) | stat: -rw-r--r-- 4,141 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
/*
 *  Very simple program, that has been used by us
 *  (V. Babin <babin :at: users.sourceforge.net> and
 *   S. Kondrat <valiska :at: users.sourceforge.net>)
 *  during toying with libmng (http://www.libmng.com)
 *
 *  License: GPL :-))
 *
 *  7 July 2001:  added key-press/button-press handling to exit viewer without
 *                window-manager help; added libmng version info [Greg Roelofs]
 */

#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <errno.h>
#include <gtk/gtk.h>
#include "gtk-mng-view.h"

#define BLOCK_SIZE  4096

static guint
read_file (const gchar* file_name, guchar ** ptr)
{
  gint fd;
  guint size = 0;
  guint bytes_read = 0;

  if ((fd = open (file_name, O_RDONLY)) == -1)
    {
      perror (file_name);
      * ptr = NULL; 
      return 0;
    }

  * ptr = g_new (guchar, BLOCK_SIZE);
  while ((bytes_read = read (fd, * ptr + size, BLOCK_SIZE)))
    {
      size += bytes_read;
      * ptr = (guchar *) g_realloc (* ptr, size + BLOCK_SIZE);
    }
  close (fd);

  * ptr = (guchar *) g_realloc (* ptr, size);
  return size;
}

int
main (int argc, char ** argv)
{
  GtkMngView * mng_view;
  GtkWidget * window;
  GtkWidget * align;
  GtkWidget * frame;
  guchar * mng_data = NULL;
  guint mng_data_size;

  if (argc < 2)
    {
      g_print ("Usage:  %s <file.mng>\n\n", argv[0]);

      g_print ("   Compiled with GTK+ %d.%d.%d; using GTK+ %d.%d.%d.\n",
        GTK_MAJOR_VERSION, GTK_MINOR_VERSION, GTK_MICRO_VERSION,
        gtk_major_version, gtk_minor_version, gtk_micro_version);
#ifdef GDK_PIXBUF_VERSION
      g_print ("   Compiled with gdk-pixbuf %s; using gdk-pixbuf %s.\n",
        GDK_PIXBUF_VERSION, gdk_pixbuf_version);
#endif
      g_print ("   Compiled with libmng %s; using libmng %s.\n",
        MNG_VERSION_TEXT, mng_version_text());
      g_print ("   Compiled with zlib %s; using zlib %s.\n",
        ZLIB_VERSION, zlib_version);
#ifdef JPEG_LIB_VERSION
        {
          int major = JPEG_LIB_VERSION / 10;
          int minor = JPEG_LIB_VERSION % 10;
          char minoralpha[2];

          if (minor)
            {
              minoralpha[0] = (char)(minor - 1 + 'a');
              minoralpha[1] = '\0';
            }
          else
              minoralpha[0] = '\0';
          g_print ("   Compiled with libjpeg %d%s.\n", major, minoralpha);
        }
#endif
      g_print ("\nPress Esc or Q, or click mouse button, to quit.\n");
      return 1;
    }

  mng_data_size = read_file (* (argv + 1), &mng_data);

  if (mng_data == NULL)
    return 1;

  gtk_init (&argc, &argv);
  gdk_rgb_init ();
  gdk_rgb_set_verbose (TRUE);
  gtk_widget_set_default_visual (gdk_rgb_get_visual ());
  gtk_widget_set_default_colormap (gdk_rgb_get_cmap ());

  window = gtk_widget_new (GTK_TYPE_WINDOW,
			   "GtkWindow::type", GTK_WINDOW_TOPLEVEL,
			   "GtkWindow::title", "MNG animation",
			   "GtkContainer::border_width", 5,
			   NULL);
  gtk_signal_connect (GTK_OBJECT (window), "delete_event",
		      GTK_SIGNAL_FUNC (gtk_main_quit), NULL);
  gtk_signal_connect (GTK_OBJECT (window), "destroy",
		      GTK_SIGNAL_FUNC (gtk_main_quit), NULL);

  /* any keypress (e.g., Esc or Q) or mouse-button click will quit viewer */
  gtk_signal_connect (GTK_OBJECT (window), "key_press_event",
		      GTK_SIGNAL_FUNC (gtk_main_quit), NULL);
  gtk_widget_add_events(window, GDK_BUTTON_PRESS_MASK);
  gtk_signal_connect (GTK_OBJECT (window), "button_press_event",
		      GTK_SIGNAL_FUNC (gtk_main_quit), NULL);

  align = gtk_alignment_new (0.5, 0.5, 0.0, 0.0);
  gtk_container_add (GTK_CONTAINER (window), align);
  frame = gtk_frame_new (NULL);
  gtk_container_add (GTK_CONTAINER (align), frame);

  /* actually it */
  mng_view = GTK_MNG_VIEW (gtk_mng_view_new ());
  gtk_container_add (GTK_CONTAINER (frame), GTK_WIDGET (mng_view));

  gtk_mng_view_load_mng_from_memory (mng_view, mng_data, mng_data_size);
  g_free (mng_data);

  /* rest in piece */
  gtk_widget_show_all (window);
  gtk_main ();

  return 0;
}