diff options
author | Alessio Treglia <alessio@debian.org> | 2014-07-21 13:58:18 +0100 |
---|---|---|
committer | Alessio Treglia <alessio@debian.org> | 2014-07-21 13:58:18 +0100 |
commit | 6ef14034edff72de856c29dd2e4f2b180444d890 (patch) | |
tree | 6586d6a6d6c494ff4c82adfc63154dc8496fd93c /src |
Imported Upstream version 0.17upstream/0.17
Diffstat (limited to 'src')
-rw-r--r-- | src/.cvsignore | 5 | ||||
-rw-r--r-- | src/CVS/Entries | 18 | ||||
-rw-r--r-- | src/CVS/Repository | 1 | ||||
-rw-r--r-- | src/CVS/Root | 1 | ||||
-rw-r--r-- | src/Makefile.am | 11 | ||||
-rw-r--r-- | src/Makefile.in | 439 | ||||
-rw-r--r-- | src/callbacks.c | 961 | ||||
-rw-r--r-- | src/callbacks.h | 77 | ||||
-rw-r--r-- | src/eggtrayicon.c | 480 | ||||
-rw-r--r-- | src/eggtrayicon.h | 77 | ||||
-rw-r--r-- | src/fileio.c | 439 | ||||
-rw-r--r-- | src/fileio.h | 7 | ||||
-rw-r--r-- | src/filter.c | 493 | ||||
-rw-r--r-- | src/filter.h | 13 | ||||
-rw-r--r-- | src/font_6x11.h | 3337 | ||||
-rw-r--r-- | src/interface.h | 25 | ||||
-rw-r--r-- | src/main.c | 623 | ||||
-rw-r--r-- | src/support.c | 92 | ||||
-rw-r--r-- | src/support.h | 3 | ||||
-rw-r--r-- | src/v4l.c | 252 | ||||
-rw-r--r-- | src/v4l.h | 71 |
21 files changed, 7425 insertions, 0 deletions
diff --git a/src/.cvsignore b/src/.cvsignore new file mode 100644 index 0000000..01407ae --- /dev/null +++ b/src/.cvsignore @@ -0,0 +1,5 @@ +Makefile +Makefile.in +camorama +*.o +.deps diff --git a/src/CVS/Entries b/src/CVS/Entries new file mode 100644 index 0000000..32a325b --- /dev/null +++ b/src/CVS/Entries @@ -0,0 +1,18 @@ +/.cvsignore/1.2/Fri Jan 17 01:49:00 2003// +/filter.h/1.2/Thu Feb 6 03:05:54 2003// +/font_6x11.h/1.2/Thu Feb 6 03:05:54 2003// +/interface.h/1.2/Thu Feb 6 03:05:54 2003// +/Makefile.am/1.4/Fri Jul 25 22:55:50 2003// +/callbacks.h/1.7/Wed Jul 30 01:42:26 2003// +/eggtrayicon.c/1.1/Fri Jul 25 22:43:40 2003// +/eggtrayicon.h/1.1/Fri Jul 25 22:43:27 2003// +/fileio.h/1.3/Wed Jul 30 01:42:25 2003// +/support.h/1.3/Wed Jul 30 01:42:27 2003// +/callbacks.c/1.18/Fri Aug 15 15:32:30 2003// +/filter.c/1.8/Fri Aug 15 15:03:43 2003// +/main.c/1.18/Fri Aug 15 15:32:03 2003// +/v4l.c/1.12/Fri Aug 15 14:25:16 2003// +/v4l.h/1.7/Fri Aug 15 14:17:41 2003// +/fileio.c/1.13/Wed Aug 20 18:20:55 2003// +/support.c/1.4/Wed Aug 20 18:21:12 2003// +D diff --git a/src/CVS/Repository b/src/CVS/Repository new file mode 100644 index 0000000..6dbdc42 --- /dev/null +++ b/src/CVS/Repository @@ -0,0 +1 @@ +camorama/src diff --git a/src/CVS/Root b/src/CVS/Root new file mode 100644 index 0000000..f253780 --- /dev/null +++ b/src/CVS/Root @@ -0,0 +1 @@ +:pserver:ly@cvs.gnome.org:/cvs/gnome diff --git a/src/Makefile.am b/src/Makefile.am new file mode 100644 index 0000000..df75c50 --- /dev/null +++ b/src/Makefile.am @@ -0,0 +1,11 @@ +INCLUDES = \ + -DPACKAGE_DATA_DIR=\""$(datadir)"\" \ + -DDATADIR=\""$(datadir)"\" \ + -DPACKAGE_LOCALE_DIR=\""$(datadir)/locale"\" \ + @PACKAGE_CFLAGS@ + + +bin_PROGRAMS = camorama + +camorama_SOURCES = main.c v4l.c filter.c callbacks.c support.c fileio.c eggtrayicon.c v4l.h callbacks.h support.h interface.h fileio.h font_6x11.h filter.h eggtrayicon.h +camorama_LDADD = @PACKAGE_LIBS@ diff --git a/src/Makefile.in b/src/Makefile.in new file mode 100644 index 0000000..f9b6b91 --- /dev/null +++ b/src/Makefile.in @@ -0,0 +1,439 @@ +# Makefile.in generated by automake 1.7.6 from Makefile.am. +# @configure_input@ + +# Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003 +# Free Software Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +srcdir = @srcdir@ +top_srcdir = @top_srcdir@ +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +top_builddir = .. + +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +INSTALL = @INSTALL@ +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +ACLOCAL = @ACLOCAL@ +AMDEP_FALSE = @AMDEP_FALSE@ +AMDEP_TRUE = @AMDEP_TRUE@ +AMTAR = @AMTAR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CATALOGS = @CATALOGS@ +CATOBJEXT = @CATOBJEXT@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DATADIRNAME = @DATADIRNAME@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +GCONFTOOL = @GCONFTOOL@ +GCONF_SCHEMAS_INSTALL_FALSE = @GCONF_SCHEMAS_INSTALL_FALSE@ +GCONF_SCHEMAS_INSTALL_TRUE = @GCONF_SCHEMAS_INSTALL_TRUE@ +GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ +GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ +GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ +GMOFILES = @GMOFILES@ +GMSGFMT = @GMSGFMT@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INSTOBJEXT = @INSTOBJEXT@ +INTLLIBS = @INTLLIBS@ +INTLTOOL_CAVES_RULE = @INTLTOOL_CAVES_RULE@ +INTLTOOL_DESKTOP_RULE = @INTLTOOL_DESKTOP_RULE@ +INTLTOOL_DIRECTORY_RULE = @INTLTOOL_DIRECTORY_RULE@ +INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@ +INTLTOOL_KEYS_RULE = @INTLTOOL_KEYS_RULE@ +INTLTOOL_MERGE = @INTLTOOL_MERGE@ +INTLTOOL_OAF_RULE = @INTLTOOL_OAF_RULE@ +INTLTOOL_PERL = @INTLTOOL_PERL@ +INTLTOOL_PONG_RULE = @INTLTOOL_PONG_RULE@ +INTLTOOL_PROP_RULE = @INTLTOOL_PROP_RULE@ +INTLTOOL_SCHEMAS_RULE = @INTLTOOL_SCHEMAS_RULE@ +INTLTOOL_SERVER_RULE = @INTLTOOL_SERVER_RULE@ +INTLTOOL_SHEET_RULE = @INTLTOOL_SHEET_RULE@ +INTLTOOL_SOUNDLIST_RULE = @INTLTOOL_SOUNDLIST_RULE@ +INTLTOOL_THEME_RULE = @INTLTOOL_THEME_RULE@ +INTLTOOL_UI_RULE = @INTLTOOL_UI_RULE@ +INTLTOOL_UPDATE = @INTLTOOL_UPDATE@ +INTLTOOL_XML_RULE = @INTLTOOL_XML_RULE@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LTLIBOBJS = @LTLIBOBJS@ +MAKEINFO = @MAKEINFO@ +MKINSTALLDIRS = @MKINSTALLDIRS@ +MSGFMT = @MSGFMT@ +OBJEXT = @OBJEXT@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_CFLAGS = @PACKAGE_CFLAGS@ +PACKAGE_LIBS = @PACKAGE_LIBS@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +POFILES = @POFILES@ +POSUB = @POSUB@ +PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@ +PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +USE_NLS = @USE_NLS@ +VERSION = @VERSION@ +XGETTEXT = @XGETTEXT@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_STRIP = @ac_ct_STRIP@ +am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ +am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +bindir = @bindir@ +build_alias = @build_alias@ +datadir = @datadir@ +exec_prefix = @exec_prefix@ +host_alias = @host_alias@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +oldincludedir = @oldincludedir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +INCLUDES = \ + -DPACKAGE_DATA_DIR=\""$(datadir)"\" \ + -DDATADIR=\""$(datadir)"\" \ + -DPACKAGE_LOCALE_DIR=\""$(datadir)/locale"\" \ + @PACKAGE_CFLAGS@ + + +bin_PROGRAMS = camorama + +camorama_SOURCES = main.c v4l.c filter.c callbacks.c support.c fileio.c eggtrayicon.c v4l.h callbacks.h support.h interface.h fileio.h font_6x11.h filter.h eggtrayicon.h +camorama_LDADD = @PACKAGE_LIBS@ +subdir = src +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +bin_PROGRAMS = camorama$(EXEEXT) +PROGRAMS = $(bin_PROGRAMS) + +am_camorama_OBJECTS = main.$(OBJEXT) v4l.$(OBJEXT) filter.$(OBJEXT) \ + callbacks.$(OBJEXT) support.$(OBJEXT) fileio.$(OBJEXT) \ + eggtrayicon.$(OBJEXT) +camorama_OBJECTS = $(am_camorama_OBJECTS) +camorama_DEPENDENCIES = +camorama_LDFLAGS = + +DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +@AMDEP_TRUE@DEP_FILES = ./$(DEPDIR)/callbacks.Po \ +@AMDEP_TRUE@ ./$(DEPDIR)/eggtrayicon.Po ./$(DEPDIR)/fileio.Po \ +@AMDEP_TRUE@ ./$(DEPDIR)/filter.Po ./$(DEPDIR)/main.Po \ +@AMDEP_TRUE@ ./$(DEPDIR)/support.Po ./$(DEPDIR)/v4l.Po +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +CCLD = $(CC) +LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ +DIST_SOURCES = $(camorama_SOURCES) +DIST_COMMON = Makefile.am Makefile.in +SOURCES = $(camorama_SOURCES) + +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .o .obj +$(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) + cd $(top_srcdir) && \ + $(AUTOMAKE) --gnu src/Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe) +binPROGRAMS_INSTALL = $(INSTALL_PROGRAM) +install-binPROGRAMS: $(bin_PROGRAMS) + @$(NORMAL_INSTALL) + $(mkinstalldirs) $(DESTDIR)$(bindir) + @list='$(bin_PROGRAMS)'; for p in $$list; do \ + p1=`echo $$p|sed 's/$(EXEEXT)$$//'`; \ + if test -f $$p \ + ; then \ + f=`echo "$$p1" | sed 's,^.*/,,;$(transform);s/$$/$(EXEEXT)/'`; \ + echo " $(INSTALL_PROGRAM_ENV) $(binPROGRAMS_INSTALL) $$p $(DESTDIR)$(bindir)/$$f"; \ + $(INSTALL_PROGRAM_ENV) $(binPROGRAMS_INSTALL) $$p $(DESTDIR)$(bindir)/$$f || exit 1; \ + else :; fi; \ + done + +uninstall-binPROGRAMS: + @$(NORMAL_UNINSTALL) + @list='$(bin_PROGRAMS)'; for p in $$list; do \ + f=`echo "$$p" | sed 's,^.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/'`; \ + echo " rm -f $(DESTDIR)$(bindir)/$$f"; \ + rm -f $(DESTDIR)$(bindir)/$$f; \ + done + +clean-binPROGRAMS: + -test -z "$(bin_PROGRAMS)" || rm -f $(bin_PROGRAMS) +camorama$(EXEEXT): $(camorama_OBJECTS) $(camorama_DEPENDENCIES) + @rm -f camorama$(EXEEXT) + $(LINK) $(camorama_LDFLAGS) $(camorama_OBJECTS) $(camorama_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) core *.core + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/callbacks.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/eggtrayicon.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fileio.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/filter.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/main.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/support.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/v4l.Po@am__quote@ + +distclean-depend: + -rm -rf ./$(DEPDIR) + +.c.o: +@am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" \ +@am__fastdepCC_TRUE@ -c -o $@ `test -f '$<' || echo '$(srcdir)/'`$<; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; \ +@am__fastdepCC_TRUE@ else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; \ +@am__fastdepCC_TRUE@ fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c `test -f '$<' || echo '$(srcdir)/'`$< + +.c.obj: +@am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" \ +@am__fastdepCC_TRUE@ -c -o $@ `if test -f '$<'; then $(CYGPATH_W) '$<'; else $(CYGPATH_W) '$(srcdir)/$<'; fi`; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; \ +@am__fastdepCC_TRUE@ else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; \ +@am__fastdepCC_TRUE@ fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c `if test -f '$<'; then $(CYGPATH_W) '$<'; else $(CYGPATH_W) '$(srcdir)/$<'; fi` +uninstall-info-am: + +ETAGS = etags +ETAGSFLAGS = + +CTAGS = ctags +CTAGSFLAGS = + +tags: TAGS + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + mkid -fID $$unique + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + test -z "$(ETAGS_ARGS)$$tags$$unique" \ + || $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$tags $$unique + +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + test -z "$(CTAGS_ARGS)$$tags$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$tags $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && cd $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) $$here + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) + +top_distdir = .. +distdir = $(top_distdir)/$(PACKAGE)-$(VERSION) + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ + list='$(DISTFILES)'; for file in $$list; do \ + case $$file in \ + $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ + $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ + esac; \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test "$$dir" != "$$file" && test "$$dir" != "."; then \ + dir="/$$dir"; \ + $(mkinstalldirs) "$(distdir)$$dir"; \ + else \ + dir=''; \ + fi; \ + if test -d $$d/$$file; then \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ + fi; \ + cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ + else \ + test -f $(distdir)/$$file \ + || cp -p $$d/$$file $(distdir)/$$file \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(PROGRAMS) + +installdirs: + $(mkinstalldirs) $(DESTDIR)$(bindir) +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -rm -f Makefile $(CONFIG_CLEAN_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-binPROGRAMS clean-generic mostlyclean-am + +distclean: distclean-am + +distclean-am: clean-am distclean-compile distclean-depend \ + distclean-generic distclean-tags + +dvi: dvi-am + +dvi-am: + +info: info-am + +info-am: + +install-data-am: + +install-exec-am: install-binPROGRAMS + +install-info: install-info-am + +install-man: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-binPROGRAMS uninstall-info-am + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-binPROGRAMS \ + clean-generic ctags distclean distclean-compile \ + distclean-depend distclean-generic distclean-tags distdir dvi \ + dvi-am info info-am install install-am install-binPROGRAMS \ + install-data install-data-am install-exec install-exec-am \ + install-info install-info-am install-man install-strip \ + installcheck installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic pdf pdf-am ps ps-am tags uninstall \ + uninstall-am uninstall-binPROGRAMS uninstall-info-am + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/src/callbacks.c b/src/callbacks.c new file mode 100644 index 0000000..8e5ce02 --- /dev/null +++ b/src/callbacks.c @@ -0,0 +1,961 @@ +#include <gtk/gtk.h> +#include <config.h> +#include "callbacks.h" +#include "interface.h" +#include "support.h" +#include "filter.h" +#include <gnome.h> +#include <libgnomeui/gnome-about.h> +#include <libgnomeui/gnome-propertybox.h> +#include <libgnomeui/gnome-window-icon.h> +#include <pthread.h> + +extern GtkWidget *main_window, *prefswindow; +extern state func_state; +extern int frames; +extern int frames2; +extern int seconds; +extern GtkWidget *dentry, *entry2, *string_entry; +extern GtkWidget *host_entry, + *directory_entry, *filename_entry, *login_entry, *pw_entry; +int frame; + +/* + * pref callbacks + */ + +void ts_func (GtkWidget * rb, cam * cam) +{ + GConfClient *client; + + client = gconf_client_get_default (); + cam->timestamp = gtk_toggle_button_get_active ((GtkToggleButton *) rb); + gconf_client_set_bool (cam->gc, KEY4, cam->timestamp, NULL); +} + +void customstring_func (GtkWidget * rb, cam * cam) +{ + GConfClient *client; + + client = gconf_client_get_default (); + cam->usestring = gtk_toggle_button_get_active ((GtkToggleButton *) rb); + gconf_client_set_bool (cam->gc, KEY18, cam->usestring, NULL); + gtk_widget_set_sensitive (glade_xml_get_widget + (cam->xml, "string_entry"), cam->usestring); +} + +void drawdate_func (GtkWidget * rb, cam * cam) +{ + GConfClient *client; + + client = gconf_client_get_default (); + cam->usedate = gtk_toggle_button_get_active ((GtkToggleButton *) rb); + gconf_client_set_bool (cam->gc, KEY19, cam->usedate, NULL); +} + +void append_func (GtkWidget * rb, cam * cam) +{ + GConfClient *client; + + client = gconf_client_get_default (); + cam->timefn = gtk_toggle_button_get_active ((GtkToggleButton *) rb); + gconf_client_set_bool (cam->gc, KEY14, cam->timefn, NULL); + +} + +void rappend_func (GtkWidget * rb, cam * cam) +{ + GConfClient *client; + + client = gconf_client_get_default (); + cam->rtimefn = gtk_toggle_button_get_active ((GtkToggleButton *) rb); + gconf_client_set_bool (cam->gc, KEY15, cam->rtimefn, NULL); + +} + +void jpg_func (GtkWidget * rb, cam * cam) +{ + GConfClient *client; + + client = gconf_client_get_default (); + cam->savetype = JPEG; + gconf_client_set_int (cam->gc, KEY3, cam->savetype, NULL); + +} + +void png_func (GtkWidget * rb, cam * cam) +{ + GConfClient *client; + + client = gconf_client_get_default (); + cam->savetype = PNG; + gconf_client_set_int (cam->gc, KEY3, cam->savetype, NULL); +} + +void ppm_func (GtkWidget * rb, cam * cam) +{ + GConfClient *client; + + client = gconf_client_get_default (); + cam->savetype = PPM; + gconf_client_set_int (cam->gc, KEY3, cam->savetype, NULL); +} + +void set_sensitive (cam * cam) +{ + gtk_widget_set_sensitive (glade_xml_get_widget (cam->xml, "table4"), + cam->cap); + + gtk_widget_set_sensitive (glade_xml_get_widget + (cam->xml, "appendbutton"), cam->cap); + gtk_widget_set_sensitive (glade_xml_get_widget (cam->xml, "tsbutton"), + cam->cap); + gtk_widget_set_sensitive (glade_xml_get_widget (cam->xml, "jpgb"), + cam->cap); + gtk_widget_set_sensitive (glade_xml_get_widget (cam->xml, "pngb"), + cam->cap); + gtk_widget_set_sensitive (glade_xml_get_widget (cam->xml, "table5"), + cam->rcap); + gtk_widget_set_sensitive (glade_xml_get_widget (cam->xml, "timecb"), + cam->rcap); + gtk_widget_set_sensitive (glade_xml_get_widget + (cam->xml, "tsbutton2"), cam->rcap); + gtk_widget_set_sensitive (glade_xml_get_widget (cam->xml, "fjpgb"), + cam->rcap); + gtk_widget_set_sensitive (glade_xml_get_widget (cam->xml, "fpngb"), + cam->rcap); + gtk_widget_set_sensitive (glade_xml_get_widget (cam->xml, "hbox20"), + cam->acap); + +} + +void cap_func (GtkWidget * rb, cam * cam) +{ + GConfClient *client; + + client = gconf_client_get_default (); + cam->cap = gtk_toggle_button_get_active ((GtkToggleButton *) rb); + + gconf_client_set_bool (cam->gc, KEY12, cam->cap, NULL); + update_tooltip (cam); + set_sensitive (cam); + +} + +void rcap_func (GtkWidget * rb, cam * cam) +{ + GConfClient *client; + + client = gconf_client_get_default (); + cam->rcap = gtk_toggle_button_get_active ((GtkToggleButton *) rb); + gconf_client_set_bool (cam->gc, KEY13, cam->rcap, NULL); + update_tooltip (cam); + set_sensitive (cam); + +} + +void acap_func (GtkWidget * rb, cam * cam) +{ + GConfClient *client; + + client = gconf_client_get_default (); + cam->acap = gtk_toggle_button_get_active ((GtkToggleButton *) rb); + + gconf_client_set_bool (cam->gc, KEY20, cam->acap, NULL); + + if (cam->acap == TRUE) { + cam->timeout_id = + gtk_timeout_add (cam->timeout_interval, + (GSourceFunc) timeout_capture_func, cam); + if (cam->debug == TRUE) { + printf ("add autocap - %d - timeout_interval = \n", + cam->timeout_id, cam->timeout_interval); + } + } else { + if (cam->debug == TRUE) { + printf ("remove autocap - %d - timeout_interval = \n", + cam->timeout_id, cam->timeout_interval); + } + gtk_timeout_remove (cam->timeout_id); + } + update_tooltip (cam); + set_sensitive (cam); +} + +void interval_change (GtkWidget * sb, cam * cam) +{ + GConfClient *client; + + client = gconf_client_get_default (); + cam->timeout_interval = + gtk_spin_button_get_value ((GtkSpinButton *) sb) * 60000; + gconf_client_set_int (cam->gc, KEY21, cam->timeout_interval, NULL); + if (cam->acap == TRUE) { + if (cam->debug == TRUE) { + printf + ("interval_change; old timeout_id = %d old interval = %d\n", + cam->timeout_id, cam->timeout_interval); + } + gtk_timeout_remove (cam->timeout_id); + cam->timeout_id = + gtk_timeout_add (cam->timeout_interval, + (GSourceFunc) timeout_capture_func, cam); + if (cam->debug == TRUE) { + printf ("new timeout_id = %d, new interval = %d\n", + cam->timeout_id, cam->timeout_interval); + } + } + update_tooltip (cam); +} + +void rjpg_func (GtkWidget * rb, cam * cam) +{ + GConfClient *client; + + client = gconf_client_get_default (); + cam->rsavetype = JPEG; + gconf_client_set_int (cam->gc, KEY10, cam->rsavetype, NULL); + +} + +void rpng_func (GtkWidget * rb, cam * cam) +{ + GConfClient *client; + + client = gconf_client_get_default (); + cam->rsavetype = PNG; + gconf_client_set_int (cam->gc, KEY10, cam->rsavetype, NULL); +} + +void rppm_func (GtkWidget * rb, cam * cam) +{ + GConfClient *client; + + client = gconf_client_get_default (); + cam->rsavetype = PPM; + gconf_client_set_int (cam->gc, KEY10, cam->rsavetype, NULL); +} + +void rts_func (GtkWidget * rb, cam * cam) +{ + GConfClient *client; + + client = gconf_client_get_default (); + cam->rtimestamp = gtk_toggle_button_get_active ((GtkToggleButton *) rb); + gconf_client_set_bool (cam->gc, KEY11, cam->rtimestamp, NULL); + +} + +void +gconf_notify_func (GConfClient * client, guint cnxn_id, GConfEntry * entry, + char *str) +{ + GConfValue *value; + + value = gconf_entry_get_value (entry); + str = g_strdup (gconf_value_get_string (value)); + +} + +void +gconf_notify_func_bool (GConfClient * client, guint cnxn_id, + GConfEntry * entry, gboolean val) +{ + GConfValue *value; + value = gconf_entry_get_value (entry); + val = gconf_value_get_bool (value); + +} + +void +gconf_notify_func_int (GConfClient * client, guint cnxn_id, + GConfEntry * entry, int val) +{ + GConfValue *value; + value = gconf_entry_get_value (entry); + val = gconf_value_get_int (value); + +} + +int delete_event (GtkWidget * widget, gpointer data) +{ + gtk_main_quit (); + return FALSE; +} + +/* + * apply preferences + */ +void prefs_func (GtkWidget * okbutton, cam * cam) +{ + GConfClient *client; + + client = gconf_client_get_default (); + + if (gnome_file_entry_get_full_path ((GnomeFileEntry *) dentry, TRUE) + != NULL) { + cam->pixdir = g_strdup ((gchar *) + gnome_file_entry_get_full_path ((GnomeFileEntry *) dentry, FALSE)); + gconf_client_set_string (cam->gc, KEY1, cam->pixdir, NULL); + + } else { + if (cam->debug == TRUE) { + fprintf (stderr, "null directory\ndirectory unchanged."); + } + } + + /* + * this is stupid, even if the string is empty, it will not return NULL + */ + if (strlen (gtk_entry_get_text ((GtkEntry *) entry2)) > 0) { + cam->capturefile = + g_strdup (gtk_entry_get_text ((GtkEntry *) entry2)); + gconf_client_set_string (cam->gc, KEY2, cam->capturefile, NULL); + } + + if (strlen (gtk_entry_get_text ((GtkEntry *) host_entry)) > 0) { + cam->rhost = g_strdup (gtk_entry_get_text ((GtkEntry *) host_entry)); + gconf_client_set_string (cam->gc, KEY5, cam->rhost, NULL); + } + if (strlen (gtk_entry_get_text ((GtkEntry *) login_entry)) > 0) { + cam->rlogin = + g_strdup (gtk_entry_get_text ((GtkEntry *) login_entry)); + gconf_client_set_string (cam->gc, KEY6, cam->rlogin, NULL); + } + if (strlen (gtk_entry_get_text ((GtkEntry *) pw_entry)) > 0) { + cam->rpw = g_strdup (gtk_entry_get_text ((GtkEntry *) pw_entry)); + gconf_client_set_string (cam->gc, KEY7, cam->rpw, NULL); + } + if (strlen (gtk_entry_get_text ((GtkEntry *) directory_entry)) > 0) { + cam->rpixdir = + g_strdup (gtk_entry_get_text ((GtkEntry *) directory_entry)); + gconf_client_set_string (cam->gc, KEY8, cam->rpixdir, NULL); + } + if (strlen (gtk_entry_get_text ((GtkEntry *) filename_entry)) > 0) { + cam->rcapturefile = + g_strdup (gtk_entry_get_text ((GtkEntry *) filename_entry)); + gconf_client_set_string (cam->gc, KEY9, cam->rcapturefile, NULL); + } + if (strlen (gtk_entry_get_text ((GtkEntry *) string_entry)) > 0) { + cam->ts_string = + g_strdup (gtk_entry_get_text ((GtkEntry *) string_entry)); + gconf_client_set_string (cam->gc, KEY16, cam->ts_string, NULL); + } + if (cam->debug == TRUE) { + fprintf (stderr, "dir now = %s\nfile now = %s\n", cam->pixdir, + cam->capturefile); + } + gtk_widget_hide (prefswindow); + +} + +void on_quit1_activate (GtkMenuItem * menuitem, gpointer user_data) +{ + gtk_main_quit (); +} + +void on_preferences1_activate (GtkMenuItem * menuitem, gpointer user_data) +{ + gtk_widget_show (prefswindow); +} + +void on_show_adjustments1_activate (GtkMenuItem * menuitem, cam * cam) +{ + + if (GTK_WIDGET_VISIBLE (glade_xml_get_widget (cam->xml, "table6"))) { + gtk_widget_hide (glade_xml_get_widget (cam->xml, "table6")); + gtk_window_resize (GTK_WINDOW + (glade_xml_get_widget + (cam->xml, "window2")), 320, 240); + cam->show_adjustments = FALSE; + + } else { + gtk_widget_show (glade_xml_get_widget (cam->xml, "table6")); + cam->show_adjustments = TRUE; + } + gconf_client_set_bool (cam->gc, KEY22, cam->show_adjustments, NULL); +} + +void on_change_size_activate (GtkWidget * widget, cam * cam) +{ + gchar *name, *title; + + (G_CONST_RETURN) name = gtk_widget_get_name (widget); + + if (strcmp (name, "small1") == 0) { + cam->x = cam->vid_cap.minwidth; + cam->y = cam->vid_cap.minheight; + if (cam->debug) { + printf ("\nsmall\n"); + } + } else if (strcmp (name, "medium1") == 0) { + cam->x = cam->vid_cap.maxwidth / 2; + cam->y = cam->vid_cap.maxheight / 2; + if (cam->debug) { + printf ("\nmed\n"); + } + } else { + cam->x = cam->vid_cap.maxwidth; + cam->y = cam->vid_cap.maxheight; + if (cam->debug) { + printf ("\nlarge\n"); + } + } + + cam->pixmap = gdk_pixmap_new (NULL, cam->x, cam->y, cam->desk_depth); + gtk_widget_set_size_request (glade_xml_get_widget (cam->xml, "da"), + cam->x, cam->y); + + /* + * if(cam->read == FALSE) { + * * cam->pic = mmap(0, cam->vid_buf.size, PROT_READ | PROT_WRITE, MAP_SHARED, cam->dev, 0); + * * + * * if((unsigned char *) -1 == (unsigned char *) cam->pic) { + * * if(cam->debug == TRUE) { + * * fprintf(stderr, "Unable to capture image (mmap).\n"); + * * } + * * error_dialog(_("Unable to capture image.")); + * * exit(-1); + * * } + * * }else{ + * * cam->pic_buf = malloc(cam->x * cam->y * cam->depth); + * * read(cam->dev,cam->pic,(cam->x * cam->y * 3)); + * * } + */ + + cam->vid_win.x = 0; + cam->vid_win.y = 0; + cam->vid_win.width = cam->x; + cam->vid_win.height = cam->y; + cam->vid_win.chromakey = 0; + cam->vid_win.flags = 0; + + set_win_info (cam); + // get_win_info(cam); + cam->vid_map.height = cam->y; + cam->vid_map.width = cam->x; + /* + * cam->vid_win.height = cam->y; + * * cam->vid_win.width = cam->x; + * * get_win_info(cam); + */ + cam->vid_map.format = cam->vid_pic.palette; + // get_win_info(cam); + /* + * if(cam->read == FALSE) { + * * for(frame = 0; frame < cam->vid_buf.frames; frame++) { + * * cam->vid_map.frame = frame; + * * if(ioctl(cam->dev, VIDIOCMCAPTURE, &cam->vid_map) < 0) { + * * if(cam->debug == TRUE) { + * * fprintf(stderr, "Unable to capture image (VIDIOCMCAPTURE) during resize.\n"); + * * } + * * //error_dialog(_("Unable to capture image.")); + * * //exit(-1); + * * } + * * } + * * } + */ + get_win_info (cam); + frame = 0; + gtk_window_resize (GTK_WINDOW + (glade_xml_get_widget (cam->xml, "window2")), 320, + 240); + + title = g_strdup_printf ("Camorama - %s - %dx%d", cam->vid_cap.name, + cam->x, cam->y); + gtk_window_set_title (GTK_WINDOW + (glade_xml_get_widget (cam->xml, "window2")), + title); + g_free (title); + +} + +void on_show_effects_activate (GtkMenuItem * menuitem, cam * cam) +{ + + if (GTK_WIDGET_VISIBLE (glade_xml_get_widget (cam->xml, "vbox37"))) { + gtk_widget_hide (glade_xml_get_widget (cam->xml, "vbox37")); + gtk_window_resize (GTK_WINDOW + (glade_xml_get_widget + (cam->xml, "window2")), 320, 240); + cam->show_adjustments = FALSE; + + } else { + gtk_widget_show (glade_xml_get_widget (cam->xml, "vbox37")); + cam->show_adjustments = TRUE; + } + gconf_client_set_bool (cam->gc, KEY22, cam->show_adjustments, NULL); +} + +void on_about1_activate (GtkMenuItem * menuitem, gpointer user_data) +{ + GtkWidget *about1 = NULL; + const gchar *authors[] = { "Greg Jones <greg@fixedgear.org>", + "Jens Knutson <tempest@magusbooks.com>", NULL + }; + const gchar *documenters[] = { NULL }; + GdkPixbuf *logo = + (GdkPixbuf *) create_pixbuf (DATADIR "/pixmaps/camorama.png"); + char *translators = _("translator_credits"); + + if (!strcmp (translators, "translator_credits")) + translators = NULL; + + if (about1 != NULL) { + printf ("before the old return\n"); + gdk_window_raise (about1->window); + gdk_window_show (about1->window); + return; + printf ("after the old return\n"); + } + + about1 = gnome_about_new ("Camorama", VERSION, + "Copyright \xc2\xa9 2002 Greg Jones", + _ + ("View, alter and save images from a webcam"), + authors, documenters, translators, logo); + + g_signal_connect (G_OBJECT (about1), "destroy", + G_CALLBACK (gtk_widget_destroyed), &about1); + g_object_add_weak_pointer (G_OBJECT (about1), (void **) &(about1)); + + gtk_widget_show (about1); +} + +/* + * get image from cam - does all the work ;) + */ +gint read_timeout_func (cam * cam) +{ + int i, count = 0; + GdkGC *gc; + + read (cam->dev, cam->pic, (cam->x * cam->y * 3)); + frames2++; + /* + * update_rec.x = 0; + * * update_rec.y = 0; + * * update_rec.width = cam->x; + * * update_rec.height = cam->y; + */ + count++; + /* + * refer the frame + */ + cam->pic_buf = cam->pic; // + cam->vid_buf.offsets[frame]; + + if (cam->vid_pic.palette == VIDEO_PALETTE_YUV420P) { + yuv420p_to_rgb (cam->pic_buf, cam->tmp, cam->x, cam->y, cam->depth); + cam->pic_buf = cam->tmp; + } + + if (func_state.fc == TRUE) { + fix_colour (cam->pic_buf, cam->x, cam->y); + } + + if (func_state.threshold_channel == TRUE) { + threshold_channel (cam->pic_buf, cam->x, cam->y, cam->dither); + } + + if (func_state.threshold == TRUE) { + threshold (cam->pic_buf, cam->x, cam->y, cam->dither); + } + + if (func_state.laplace == TRUE) { + + laplace (cam->pic_buf, cam->depth, cam->x, cam->y); + } + + if (func_state.sobel == TRUE) { + sobel (cam->pic_buf, cam->x, cam->y); + } + + if (func_state.wacky == TRUE) { + wacky (cam->pic_buf, cam->depth, cam->x, cam->y); + } + + if (func_state.negative == TRUE) { + negative (cam->pic_buf, cam->x, cam->y, cam->depth); + } + + if (func_state.mirror == TRUE) { + mirror (cam->pic_buf, cam->x, cam->y, cam->depth); + } + + if (func_state.colour == TRUE) { + bw (cam->pic_buf, cam->x, cam->y); + } + + if (func_state.smooth == TRUE) { + smooth (cam->pic_buf, cam->depth, cam->x, cam->y); + } + + gc = gdk_gc_new (cam->pixmap); + gdk_draw_rgb_image (cam->pixmap, + gc, 0, 0, + cam->vid_win.width, cam->vid_win.height, + GDK_RGB_DITHER_NORMAL, cam->pic_buf, + cam->vid_win.width * cam->depth); + + gtk_widget_queue_draw_area (glade_xml_get_widget (cam->xml, "da"), 0, + 0, cam->x, cam->y); + return 1; + +} + +gint timeout_func (cam * cam) +{ + int i, count = 0; + GdkGC *gc; + + i = -1; + while (i < 0) { + i = ioctl (cam->dev, VIDIOCSYNC, &frame); + + if (i < 0 && errno == EINTR) { + if (cam->debug == TRUE) { + printf ("i = %d\n", i); + } + continue; + } + if (i < 0) { + if (cam->debug == TRUE) { + fprintf (stderr, "Unable to capture image (VIDIOCSYNC)\n"); + } + error_dialog (_("Unable to capture image.")); + exit (-1); + } + break; + } + count++; + /* + * refer the frame + */ + cam->pic_buf = cam->pic + cam->vid_buf.offsets[frame]; + if (cam->vid_pic.palette == VIDEO_PALETTE_YUV420P) { + yuv420p_to_rgb (cam->pic_buf, cam->tmp, cam->x, cam->y, cam->depth); + cam->pic_buf = cam->tmp; + } + if (func_state.fc == TRUE) { + fix_colour (cam->pic_buf, cam->x, cam->y); + } + + if (func_state.threshold_channel == TRUE) { + threshold_channel (cam->pic_buf, cam->x, cam->y, cam->dither); + } + + if (func_state.threshold == TRUE) { + threshold (cam->pic_buf, cam->x, cam->y, cam->dither); + } + + if (func_state.laplace == TRUE) { + + laplace (cam->pic_buf, cam->depth, cam->x, cam->y); + } + + if (func_state.sobel == TRUE) { + sobel (cam->pic_buf, cam->x, cam->y); + } + + if (func_state.wacky == TRUE) { + wacky (cam->pic_buf, cam->depth, cam->x, cam->y); + } + + if (func_state.negative == TRUE) { + negative (cam->pic_buf, cam->x, cam->y, cam->depth); + } + + if (func_state.mirror == TRUE) { + mirror (cam->pic_buf, cam->x, cam->y, cam->depth); + } + + if (func_state.colour == TRUE) { + bw (cam->pic_buf, cam->x, cam->y); + } + + if (func_state.smooth == TRUE) { + smooth (cam->pic_buf, cam->depth, cam->x, cam->y); + } + + gc = gdk_gc_new (cam->pixmap); + + gdk_draw_rgb_image (cam->pixmap, + gc, 0, 0, + cam->vid_win.width, cam->vid_win.height, + GDK_RGB_DITHER_NORMAL, cam->pic_buf, + cam->vid_win.width * cam->depth); + + gtk_widget_queue_draw_area (glade_xml_get_widget (cam->xml, "da"), 0, + 0, cam->x, cam->y); + + cam->vid_map.frame = frame; + if (ioctl (cam->dev, VIDIOCMCAPTURE, &cam->vid_map) < 0) { + if (cam->debug == TRUE) { + fprintf (stderr, "Unable to capture image (VIDIOCMCAPTURE)\n"); + } + error_dialog (_("Unable to capture image.")); + exit (-1); + } + + /* + * next frame + */ + frame++; + + /* + * reset to the 1st frame + */ + if (frame >= cam->vid_buf.frames) { + frame = 0; + } + + frames2++; + g_object_unref ((gpointer) gc); + return 1; +} + +gint fps (GtkWidget * sb) +{ + gchar *stat; + + seconds++; + stat = g_strdup_printf ("%.2f fps - current %.2f fps - average", + (float) frames / (float) (2), + (float) frames2 / (float) (seconds * 2)); + frames = 0; + gnome_appbar_push (GNOME_APPBAR (sb), stat); + g_free (stat); + return 1; +} + +void on_status_show (GtkWidget * sb, cam * cam) +{ + cam->status = sb; +} + +void init_cam (GtkWidget * capture, cam * cam) +{ + cam->pic = + mmap (0, cam->vid_buf.size, PROT_READ | PROT_WRITE, + MAP_SHARED, cam->dev, 0); + + if ((unsigned char *) -1 == (unsigned char *) cam->pic) { + if (cam->debug == TRUE) { + fprintf (stderr, "Unable to capture image (mmap).\n"); + } + error_dialog (_("Unable to capture image.")); + exit (-1); + } + cam->vid_map.height = cam->y; + cam->vid_map.width = cam->x; + cam->vid_map.format = cam->vid_pic.palette; + for (frame = 0; frame < cam->vid_buf.frames; frame++) { + cam->vid_map.frame = frame; + if (ioctl (cam->dev, VIDIOCMCAPTURE, &cam->vid_map) < 0) { + if (cam->debug == TRUE) { + fprintf (stderr, + "Unable to capture image (VIDIOCMCAPTURE).\n"); + } + error_dialog (_("Unable to capture image.")); + exit (-1); + } + } + frame = 0; +} + +void capture_func (GtkWidget * widget, cam * cam) +{ + if (cam->debug == TRUE) { + printf + ("capture_func\nx = %d, y = %d, depth = %d, realloc size = %d\n", + cam->x, cam->y, cam->depth, (cam->x * cam->y * cam->depth)); + } + + memcpy (cam->tmp, cam->pic_buf, cam->x * cam->y * cam->depth); + + if (cam->rcap == TRUE) { + remote_save (cam); + } + if (cam->cap == TRUE) { + local_save (cam); + } + +} + +gint timeout_capture_func (cam * cam) +{ + /* GdkRectangle rect; + rect->x = 0; rect->y = 0; + rect->width = cam->x; rect->height = cam->y;*/ + + /* need to return true, or the timeout will be destroyed - don't forget! :) */ + if (cam->hidden == TRUE) { + /* call timeout_func to get a new picture. stupid, but it works. + * also need to add this to capture_func + * maybe add a "window_state_event" handler to do the same when window is iconified */ + + + pt2Function (cam); + pt2Function (cam); + pt2Function (cam); + pt2Function (cam); + + } + memcpy (cam->tmp, cam->pic_buf, cam->x * cam->y * cam->depth); + + if (cam->cap == TRUE) { + local_save (cam); + } + if (cam->rcap == TRUE) { + remote_save (cam); + } + return 1; +} + +gboolean +on_drawingarea1_expose_event (GtkWidget * widget, GdkEventExpose * event, + cam * cam) +{ + cam->window = widget->window; + gdk_draw_drawable (widget->window, + widget->style->fg_gc[GTK_WIDGET_STATE (widget)], + cam->pixmap, + event->area.x, event->area.y, event->area.x, + event->area.y, event->area.width, event->area.height); + + frames++; + return FALSE; +} + +void fix_colour_func (GtkToggleButton * tb, char *data) +{ + func_state.fc = gtk_toggle_button_get_active (tb); +} + +void edge_func1 (GtkToggleButton * tb, gpointer data) +{ + func_state.wacky = gtk_toggle_button_get_active (tb); +} + +void sobel_func (GtkToggleButton * tb, gpointer data) +{ + func_state.sobel = gtk_toggle_button_get_active (tb); +} + +void threshold_func1 (GtkToggleButton * tb, gpointer data) +{ + func_state.threshold = gtk_toggle_button_get_active (tb); +} + +void threshold_ch_func (GtkToggleButton * tb, gpointer data) +{ + func_state.threshold_channel = gtk_toggle_button_get_active (tb); +} + +void edge_func3 (GtkToggleButton * tb, gpointer data) +{ + func_state.laplace = gtk_toggle_button_get_active (tb); +} + +void negative_func (GtkToggleButton * tb, gpointer data) +{ + func_state.negative = gtk_toggle_button_get_active (tb); +} + +void mirror_func (GtkToggleButton * tb, gpointer data) +{ + func_state.mirror = gtk_toggle_button_get_active (tb); +} + +void smooth_func (GtkToggleButton * tb, gpointer data) +{ + func_state.smooth = gtk_toggle_button_get_active (tb); +} + +void colour_func (GtkToggleButton * tb, gpointer data) +{ + func_state.colour = gtk_toggle_button_get_active (tb); +} + +void on_scale1_drag_data_received (GtkHScale * sc1, cam * cam) +{ + cam->dither = (int) gtk_range_get_value ((GtkRange *) sc1); +} + +void contrast_change (GtkHScale * sc1, cam * cam) +{ + + cam->vid_pic.contrast = + 256 * (int) gtk_range_get_value ((GtkRange *) sc1); + set_pic_info (cam); +} + +void brightness_change (GtkHScale * sc1, cam * cam) +{ + + cam->vid_pic.brightness = + 256 * (int) gtk_range_get_value ((GtkRange *) sc1); + set_pic_info (cam); +} + +void colour_change (GtkHScale * sc1, cam * cam) +{ + + cam->vid_pic.colour = 256 * (int) gtk_range_get_value ((GtkRange *) sc1); + set_pic_info (cam); +} + +void hue_change (GtkHScale * sc1, cam * cam) +{ + + cam->vid_pic.hue = 256 * (int) gtk_range_get_value ((GtkRange *) sc1); + set_pic_info (cam); +} + +void wb_change (GtkHScale * sc1, cam * cam) +{ + + cam->vid_pic.whiteness = + 256 * (int) gtk_range_get_value ((GtkRange *) sc1); + set_pic_info (cam); +} + +void help_cb (GtkWidget * widget, gpointer data) +{ + GError *error = NULL; + + if (error != NULL) { + /* + * FIXME: This is bad :) + */ + g_warning ("%s\n", error->message); + g_error_free (error); + } +} + +void update_tooltip (cam * cam) +{ + gchar *tooltip_text; + + if (cam->debug == TRUE) { + printf ("update_tooltip called\n"); + } + if (cam->acap == TRUE) { + tooltip_text = + g_strdup_printf + ("Local Capture: %d\nRemote Capture: %d\nCapture Interval: %d", + cam->cap, cam->rcap, cam->timeout_interval / 60000); + if (cam->debug == TRUE) { + printf ("tip - acap on\n"); + } + } else { + if (cam->debug == TRUE) { + printf ("tip - acap off\n"); + } + tooltip_text = g_strdup_printf ("Automatic Capture Disabled"); + } + gtk_tooltips_set_tip ((GtkTooltips *) cam->tooltips, + (GtkWidget *) cam->tray_icon, tooltip_text, + "private"); + g_free (tooltip_text); +} diff --git a/src/callbacks.h b/src/callbacks.h new file mode 100644 index 0000000..04ede00 --- /dev/null +++ b/src/callbacks.h @@ -0,0 +1,77 @@ +#include <gtk/gtk.h> +#include "fileio.h" +#include <gconf/gconf-client.h> + +typedef struct image_state { + gboolean wacky; + gboolean threshold; + gboolean threshold_channel; + gboolean sobel; + gboolean laplace; + gboolean negative; + gboolean mirror; + gboolean colour; + gboolean smooth; + gboolean fc; +} state; + +void on_change_size_activate (GtkWidget * widget, cam * cam); +void on_quit1_activate (GtkMenuItem * menuitem, gpointer user_data); +void gconf_notify_func (GConfClient * client, guint cnxn_id, + GConfEntry * entry, char *); +void gconf_notify_func_bool (GConfClient * client, guint cnxn_id, + GConfEntry * entry, gboolean val); +void gconf_notify_func_int (GConfClient * client, guint cnxn_id, + GConfEntry * entry, int val); +int delete_event (GtkWidget *, gpointer data); +void cap_func (GtkWidget *, cam *); +void rcap_func (GtkWidget *, cam *); +void acap_func (GtkWidget *, cam *); +void set_sensitive (cam *); +void tt_enable_func (GtkWidget *, cam *); +void interval_change (GtkWidget *, cam *); +void ts_func (GtkWidget *, cam *); +void customstring_func (GtkWidget *, cam *); +void drawdate_func (GtkWidget *, cam *); +void append_func (GtkWidget *, cam *); +void rappend_func (GtkWidget *, cam *); +void jpg_func (GtkWidget *, cam *); +void png_func (GtkWidget *, cam *); +void ppm_func (GtkWidget *, cam *); +void rts_func (GtkWidget *, cam *); +void rjpg_func (GtkWidget *, cam *); +void rpng_func (GtkWidget *, cam *); +gint (*pt2Function) (cam *); +void rppm_func (GtkWidget *, cam *); +void on_preferences1_activate (GtkMenuItem * menuitem, gpointer user_data); +void on_about1_activate (GtkMenuItem * menuitem, gpointer user_data); +void on_show_adjustments1_activate (GtkMenuItem * menuitem, cam *); +void on_show_effects_activate (GtkMenuItem * menuitem, cam *); +void prefs_func (GtkWidget *, cam *); +gint io_func (cam *, gint, GdkInputCondition); +void capture_func2 (GtkWidget *, cam *); +void capture_func (GtkWidget *, cam *); +void init_cam (GtkWidget * capture, cam * cam); +gint timeout_capture_func (cam *); +gint fps (GtkWidget *); +gint timeout_func (cam *); +gint read_timeout_func (cam *); +void edge_func1 (GtkToggleButton *, gpointer); +void sobel_func (GtkToggleButton *, gpointer); +void fix_colour_func (GtkToggleButton *, char *); +void threshold_func1 (GtkToggleButton *, gpointer); +void threshold_ch_func (GtkToggleButton *, gpointer); +void edge_func3 (GtkToggleButton *, gpointer); +void mirror_func (GtkToggleButton *, gpointer); +void colour_func (GtkToggleButton *, gpointer); +void smooth_func (GtkToggleButton *, gpointer); +void negative_func (GtkToggleButton *, gpointer); +void on_scale1_drag_data_received (GtkHScale *, cam *); +void on_status_show (GtkWidget *, cam *); +void contrast_change (GtkHScale *, cam *); +void brightness_change (GtkHScale *, cam *); +void colour_change (GtkHScale *, cam *); +void hue_change (GtkHScale *, cam *); +void wb_change (GtkHScale *, cam *); +gboolean on_drawingarea1_expose_event (GtkWidget *, GdkEventExpose *, cam *); +void update_tooltip (cam * cam); diff --git a/src/eggtrayicon.c b/src/eggtrayicon.c new file mode 100644 index 0000000..6c30930 --- /dev/null +++ b/src/eggtrayicon.c @@ -0,0 +1,480 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* eggtrayicon.c + * Copyright (C) 2002 Anders Carlsson <andersca@gnu.org> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#include <config.h> +#include <string.h> +#include <libintl.h> + +#include "eggtrayicon.h" + +#include <gdk/gdkx.h> +#include <X11/Xatom.h> + +#ifndef EGG_COMPILATION +#ifndef _ +#define _(x) dgettext (GETTEXT_PACKAGE, x) +#define N_(x) x +#endif +#else +#define _(x) x +#define N_(x) x +#endif + +#define SYSTEM_TRAY_REQUEST_DOCK 0 +#define SYSTEM_TRAY_BEGIN_MESSAGE 1 +#define SYSTEM_TRAY_CANCEL_MESSAGE 2 + +#define SYSTEM_TRAY_ORIENTATION_HORZ 0 +#define SYSTEM_TRAY_ORIENTATION_VERT 1 + +enum { + PROP_0, + PROP_ORIENTATION +}; + +static GtkPlugClass *parent_class = NULL; + +static void egg_tray_icon_init (EggTrayIcon *icon); +static void egg_tray_icon_class_init (EggTrayIconClass *klass); + +static void egg_tray_icon_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec); + +static void egg_tray_icon_realize (GtkWidget *widget); +static void egg_tray_icon_unrealize (GtkWidget *widget); + +static void egg_tray_icon_update_manager_window (EggTrayIcon *icon); + +GType +egg_tray_icon_get_type (void) +{ + static GType our_type = 0; + + if (our_type == 0) + { + static const GTypeInfo our_info = + { + sizeof (EggTrayIconClass), + (GBaseInitFunc) NULL, + (GBaseFinalizeFunc) NULL, + (GClassInitFunc) egg_tray_icon_class_init, + NULL, /* class_finalize */ + NULL, /* class_data */ + sizeof (EggTrayIcon), + 0, /* n_preallocs */ + (GInstanceInitFunc) egg_tray_icon_init + }; + + our_type = g_type_register_static (GTK_TYPE_PLUG, "EggTrayIcon", &our_info, 0); + } + + return our_type; +} + +static void +egg_tray_icon_init (EggTrayIcon *icon) +{ + icon->stamp = 1; + icon->orientation = GTK_ORIENTATION_HORIZONTAL; + + gtk_widget_add_events (GTK_WIDGET (icon), GDK_PROPERTY_CHANGE_MASK); +} + +static void +egg_tray_icon_class_init (EggTrayIconClass *klass) +{ + GObjectClass *gobject_class = (GObjectClass *)klass; + GtkWidgetClass *widget_class = (GtkWidgetClass *)klass; + + parent_class = g_type_class_peek_parent (klass); + + gobject_class->get_property = egg_tray_icon_get_property; + + widget_class->realize = egg_tray_icon_realize; + widget_class->unrealize = egg_tray_icon_unrealize; + + g_object_class_install_property (gobject_class, + PROP_ORIENTATION, + g_param_spec_enum ("orientation", + _("Orientation"), + _("The orientation of the tray."), + GTK_TYPE_ORIENTATION, + GTK_ORIENTATION_HORIZONTAL, + G_PARAM_READABLE)); +} + +static void +egg_tray_icon_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + EggTrayIcon *icon = EGG_TRAY_ICON (object); + + switch (prop_id) + { + case PROP_ORIENTATION: + g_value_set_enum (value, icon->orientation); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +egg_tray_icon_get_orientation_property (EggTrayIcon *icon) +{ + Display *xdisplay; + Atom type; + int format; + union { + gulong *prop; + guchar *prop_ch; + } prop = { NULL }; + gulong nitems; + gulong bytes_after; + int error, result; + + g_assert (icon->manager_window != None); + + xdisplay = GDK_DISPLAY_XDISPLAY (gtk_widget_get_display (GTK_WIDGET (icon))); + + gdk_error_trap_push (); + type = None; + result = XGetWindowProperty (xdisplay, + icon->manager_window, + icon->orientation_atom, + 0, G_MAXLONG, FALSE, + XA_CARDINAL, + &type, &format, &nitems, + &bytes_after, &(prop.prop_ch)); + error = gdk_error_trap_pop (); + + if (error || result != Success) + return; + + if (type == XA_CARDINAL) + { + GtkOrientation orientation; + + orientation = (prop.prop [0] == SYSTEM_TRAY_ORIENTATION_HORZ) ? + GTK_ORIENTATION_HORIZONTAL : + GTK_ORIENTATION_VERTICAL; + + if (icon->orientation != orientation) + { + icon->orientation = orientation; + + g_object_notify (G_OBJECT (icon), "orientation"); + } + } + + if (prop.prop) + XFree (prop.prop); +} + +static GdkFilterReturn +egg_tray_icon_manager_filter (GdkXEvent *xevent, GdkEvent *event, gpointer user_data) +{ + EggTrayIcon *icon = user_data; + XEvent *xev = (XEvent *)xevent; + + if (xev->xany.type == ClientMessage && + xev->xclient.message_type == icon->manager_atom && + xev->xclient.data.l[1] == icon->selection_atom) + { + egg_tray_icon_update_manager_window (icon); + } + else if (xev->xany.window == icon->manager_window) + { + if (xev->xany.type == PropertyNotify && + xev->xproperty.atom == icon->orientation_atom) + { + egg_tray_icon_get_orientation_property (icon); + } + if (xev->xany.type == DestroyNotify) + { + egg_tray_icon_update_manager_window (icon); + } + } + + return GDK_FILTER_CONTINUE; +} + +static void +egg_tray_icon_unrealize (GtkWidget *widget) +{ + EggTrayIcon *icon = EGG_TRAY_ICON (widget); + GdkWindow *root_window; + + if (icon->manager_window != None) + { + GdkWindow *gdkwin; + + gdkwin = gdk_window_lookup_for_display (gtk_widget_get_display (widget), + icon->manager_window); + + gdk_window_remove_filter (gdkwin, egg_tray_icon_manager_filter, icon); + } + + root_window = gdk_screen_get_root_window (gtk_widget_get_screen (widget)); + + gdk_window_remove_filter (root_window, egg_tray_icon_manager_filter, icon); + + if (GTK_WIDGET_CLASS (parent_class)->unrealize) + (* GTK_WIDGET_CLASS (parent_class)->unrealize) (widget); +} + +static void +egg_tray_icon_send_manager_message (EggTrayIcon *icon, + long message, + Window window, + long data1, + long data2, + long data3) +{ + XClientMessageEvent ev; + Display *display; + + ev.type = ClientMessage; + ev.window = window; + ev.message_type = icon->system_tray_opcode_atom; + ev.format = 32; + ev.data.l[0] = gdk_x11_get_server_time (GTK_WIDGET (icon)->window); + ev.data.l[1] = message; + ev.data.l[2] = data1; + ev.data.l[3] = data2; + ev.data.l[4] = data3; + + display = GDK_DISPLAY_XDISPLAY (gtk_widget_get_display (GTK_WIDGET (icon))); + + gdk_error_trap_push (); + XSendEvent (display, + icon->manager_window, False, NoEventMask, (XEvent *)&ev); + XSync (display, False); + gdk_error_trap_pop (); +} + +static void +egg_tray_icon_send_dock_request (EggTrayIcon *icon) +{ + egg_tray_icon_send_manager_message (icon, + SYSTEM_TRAY_REQUEST_DOCK, + icon->manager_window, + gtk_plug_get_id (GTK_PLUG (icon)), + 0, 0); +} + +static void +egg_tray_icon_update_manager_window (EggTrayIcon *icon) +{ + Display *xdisplay; + + xdisplay = GDK_DISPLAY_XDISPLAY (gtk_widget_get_display (GTK_WIDGET (icon))); + + if (icon->manager_window != None) + { + GdkWindow *gdkwin; + + gdkwin = gdk_window_lookup_for_display (gtk_widget_get_display (GTK_WIDGET (icon)), + icon->manager_window); + + gdk_window_remove_filter (gdkwin, egg_tray_icon_manager_filter, icon); + } + + XGrabServer (xdisplay); + + icon->manager_window = XGetSelectionOwner (xdisplay, + icon->selection_atom); + + if (icon->manager_window != None) + XSelectInput (xdisplay, + icon->manager_window, StructureNotifyMask|PropertyChangeMask); + + XUngrabServer (xdisplay); + XFlush (xdisplay); + + if (icon->manager_window != None) + { + GdkWindow *gdkwin; + + gdkwin = gdk_window_lookup_for_display (gtk_widget_get_display (GTK_WIDGET (icon)), + icon->manager_window); + + gdk_window_add_filter (gdkwin, egg_tray_icon_manager_filter, icon); + + /* Send a request that we'd like to dock */ + egg_tray_icon_send_dock_request (icon); + + egg_tray_icon_get_orientation_property (icon); + } +} + +static void +egg_tray_icon_realize (GtkWidget *widget) +{ + EggTrayIcon *icon = EGG_TRAY_ICON (widget); + GdkScreen *screen; + GdkDisplay *display; + Display *xdisplay; + char buffer[256]; + GdkWindow *root_window; + + if (GTK_WIDGET_CLASS (parent_class)->realize) + GTK_WIDGET_CLASS (parent_class)->realize (widget); + + screen = gtk_widget_get_screen (widget); + display = gdk_screen_get_display (screen); + xdisplay = gdk_x11_display_get_xdisplay (display); + + /* Now see if there's a manager window around */ + g_snprintf (buffer, sizeof (buffer), + "_NET_SYSTEM_TRAY_S%d", + gdk_screen_get_number (screen)); + + icon->selection_atom = XInternAtom (xdisplay, buffer, False); + + icon->manager_atom = XInternAtom (xdisplay, "MANAGER", False); + + icon->system_tray_opcode_atom = XInternAtom (xdisplay, + "_NET_SYSTEM_TRAY_OPCODE", + False); + + icon->orientation_atom = XInternAtom (xdisplay, + "_NET_SYSTEM_TRAY_ORIENTATION", + False); + + egg_tray_icon_update_manager_window (icon); + + root_window = gdk_screen_get_root_window (screen); + + /* Add a root window filter so that we get changes on MANAGER */ + gdk_window_add_filter (root_window, + egg_tray_icon_manager_filter, icon); +} + +EggTrayIcon * +egg_tray_icon_new_for_xscreen (Screen *xscreen, const char *name) +{ + GdkDisplay *display; + GdkScreen *screen; + + display = gdk_x11_lookup_xdisplay (DisplayOfScreen (xscreen)); + screen = gdk_display_get_screen (display, XScreenNumberOfScreen (xscreen)); + + return egg_tray_icon_new_for_screen (screen, name); +} + +EggTrayIcon * +egg_tray_icon_new_for_screen (GdkScreen *screen, const char *name) +{ + g_return_val_if_fail (GDK_IS_SCREEN (screen), NULL); + + return g_object_new (EGG_TYPE_TRAY_ICON, "screen", screen, "title", name, NULL); +} + +EggTrayIcon* +egg_tray_icon_new (const gchar *name) +{ + return g_object_new (EGG_TYPE_TRAY_ICON, "title", name, NULL); +} + +guint +egg_tray_icon_send_message (EggTrayIcon *icon, + gint timeout, + const gchar *message, + gint len) +{ + guint stamp; + + g_return_val_if_fail (EGG_IS_TRAY_ICON (icon), 0); + g_return_val_if_fail (timeout >= 0, 0); + g_return_val_if_fail (message != NULL, 0); + + if (icon->manager_window == None) + return 0; + + if (len < 0) + len = strlen (message); + + stamp = icon->stamp++; + + /* Get ready to send the message */ + egg_tray_icon_send_manager_message (icon, SYSTEM_TRAY_BEGIN_MESSAGE, + (Window)gtk_plug_get_id (GTK_PLUG (icon)), + timeout, len, stamp); + + /* Now to send the actual message */ + gdk_error_trap_push (); + while (len > 0) + { + XClientMessageEvent ev; + Display *xdisplay; + + xdisplay = GDK_DISPLAY_XDISPLAY (gtk_widget_get_display (GTK_WIDGET (icon))); + + ev.type = ClientMessage; + ev.window = (Window)gtk_plug_get_id (GTK_PLUG (icon)); + ev.format = 8; + ev.message_type = XInternAtom (xdisplay, + "_NET_SYSTEM_TRAY_MESSAGE_DATA", False); + if (len > 20) + { + memcpy (&ev.data, message, 20); + len -= 20; + message += 20; + } + else + { + memcpy (&ev.data, message, len); + len = 0; + } + + XSendEvent (xdisplay, + icon->manager_window, False, StructureNotifyMask, (XEvent *)&ev); + XSync (xdisplay, False); + } + gdk_error_trap_pop (); + + return stamp; +} + +void +egg_tray_icon_cancel_message (EggTrayIcon *icon, + guint id) +{ + g_return_if_fail (EGG_IS_TRAY_ICON (icon)); + g_return_if_fail (id > 0); + + egg_tray_icon_send_manager_message (icon, SYSTEM_TRAY_CANCEL_MESSAGE, + (Window)gtk_plug_get_id (GTK_PLUG (icon)), + id, 0, 0); +} + +GtkOrientation +egg_tray_icon_get_orientation (EggTrayIcon *icon) +{ + g_return_val_if_fail (EGG_IS_TRAY_ICON (icon), GTK_ORIENTATION_HORIZONTAL); + + return icon->orientation; +} diff --git a/src/eggtrayicon.h b/src/eggtrayicon.h new file mode 100644 index 0000000..007f4c1 --- /dev/null +++ b/src/eggtrayicon.h @@ -0,0 +1,77 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* eggtrayicon.h + * Copyright (C) 2002 Anders Carlsson <andersca@gnu.org> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#ifndef __EGG_TRAY_ICON_H__ +#define __EGG_TRAY_ICON_H__ + +#include <gtk/gtkplug.h> +#include <gdk/gdkx.h> + +G_BEGIN_DECLS + +#define EGG_TYPE_TRAY_ICON (egg_tray_icon_get_type ()) +#define EGG_TRAY_ICON(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), EGG_TYPE_TRAY_ICON, EggTrayIcon)) +#define EGG_TRAY_ICON_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), EGG_TYPE_TRAY_ICON, EggTrayIconClass)) +#define EGG_IS_TRAY_ICON(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), EGG_TYPE_TRAY_ICON)) +#define EGG_IS_TRAY_ICON_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), EGG_TYPE_TRAY_ICON)) +#define EGG_TRAY_ICON_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), EGG_TYPE_TRAY_ICON, EggTrayIconClass)) + +typedef struct _EggTrayIcon EggTrayIcon; +typedef struct _EggTrayIconClass EggTrayIconClass; + +struct _EggTrayIcon +{ + GtkPlug parent_instance; + + guint stamp; + + Atom selection_atom; + Atom manager_atom; + Atom system_tray_opcode_atom; + Atom orientation_atom; + Window manager_window; + + GtkOrientation orientation; +}; + +struct _EggTrayIconClass +{ + GtkPlugClass parent_class; +}; + +GType egg_tray_icon_get_type (void); + +EggTrayIcon *egg_tray_icon_new_for_screen (GdkScreen *screen, + const gchar *name); + +EggTrayIcon *egg_tray_icon_new (const gchar *name); + +guint egg_tray_icon_send_message (EggTrayIcon *icon, + gint timeout, + const char *message, + gint len); +void egg_tray_icon_cancel_message (EggTrayIcon *icon, + guint id); + +GtkOrientation egg_tray_icon_get_orientation (EggTrayIcon *icon); + +G_END_DECLS + +#endif /* __EGG_TRAY_ICON_H__ */ diff --git a/src/fileio.c b/src/fileio.c new file mode 100644 index 0000000..7e8a6b1 --- /dev/null +++ b/src/fileio.c @@ -0,0 +1,439 @@ +#include"fileio.h" +#include<time.h> +#include<errno.h> +#include "support.h" + +#include <gdk-pixbuf/gdk-pixbuf.h> +#include<stdio.h> +# define CHAR_HEIGHT 11 +# define CHAR_WIDTH 6 +# define CHAR_START 4 +# include "font_6x11.h" +#include <gnome.h> + +static int print_error (GnomeVFSResult result, const char *uri_string); + +/* add timestamp/text to image - "borrowed" from gspy */ +int +add_rgb_text (char *image, int width, int height, char *cstring, char *format, + gboolean str, gboolean date) +{ + time_t t; + struct tm *tm; + unsigned char line[128], *ptr; + int i, x, y, f, len; + int total; + gchar *image_label; + + if (str == TRUE && date == TRUE) { + image_label = g_strdup_printf ("%s - %s", cstring, format); + + } else if (str == TRUE && date == FALSE) { + image_label = g_strdup_printf ("%s", cstring); + } else if (str == FALSE && date == TRUE) { + image_label = g_strdup_printf ("%s", format); + } else if (str == FALSE && date == FALSE) { + return 0; + } + + time (&t); + tm = localtime (&t); + len = strftime (line, 127, image_label, tm); + + for (y = 0; y < CHAR_HEIGHT; y++) { + /* locate text in lower left corner of image */ + ptr = image + 3 * width * (height - CHAR_HEIGHT - 2 + y) + 12; + + /* loop for each character in the string */ + for (x = 0; x < len; x++) { + /* locate the character in the fontdata array */ + f = fontdata[line[x] * CHAR_HEIGHT + y]; + + /* loop for each column of font data */ + for (i = CHAR_WIDTH - 1; i >= 0; i--) { + /* write a black background under text + * comment out the following block to get white letters on picture background */ + /* ptr[0] = 0; + * ptr[1] = 0; + * ptr[2] = 0; */ + if (f & (CHAR_START << i)) { + + /* white text */ + + total = ptr[0] + ptr[1] + ptr[2]; + if (total / 3 < 128) { + ptr[0] = 255; + ptr[1] = 255; + ptr[2] = 255; + } else { + ptr[0] = 0; + ptr[1] = 0; + ptr[2] = 0; + } + } + ptr += 3; + } + } + } + return 1; +} + +void remote_save (cam * cam) +{ + GThread *remote_thread; + GnomeVFSHandle **write_handle; + char *output_uri_string, *input_uri_string; + GnomeVFSFileSize bytes_written; + GnomeVFSURI *uri_1; + unsigned char *tmp; + GnomeVFSResult result = 0; + gboolean test; + char *filename, *error_message; + FILE *fp; + int bytes = 0, fc; + time_t t; + gchar *timenow, *ext; + struct tm *tm; + gboolean pbs; + GdkPixbuf *pb; + GError *error; + + switch (cam->rsavetype) { + case JPEG: + ext = g_strdup ((gchar *) "jpeg"); + break; + case PNG: + ext = g_strdup ((gchar *) "png"); + break; + default: + ext = g_strdup ((gchar *) "jpeg"); + } + //cam->tmp = NULL; + + if (cam->rtimestamp == TRUE) { + add_rgb_text (cam->tmp, cam->x, cam->y, cam->ts_string, + cam->date_format, cam->usestring, cam->usedate); + } + + if (chdir ("/tmp") != 0) { + error_dialog (_("Could save temporary image file in /tmp.")); + g_free (ext); + //g_thread_exit (NULL); + } + + time (&t); + tm = localtime (&t); + strftime (timenow, sizeof (timenow) - 1, "%s", tm); + + filename = g_strdup_printf ("camorama.%s", ext); + //g_free(ext); + pb = gdk_pixbuf_new_from_data (cam->tmp, GDK_COLORSPACE_RGB, FALSE, 8, + cam->x, cam->y, + cam->x * cam->vid_pic.depth / 8, NULL, + NULL); + + if (pb == NULL) { + error_message = + g_strdup_printf (_("Unable to create image '%s'."), filename); + error_dialog (error_message); + g_free (error_message); + //g_thread_exit (NULL); + } + + pbs = gdk_pixbuf_save (pb, filename, ext, NULL, NULL); //&error);//, NULL); + if (pbs == FALSE) { + error_message = + g_strdup_printf (_("Could not save image '%s/%s'."), + cam->pixdir, filename); + error_dialog (error_message); + g_free (filename); + //g_free (error_message); + //return -1; + } + + /*if (cam->debug == TRUE) + * { + * fprintf (stderr, "bytes to file %s: %d\n", filename, fc); + * } */ + + g_free (filename); + /* from here :) */ + /* open tmp file and read it */ + /*input_uri_string = g_strdup_printf ("camorama.%s", ext); + * + * if (!(fp = fopen (input_uri_string, "rb"))) + * { + * error_message = + * g_strdup_printf (_ + * ("Unable to open temporary image file '%s'."), + * filename); + * error_dialog (error_message); + * g_free (input_uri_string); + * g_free (error_message); + * exit (0); + * } + * + * tmp = malloc (sizeof (char) * cam->x * cam->y * cam->depth * 2); + * while (!feof (fp)) + * { + * bytes += fread (tmp, 1, cam->x * cam->y * cam->depth, fp); + * } + * fclose (fp); + * + * time (&t); + * tm = localtime (&t); + * strftime (timenow, sizeof (timenow) - 1, "%s", tm); + * if (cam->rtimefn == TRUE) + * { + * output_uri_string = g_strdup_printf ("ftp://%s/%s/%s-%s.%s", + * cam->rhost, cam->rpixdir, + * cam->rcapturefile, + * timenow, ext); + * } + * else + * { + * output_uri_string = + * g_strdup_printf ("ftp://%s/%s/%s.%s", cam->rhost, + * cam->rpixdir, cam->rcapturefile, + * ext); + * } + * uri_1 = gnome_vfs_uri_new (output_uri_string); + * + * test = gnome_vfs_uri_exists (uri_1); + * + * gnome_vfs_uri_set_user_name (uri_1, cam->rlogin); + * gnome_vfs_uri_set_password (uri_1, cam->rpw); + */ + /* start here? */ + /*result = gnome_vfs_open_uri((GnomeVFSHandle **) & write_handle, uri_1, GNOME_VFS_OPEN_WRITE); + * if(result != GNOME_VFS_OK) { + * error_message = g_strdup_printf(_("An error occured opening %s."), output_uri_string); + * error_dialog(error_message); + * g_free(error_message); + * g_thread_exit(NULL); + * } */ + + /* write the data */ + /*result = gnome_vfs_write((GnomeVFSHandle *) write_handle, tmp, bytes, &bytes_written); + * if(result != GNOME_VFS_OK) { + * error_message = g_strdup_printf(_("An error occured writing to %s."), output_uri_string); + * error_dialog(error_message); + * g_free(error_message); + * } */ + + remote_thread = + g_thread_create ((GThreadFunc) save_thread, cam, FALSE, NULL); + g_free (ext); + //free (tmp); + +} + +void save_thread (cam * cam) +{ + GnomeVFSHandle **write_handle; + char *output_uri_string, *input_uri_string; + GnomeVFSFileSize bytes_written; + GnomeVFSURI *uri_1; + unsigned char *tmp; + GnomeVFSResult result = 0; + gboolean test; + char *filename, *error_message; + FILE *fp; + int bytes = 0; + time_t t; + gchar *timenow, *ext; + struct tm *tm; + gboolean pbs; + GdkPixbuf *pb; + /*GnomeVFSResult result = 0; + * GnomeVFSHandle **write_handle; + * char *error_message; */ + + switch (cam->rsavetype) { + case JPEG: + ext = g_strdup ((gchar *) "jpeg"); + break; + case PNG: + ext = g_strdup ((gchar *) "png"); + break; + default: + ext = g_strdup ((gchar *) "jpeg"); + } + input_uri_string = g_strdup_printf ("camorama.%s", ext); + + if (chdir ("/tmp") != 0) { + error_dialog (_("Could save temporary image file in /tmp.")); + g_free (ext); + g_thread_exit (NULL); + } + + if (!(fp = fopen (input_uri_string, "rb"))) { + error_message = + g_strdup_printf (_ + ("Unable to open temporary image file '%s'.\nCannot upload image."), + input_uri_string); + error_dialog (error_message); + g_free (input_uri_string); + g_free (error_message); + g_thread_exit (NULL); + //exit (0); + } + + tmp = malloc (sizeof (char) * cam->x * cam->y * cam->depth * 2); + while (!feof (fp)) { + bytes += fread (tmp, 1, cam->x * cam->y * cam->depth, fp); + } + fclose (fp); + + time (&t); + tm = localtime (&t); + strftime (timenow, sizeof (timenow) - 1, "%s", tm); + if (cam->rtimefn == TRUE) { + output_uri_string = g_strdup_printf ("ftp://%s/%s/%s-%s.%s", + cam->rhost, cam->rpixdir, + cam->rcapturefile, timenow, ext); + } else { + output_uri_string = + g_strdup_printf ("ftp://%s/%s/%s.%s", cam->rhost, + cam->rpixdir, cam->rcapturefile, ext); + } + uri_1 = gnome_vfs_uri_new (output_uri_string); + + //test = gnome_vfs_uri_exists (uri_1); + gnome_vfs_uri_set_user_name (uri_1, cam->rlogin); + gnome_vfs_uri_set_password (uri_1, cam->rpw); + + + result = gnome_vfs_open_uri ((GnomeVFSHandle **) & write_handle, + uri_1, GNOME_VFS_OPEN_WRITE); + if (result != GNOME_VFS_OK) { + error_message = + g_strdup_printf (_("An error occured opening %s."), + output_uri_string); + error_dialog (error_message); + g_free (error_message); + g_thread_exit (NULL); + } + + /* write the data */ + result = gnome_vfs_write ((GnomeVFSHandle *) write_handle, tmp, bytes, + &bytes_written); + if (result != GNOME_VFS_OK) { + error_message = + g_strdup_printf (_("An error occured writing to %s."), + output_uri_string); + error_dialog (error_message); + g_free (error_message); + } + gnome_vfs_close ((GnomeVFSHandle *) write_handle); + gnome_vfs_shutdown (); + free (tmp); + g_thread_exit (NULL); +} + +static int print_error (GnomeVFSResult result, const char *uri_string) +{ + const char *error_string; + /* get the string corresponding to this GnomeVFSResult value */ + error_string = gnome_vfs_result_to_string (result); + printf ("Error %s occured opening location %s\n", error_string, + uri_string); + return 1; +} + +int local_save (cam * cam) +{ + int fc; + gchar *filename, *ext; + time_t t; + struct tm *tm; + char timenow[64], *error_message; + int len, mkd; + gboolean pbs; + GdkPixbuf *pb; + + /* todo: + * run gdk-pixbuf-query-loaders to get available image types*/ + + switch (cam->savetype) { + case JPEG: + ext = g_strdup ((gchar *) "jpeg"); + break; + case PNG: + ext = g_strdup ((gchar *) "png"); + break; + default: + ext = g_strdup ((gchar *) "jpeg"); + } + //cam->tmp = NULL; + //memcpy (cam->tmp, cam->pic_buf, cam->x * cam->y * cam->depth); + + if (cam->timestamp == TRUE) { + add_rgb_text (cam->tmp, cam->x, cam->y, cam->ts_string, + cam->date_format, cam->usestring, cam->usedate); + } + + time (&t); + tm = localtime (&t); + len = strftime (timenow, sizeof (timenow) - 1, "%s", tm); + + if (cam->debug == TRUE) { + fprintf (stderr, "time = %s\n", timenow); + } + + if (cam->timefn == TRUE) { + filename = + g_strdup_printf ("%s-%s.%s", cam->capturefile, timenow, ext); + } else { + filename = g_strdup_printf ("%s.%s", cam->capturefile, ext); + } + + if (cam->debug == TRUE) { + fprintf (stderr, "filename = %s\n", filename); + } + mkd = mkdir (cam->pixdir, 0777); + + if (cam->debug == TRUE) { + perror ("create dir: "); + } + + if (mkd != 0 && errno != EEXIST) { + error_message = + g_strdup_printf (_ + ("Could not create directory '%s'."), + cam->pixdir); + error_dialog (error_message); + g_free (filename); + g_free (error_message); + return -1; + } + + if (chdir (cam->pixdir) != 0) { + error_message = + g_strdup_printf (_ + ("Could not change to directory '%s'."), + cam->pixdir); + error_dialog (error_message); + g_free (filename); + g_free (error_message); + return -1; + } + + pb = gdk_pixbuf_new_from_data (cam->tmp, GDK_COLORSPACE_RGB, FALSE, 8, + cam->x, cam->y, + (cam->x * cam->vid_pic.depth / 8), NULL, + NULL); + pbs = gdk_pixbuf_save (pb, filename, ext, NULL, NULL); + if (pbs == FALSE) { + error_message = + g_strdup_printf (_("Could not save image '%s/%s'."), + cam->pixdir, filename); + error_dialog (error_message); + g_free (filename); + g_free (error_message); + return -1; + } + + g_free (filename); + return 0; +} diff --git a/src/fileio.h b/src/fileio.h new file mode 100644 index 0000000..96ae35c --- /dev/null +++ b/src/fileio.h @@ -0,0 +1,7 @@ +#include "v4l.h" +#include <libgnomevfs/gnome-vfs.h> + +int add_rgb_text (char *, int, int, char *, char *, gboolean, gboolean); +void remote_save (cam *); +void save_thread (cam *); +int local_save (cam *); diff --git a/src/filter.c b/src/filter.c new file mode 100644 index 0000000..778a7ce --- /dev/null +++ b/src/filter.c @@ -0,0 +1,493 @@ +#include "v4l.h" + +static inline void move_420_block (int yTL, int yTR, int yBL, int yBR, int u, + int v, int rowPixels, unsigned char *rgb, + int bits); + +/*these two functions are borrowed from the ov511 driver, with the author, + *Mark McClelland's kind encoragement*/ + +/* LIMIT: convert a 16.16 fixed-point value to a byte, with clipping. */ +#define LIMIT(x) ((x)>0xffffff?0xff: ((x)<=0xffff?0:((x)>>16))) + +void +yuv420p_to_rgb (unsigned char *image, unsigned char *temp, int x, int y, + int z) +{ + const int numpix = x * y; + const int bytes = z; /* (z*8) >> 3; */ + int i, j, y00, y01, y10, y11, u, v; + unsigned char *pY = image; + unsigned char *pU = pY + numpix; + unsigned char *pV = pU + numpix / 4; + unsigned char *image2 = temp; + + for (j = 0; j <= y - 2; j += 2) { + for (i = 0; i <= x - 2; i += 2) { + y00 = *pY; + y01 = *(pY + 1); + y10 = *(pY + x); + y11 = *(pY + x + 1); + u = (*pU++) - 128; + v = (*pV++) - 128; + + move_420_block (y00, y01, y10, y11, u, v, x, image2, z * 8); + + pY += 2; + image2 += 2 * bytes; + } + pY += x; + image2 += x * bytes; + } +} +static inline void +move_420_block (int yTL, int yTR, int yBL, int yBR, int u, int v, + int rowPixels, unsigned char *rgb, int bits) +{ + const int rvScale = 91881; + const int guScale = -22553; + const int gvScale = -46801; + const int buScale = 116129; + const int yScale = 65536; + int r, g, b; + + g = guScale * u + gvScale * v; + if (1) { + r = buScale * u; + b = rvScale * v; + } else { + r = rvScale * v; + b = buScale * u; + } + + yTL *= yScale; + yTR *= yScale; + yBL *= yScale; + yBR *= yScale; + + if (bits == 24) { + /* Write out top two pixels */ + rgb[0] = LIMIT (b + yTL); + rgb[1] = LIMIT (g + yTL); + rgb[2] = LIMIT (r + yTL); + + rgb[3] = LIMIT (b + yTR); + rgb[4] = LIMIT (g + yTR); + rgb[5] = LIMIT (r + yTR); + + /* Skip down to next line to write out bottom two pixels */ + rgb += 3 * rowPixels; + rgb[0] = LIMIT (b + yBL); + rgb[1] = LIMIT (g + yBL); + rgb[2] = LIMIT (r + yBL); + + rgb[3] = LIMIT (b + yBR); + rgb[4] = LIMIT (g + yBR); + rgb[5] = LIMIT (r + yBR); + } else if (bits == 16) { + /* Write out top two pixels */ + rgb[0] = ((LIMIT (b + yTL) >> 3) & 0x1F) + | ((LIMIT (g + yTL) << 3) & 0xE0); + rgb[1] = ((LIMIT (g + yTL) >> 5) & 0x07) + | (LIMIT (r + yTL) & 0xF8); + + rgb[2] = ((LIMIT (b + yTR) >> 3) & 0x1F) + | ((LIMIT (g + yTR) << 3) & 0xE0); + rgb[3] = ((LIMIT (g + yTR) >> 5) & 0x07) + | (LIMIT (r + yTR) & 0xF8); + + /* Skip down to next line to write out bottom two pixels */ + rgb += 2 * rowPixels; + + rgb[0] = ((LIMIT (b + yBL) >> 3) & 0x1F) + | ((LIMIT (g + yBL) << 3) & 0xE0); + rgb[1] = ((LIMIT (g + yBL) >> 5) & 0x07) + | (LIMIT (r + yBL) & 0xF8); + + rgb[2] = ((LIMIT (b + yBR) >> 3) & 0x1F) + | ((LIMIT (g + yBR) << 3) & 0xE0); + rgb[3] = ((LIMIT (g + yBR) >> 5) & 0x07) + | (LIMIT (r + yBR) & 0xF8); + } +} + +void fix_colour (char *image, int x, int y) +{ + int i; + char tmp; + i = x * y; + while (--i) { + tmp = image[0]; + image[0] = image[2]; + image[2] = tmp; + image += 3; + } +} + +void negative (unsigned char *image, int x, int y, int z) +{ + int i; + for (i = 0; i < x * y * z; i++) { + image[i] = 255 - image[i]; + + } +} + +void threshold (unsigned char *image, int x, int y, int threshold_value) +{ + int i; + for (i = 0; i < x * y; i++) { + if ((image[0] + image[1] + image[2]) > (threshold_value * 3)) { + image[0] = 255; + image[1] = 255; + image[2] = 255; + } else { + image[0] = 0; + image[1] = 0; + image[2] = 0; + } + image += 3; + } +} + +void +threshold_channel (unsigned char *image, int x, int y, int threshold_value) +{ + int i; + for (i = 0; i < x * y; i++) { + if (image[0] > threshold_value) { + image[0] = 255; + } else { + image[0] = 0; + } + if (image[1] > threshold_value) { + image[1] = 255; + } else { + image[1] = 0; + } + if (image[2] > threshold_value) { + image[2] = 255; + } else { + image[2] = 0; + } + image += 3; + } +} + +void mirror (unsigned char *image, int x, int y, int z) +{ + int i, j, k; + unsigned char *image2; + + image2 = (char *) malloc (sizeof (unsigned char) * x * y * z); + memcpy (image2, image, x * y * z); + + for (i = 0; i < y; i++) { + for (j = 0; j < x; j++) { + for (k = 0; k < z; k++) { + /*ow, my brain! */ + image[(i * x * z) + (j * z) + k] = + image2[(i * x * z) - (j * z) + k]; + } + + } + + } + + free (image2); + +} + +void wacky (unsigned char *image, int z, int x, int y) +{ + int i; + int neighbours; + int total; + unsigned char *image2, *image3; + image2 = (unsigned char *) malloc (sizeof (unsigned char) * x * y * z); + memcpy (image2, image, x * y * z); + image3 = image2; + + for (i = 0; i < x * y; i++) { + total = 0; + neighbours = 0; + + if (i < x * z) { + /*we are in the top row */ + } else { + image2 -= (x + 1) * z; + total = total + ((1 / 6) * image2[0]); + image2 += z; + total = total + ((4 / 6) * image2[0]); + image2 += z; + total = total + ((1 / 6) * image2[0]); + neighbours = neighbours + z; + image2 += (x - 1) * z; + } + if (i > x * (y - 1) * z) { + /*we are in the bottom row */ + } else { + image2 += (x + 1) * z; + total = total + ((1 / 6) * image2[0]); + image2 -= z; + total = total + ((4 / 6) * image2[0]); + image2 -= z; + total = total + ((1 / 6) * image2[0]); + image2 -= (x - 1) * z; + neighbours = neighbours + z; + } + + image2 += z; + total = total + ((4 / 6) * image2[0]); + image2 -= z; + neighbours++; + + image2 -= z; + total = total + ((4 / 6) * image2[0]); + image2 += z; + neighbours++; + + image[0] = image[0] * (-20 / 6); + image[0] = image[0] + total; + image[1] = image[0]; + image[2] = image[0]; + image += z; + } + free (image2); +} + +void smooth (unsigned char *image, int z, int x, int y) +{ + int i; + int neighbours; + int total0, total1, total2; + unsigned char *image2, *image3; + int tr = 0, br = 0; + + image2 = (unsigned char *) malloc (sizeof (unsigned char) * x * y * z); + memcpy (image2, image, x * y * z); + image3 = image2; + + for (i = 0; i < x * y; i++) { + total0 = 0; + total1 = 0; + total2 = 0; + neighbours = 0; + + if (i < x) { + /*we are in the top row */ + tr++; + } else { + image2 -= (x + 1) * z; + total0 = total0 + image2[0]; + total1 = total1 + image2[1]; + total2 = total2 + image2[2]; + + total0 = total0 + image2[3]; + total1 = total1 + image2[4]; + total2 = total2 + image2[5]; + + total0 = total0 + image2[6]; + total1 = total1 + image2[7]; + total2 = total2 + image2[8]; + neighbours = neighbours + z; + if (tr > 1) { + tr = 0; + } + image2 += (x + 1) * z; + } + if (i > x * (y - 1)) { + br++; + /*we are in the bottom row */ + } else { + image2 += (x - 1) * z; + total0 = total0 + image2[0]; + total1 = total1 + image2[1]; + total2 = total2 + image2[2]; + + total0 = total0 + image2[3]; + total1 = total1 + image2[4]; + total2 = total2 + image2[5]; + + total0 = total0 + image2[6]; + total1 = total1 + image2[7]; + total2 = total2 + image2[8]; + + image2 -= (x - 1) * z; + + neighbours = neighbours + z; + } + + image2 += 3; + total0 = total0 + image2[0]; + total1 = total1 + image2[1]; + total2 = total2 + image2[2]; + image2 -= 3; + neighbours++; + + image2 -= 3; + total0 = total0 + image2[0]; + total1 = total1 + image2[1]; + total2 = total2 + image2[2]; + image2 += 3; + neighbours++; + + image[0] = (int) (total0 / neighbours); + image[1] = (int) (total1 / neighbours); + image[2] = (int) (total2 / neighbours); + + image += 3; + image2 += 3; + } + free (image3); + +} + +void laplace (unsigned char *image, int z, int x, int y) +{ + int i; + int neighbours; + int total0, total1, total2; + unsigned char *image2, *image3; + + image2 = (unsigned char *) malloc (sizeof (unsigned char) * x * y * z); + memcpy (image2, image, x * y * z); + image3 = image2; + + for (i = 1; i < x * (y - 1); i++) { + total0 = 0; + total1 = 0; + total2 = 0; + neighbours = 0; + + image2 -= (x + 1) * 3; + total0 = total0 + image2[0]; + total1 = total1 + image2[1]; + total2 = total2 + image2[2]; + + total0 = total0 + image2[3]; + total1 = total1 + image2[4]; + total2 = total2 + image2[5]; + + total0 = total0 + image2[6]; + total1 = total1 + image2[7]; + total2 = total2 + image2[8]; + + image2 += (x + 1) * 3; + + image2 += (x - 1) * 3; + total0 = total0 + image2[0]; + total1 = total1 + image2[1]; + total2 = total2 + image2[2]; + + total0 = total0 + image2[3]; + total1 = total1 + image2[4]; + total2 = total2 + image2[5]; + + total0 = total0 + image2[6]; + total1 = total1 + image2[7]; + total2 = total2 + image2[8]; + + image2 -= (x - 1) * 3; + + image2 += 3; + total0 = total0 + image2[0]; + total1 = total1 + image2[1]; + total2 = total2 + image2[2]; + image2 -= 3; + + image2 -= 3; + total0 = total0 + image2[0]; + total1 = total1 + image2[1]; + total2 = total2 + image2[2]; + image2 += 3; + + if (image[0] * 8 < total0) { + image[0] = 0; + } else { + image[0] = (image[0] * 8) - total0; + } + if (image[1] * 8 < total1) { + image[1] = 0; + } else { + image[1] = (image[1] * 8) - total1; + } + if (image[2] * 8 < total2) { + image[2] = 0; + } else { + image[2] = (image[2] * 8) - total2; + } + + image += 3; + image2 += 3; + } + + free (image3); + +} + +void bw (unsigned char *image, int x, int y) +{ + int i; + int total, avg; + + for (i = 0; i < x * y; i++) { + total = image[0] + image[1] + image[2]; + avg = (int) (total / 3); + + image[0] = avg; + image[1] = avg; + image[2] = avg; + image += 3; + } +} +void bw2 (unsigned char *image, int x, int y) +{ + int i; + int avg; + for (i = 0; i < x * y; i++) { + avg = (int) ((image[0] * 0.2125) + (image[1] * 0.7154) + + (image[2] * 0.0721)); + + image[0] = avg; + image[1] = avg; + image[2] = avg; + image += 3; /* bump to next triplet */ + } +} + +/* fix this at some point, very slow */ +void sobel (unsigned char *image, int x, int y) +{ + int i, j, grad[3]; + int deltaX[3], deltaY[3]; + int width = x * 3; + unsigned char *image2; + + image2 = (char *) malloc (sizeof (unsigned char) * (x * y * 3)); + + for (i = width; i < (y - 1) * width; i++) { + for (j = 0; j <= 2; j++) { + deltaX[j] = + 2 * image[i + 1] + image[i - width + 1] + + image[i + width + 1] - 2 * image[i - 1] - + image[i - width - 1] - image[i + width - 1]; + + deltaY[j] = + image[i - width - 1] + 2 * image[i - + width] + + image[i - width + 1] - image[i + width - + 1] - + 2 * image[i + width] - image[i + width + 1]; + grad[j] = (abs (deltaX[j]) + abs (deltaY[j])); + grad[j] = grad[j] / 5.66; /* <<<<<------------------------ new line */ + if (grad[j] > 255) { + grad[j] = 255; + } + image2[i + j] = (unsigned char) grad[j]; + } + } + + memcpy (image, image2, (x * y * 3)); + free (image2); +} diff --git a/src/filter.h b/src/filter.h new file mode 100644 index 0000000..0735d67 --- /dev/null +++ b/src/filter.h @@ -0,0 +1,13 @@ +void yuv420p_to_rgb(unsigned char *image, unsigned char *temp, int x, int y, int z); +void fix_colour(char *image, int x, int y); +void negative(unsigned char *image, int x, int y, int z); +void threshold(unsigned char *image, int x, int y, int threshold_value); +void threshold_channel(unsigned char *image, int x, int y, int threshold_value); +void mirror(unsigned char *image, int x, int y, int z); +void wacky(unsigned char *image, int z, int x, int y); +void smooth(unsigned char *image, int z, int x, int y); + +void bw(unsigned char *image, int x, int y); +void bw2(unsigned char *image, int x, int y); +void laplace(unsigned char *image, int z, int x, int y); +void sobel(unsigned char *image, int x, int y); diff --git a/src/font_6x11.h b/src/font_6x11.h new file mode 100644 index 0000000..a88c8a7 --- /dev/null +++ b/src/font_6x11.h @@ -0,0 +1,3337 @@ +/**********************************************/ +/* */ +/* Font file generated by rthelen */ +/* */ +/**********************************************/ + +static unsigned char fontdata[] = { + + /* 0 0x00 '^A' */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 1 0x01 '^B' */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 2 0x02 '^C' */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 3 0x03 '^D' */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 4 0x04 '^E' */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 5 0x05 '^F' */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 6 0x06 '^G' */ + 0x00, /* 00000000 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 7 0x07 '^H' */ + 0x00, /* 00000000 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 8 0x08 '^I' */ + 0x00, /* 00000000 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 9 0x09 '^J' */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 10 0x0a '^K' */ + 0x00, /* 00000000 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 11 0x0b '^L' */ + 0x00, /* 00000000 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 12 0x0c '^M' */ + 0x00, /* 00000000 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 13 0x0d '^N' */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 14 0x0e '^O' */ + 0x00, /* 00000000 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 15 0x0f '^P' */ + 0x00, /* 00000000 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 16 0x10 '^Q' */ + 0x00, /* 00000000 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 17 0x11 '^R' */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x28, /* 00 0 000 */ + 0x54, /* 0 0 0 00 */ + 0x38, /* 00 000 */ + 0x54, /* 0 0 0 00 */ + 0x28, /* 00 0 000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 18 0x12 '^S' */ + 0x04, /* 00000 00 */ + 0x04, /* 00000 00 */ + 0x08, /* 0000 000 */ + 0x08, /* 0000 000 */ + 0x50, /* 0 0 0000 */ + 0x50, /* 0 0 0000 */ + 0x20, /* 00 00000 */ + 0x20, /* 00 00000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 19 0x13 '^T' */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x10, /* 000 0000 */ + 0x38, /* 00 000 */ + 0x7c, /* 0 00 */ + 0x38, /* 00 000 */ + 0x10, /* 000 0000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 20 0x14 '^U' */ + 0x18, /* 000 000 */ + 0x10, /* 000 0000 */ + 0x28, /* 00 0 000 */ + 0x7c, /* 0 00 */ + 0x78, /* 0 000 */ + 0x78, /* 0 000 */ + 0x7c, /* 0 00 */ + 0x28, /* 00 0 000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 21 0x15 '^V' */ + 0x00, /* 00000000 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 22 0x16 '^W' */ + 0x00, /* 00000000 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 23 0x17 '^X' */ + 0x00, /* 00000000 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 24 0x18 '^Y' */ + 0x00, /* 00000000 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 25 0x19 '^Z' */ + 0x00, /* 00000000 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 26 0x1a '^[' */ + 0x00, /* 00000000 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 27 0x1b '^\' */ + 0x00, /* 00000000 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 28 0x1c '^]' */ + 0x00, /* 00000000 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 29 0x1d '^^' */ + 0x00, /* 00000000 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 30 0x1e '^_' */ + 0x00, /* 00000000 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 31 0x1f '^`' */ + 0x00, /* 00000000 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 32 0x20 ' ' */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 33 0x21 '!' */ + 0x00, /* 00000000 */ + 0x10, /* 000 0000 */ + 0x10, /* 000 0000 */ + 0x10, /* 000 0000 */ + 0x10, /* 000 0000 */ + 0x10, /* 000 0000 */ + 0x00, /* 00000000 */ + 0x10, /* 000 0000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 34 0x22 '"' */ + 0x28, /* 00 0 000 */ + 0x28, /* 00 0 000 */ + 0x28, /* 00 0 000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 35 0x23 '#' */ + 0x00, /* 00000000 */ + 0x28, /* 00 0 000 */ + 0x7c, /* 0 00 */ + 0x28, /* 00 0 000 */ + 0x7c, /* 0 00 */ + 0x28, /* 00 0 000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 36 0x24 '$' */ + 0x10, /* 000 0000 */ + 0x38, /* 00 000 */ + 0x54, /* 0 0 0 00 */ + 0x50, /* 0 0 0000 */ + 0x38, /* 00 000 */ + 0x14, /* 000 0 00 */ + 0x54, /* 0 0 0 00 */ + 0x38, /* 00 000 */ + 0x10, /* 000 0000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 37 0x25 '%' */ + 0x00, /* 00000000 */ + 0x3c, /* 00 00 */ + 0x54, /* 0 0 0 00 */ + 0x58, /* 0 0 000 */ + 0x28, /* 00 0 000 */ + 0x34, /* 00 0 00 */ + 0x54, /* 0 0 0 00 */ + 0x48, /* 0 00 000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 38 0x26 '&' */ + 0x00, /* 00000000 */ + 0x30, /* 00 0000 */ + 0x48, /* 0 00 000 */ + 0x50, /* 0 0 0000 */ + 0x20, /* 00 00000 */ + 0x54, /* 0 0 0 00 */ + 0x48, /* 0 00 000 */ + 0x34, /* 00 0 00 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 39 0x27 ''' */ + 0x10, /* 000 0000 */ + 0x10, /* 000 0000 */ + 0x10, /* 000 0000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 40 0x28 '(' */ + 0x04, /* 00000 00 */ + 0x08, /* 0000 000 */ + 0x10, /* 000 0000 */ + 0x10, /* 000 0000 */ + 0x10, /* 000 0000 */ + 0x10, /* 000 0000 */ + 0x10, /* 000 0000 */ + 0x08, /* 0000 000 */ + 0x04, /* 00000 00 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 41 0x29 ')' */ + 0x20, /* 00 00000 */ + 0x10, /* 000 0000 */ + 0x08, /* 0000 000 */ + 0x08, /* 0000 000 */ + 0x08, /* 0000 000 */ + 0x08, /* 0000 000 */ + 0x08, /* 0000 000 */ + 0x10, /* 000 0000 */ + 0x20, /* 00 00000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 42 0x2a '*' */ + 0x00, /* 00000000 */ + 0x10, /* 000 0000 */ + 0x54, /* 0 0 0 00 */ + 0x38, /* 00 000 */ + 0x54, /* 0 0 0 00 */ + 0x10, /* 000 0000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 43 0x2b '+' */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x10, /* 000 0000 */ + 0x10, /* 000 0000 */ + 0x7c, /* 0 00 */ + 0x10, /* 000 0000 */ + 0x10, /* 000 0000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 44 0x2c ',' */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x30, /* 00 0000 */ + 0x30, /* 00 0000 */ + 0x10, /* 000 0000 */ + 0x20, /* 00 00000 */ + 0x00, /* 00000000 */ + + /* 45 0x2d '-' */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x7c, /* 0 00 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 46 0x2e '.' */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x18, /* 000 000 */ + 0x18, /* 000 000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 47 0x2f '/' */ + 0x04, /* 00000 00 */ + 0x04, /* 00000 00 */ + 0x08, /* 0000 000 */ + 0x08, /* 0000 000 */ + 0x10, /* 000 0000 */ + 0x10, /* 000 0000 */ + 0x20, /* 00 00000 */ + 0x20, /* 00 00000 */ + 0x40, /* 0 000000 */ + 0x40, /* 0 000000 */ + 0x00, /* 00000000 */ + + /* 48 0x30 '0' */ + 0x00, /* 00000000 */ + 0x38, /* 00 000 */ + 0x44, /* 0 000 00 */ + 0x4c, /* 0 00 00 */ + 0x54, /* 0 0 0 00 */ + 0x64, /* 0 00 00 */ + 0x44, /* 0 000 00 */ + 0x38, /* 00 000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 49 0x31 '1' */ + 0x00, /* 00000000 */ + 0x08, /* 0000 000 */ + 0x18, /* 000 000 */ + 0x08, /* 0000 000 */ + 0x08, /* 0000 000 */ + 0x08, /* 0000 000 */ + 0x08, /* 0000 000 */ + 0x1c, /* 000 00 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 50 0x32 '2' */ + 0x00, /* 00000000 */ + 0x38, /* 00 000 */ + 0x44, /* 0 000 00 */ + 0x04, /* 00000 00 */ + 0x08, /* 0000 000 */ + 0x10, /* 000 0000 */ + 0x20, /* 00 00000 */ + 0x7c, /* 0 00 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 51 0x33 '3' */ + 0x00, /* 00000000 */ + 0x38, /* 00 000 */ + 0x44, /* 0 000 00 */ + 0x04, /* 00000 00 */ + 0x18, /* 000 000 */ + 0x04, /* 00000 00 */ + 0x44, /* 0 000 00 */ + 0x38, /* 00 000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 52 0x34 '4' */ + 0x00, /* 00000000 */ + 0x08, /* 0000 000 */ + 0x18, /* 000 000 */ + 0x28, /* 00 0 000 */ + 0x48, /* 0 00 000 */ + 0x7c, /* 0 00 */ + 0x08, /* 0000 000 */ + 0x1c, /* 000 00 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 53 0x35 '5' */ + 0x00, /* 00000000 */ + 0x7c, /* 0 00 */ + 0x40, /* 0 000000 */ + 0x78, /* 0 000 */ + 0x04, /* 00000 00 */ + 0x04, /* 00000 00 */ + 0x44, /* 0 000 00 */ + 0x38, /* 00 000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 54 0x36 '6' */ + 0x00, /* 00000000 */ + 0x38, /* 00 000 */ + 0x40, /* 0 000000 */ + 0x78, /* 0 000 */ + 0x44, /* 0 000 00 */ + 0x44, /* 0 000 00 */ + 0x44, /* 0 000 00 */ + 0x38, /* 00 000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 55 0x37 '7' */ + 0x00, /* 00000000 */ + 0x7c, /* 0 00 */ + 0x04, /* 00000 00 */ + 0x04, /* 00000 00 */ + 0x08, /* 0000 000 */ + 0x10, /* 000 0000 */ + 0x10, /* 000 0000 */ + 0x10, /* 000 0000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 56 0x38 '8' */ + 0x00, /* 00000000 */ + 0x38, /* 00 000 */ + 0x44, /* 0 000 00 */ + 0x44, /* 0 000 00 */ + 0x38, /* 00 000 */ + 0x44, /* 0 000 00 */ + 0x44, /* 0 000 00 */ + 0x38, /* 00 000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 57 0x39 '9' */ + 0x00, /* 00000000 */ + 0x38, /* 00 000 */ + 0x44, /* 0 000 00 */ + 0x44, /* 0 000 00 */ + 0x44, /* 0 000 00 */ + 0x3c, /* 00 00 */ + 0x04, /* 00000 00 */ + 0x38, /* 00 000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 58 0x3a ':' */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x18, /* 000 000 */ + 0x18, /* 000 000 */ + 0x00, /* 00000000 */ + 0x18, /* 000 000 */ + 0x18, /* 000 000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 59 0x3b ';' */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x30, /* 00 0000 */ + 0x30, /* 00 0000 */ + 0x00, /* 00000000 */ + 0x30, /* 00 0000 */ + 0x30, /* 00 0000 */ + 0x10, /* 000 0000 */ + 0x20, /* 00 00000 */ + 0x00, /* 00000000 */ + + /* 60 0x3c '<' */ + 0x00, /* 00000000 */ + 0x04, /* 00000 00 */ + 0x08, /* 0000 000 */ + 0x10, /* 000 0000 */ + 0x20, /* 00 00000 */ + 0x10, /* 000 0000 */ + 0x08, /* 0000 000 */ + 0x04, /* 00000 00 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 61 0x3d '=' */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x7c, /* 0 00 */ + 0x00, /* 00000000 */ + 0x7c, /* 0 00 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 62 0x3e '>' */ + 0x00, /* 00000000 */ + 0x20, /* 00 00000 */ + 0x10, /* 000 0000 */ + 0x08, /* 0000 000 */ + 0x04, /* 00000 00 */ + 0x08, /* 0000 000 */ + 0x10, /* 000 0000 */ + 0x20, /* 00 00000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 63 0x3f '?' */ + 0x00, /* 00000000 */ + 0x38, /* 00 000 */ + 0x44, /* 0 000 00 */ + 0x04, /* 00000 00 */ + 0x08, /* 0000 000 */ + 0x10, /* 000 0000 */ + 0x00, /* 00000000 */ + 0x10, /* 000 0000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 64 0x40 '@' */ + 0x00, /* 00000000 */ + 0x38, /* 00 000 */ + 0x44, /* 0 000 00 */ + 0x74, /* 0 0 00 */ + 0x54, /* 0 0 0 00 */ + 0x78, /* 0 000 */ + 0x40, /* 0 000000 */ + 0x38, /* 00 000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 65 0x41 'A' */ + 0x00, /* 00000000 */ + 0x38, /* 00 000 */ + 0x44, /* 0 000 00 */ + 0x44, /* 0 000 00 */ + 0x7c, /* 0 00 */ + 0x44, /* 0 000 00 */ + 0x44, /* 0 000 00 */ + 0x44, /* 0 000 00 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 66 0x42 'B' */ + 0x00, /* 00000000 */ + 0x78, /* 0 000 */ + 0x44, /* 0 000 00 */ + 0x44, /* 0 000 00 */ + 0x78, /* 0 000 */ + 0x44, /* 0 000 00 */ + 0x44, /* 0 000 00 */ + 0x78, /* 0 000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 67 0x43 'C' */ + 0x00, /* 00000000 */ + 0x38, /* 00 000 */ + 0x44, /* 0 000 00 */ + 0x40, /* 0 000000 */ + 0x40, /* 0 000000 */ + 0x40, /* 0 000000 */ + 0x44, /* 0 000 00 */ + 0x38, /* 00 000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 68 0x44 'D' */ + 0x00, /* 00000000 */ + 0x78, /* 0 000 */ + 0x44, /* 0 000 00 */ + 0x44, /* 0 000 00 */ + 0x44, /* 0 000 00 */ + 0x44, /* 0 000 00 */ + 0x44, /* 0 000 00 */ + 0x78, /* 0 000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 69 0x45 'E' */ + 0x00, /* 00000000 */ + 0x7c, /* 0 00 */ + 0x40, /* 0 000000 */ + 0x40, /* 0 000000 */ + 0x78, /* 0 000 */ + 0x40, /* 0 000000 */ + 0x40, /* 0 000000 */ + 0x7c, /* 0 00 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 70 0x46 'F' */ + 0x00, /* 00000000 */ + 0x7c, /* 0 00 */ + 0x40, /* 0 000000 */ + 0x40, /* 0 000000 */ + 0x78, /* 0 000 */ + 0x40, /* 0 000000 */ + 0x40, /* 0 000000 */ + 0x40, /* 0 000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 71 0x47 'G' */ + 0x00, /* 00000000 */ + 0x38, /* 00 000 */ + 0x44, /* 0 000 00 */ + 0x40, /* 0 000000 */ + 0x4c, /* 0 00 00 */ + 0x44, /* 0 000 00 */ + 0x44, /* 0 000 00 */ + 0x38, /* 00 000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 72 0x48 'H' */ + 0x00, /* 00000000 */ + 0x44, /* 0 000 00 */ + 0x44, /* 0 000 00 */ + 0x44, /* 0 000 00 */ + 0x7c, /* 0 00 */ + 0x44, /* 0 000 00 */ + 0x44, /* 0 000 00 */ + 0x44, /* 0 000 00 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 73 0x49 'I' */ + 0x00, /* 00000000 */ + 0x38, /* 00 000 */ + 0x10, /* 000 0000 */ + 0x10, /* 000 0000 */ + 0x10, /* 000 0000 */ + 0x10, /* 000 0000 */ + 0x10, /* 000 0000 */ + 0x38, /* 00 000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 74 0x4a 'J' */ + 0x00, /* 00000000 */ + 0x04, /* 00000 00 */ + 0x04, /* 00000 00 */ + 0x04, /* 00000 00 */ + 0x04, /* 00000 00 */ + 0x44, /* 0 000 00 */ + 0x44, /* 0 000 00 */ + 0x38, /* 00 000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 75 0x4b 'K' */ + 0x00, /* 00000000 */ + 0x44, /* 0 000 00 */ + 0x48, /* 0 00 000 */ + 0x50, /* 0 0 0000 */ + 0x60, /* 0 00000 */ + 0x50, /* 0 0 0000 */ + 0x48, /* 0 00 000 */ + 0x44, /* 0 000 00 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 76 0x4c 'L' */ + 0x00, /* 00000000 */ + 0x40, /* 0 000000 */ + 0x40, /* 0 000000 */ + 0x40, /* 0 000000 */ + 0x40, /* 0 000000 */ + 0x40, /* 0 000000 */ + 0x40, /* 0 000000 */ + 0x7c, /* 0 00 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 77 0x4d 'M' */ + 0x00, /* 00000000 */ + 0x44, /* 0 000 00 */ + 0x6c, /* 0 0 00 */ + 0x54, /* 0 0 0 00 */ + 0x54, /* 0 0 0 00 */ + 0x44, /* 0 000 00 */ + 0x44, /* 0 000 00 */ + 0x44, /* 0 000 00 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 78 0x4e 'N' */ + 0x00, /* 00000000 */ + 0x44, /* 0 000 00 */ + 0x64, /* 0 00 00 */ + 0x54, /* 0 0 0 00 */ + 0x4c, /* 0 00 00 */ + 0x44, /* 0 000 00 */ + 0x44, /* 0 000 00 */ + 0x44, /* 0 000 00 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 79 0x4f 'O' */ + 0x00, /* 00000000 */ + 0x38, /* 00 000 */ + 0x44, /* 0 000 00 */ + 0x44, /* 0 000 00 */ + 0x44, /* 0 000 00 */ + 0x44, /* 0 000 00 */ + 0x44, /* 0 000 00 */ + 0x38, /* 00 000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 80 0x50 'P' */ + 0x00, /* 00000000 */ + 0x78, /* 0 000 */ + 0x44, /* 0 000 00 */ + 0x44, /* 0 000 00 */ + 0x78, /* 0 000 */ + 0x40, /* 0 000000 */ + 0x40, /* 0 000000 */ + 0x40, /* 0 000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 81 0x51 'Q' */ + 0x00, /* 00000000 */ + 0x38, /* 00 000 */ + 0x44, /* 0 000 00 */ + 0x44, /* 0 000 00 */ + 0x44, /* 0 000 00 */ + 0x44, /* 0 000 00 */ + 0x54, /* 0 0 0 00 */ + 0x38, /* 00 000 */ + 0x04, /* 00000 00 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 82 0x52 'R' */ + 0x00, /* 00000000 */ + 0x78, /* 0 000 */ + 0x44, /* 0 000 00 */ + 0x44, /* 0 000 00 */ + 0x78, /* 0 000 */ + 0x44, /* 0 000 00 */ + 0x44, /* 0 000 00 */ + 0x44, /* 0 000 00 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 83 0x53 'S' */ + 0x00, /* 00000000 */ + 0x38, /* 00 000 */ + 0x44, /* 0 000 00 */ + 0x40, /* 0 000000 */ + 0x38, /* 00 000 */ + 0x04, /* 00000 00 */ + 0x44, /* 0 000 00 */ + 0x38, /* 00 000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 84 0x54 'T' */ + 0x00, /* 00000000 */ + 0x7c, /* 0 00 */ + 0x10, /* 000 0000 */ + 0x10, /* 000 0000 */ + 0x10, /* 000 0000 */ + 0x10, /* 000 0000 */ + 0x10, /* 000 0000 */ + 0x10, /* 000 0000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 85 0x55 'U' */ + 0x00, /* 00000000 */ + 0x44, /* 0 000 00 */ + 0x44, /* 0 000 00 */ + 0x44, /* 0 000 00 */ + 0x44, /* 0 000 00 */ + 0x44, /* 0 000 00 */ + 0x44, /* 0 000 00 */ + 0x38, /* 00 000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 86 0x56 'V' */ + 0x00, /* 00000000 */ + 0x44, /* 0 000 00 */ + 0x44, /* 0 000 00 */ + 0x44, /* 0 000 00 */ + 0x44, /* 0 000 00 */ + 0x44, /* 0 000 00 */ + 0x28, /* 00 0 000 */ + 0x10, /* 000 0000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 87 0x57 'W' */ + 0x00, /* 00000000 */ + 0x44, /* 0 000 00 */ + 0x44, /* 0 000 00 */ + 0x44, /* 0 000 00 */ + 0x54, /* 0 0 0 00 */ + 0x54, /* 0 0 0 00 */ + 0x6c, /* 0 0 00 */ + 0x44, /* 0 000 00 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 88 0x58 'X' */ + 0x00, /* 00000000 */ + 0x44, /* 0 000 00 */ + 0x44, /* 0 000 00 */ + 0x28, /* 00 0 000 */ + 0x10, /* 000 0000 */ + 0x28, /* 00 0 000 */ + 0x44, /* 0 000 00 */ + 0x44, /* 0 000 00 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 89 0x59 'Y' */ + 0x00, /* 00000000 */ + 0x44, /* 0 000 00 */ + 0x44, /* 0 000 00 */ + 0x44, /* 0 000 00 */ + 0x28, /* 00 0 000 */ + 0x10, /* 000 0000 */ + 0x10, /* 000 0000 */ + 0x10, /* 000 0000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 90 0x5a 'Z' */ + 0x00, /* 00000000 */ + 0x7c, /* 0 00 */ + 0x04, /* 00000 00 */ + 0x08, /* 0000 000 */ + 0x10, /* 000 0000 */ + 0x20, /* 00 00000 */ + 0x40, /* 0 000000 */ + 0x7c, /* 0 00 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 91 0x5b '[' */ + 0x0c, /* 0000 00 */ + 0x08, /* 0000 000 */ + 0x08, /* 0000 000 */ + 0x08, /* 0000 000 */ + 0x08, /* 0000 000 */ + 0x08, /* 0000 000 */ + 0x08, /* 0000 000 */ + 0x08, /* 0000 000 */ + 0x0c, /* 0000 00 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 92 0x5c '\' */ + 0x20, /* 00 00000 */ + 0x20, /* 00 00000 */ + 0x10, /* 000 0000 */ + 0x10, /* 000 0000 */ + 0x08, /* 0000 000 */ + 0x08, /* 0000 000 */ + 0x04, /* 00000 00 */ + 0x04, /* 00000 00 */ + 0x02, /* 000000 0 */ + 0x02, /* 000000 0 */ + 0x00, /* 00000000 */ + + /* 93 0x5d ']' */ + 0x30, /* 00 0000 */ + 0x10, /* 000 0000 */ + 0x10, /* 000 0000 */ + 0x10, /* 000 0000 */ + 0x10, /* 000 0000 */ + 0x10, /* 000 0000 */ + 0x10, /* 000 0000 */ + 0x10, /* 000 0000 */ + 0x30, /* 00 0000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 94 0x5e '^' */ + 0x00, /* 00000000 */ + 0x10, /* 000 0000 */ + 0x28, /* 00 0 000 */ + 0x44, /* 0 000 00 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 95 0x5f '_' */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x7e, /* 0 0 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 96 0x60 '`' */ + 0x20, /* 00 00000 */ + 0x10, /* 000 0000 */ + 0x08, /* 0000 000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 97 0x61 'a' */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x3c, /* 00 00 */ + 0x44, /* 0 000 00 */ + 0x44, /* 0 000 00 */ + 0x4c, /* 0 00 00 */ + 0x34, /* 00 0 00 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 98 0x62 'b' */ + 0x00, /* 00000000 */ + 0x40, /* 0 000000 */ + 0x40, /* 0 000000 */ + 0x78, /* 0 000 */ + 0x44, /* 0 000 00 */ + 0x44, /* 0 000 00 */ + 0x44, /* 0 000 00 */ + 0x78, /* 0 000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 99 0x63 'c' */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x38, /* 00 000 */ + 0x44, /* 0 000 00 */ + 0x40, /* 0 000000 */ + 0x44, /* 0 000 00 */ + 0x38, /* 00 000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 100 0x64 'd' */ + 0x00, /* 00000000 */ + 0x04, /* 00000 00 */ + 0x04, /* 00000 00 */ + 0x3c, /* 00 00 */ + 0x44, /* 0 000 00 */ + 0x44, /* 0 000 00 */ + 0x44, /* 0 000 00 */ + 0x3c, /* 00 00 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 101 0x65 'e' */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x38, /* 00 000 */ + 0x44, /* 0 000 00 */ + 0x7c, /* 0 00 */ + 0x40, /* 0 000000 */ + 0x3c, /* 00 00 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 102 0x66 'f' */ + 0x00, /* 00000000 */ + 0x0c, /* 0000 00 */ + 0x10, /* 000 0000 */ + 0x38, /* 00 000 */ + 0x10, /* 000 0000 */ + 0x10, /* 000 0000 */ + 0x10, /* 000 0000 */ + 0x10, /* 000 0000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 103 0x67 'g' */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x3c, /* 00 00 */ + 0x44, /* 0 000 00 */ + 0x44, /* 0 000 00 */ + 0x44, /* 0 000 00 */ + 0x3c, /* 00 00 */ + 0x04, /* 00000 00 */ + 0x38, /* 00 000 */ + 0x00, /* 00000000 */ + + /* 104 0x68 'h' */ + 0x00, /* 00000000 */ + 0x40, /* 0 000000 */ + 0x40, /* 0 000000 */ + 0x78, /* 0 000 */ + 0x44, /* 0 000 00 */ + 0x44, /* 0 000 00 */ + 0x44, /* 0 000 00 */ + 0x44, /* 0 000 00 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 105 0x69 'i' */ + 0x00, /* 00000000 */ + 0x10, /* 000 0000 */ + 0x00, /* 00000000 */ + 0x30, /* 00 0000 */ + 0x10, /* 000 0000 */ + 0x10, /* 000 0000 */ + 0x10, /* 000 0000 */ + 0x38, /* 00 000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 106 0x6a 'j' */ + 0x00, /* 00000000 */ + 0x10, /* 000 0000 */ + 0x00, /* 00000000 */ + 0x30, /* 00 0000 */ + 0x10, /* 000 0000 */ + 0x10, /* 000 0000 */ + 0x10, /* 000 0000 */ + 0x10, /* 000 0000 */ + 0x10, /* 000 0000 */ + 0x60, /* 0 00000 */ + 0x00, /* 00000000 */ + + /* 107 0x6b 'k' */ + 0x00, /* 00000000 */ + 0x40, /* 0 000000 */ + 0x40, /* 0 000000 */ + 0x48, /* 0 00 000 */ + 0x50, /* 0 0 0000 */ + 0x70, /* 0 0000 */ + 0x48, /* 0 00 000 */ + 0x44, /* 0 000 00 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 108 0x6c 'l' */ + 0x00, /* 00000000 */ + 0x30, /* 00 0000 */ + 0x10, /* 000 0000 */ + 0x10, /* 000 0000 */ + 0x10, /* 000 0000 */ + 0x10, /* 000 0000 */ + 0x10, /* 000 0000 */ + 0x38, /* 00 000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 109 0x6d 'm' */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x78, /* 0 000 */ + 0x54, /* 0 0 0 00 */ + 0x54, /* 0 0 0 00 */ + 0x54, /* 0 0 0 00 */ + 0x54, /* 0 0 0 00 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 110 0x6e 'n' */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x58, /* 0 0 000 */ + 0x64, /* 0 00 00 */ + 0x44, /* 0 000 00 */ + 0x44, /* 0 000 00 */ + 0x44, /* 0 000 00 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 111 0x6f 'o' */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x38, /* 00 000 */ + 0x44, /* 0 000 00 */ + 0x44, /* 0 000 00 */ + 0x44, /* 0 000 00 */ + 0x38, /* 00 000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 112 0x70 'p' */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x78, /* 0 000 */ + 0x44, /* 0 000 00 */ + 0x44, /* 0 000 00 */ + 0x44, /* 0 000 00 */ + 0x78, /* 0 000 */ + 0x40, /* 0 000000 */ + 0x40, /* 0 000000 */ + 0x00, /* 00000000 */ + + /* 113 0x71 'q' */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x3c, /* 00 00 */ + 0x44, /* 0 000 00 */ + 0x44, /* 0 000 00 */ + 0x44, /* 0 000 00 */ + 0x3c, /* 00 00 */ + 0x04, /* 00000 00 */ + 0x04, /* 00000 00 */ + 0x00, /* 00000000 */ + + /* 114 0x72 'r' */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x58, /* 0 0 000 */ + 0x64, /* 0 00 00 */ + 0x40, /* 0 000000 */ + 0x40, /* 0 000000 */ + 0x40, /* 0 000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 115 0x73 's' */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x3c, /* 00 00 */ + 0x40, /* 0 000000 */ + 0x38, /* 00 000 */ + 0x04, /* 00000 00 */ + 0x78, /* 0 000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 116 0x74 't' */ + 0x00, /* 00000000 */ + 0x10, /* 000 0000 */ + 0x10, /* 000 0000 */ + 0x38, /* 00 000 */ + 0x10, /* 000 0000 */ + 0x10, /* 000 0000 */ + 0x10, /* 000 0000 */ + 0x0c, /* 0000 00 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 117 0x75 'u' */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x44, /* 0 000 00 */ + 0x44, /* 0 000 00 */ + 0x44, /* 0 000 00 */ + 0x4c, /* 0 00 00 */ + 0x34, /* 00 0 00 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 118 0x76 'v' */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x44, /* 0 000 00 */ + 0x44, /* 0 000 00 */ + 0x44, /* 0 000 00 */ + 0x28, /* 00 0 000 */ + 0x10, /* 000 0000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 119 0x77 'w' */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x54, /* 0 0 0 00 */ + 0x54, /* 0 0 0 00 */ + 0x54, /* 0 0 0 00 */ + 0x54, /* 0 0 0 00 */ + 0x28, /* 00 0 000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 120 0x78 'x' */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x44, /* 0 000 00 */ + 0x28, /* 00 0 000 */ + 0x10, /* 000 0000 */ + 0x28, /* 00 0 000 */ + 0x44, /* 0 000 00 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 121 0x79 'y' */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x44, /* 0 000 00 */ + 0x44, /* 0 000 00 */ + 0x44, /* 0 000 00 */ + 0x44, /* 0 000 00 */ + 0x3c, /* 00 00 */ + 0x04, /* 00000 00 */ + 0x38, /* 00 000 */ + 0x00, /* 00000000 */ + + /* 122 0x7a 'z' */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x7c, /* 0 00 */ + 0x08, /* 0000 000 */ + 0x10, /* 000 0000 */ + 0x20, /* 00 00000 */ + 0x7c, /* 0 00 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 123 0x7b '{' */ + 0x08, /* 0000 000 */ + 0x08, /* 0000 000 */ + 0x08, /* 0000 000 */ + 0x08, /* 0000 000 */ + 0x10, /* 000 0000 */ + 0x08, /* 0000 000 */ + 0x08, /* 0000 000 */ + 0x08, /* 0000 000 */ + 0x08, /* 0000 000 */ + 0x04, /* 00000 00 */ + 0x00, /* 00000000 */ + + /* 124 0x7c '|' */ + 0x10, /* 000 0000 */ + 0x10, /* 000 0000 */ + 0x10, /* 000 0000 */ + 0x10, /* 000 0000 */ + 0x10, /* 000 0000 */ + 0x10, /* 000 0000 */ + 0x10, /* 000 0000 */ + 0x10, /* 000 0000 */ + 0x10, /* 000 0000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 125 0x7d '}' */ + 0x10, /* 000 0000 */ + 0x10, /* 000 0000 */ + 0x10, /* 000 0000 */ + 0x10, /* 000 0000 */ + 0x08, /* 0000 000 */ + 0x10, /* 000 0000 */ + 0x10, /* 000 0000 */ + 0x10, /* 000 0000 */ + 0x10, /* 000 0000 */ + 0x20, /* 00 00000 */ + 0x00, /* 00000000 */ + + /* 126 0x7e '~' */ + 0x00, /* 00000000 */ + 0x34, /* 00 0 00 */ + 0x58, /* 0 0 000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 127 0x7f '^?' */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 128 0x80 '\200' */ + 0x00, /* 00000000 */ + 0x38, /* 00 000 */ + 0x44, /* 0 000 00 */ + 0x44, /* 0 000 00 */ + 0x7c, /* 0 00 */ + 0x44, /* 0 000 00 */ + 0x44, /* 0 000 00 */ + 0x44, /* 0 000 00 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 129 0x81 '\201' */ + 0x28, /* 00 0 000 */ + 0x38, /* 00 000 */ + 0x44, /* 0 000 00 */ + 0x44, /* 0 000 00 */ + 0x7c, /* 0 00 */ + 0x44, /* 0 000 00 */ + 0x44, /* 0 000 00 */ + 0x44, /* 0 000 00 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 130 0x82 '\202' */ + 0x00, /* 00000000 */ + 0x38, /* 00 000 */ + 0x44, /* 0 000 00 */ + 0x40, /* 0 000000 */ + 0x40, /* 0 000000 */ + 0x40, /* 0 000000 */ + 0x44, /* 0 000 00 */ + 0x38, /* 00 000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 131 0x83 '\203' */ + 0x10, /* 000 0000 */ + 0x7c, /* 0 00 */ + 0x40, /* 0 000000 */ + 0x40, /* 0 000000 */ + 0x78, /* 0 000 */ + 0x40, /* 0 000000 */ + 0x40, /* 0 000000 */ + 0x7c, /* 0 00 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 132 0x84 '\204' */ + 0x58, /* 0 0 000 */ + 0x44, /* 0 000 00 */ + 0x64, /* 0 00 00 */ + 0x54, /* 0 0 0 00 */ + 0x4c, /* 0 00 00 */ + 0x44, /* 0 000 00 */ + 0x44, /* 0 000 00 */ + 0x44, /* 0 000 00 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 133 0x85 '\205' */ + 0x00, /* 00000000 */ + 0x38, /* 00 000 */ + 0x44, /* 0 000 00 */ + 0x44, /* 0 000 00 */ + 0x44, /* 0 000 00 */ + 0x44, /* 0 000 00 */ + 0x44, /* 0 000 00 */ + 0x38, /* 00 000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 134 0x86 '\206' */ + 0x00, /* 00000000 */ + 0x44, /* 0 000 00 */ + 0x44, /* 0 000 00 */ + 0x44, /* 0 000 00 */ + 0x44, /* 0 000 00 */ + 0x44, /* 0 000 00 */ + 0x44, /* 0 000 00 */ + 0x38, /* 00 000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 135 0x87 '\207' */ + 0x08, /* 0000 000 */ + 0x10, /* 000 0000 */ + 0x00, /* 00000000 */ + 0x3c, /* 00 00 */ + 0x44, /* 0 000 00 */ + 0x44, /* 0 000 00 */ + 0x4c, /* 0 00 00 */ + 0x34, /* 00 0 00 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 136 0x88 '\210' */ + 0x10, /* 000 0000 */ + 0x08, /* 0000 000 */ + 0x00, /* 00000000 */ + 0x3c, /* 00 00 */ + 0x44, /* 0 000 00 */ + 0x44, /* 0 000 00 */ + 0x4c, /* 0 00 00 */ + 0x34, /* 00 0 00 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 137 0x89 '\211' */ + 0x10, /* 000 0000 */ + 0x28, /* 00 0 000 */ + 0x00, /* 00000000 */ + 0x3c, /* 00 00 */ + 0x44, /* 0 000 00 */ + 0x44, /* 0 000 00 */ + 0x4c, /* 0 00 00 */ + 0x34, /* 00 0 00 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 138 0x8a '\212' */ + 0x00, /* 00000000 */ + 0x28, /* 00 0 000 */ + 0x00, /* 00000000 */ + 0x3c, /* 00 00 */ + 0x44, /* 0 000 00 */ + 0x44, /* 0 000 00 */ + 0x4c, /* 0 00 00 */ + 0x34, /* 00 0 00 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 139 0x8b '\213' */ + 0x34, /* 00 0 00 */ + 0x58, /* 0 0 000 */ + 0x00, /* 00000000 */ + 0x3c, /* 00 00 */ + 0x44, /* 0 000 00 */ + 0x44, /* 0 000 00 */ + 0x4c, /* 0 00 00 */ + 0x34, /* 00 0 00 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 140 0x8c '\214' */ + 0x18, /* 000 000 */ + 0x24, /* 00 00 00 */ + 0x18, /* 000 000 */ + 0x3c, /* 00 00 */ + 0x44, /* 0 000 00 */ + 0x44, /* 0 000 00 */ + 0x4c, /* 0 00 00 */ + 0x34, /* 00 0 00 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 141 0x8d '\215' */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x38, /* 00 000 */ + 0x44, /* 0 000 00 */ + 0x40, /* 0 000000 */ + 0x40, /* 0 000000 */ + 0x3c, /* 00 00 */ + 0x10, /* 000 0000 */ + 0x20, /* 00 00000 */ + 0x00, /* 00000000 */ + + /* 142 0x8e '\216' */ + 0x08, /* 0000 000 */ + 0x10, /* 000 0000 */ + 0x00, /* 00000000 */ + 0x38, /* 00 000 */ + 0x44, /* 0 000 00 */ + 0x7c, /* 0 00 */ + 0x40, /* 0 000000 */ + 0x3c, /* 00 00 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 143 0x8f '\217' */ + 0x20, /* 00 00000 */ + 0x10, /* 000 0000 */ + 0x00, /* 00000000 */ + 0x38, /* 00 000 */ + 0x44, /* 0 000 00 */ + 0x7c, /* 0 00 */ + 0x40, /* 0 000000 */ + 0x3c, /* 00 00 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 144 0x90 '\220' */ + 0x10, /* 000 0000 */ + 0x28, /* 00 0 000 */ + 0x00, /* 00000000 */ + 0x38, /* 00 000 */ + 0x44, /* 0 000 00 */ + 0x7c, /* 0 00 */ + 0x40, /* 0 000000 */ + 0x3c, /* 00 00 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 145 0x91 '\221' */ + 0x00, /* 00000000 */ + 0x28, /* 00 0 000 */ + 0x00, /* 00000000 */ + 0x38, /* 00 000 */ + 0x44, /* 0 000 00 */ + 0x7c, /* 0 00 */ + 0x40, /* 0 000000 */ + 0x3c, /* 00 00 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 146 0x92 '\222' */ + 0x08, /* 0000 000 */ + 0x10, /* 000 0000 */ + 0x00, /* 00000000 */ + 0x10, /* 000 0000 */ + 0x10, /* 000 0000 */ + 0x10, /* 000 0000 */ + 0x10, /* 000 0000 */ + 0x10, /* 000 0000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 147 0x93 '\223' */ + 0x20, /* 00 00000 */ + 0x10, /* 000 0000 */ + 0x00, /* 00000000 */ + 0x10, /* 000 0000 */ + 0x10, /* 000 0000 */ + 0x10, /* 000 0000 */ + 0x10, /* 000 0000 */ + 0x10, /* 000 0000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 148 0x94 '\224' */ + 0x10, /* 000 0000 */ + 0x28, /* 00 0 000 */ + 0x00, /* 00000000 */ + 0x10, /* 000 0000 */ + 0x10, /* 000 0000 */ + 0x10, /* 000 0000 */ + 0x10, /* 000 0000 */ + 0x10, /* 000 0000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 149 0x95 '\225' */ + 0x00, /* 00000000 */ + 0x28, /* 00 0 000 */ + 0x00, /* 00000000 */ + 0x10, /* 000 0000 */ + 0x10, /* 000 0000 */ + 0x10, /* 000 0000 */ + 0x10, /* 000 0000 */ + 0x10, /* 000 0000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 150 0x96 '\226' */ + 0x34, /* 00 0 00 */ + 0x58, /* 0 0 000 */ + 0x00, /* 00000000 */ + 0x58, /* 0 0 000 */ + 0x64, /* 0 00 00 */ + 0x44, /* 0 000 00 */ + 0x44, /* 0 000 00 */ + 0x44, /* 0 000 00 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 151 0x97 '\227' */ + 0x08, /* 0000 000 */ + 0x10, /* 000 0000 */ + 0x00, /* 00000000 */ + 0x38, /* 00 000 */ + 0x44, /* 0 000 00 */ + 0x44, /* 0 000 00 */ + 0x44, /* 0 000 00 */ + 0x38, /* 00 000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 152 0x98 '\230' */ + 0x20, /* 00 00000 */ + 0x10, /* 000 0000 */ + 0x00, /* 00000000 */ + 0x38, /* 00 000 */ + 0x44, /* 0 000 00 */ + 0x44, /* 0 000 00 */ + 0x44, /* 0 000 00 */ + 0x38, /* 00 000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 153 0x99 '\231' */ + 0x10, /* 000 0000 */ + 0x28, /* 00 0 000 */ + 0x00, /* 00000000 */ + 0x38, /* 00 000 */ + 0x44, /* 0 000 00 */ + 0x44, /* 0 000 00 */ + 0x44, /* 0 000 00 */ + 0x38, /* 00 000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 154 0x9a '\232' */ + 0x00, /* 00000000 */ + 0x28, /* 00 0 000 */ + 0x00, /* 00000000 */ + 0x38, /* 00 000 */ + 0x44, /* 0 000 00 */ + 0x44, /* 0 000 00 */ + 0x44, /* 0 000 00 */ + 0x38, /* 00 000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 155 0x9b '\233' */ + 0x34, /* 00 0 00 */ + 0x58, /* 0 0 000 */ + 0x00, /* 00000000 */ + 0x38, /* 00 000 */ + 0x44, /* 0 000 00 */ + 0x44, /* 0 000 00 */ + 0x44, /* 0 000 00 */ + 0x38, /* 00 000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 156 0x9c '\234' */ + 0x08, /* 0000 000 */ + 0x10, /* 000 0000 */ + 0x00, /* 00000000 */ + 0x44, /* 0 000 00 */ + 0x44, /* 0 000 00 */ + 0x44, /* 0 000 00 */ + 0x4c, /* 0 00 00 */ + 0x34, /* 00 0 00 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 157 0x9d '\235' */ + 0x20, /* 00 00000 */ + 0x10, /* 000 0000 */ + 0x00, /* 00000000 */ + 0x44, /* 0 000 00 */ + 0x44, /* 0 000 00 */ + 0x44, /* 0 000 00 */ + 0x4c, /* 0 00 00 */ + 0x34, /* 00 0 00 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 158 0x9e '\236' */ + 0x10, /* 000 0000 */ + 0x28, /* 00 0 000 */ + 0x00, /* 00000000 */ + 0x44, /* 0 000 00 */ + 0x44, /* 0 000 00 */ + 0x44, /* 0 000 00 */ + 0x4c, /* 0 00 00 */ + 0x34, /* 00 0 00 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 159 0x9f '\237' */ + 0x00, /* 00000000 */ + 0x28, /* 00 0 000 */ + 0x00, /* 00000000 */ + 0x44, /* 0 000 00 */ + 0x44, /* 0 000 00 */ + 0x44, /* 0 000 00 */ + 0x4c, /* 0 00 00 */ + 0x34, /* 00 0 00 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 160 0xa0 '\240' */ + 0x00, /* 00000000 */ + 0x10, /* 000 0000 */ + 0x38, /* 00 000 */ + 0x10, /* 000 0000 */ + 0x10, /* 000 0000 */ + 0x10, /* 000 0000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 161 0xa1 '\241' */ + 0x18, /* 000 000 */ + 0x24, /* 00 00 00 */ + 0x24, /* 00 00 00 */ + 0x18, /* 000 000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 162 0xa2 '\242' */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x10, /* 000 0000 */ + 0x38, /* 00 000 */ + 0x54, /* 0 0 0 00 */ + 0x50, /* 0 0 0000 */ + 0x54, /* 0 0 0 00 */ + 0x38, /* 00 000 */ + 0x10, /* 000 0000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 163 0xa3 '\243' */ + 0x30, /* 00 0000 */ + 0x48, /* 0 00 000 */ + 0x40, /* 0 000000 */ + 0x70, /* 0 0000 */ + 0x40, /* 0 000000 */ + 0x40, /* 0 000000 */ + 0x44, /* 0 000 00 */ + 0x78, /* 0 000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 164 0xa4 '\244' */ + 0x44, /* 0 000 00 */ + 0x24, /* 00 00 00 */ + 0x50, /* 0 0 0000 */ + 0x48, /* 0 00 000 */ + 0x24, /* 00 00 00 */ + 0x14, /* 000 0 00 */ + 0x48, /* 0 00 000 */ + 0x44, /* 0 000 00 */ + 0x38, /* 00 000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 165 0xa5 '\245' */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x38, /* 00 000 */ + 0x7c, /* 0 00 */ + 0x7c, /* 0 00 */ + 0x7c, /* 0 00 */ + 0x38, /* 00 000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 166 0xa6 '\246' */ + 0x3c, /* 00 00 */ + 0x54, /* 0 0 0 00 */ + 0x54, /* 0 0 0 00 */ + 0x54, /* 0 0 0 00 */ + 0x3c, /* 00 00 */ + 0x14, /* 000 0 00 */ + 0x14, /* 000 0 00 */ + 0x14, /* 000 0 00 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 167 0xa7 '\247' */ + 0x18, /* 000 000 */ + 0x24, /* 00 00 00 */ + 0x44, /* 0 000 00 */ + 0x48, /* 0 00 000 */ + 0x48, /* 0 00 000 */ + 0x44, /* 0 000 00 */ + 0x44, /* 0 000 00 */ + 0x58, /* 0 0 000 */ + 0x40, /* 0 000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 168 0xa8 '\250' */ + 0x00, /* 00000000 */ + 0x70, /* 0 0000 */ + 0x08, /* 0000 000 */ + 0x64, /* 0 00 00 */ + 0x54, /* 0 0 0 00 */ + 0x64, /* 0 00 00 */ + 0x58, /* 0 0 000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 169 0xa9 '\251' */ + 0x00, /* 00000000 */ + 0x70, /* 0 0000 */ + 0x08, /* 0000 000 */ + 0x34, /* 00 0 00 */ + 0x44, /* 0 000 00 */ + 0x34, /* 00 0 00 */ + 0x08, /* 0000 000 */ + 0x70, /* 0 0000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 170 0xaa '\252' */ + 0x00, /* 00000000 */ + 0x7a, /* 0 0 0 */ + 0x2e, /* 00 0 0 */ + 0x2e, /* 00 0 0 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 171 0xab '\253' */ + 0x00, /* 00000000 */ + 0x08, /* 0000 000 */ + 0x10, /* 000 0000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 172 0xac '\254' */ + 0x00, /* 00000000 */ + 0x28, /* 00 0 000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 173 0xad '\255' */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x08, /* 0000 000 */ + 0x7c, /* 0 00 */ + 0x10, /* 000 0000 */ + 0x7c, /* 0 00 */ + 0x20, /* 00 00000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 174 0xae '\256' */ + 0x00, /* 00000000 */ + 0x3c, /* 00 00 */ + 0x50, /* 0 0 0000 */ + 0x50, /* 0 0 0000 */ + 0x78, /* 0 000 */ + 0x50, /* 0 0 0000 */ + 0x50, /* 0 0 0000 */ + 0x5c, /* 0 0 00 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 175 0xaf '\257' */ + 0x00, /* 00000000 */ + 0x38, /* 00 000 */ + 0x44, /* 0 000 00 */ + 0x4c, /* 0 00 00 */ + 0x54, /* 0 0 0 00 */ + 0x64, /* 0 00 00 */ + 0x44, /* 0 000 00 */ + 0x38, /* 00 000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 176 0xb0 '\260' */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x6c, /* 0 0 00 */ + 0x54, /* 0 0 0 00 */ + 0x6c, /* 0 0 00 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 177 0xb1 '\261' */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x10, /* 000 0000 */ + 0x10, /* 000 0000 */ + 0x7c, /* 0 00 */ + 0x10, /* 000 0000 */ + 0x10, /* 000 0000 */ + 0x7c, /* 0 00 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 178 0xb2 '\262' */ + 0x00, /* 00000000 */ + 0x08, /* 0000 000 */ + 0x10, /* 000 0000 */ + 0x20, /* 00 00000 */ + 0x10, /* 000 0000 */ + 0x08, /* 0000 000 */ + 0x00, /* 00000000 */ + 0x38, /* 00 000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 179 0xb3 '\263' */ + 0x00, /* 00000000 */ + 0x10, /* 000 0000 */ + 0x08, /* 0000 000 */ + 0x04, /* 00000 00 */ + 0x08, /* 0000 000 */ + 0x10, /* 000 0000 */ + 0x00, /* 00000000 */ + 0x1c, /* 000 00 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 180 0xb4 '\264' */ + 0x00, /* 00000000 */ + 0x44, /* 0 000 00 */ + 0x28, /* 00 0 000 */ + 0x7c, /* 0 00 */ + 0x10, /* 000 0000 */ + 0x7c, /* 0 00 */ + 0x10, /* 000 0000 */ + 0x10, /* 000 0000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 181 0xb5 '\265' */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x48, /* 0 00 000 */ + 0x48, /* 0 00 000 */ + 0x48, /* 0 00 000 */ + 0x48, /* 0 00 000 */ + 0x74, /* 0 0 00 */ + 0x40, /* 0 000000 */ + 0x40, /* 0 000000 */ + 0x00, /* 00000000 */ + + /* 182 0xb6 '\266' */ + 0x00, /* 00000000 */ + 0x10, /* 000 0000 */ + 0x08, /* 0000 000 */ + 0x0c, /* 0000 00 */ + 0x14, /* 000 0 00 */ + 0x24, /* 00 00 00 */ + 0x24, /* 00 00 00 */ + 0x18, /* 000 000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 183 0xb7 '\267' */ + 0x00, /* 00000000 */ + 0x7c, /* 0 00 */ + 0x24, /* 00 00 00 */ + 0x10, /* 000 0000 */ + 0x08, /* 0000 000 */ + 0x10, /* 000 0000 */ + 0x24, /* 00 00 00 */ + 0x7c, /* 0 00 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 184 0xb8 '\270' */ + 0x00, /* 00000000 */ + 0x7c, /* 0 00 */ + 0x28, /* 00 0 000 */ + 0x28, /* 00 0 000 */ + 0x28, /* 00 0 000 */ + 0x28, /* 00 0 000 */ + 0x28, /* 00 0 000 */ + 0x28, /* 00 0 000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 185 0xb9 '\271' */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x7c, /* 0 00 */ + 0x28, /* 00 0 000 */ + 0x28, /* 00 0 000 */ + 0x28, /* 00 0 000 */ + 0x28, /* 00 0 000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 186 0xba '\272' */ + 0x10, /* 000 0000 */ + 0x10, /* 000 0000 */ + 0x10, /* 000 0000 */ + 0x10, /* 000 0000 */ + 0x10, /* 000 0000 */ + 0x10, /* 000 0000 */ + 0x10, /* 000 0000 */ + 0x10, /* 000 0000 */ + 0x10, /* 000 0000 */ + 0x60, /* 0 00000 */ + 0x00, /* 00000000 */ + + /* 187 0xbb '\273' */ + 0x00, /* 00000000 */ + 0x1c, /* 000 00 */ + 0x24, /* 00 00 00 */ + 0x24, /* 00 00 00 */ + 0x1c, /* 000 00 */ + 0x00, /* 00000000 */ + 0x3c, /* 00 00 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 188 0xbc '\274' */ + 0x00, /* 00000000 */ + 0x18, /* 000 000 */ + 0x24, /* 00 00 00 */ + 0x24, /* 00 00 00 */ + 0x18, /* 000 000 */ + 0x00, /* 00000000 */ + 0x3c, /* 00 00 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 189 0xbd '\275' */ + 0x00, /* 00000000 */ + 0x38, /* 00 000 */ + 0x44, /* 0 000 00 */ + 0x44, /* 0 000 00 */ + 0x44, /* 0 000 00 */ + 0x44, /* 0 000 00 */ + 0x28, /* 00 0 000 */ + 0x6c, /* 0 0 00 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 190 0xbe '\276' */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x38, /* 00 000 */ + 0x54, /* 0 0 0 00 */ + 0x5c, /* 0 0 00 */ + 0x50, /* 0 0 0000 */ + 0x3c, /* 00 00 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 191 0xbf '\277' */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x38, /* 00 000 */ + 0x4c, /* 0 00 00 */ + 0x54, /* 0 0 0 00 */ + 0x64, /* 0 00 00 */ + 0x38, /* 00 000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 192 0xc0 '\300' */ + 0x00, /* 00000000 */ + 0x10, /* 000 0000 */ + 0x00, /* 00000000 */ + 0x10, /* 000 0000 */ + 0x20, /* 00 00000 */ + 0x40, /* 0 000000 */ + 0x44, /* 0 000 00 */ + 0x38, /* 00 000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 193 0xc1 '\301' */ + 0x00, /* 00000000 */ + 0x08, /* 0000 000 */ + 0x00, /* 00000000 */ + 0x08, /* 0000 000 */ + 0x08, /* 0000 000 */ + 0x08, /* 0000 000 */ + 0x08, /* 0000 000 */ + 0x08, /* 0000 000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 194 0xc2 '\302' */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x7c, /* 0 00 */ + 0x04, /* 00000 00 */ + 0x04, /* 00000 00 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 195 0xc3 '\303' */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x0c, /* 0000 00 */ + 0x08, /* 0000 000 */ + 0x10, /* 000 0000 */ + 0x50, /* 0 0 0000 */ + 0x20, /* 00 00000 */ + 0x20, /* 00 00000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 196 0xc4 '\304' */ + 0x10, /* 000 0000 */ + 0x10, /* 000 0000 */ + 0x10, /* 000 0000 */ + 0x38, /* 00 000 */ + 0x10, /* 000 0000 */ + 0x10, /* 000 0000 */ + 0x10, /* 000 0000 */ + 0x10, /* 000 0000 */ + 0x10, /* 000 0000 */ + 0x60, /* 0 00000 */ + 0x00, /* 00000000 */ + + /* 197 0xc5 '\305' */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x04, /* 00000 00 */ + 0x38, /* 00 000 */ + 0x44, /* 0 000 00 */ + 0x38, /* 00 000 */ + 0x40, /* 0 000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 198 0xc6 '\306' */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x10, /* 000 0000 */ + 0x10, /* 000 0000 */ + 0x28, /* 00 0 000 */ + 0x28, /* 00 0 000 */ + 0x44, /* 0 000 00 */ + 0x7c, /* 0 00 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 199 0xc7 '\307' */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x24, /* 00 00 00 */ + 0x48, /* 0 00 000 */ + 0x48, /* 0 00 000 */ + 0x24, /* 00 00 00 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 200 0xc8 '\310' */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x48, /* 0 00 000 */ + 0x24, /* 00 00 00 */ + 0x24, /* 00 00 00 */ + 0x48, /* 0 00 000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 201 0xc9 '\311' */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x54, /* 0 0 0 00 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 202 0xca '\312' */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 203 0xcb '\313' */ + 0x10, /* 000 0000 */ + 0x38, /* 00 000 */ + 0x44, /* 0 000 00 */ + 0x44, /* 0 000 00 */ + 0x7c, /* 0 00 */ + 0x44, /* 0 000 00 */ + 0x44, /* 0 000 00 */ + 0x44, /* 0 000 00 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 204 0xcc '\314' */ + 0x58, /* 0 0 000 */ + 0x38, /* 00 000 */ + 0x44, /* 0 000 00 */ + 0x44, /* 0 000 00 */ + 0x7c, /* 0 00 */ + 0x44, /* 0 000 00 */ + 0x44, /* 0 000 00 */ + 0x44, /* 0 000 00 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 205 0xcd '\315' */ + 0x58, /* 0 0 000 */ + 0x38, /* 00 000 */ + 0x44, /* 0 000 00 */ + 0x44, /* 0 000 00 */ + 0x44, /* 0 000 00 */ + 0x44, /* 0 000 00 */ + 0x44, /* 0 000 00 */ + 0x38, /* 00 000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 206 0xce '\316' */ + 0x00, /* 00000000 */ + 0x3c, /* 00 00 */ + 0x50, /* 0 0 0000 */ + 0x50, /* 0 0 0000 */ + 0x58, /* 0 0 000 */ + 0x50, /* 0 0 0000 */ + 0x50, /* 0 0 0000 */ + 0x3c, /* 00 00 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 207 0xcf '\317' */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x28, /* 00 0 000 */ + 0x54, /* 0 0 0 00 */ + 0x5c, /* 0 0 00 */ + 0x50, /* 0 0 0000 */ + 0x2c, /* 00 0 00 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 208 0xd0 '\320' */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x38, /* 00 000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 209 0xd1 '\321' */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x7e, /* 0 0 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 210 0xd2 '\322' */ + 0x00, /* 00000000 */ + 0x14, /* 000 0 00 */ + 0x28, /* 00 0 000 */ + 0x28, /* 00 0 000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 211 0xd3 '\323' */ + 0x00, /* 00000000 */ + 0x14, /* 000 0 00 */ + 0x14, /* 000 0 00 */ + 0x28, /* 00 0 000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 212 0xd4 '\324' */ + 0x00, /* 00000000 */ + 0x08, /* 0000 000 */ + 0x10, /* 000 0000 */ + 0x18, /* 000 000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 213 0xd5 '\325' */ + 0x00, /* 00000000 */ + 0x18, /* 000 000 */ + 0x08, /* 0000 000 */ + 0x10, /* 000 0000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 214 0xd6 '\326' */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x10, /* 000 0000 */ + 0x00, /* 00000000 */ + 0x7c, /* 0 00 */ + 0x00, /* 00000000 */ + 0x10, /* 000 0000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 215 0xd7 '\327' */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x10, /* 000 0000 */ + 0x28, /* 00 0 000 */ + 0x44, /* 0 000 00 */ + 0x28, /* 00 0 000 */ + 0x10, /* 000 0000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 216 0xd8 '\330' */ + 0x00, /* 00000000 */ + 0x28, /* 00 0 000 */ + 0x00, /* 00000000 */ + 0x44, /* 0 000 00 */ + 0x44, /* 0 000 00 */ + 0x44, /* 0 000 00 */ + 0x44, /* 0 000 00 */ + 0x3c, /* 00 00 */ + 0x04, /* 00000 00 */ + 0x38, /* 00 000 */ + 0x00, /* 00000000 */ + + /* 217 0xd9 '\331' */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x7e, /* 0 0 */ + 0x00, /* 00000000 */ + 0x7e, /* 0 0 */ + 0x00, /* 00000000 */ + 0x7e, /* 0 0 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 218 0xda '\332' */ + 0x00, /* 00000000 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 219 0xdb '\333' */ + 0x00, /* 00000000 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 220 0xdc '\334' */ + 0x00, /* 00000000 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 221 0xdd '\335' */ + 0x00, /* 00000000 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 222 0xde '\336' */ + 0x00, /* 00000000 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 223 0xdf '\337' */ + 0x00, /* 00000000 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 224 0xe0 '\340' */ + 0x00, /* 00000000 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 225 0xe1 '\341' */ + 0x00, /* 00000000 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 226 0xe2 '\342' */ + 0x00, /* 00000000 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 227 0xe3 '\343' */ + 0x00, /* 00000000 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 228 0xe4 '\344' */ + 0x00, /* 00000000 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 229 0xe5 '\345' */ + 0x00, /* 00000000 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 230 0xe6 '\346' */ + 0x00, /* 00000000 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 231 0xe7 '\347' */ + 0x00, /* 00000000 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 232 0xe8 '\350' */ + 0x00, /* 00000000 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 233 0xe9 '\351' */ + 0x00, /* 00000000 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 234 0xea '\352' */ + 0x00, /* 00000000 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 235 0xeb '\353' */ + 0x00, /* 00000000 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 236 0xec '\354' */ + 0x00, /* 00000000 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 237 0xed '\355' */ + 0x00, /* 00000000 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 238 0xee '\356' */ + 0x00, /* 00000000 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 239 0xef '\357' */ + 0x00, /* 00000000 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 240 0xf0 '\360' */ + 0x00, /* 00000000 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 241 0xf1 '\361' */ + 0x00, /* 00000000 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 242 0xf2 '\362' */ + 0x00, /* 00000000 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 243 0xf3 '\363' */ + 0x00, /* 00000000 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 244 0xf4 '\364' */ + 0x00, /* 00000000 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 245 0xf5 '\365' */ + 0x00, /* 00000000 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 246 0xf6 '\366' */ + 0x00, /* 00000000 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 247 0xf7 '\367' */ + 0x00, /* 00000000 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 248 0xf8 '\370' */ + 0x00, /* 00000000 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 249 0xf9 '\371' */ + 0x00, /* 00000000 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 250 0xfa '\372' */ + 0x00, /* 00000000 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 251 0xfb '\373' */ + 0x00, /* 00000000 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 252 0xfc '\374' */ + 0x00, /* 00000000 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 253 0xfd '\375' */ + 0x00, /* 00000000 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 254 0xfe '\376' */ + 0x00, /* 00000000 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 255 0xff '\377' */ + 0x00, /* 00000000 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x3c, /* 00 00 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + +}; diff --git a/src/interface.h b/src/interface.h new file mode 100644 index 0000000..10b37b9 --- /dev/null +++ b/src/interface.h @@ -0,0 +1,25 @@ +#define PATH "/apps/camorama/preferences" +#define KEY1 "/apps/camorama/preferences/save_dir" +#define KEY2 "/apps/camorama/preferences/save_file" +#define KEY3 "/apps/camorama/preferences/file_type" +#define KEY4 "/apps/camorama/preferences/timestamp" +#define KEY5 "/apps/camorama/preferences/hostname" +#define KEY6 "/apps/camorama/preferences/login" +#define KEY7 "/apps/camorama/preferences/password" +#define KEY8 "/apps/camorama/preferences/remote_save_dir" +#define KEY9 "/apps/camorama/preferences/remote_save_file" +#define KEY10 "/apps/camorama/preferences/remote_file_type" +#define KEY11 "/apps/camorama/preferences/remote_timestamp" +#define KEY12 "/apps/camorama/preferences/local_capture" +#define KEY13 "/apps/camorama/preferences/remote_capture" +#define KEY14 "/apps/camorama/preferences/append_ts_to_file" +#define KEY15 "/apps/camorama/preferences/remote_append_ts_to_file" +#define KEY16 "/apps/camorama/preferences/timestamp_string" +#define KEY17 "/apps/camorama/preferences/date_format" +#define KEY18 "/apps/camorama/preferences/use_custom_string" +#define KEY19 "/apps/camorama/preferences/drawdate" +#define KEY20 "/apps/camorama/preferences/auto_capture" +#define KEY21 "/apps/camorama/preferences/auto_capture_interval" +#define KEY22 "/apps/camorama/preferences/show_adjustments" + + diff --git a/src/main.c b/src/main.c new file mode 100644 index 0000000..d03d939 --- /dev/null +++ b/src/main.c @@ -0,0 +1,623 @@ +#include <gnome.h> +#include "interface.h" + +#include "callbacks.h" +#include "support.h" +#include <config.h> + +#include <gdk/gdkx.h> +#include <gdk-pixbuf-xlib/gdk-pixbuf-xlib.h> +#include <gdk-pixbuf-xlib/gdk-pixbuf-xlibrgb.h> +#include <locale.h> + +GtkWidget *main_window, *prefswindow; +state func_state; +int frames, frames2, seconds; +GtkWidget *dentry, *entry2, *string_entry, *format_selection; +GtkWidget *host_entry, *directory_entry, *filename_entry, *login_entry, + *pw_entry; + +static gboolean ver = FALSE, max = FALSE, min = FALSE, half = + FALSE, use_read = FALSE; + +/*static gint tray_icon_destroyed (GtkWidget *tray, gpointer data) +{ + GConfClient *client = gconf_client_get_default (); + + //Somehow the delete_event never got called, so we use "destroy" + if (tray != MyApp->GetMainWindow ()->docklet) + return true; + GtkWidget *new_tray = gnomemeeting_init_tray (); + + if (gconf_client_get_bool + (client, GENERAL_KEY "do_not_disturb", 0)) + gnomemeeting_tray_set_content (new_tray, 2); + + + MyApp->GetMainWindow ()->docklet = GTK_WIDGET (new_tray); + gtk_widget_show (gm); + + return true; +}*/ + +static gint +tray_clicked_callback (GtkWidget * widget, GdkEventButton * event, cam * cam) +{ + GdkEventButton *event_button = NULL; + + if (event->type == GDK_BUTTON_PRESS) { + + event_button = (GdkEventButton *) event; + + //change to switch + if (event_button->button == 1) { + if (GTK_WIDGET_VISIBLE + (glade_xml_get_widget (cam->xml, "window2"))) { + cam->hidden = TRUE; + gtk_idle_remove(cam->idle_id); + gtk_widget_hide (glade_xml_get_widget (cam->xml, "window2")); + + } else { + cam->idle_id = gtk_idle_add ((GSourceFunc) pt2Function, (gpointer) cam); + gtk_widget_show (glade_xml_get_widget (cam->xml, "window2")); + cam->hidden = FALSE; + + } + return TRUE; + } else if (event_button->button == 3) { + + //gw = MyApp->GetMainWindow (); + + //gnomemeeting_component_view (NULL, (gpointer) gw->ldap_window); + + return TRUE; + } + } + + return FALSE; +} + +void load_interface (cam * cam) +{ + gchar *title; + GdkPixbuf *logo = NULL, *scaled = NULL; + GtkWidget *eventbox = NULL, *image = NULL; + gint width, height; + + (GtkTooltips *)cam->tooltips = gtk_tooltips_new (); + logo = (GdkPixbuf *) create_pixbuf (DATADIR "/pixmaps/camorama.png"); + if (logo == NULL) { + printf ("\n\nLOGO NO GO\n\n"); + } + + gtk_icon_size_lookup (GTK_ICON_SIZE_MENU, &width, &height); + scaled = + gdk_pixbuf_scale_simple (logo, width, height, GDK_INTERP_BILINEAR); + + image = gtk_image_new_from_pixbuf (scaled); + + //image = gtk_image_new_from_stock (GNOME_STOCK_TRASH, GTK_ICON_SIZE_MENU); + + if (cam->show_adjustments == FALSE) { + gtk_widget_hide (glade_xml_get_widget (cam->xml, "table6")); + gtk_widget_hide (glade_xml_get_widget (cam->xml, "vbox37")); + gtk_window_resize (GTK_WINDOW + (glade_xml_get_widget + (cam->xml, "window2")), 320, 240); + + } + + eventbox = gtk_event_box_new (); + + gtk_widget_show (image); + + gtk_widget_show (eventbox); + + cam->tray_icon = egg_tray_icon_new ("Our cool tray icon"); + update_tooltip (cam); + /* add the status to the plug */ + g_object_set_data (G_OBJECT (cam->tray_icon), "image", image); + g_object_set_data (G_OBJECT (cam->tray_icon), "available", + GINT_TO_POINTER (1)); + g_object_set_data (G_OBJECT (cam->tray_icon), "embedded", + GINT_TO_POINTER (0)); + gtk_container_add (GTK_CONTAINER (eventbox), image); + gtk_container_add ((GtkContainer *)cam->tray_icon, eventbox); + + g_signal_connect (G_OBJECT (eventbox), "button_press_event", + G_CALLBACK (tray_clicked_callback), cam); + + //button = gtk_button_new_with_label ("This is a cool\ntray icon"); + /*g_signal_connect (button, "clicked", + * G_CALLBACK (capture_func), cam); + * gtk_container_add (GTK_CONTAINER (cam->tray_icon), button); */ + gtk_widget_show_all (GTK_WIDGET (cam->tray_icon)); + + /* connect the signals in the interface + * glade_xml_signal_autoconnect(xml); + * this won't work, can't pass data to callbacks. have to do it individually :(*/ + + title = g_strdup_printf ("Camorama - %s - %dx%d", cam->vid_cap.name, + cam->x, cam->y); + gtk_window_set_title (GTK_WINDOW + (glade_xml_get_widget (cam->xml, "window2")), + title); + g_free (title); + + gtk_window_set_icon (GTK_WINDOW + (glade_xml_get_widget (cam->xml, "window2")), logo); + gtk_window_set_icon (GTK_WINDOW + (glade_xml_get_widget (cam->xml, "prefswindow")), + logo); + + glade_xml_signal_connect_data (cam->xml, "on_show_effects_activate", + G_CALLBACK (on_show_effects_activate), + cam); + gtk_toggle_button_set_active ((GtkToggleButton *) + glade_xml_get_widget (cam->xml, + "togglebutton1"), + cam->show_adjustments); + glade_xml_signal_connect_data (cam->xml, + "on_show_adjustments1_activate", + G_CALLBACK + (on_show_adjustments1_activate), cam); + + glade_xml_signal_connect_data (cam->xml, "on_large1_activate", + G_CALLBACK (on_change_size_activate), cam); + glade_xml_signal_connect_data (cam->xml, "on_medium1_activate", + G_CALLBACK (on_change_size_activate), cam); + glade_xml_signal_connect_data (cam->xml, "on_small1_activate", + G_CALLBACK (on_change_size_activate), cam); + + //glade_xml_signal_connect_data(cam->xml, "capture_func", G_CALLBACK(on_change_size_activate), cam); + glade_xml_signal_connect_data (cam->xml, "capture_func", + G_CALLBACK (capture_func), cam); + glade_xml_signal_connect_data (cam->xml, "gtk_main_quit", + G_CALLBACK (delete_event), NULL); + + /* sliders */ + glade_xml_signal_connect_data (cam->xml, + "on_scale1_drag_data_received", + G_CALLBACK + (on_scale1_drag_data_received), cam); + gtk_range_set_value ((GtkRange *) + glade_xml_get_widget (cam->xml, "slider1"), 128); + glade_xml_signal_connect_data (cam->xml, "contrast_change", + G_CALLBACK (contrast_change), cam); + gtk_range_set_value ((GtkRange *) + glade_xml_get_widget (cam->xml, "slider2"), + (int) (cam->contrast / 256)); + glade_xml_signal_connect_data (cam->xml, "brightness_change", + G_CALLBACK (brightness_change), cam); + gtk_range_set_value ((GtkRange *) + glade_xml_get_widget (cam->xml, "slider3"), + (int) (cam->brightness / 256)); + glade_xml_signal_connect_data (cam->xml, "colour_change", + G_CALLBACK (colour_change), cam); + gtk_range_set_value ((GtkRange *) + glade_xml_get_widget (cam->xml, "slider4"), + (int) (cam->colour / 256)); + glade_xml_signal_connect_data (cam->xml, "hue_change", + G_CALLBACK (hue_change), cam); + gtk_range_set_value ((GtkRange *) + glade_xml_get_widget (cam->xml, "slider5"), + (int) (cam->hue / 256)); + glade_xml_signal_connect_data (cam->xml, "wb_change", + G_CALLBACK (wb_change), cam); + gtk_range_set_value ((GtkRange *) + glade_xml_get_widget (cam->xml, "slider6"), + (int) (cam->wb / 256)); + + /* buttons */ + glade_xml_signal_connect_data (cam->xml, "fix_colour_func", + G_CALLBACK (fix_colour_func), + (gpointer) NULL); + glade_xml_signal_connect_data (cam->xml, "threshold_func1", + G_CALLBACK (threshold_func1), + (gpointer) NULL); + glade_xml_signal_connect_data (cam->xml, "threshold_ch_func", + G_CALLBACK (threshold_ch_func), + (gpointer) NULL); + glade_xml_signal_connect_data (cam->xml, "edge_func1", + G_CALLBACK (edge_func1), (gpointer) NULL); + glade_xml_signal_connect_data (cam->xml, "sobel_func", + G_CALLBACK (sobel_func), (gpointer) NULL); + glade_xml_signal_connect_data (cam->xml, "edge_func3", + G_CALLBACK (edge_func3), (gpointer) NULL); + glade_xml_signal_connect_data (cam->xml, "negative_func", + G_CALLBACK (negative_func), + (gpointer) NULL); + glade_xml_signal_connect_data (cam->xml, "mirror_func", + G_CALLBACK (mirror_func), (gpointer) NULL); + glade_xml_signal_connect_data (cam->xml, "colour_func", + G_CALLBACK (colour_func), (gpointer) NULL); + glade_xml_signal_connect_data (cam->xml, "smooth_func", + G_CALLBACK (smooth_func), (gpointer) NULL); + glade_xml_signal_connect_data (cam->xml, "edge_func1", + G_CALLBACK (edge_func1), (gpointer) NULL); + + glade_xml_signal_connect_data (cam->xml, + "on_drawingarea1_expose_event", + G_CALLBACK + (on_drawingarea1_expose_event), + (gpointer) cam); + glade_xml_signal_connect_data (cam->xml, "on_status_show", + G_CALLBACK (on_status_show), + (gpointer) cam); + glade_xml_signal_connect_data (cam->xml, "on_quit1_activate", + G_CALLBACK (on_quit1_activate), + (gpointer) cam); + glade_xml_signal_connect_data (cam->xml, "on_preferences1_activate", + G_CALLBACK (on_preferences1_activate), + (gpointer) cam); + glade_xml_signal_connect_data (cam->xml, "on_about1_activate", + G_CALLBACK (on_about1_activate), + (gpointer) cam); + + /* prefs */ + glade_xml_signal_connect_data (cam->xml, "prefs_func", + G_CALLBACK (prefs_func), cam); + + /* general */ + glade_xml_signal_connect_data (cam->xml, "cap_func", + G_CALLBACK (cap_func), cam); + + gtk_toggle_button_set_active ((GtkToggleButton *) + glade_xml_get_widget (cam->xml, + "captured_cb"), + cam->cap); + + glade_xml_signal_connect_data (cam->xml, "rcap_func", + G_CALLBACK (rcap_func), cam); + gtk_toggle_button_set_active ((GtkToggleButton *) + glade_xml_get_widget (cam->xml, + "rcapture"), + cam->rcap); + + glade_xml_signal_connect_data (cam->xml, "acap_func", + G_CALLBACK (acap_func), cam); + gtk_toggle_button_set_active ((GtkToggleButton *) + glade_xml_get_widget (cam->xml, + "acapture"), + cam->acap); + + glade_xml_signal_connect_data (cam->xml, "interval_change", + G_CALLBACK (interval_change), cam); + + gtk_spin_button_set_value ((GtkSpinButton *) + glade_xml_get_widget (cam->xml, + "interval_entry"), + (cam->timeout_interval / 60000)); + + /* local */ + dentry = glade_xml_get_widget (cam->xml, "dentry"); + entry2 = glade_xml_get_widget (cam->xml, "entry2"); + gtk_entry_set_text (GTK_ENTRY + (gnome_file_entry_gtk_entry + (GNOME_FILE_ENTRY (dentry))), cam->pixdir); + + gtk_entry_set_text (GTK_ENTRY (entry2), cam->capturefile); + + glade_xml_signal_connect_data (cam->xml, "append_func", + G_CALLBACK (append_func), cam); + gtk_toggle_button_set_active ((GtkToggleButton *) + glade_xml_get_widget (cam->xml, + "appendbutton"), + cam->timefn); + + glade_xml_signal_connect_data (cam->xml, "jpg_func", + G_CALLBACK (jpg_func), cam); + if (cam->savetype == JPEG) { + gtk_toggle_button_set_active ((GtkToggleButton *) + glade_xml_get_widget (cam->xml, + "jpgb"), TRUE); + } + glade_xml_signal_connect_data (cam->xml, "png_func", + G_CALLBACK (png_func), cam); + if (cam->savetype == PNG) { + gtk_toggle_button_set_active ((GtkToggleButton *) + glade_xml_get_widget (cam->xml, + "pngb"), TRUE); + } + + glade_xml_signal_connect_data (cam->xml, "ts_func", + G_CALLBACK (ts_func), cam); + gtk_toggle_button_set_active ((GtkToggleButton *) + glade_xml_get_widget (cam->xml, + "tsbutton"), + cam->timestamp); + + /* remote */ + login_entry = glade_xml_get_widget (cam->xml, "login_entry"); + host_entry = glade_xml_get_widget (cam->xml, "host_entry"); + pw_entry = glade_xml_get_widget (cam->xml, "pw_entry"); + directory_entry = glade_xml_get_widget (cam->xml, "directory_entry"); + filename_entry = glade_xml_get_widget (cam->xml, "filename_entry"); + gtk_entry_set_text (GTK_ENTRY (host_entry), cam->rhost); + gtk_entry_set_text (GTK_ENTRY (login_entry), cam->rlogin); + gtk_entry_set_text (GTK_ENTRY (pw_entry), cam->rpw); + gtk_entry_set_text (GTK_ENTRY (directory_entry), cam->rpixdir); + gtk_entry_set_text (GTK_ENTRY (filename_entry), cam->rcapturefile); + + glade_xml_signal_connect_data (cam->xml, "rappend_func", + G_CALLBACK (rappend_func), cam); + gtk_toggle_button_set_active ((GtkToggleButton *) + glade_xml_get_widget (cam->xml, + "timecb"), + cam->rtimefn); + + glade_xml_signal_connect_data (cam->xml, "rjpg_func", + G_CALLBACK (rjpg_func), cam); + if (cam->rsavetype == JPEG) { + gtk_toggle_button_set_active ((GtkToggleButton *) + glade_xml_get_widget (cam->xml, + "fjpgb"), TRUE); + } + glade_xml_signal_connect_data (cam->xml, "rpng_func", + G_CALLBACK (rpng_func), cam); + if (cam->rsavetype == PNG) { + gtk_toggle_button_set_active ((GtkToggleButton *) + glade_xml_get_widget (cam->xml, + "fpngb"), TRUE); + } + + glade_xml_signal_connect_data (cam->xml, "rts_func", + G_CALLBACK (rts_func), cam); + gtk_toggle_button_set_active ((GtkToggleButton *) + glade_xml_get_widget (cam->xml, + "tsbutton2"), + cam->rtimestamp); + + /* timestamp */ + glade_xml_signal_connect_data (cam->xml, "customstring_func", + G_CALLBACK (customstring_func), cam); + gtk_toggle_button_set_active ((GtkToggleButton *) + glade_xml_get_widget (cam->xml, "cscb"), + cam->usestring); + + string_entry = glade_xml_get_widget (cam->xml, "string_entry"); + gtk_entry_set_text (GTK_ENTRY (string_entry), cam->ts_string); + + glade_xml_signal_connect_data (cam->xml, "drawdate_func", + G_CALLBACK (drawdate_func), cam); + gtk_toggle_button_set_active ((GtkToggleButton *) + glade_xml_get_widget (cam->xml, "tscb"), + cam->usedate); + + cam->status = glade_xml_get_widget (cam->xml, "status"); + set_sensitive (cam); + gtk_widget_set_sensitive (glade_xml_get_widget + (cam->xml, "string_entry"), cam->usestring); + + gtk_widget_set_size_request (glade_xml_get_widget (cam->xml, "da"), + cam->x, cam->y); + + prefswindow = glade_xml_get_widget (cam->xml, "prefswindow"); +} + +int main (int argc, char *argv[]) +{ + cam cam_object, *cam; + Display *display; + Screen *screen_num; + gchar *poopoo = NULL; + gchar *pixfilename = "camorama/camorama.png"; + gchar *filename; //= "/usr/opt/garnome/share/camorama/camorama.glade"; + int x = -1, y = -1; + gboolean buggery = FALSE; + GtkWidget *button; + GConfClient *gc; + + const struct poptOption popt_options[] = { + {"version", 'V', POPT_ARG_NONE, &ver, 0, + N_("show version and exit"), NULL}, + {"device", 'd', POPT_ARG_STRING, &poopoo, 0, + N_("v4l device to use"), NULL}, + {"debug", 'D', POPT_ARG_NONE, &buggery, 0, + N_("enable debuging code"), NULL}, + {"width", 'x', POPT_ARG_INT, &x, 0, N_("capture width"), + NULL}, + {"height", 'y', POPT_ARG_INT, &y, 0, N_("capture height"), + NULL}, + {"max", 'M', POPT_ARG_NONE, &max, 0, + N_("maximum capture size"), NULL}, + {"min", 'm', POPT_ARG_NONE, &min, 0, + N_("minimum capture size"), NULL}, + {"half", 'H', POPT_ARG_NONE, &half, 0, + N_("middle capture size"), NULL}, + {"read", 'R', POPT_ARG_NONE, &use_read, 0, + N_("use read() rather than mmap()"), NULL}, + POPT_TABLEEND + }; + + cam = &cam_object; + /* set some default values */ + cam->frame_number = 0; + cam->pic = NULL; + cam->pixmap = NULL; + cam->size = PICHALF; + cam->video_dev = NULL; + cam->read = FALSE; + + bindtextdomain (GETTEXT_PACKAGE, GNOMELOCALEDIR); + bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8"); + textdomain (GETTEXT_PACKAGE); + setlocale (LC_ALL, ""); + + /* gnome_program_init - initialize everything (gconf, threads, etc) */ + gnome_program_init (PACKAGE, VERSION, LIBGNOMEUI_MODULE, argc, argv, + GNOME_PARAM_APP_DATADIR, DATADIR, + GNOME_PARAM_POPT_TABLE, popt_options, + GNOME_PARAM_HUMAN_READABLE_NAME, _("camorama"), NULL); + + cam->debug = buggery; + + if (poopoo == NULL) { + cam->video_dev = g_strdup ("/dev/video0"); + } else { + cam->video_dev = g_strdup (poopoo); + } + cam->x = x; + cam->y = y; + glade_gnome_init (); + + if (ver) { + fprintf (stderr, _("\n\nCamorama version %s\n\n"), VERSION); + exit (0); + } + if (max) { + cam->size = PICMAX; + } + if (min) { + cam->size = PICMIN; + } + if (half) { + cam->size = PICHALF; + } + if (use_read) { + printf ("gah!\n"); + cam->read = TRUE; + } + gc = gconf_client_get_default (); + cam->gc = gc; + + gconf_client_add_dir (cam->gc, PATH, GCONF_CLIENT_PRELOAD_NONE, NULL); + gconf_client_notify_add (cam->gc, KEY1, (void *) gconf_notify_func, + cam->pixdir, NULL, NULL); + gconf_client_notify_add (cam->gc, KEY5, (void *) gconf_notify_func, + cam->rhost, NULL, NULL); + gconf_client_notify_add (cam->gc, KEY2, (void *) gconf_notify_func, + cam->capturefile, NULL, NULL); + gconf_client_notify_add (cam->gc, KEY3, + (void *) gconf_notify_func_int, + GINT_TO_POINTER (cam->savetype), NULL, NULL); + gconf_client_notify_add (cam->gc, KEY4, + (void *) gconf_notify_func_bool, + &cam->timestamp, NULL, NULL); + + cam->pixdir = g_strdup (gconf_client_get_string (cam->gc, KEY1, NULL)); + cam->capturefile = + g_strdup (gconf_client_get_string (cam->gc, KEY2, NULL)); + cam->rhost = g_strdup (gconf_client_get_string (cam->gc, KEY5, NULL)); + cam->rlogin = g_strdup (gconf_client_get_string (cam->gc, KEY6, NULL)); + cam->rpw = g_strdup (gconf_client_get_string (cam->gc, KEY7, NULL)); + cam->rpixdir = g_strdup (gconf_client_get_string (cam->gc, KEY8, NULL)); + cam->rcapturefile = + g_strdup (gconf_client_get_string (cam->gc, KEY9, NULL)); + cam->savetype = gconf_client_get_int (cam->gc, KEY3, NULL); + cam->rsavetype = gconf_client_get_int (cam->gc, KEY10, NULL); + cam->ts_string = + g_strdup (gconf_client_get_string (cam->gc, KEY16, NULL)); + cam->date_format = "%Y-%m-%d %H:%M:%S"; + cam->timestamp = gconf_client_get_bool (cam->gc, KEY4, NULL); + cam->rtimestamp = gconf_client_get_bool (cam->gc, KEY11, NULL); + + cam->cap = gconf_client_get_bool (cam->gc, KEY12, NULL); + cam->rcap = gconf_client_get_bool (cam->gc, KEY13, NULL); + cam->timefn = gconf_client_get_bool (cam->gc, KEY14, NULL); + cam->rtimefn = gconf_client_get_bool (cam->gc, KEY15, NULL); + cam->usestring = gconf_client_get_bool (cam->gc, KEY18, NULL); + cam->usedate = gconf_client_get_bool (cam->gc, KEY19, NULL); + cam->acap = gconf_client_get_bool (cam->gc, KEY20, NULL); + cam->timeout_interval = gconf_client_get_int (cam->gc, KEY21, NULL); + cam->show_adjustments = gconf_client_get_bool (cam->gc, KEY22, NULL); + + /* get desktop depth */ + display = (Display *) gdk_x11_get_default_xdisplay (); + screen_num = xlib_rgb_get_screen (); + gdk_pixbuf_xlib_init (display, 0); + cam->desk_depth = xlib_rgb_get_depth (); + + func_state.wacky = 0; + func_state.threshold = 0; + func_state.laplace = 0; + func_state.negative = 0; + func_state.colour = 0; + func_state.mirror = 0; + func_state.smooth = 0; + func_state.fc = 1; + + cam->dither = 128; + + cam->dev = open (cam->video_dev, O_RDWR); + + camera_cap (cam); + get_win_info (cam); + + /* query/set window attributes */ + cam->vid_win.x = 0; + cam->vid_win.y = 0; + cam->vid_win.width = cam->x; + cam->vid_win.height = cam->y; + cam->vid_win.chromakey = 0; + cam->vid_win.flags = 0; + + set_win_info (cam); + get_win_info (cam); + + /* get picture attributes */ + get_pic_info (cam); + + /* set_pic_info(cam); */ + cam->contrast = cam->vid_pic.contrast; + cam->brightness = cam->vid_pic.brightness; + cam->colour = cam->vid_pic.colour; + cam->hue = cam->vid_pic.hue; + cam->wb = cam->vid_pic.whiteness; + cam->depth = cam->vid_pic.depth / 8; + cam->pic_buf = malloc (cam->x * cam->y * cam->depth); + cam->tmp = + malloc (cam->vid_cap.maxwidth * cam->vid_cap.maxheight * cam->depth); + //cam->tmp = NULL; + /* set the buffer size */ + if (cam->read == FALSE) { + set_buffer (cam); + } + //cam->read = FALSE; + /* initialize cam and create the window */ + + if (cam->read == FALSE) { + pt2Function = timeout_func; + init_cam (NULL, cam); + } else { + printf ("using read()\n"); + cam->pic = + realloc (cam->pic, + (cam->vid_cap.maxwidth * cam->vid_cap.maxheight * 3)); + pt2Function = read_timeout_func; + } + cam->pixmap = gdk_pixmap_new (NULL, cam->x, cam->y, cam->desk_depth); + + filename = + gnome_program_locate_file (NULL, + GNOME_FILE_DOMAIN_APP_DATADIR, + "camorama/camorama.glade", TRUE, NULL); + if (filename == NULL) { + error_dialog (_ + ("Couldn't find the main interface file (camorama.glade).")); + exit (1); + } + //pixfilename = gnome_program_locate_file(NULL, GNOME_FILE_DOMAIN_APP_DATADIR, "pixmaps/camorama.png", TRUE, NULL); + //printf("pixfile = %s\n",pixfilename); + //pixfilename); + //printf("pixfile = %s\n",pixfilename); + cam->xml = glade_xml_new (filename, NULL, NULL); + /*eggtray */ + + /*tray_icon = egg_tray_icon_new ("Our other cool tray icon"); + * button = gtk_button_new_with_label ("This is a another\ncool tray icon"); + * g_signal_connect (button, "clicked", + * G_CALLBACK (second_button_pressed), tray_icon); + * + * gtk_container_add (GTK_CONTAINER (tray_icon), button); + * gtk_widget_show_all (GTK_WIDGET (tray_icon)); */ + load_interface (cam); + + cam->idle_id = gtk_idle_add ((GSourceFunc) pt2Function, (gpointer) cam); + + gtk_timeout_add (2000, (GSourceFunc) fps, cam->status); + gdk_threads_enter (); + gtk_main (); + gdk_threads_leave (); + return 0; +} diff --git a/src/support.c b/src/support.c new file mode 100644 index 0000000..0d75b90 --- /dev/null +++ b/src/support.c @@ -0,0 +1,92 @@ +#include <sys/types.h> +#include <sys/stat.h> +#include <unistd.h> +#include <string.h> + +#include <gdk/gdkkeysyms.h> +#include <gtk/gtk.h> +#include <gnome.h> +#include "callbacks.h" +#include "interface.h" +#include "support.h" +#include <config.h> + +GtkWidget *xpm_label_box (gchar * xpm_filename) +{ + GtkWidget *box; + GtkWidget *image; + + /* Create box for image and label */ + box = gtk_hbox_new (FALSE, 0); + gtk_container_set_border_width (GTK_CONTAINER (box), 2); + + /* Now on to the image stuff */ + image = gtk_image_new_from_file (xpm_filename); + + /* Create a label for the button */ + + /* Pack the image and label into the box */ + gtk_box_pack_start (GTK_BOX (box), image, FALSE, FALSE, 3); + + gtk_widget_show (image); + + return box; +} +GtkWidget *lookup_widget (GtkWidget * widget, const gchar * widget_name) +{ + GtkWidget *parent, *found_widget; + + for (;;) { + if (GTK_IS_MENU (widget)) + parent = gtk_menu_get_attach_widget (GTK_MENU (widget)); + else + parent = widget->parent; + if (parent == NULL) + break; + widget = parent; + } + + found_widget = + (GtkWidget *) gtk_object_get_data (GTK_OBJECT (widget), widget_name); + if (!found_widget) + g_warning ("Widget not found: %s", widget_name); + return found_widget; +} +GdkPixbuf *create_pixbuf (const gchar * filename) +{ + gchar *pathname = NULL; + GdkPixbuf *pixbuf; + GError *error = NULL; + + if (!filename || !filename[0]) + return NULL; + + pathname = + gnome_program_locate_file (NULL, GNOME_FILE_DOMAIN_APP_PIXMAP, + filename, TRUE, NULL); + + if (!pathname) { + g_warning (_("Couldn't find pixmap file: %s"), filename); + return NULL; + } + pixbuf = gdk_pixbuf_new_from_file (pathname, &error); + if (!pixbuf) { + fprintf (stderr, "Failed to load pixbuf file: %s: %s\n", pathname, + error->message); + g_error_free (error); + } + g_free (pathname); + return pixbuf; +} + +int error_dialog (char *message) +{ + GtkWidget *dialog; + int test; + + dialog = + gnome_message_box_new (message, GNOME_MESSAGE_BOX_ERROR, + GNOME_STOCK_BUTTON_CLOSE, NULL); + test = gnome_dialog_run (GNOME_DIALOG (dialog)); + return test; +} diff --git a/src/support.h b/src/support.h new file mode 100644 index 0000000..82b0401 --- /dev/null +++ b/src/support.h @@ -0,0 +1,3 @@ +GtkWidget *xpm_label_box (gchar *); +int error_dialog (char *); +GdkPixbuf *create_pixbuf (const gchar * filename); diff --git a/src/v4l.c b/src/v4l.c new file mode 100644 index 0000000..f337e02 --- /dev/null +++ b/src/v4l.c @@ -0,0 +1,252 @@ +#include"v4l.h" +#include<time.h> +#include<errno.h> +#include<gnome.h> +#include "support.h" + +extern int frame_number; +extern int errno; + +void print_cam(cam *cam){ + printf("\nCamera Info\n"); + printf("-------------\n"); + printf("device = %s, x = %d, y = %d\n",cam->video_dev, cam->x,cam->y); + printf("depth = %d, desk_depth = %d, size = %d\n",cam->depth,cam->desk_depth,cam->size); + printf("capture directory = %s, capture file = %s\n",cam->pixdir, cam->capturefile); + printf("remote capture directory = %s, remote capture file = %s\n",cam->rpixdir, cam->rcapturefile); + printf("remote host = %s, remote login = %s\n",cam->rhost,cam->rlogin); + printf("timestamp = %s\n\n",cam->ts_string); + +} +void print_palette(int p) +{ + + switch (p) { + case VIDEO_PALETTE_HI240: + printf("High 240 cube (BT848)\n"); + break; + + case VIDEO_PALETTE_RGB565: + printf("565 16 bit RGB\n"); + break; + + case VIDEO_PALETTE_RGB24: + printf("24bit RGB\n"); + break; + + case VIDEO_PALETTE_RGB32: + printf("32bit RGB\n"); + break; + + case VIDEO_PALETTE_RGB555: + printf("555 15bit RGB\n"); + break; + + case VIDEO_PALETTE_YUV422: + printf("YUV422 capture"); + break; + + case VIDEO_PALETTE_YUYV: + printf("YUYV\n"); + break; + + case VIDEO_PALETTE_UYVY: + printf("UYVY\n"); + break; + + case VIDEO_PALETTE_YUV420: + printf("YUV420\n"); + break; + + case VIDEO_PALETTE_YUV411: + printf("YUV411 capture\n"); + break; + + case VIDEO_PALETTE_RAW: + printf("RAW capture (BT848)\n"); + break; + + case VIDEO_PALETTE_YUV422P: + printf("YUV 4:2:2 Planar"); + break; + + case VIDEO_PALETTE_YUV411P: + printf("YUV 4:1:1 Planar\n"); + break; + + case VIDEO_PALETTE_YUV420P: + printf("YUV 4:2:0 Planar\n"); + break; + + case VIDEO_PALETTE_YUV410P: + printf("YUV 4:1:0 Planar\n"); + break; + } +} + +void camera_cap(cam * cam) +{ + char *msg; + if(ioctl(cam->dev, VIDIOCGCAP, &cam->vid_cap) == -1) { + if(cam->debug == TRUE) { + fprintf(stderr, "VIDIOCGCAP -- could not get camera capabilities, exiting.....\n"); + } + msg = g_strdup_printf(_("Could not connect to video device (%s).\nPlease check connection."), cam->video_dev); + error_dialog(msg); + g_free(msg); + exit(0); + } + if(cam->x > 0 && cam->y > 0) { + if(cam->vid_cap.maxwidth < cam->x) { + cam->x = cam->vid_cap.maxwidth; + } + if(cam->vid_cap.minwidth > cam->x) { + cam->x = cam->vid_cap.minwidth; + } + if(cam->vid_cap.maxheight < cam->y) { + cam->y = cam->vid_cap.maxheight; + } + if(cam->vid_cap.minheight > cam->y) { + cam->y = cam->vid_cap.minheight; + } + } else { + switch (cam->size) { + case PICMAX: + cam->x = cam->vid_cap.maxwidth; + cam->y = cam->vid_cap.maxheight; + break; + + case PICMIN: + cam->x = cam->vid_cap.minwidth; + cam->y = cam->vid_cap.minheight; + break; + + case PICHALF: + cam->x = cam->vid_cap.maxwidth / 2; + cam->y = cam->vid_cap.maxheight / 2; + break; + + default: + cam->x = cam->vid_cap.maxwidth / 2; + cam->y = cam->vid_cap.maxheight / 2; + break; + } + } + if((cam->vid_cap.type & VID_TYPE_CAPTURE) != 1) { + cam->read = TRUE; + } + + if(cam->debug == TRUE) { + printf("\nVIDIOCGCAP\n"); + printf("device name = %s\n", cam->vid_cap.name); + printf("device type = %d\n", cam->vid_cap.type); + if(cam->read == FALSE){ + printf("can use mmap()\n"); + } + printf("# of channels = %d\n", cam->vid_cap.channels); + printf("# of audio devices = %d\n", cam->vid_cap.audios); + printf("max width = %d\n", cam->vid_cap.maxwidth); + printf("max height = %d\n", cam->vid_cap.maxheight); + printf("min width = %d\n", cam->vid_cap.minwidth); + printf("min height = %d\n", cam->vid_cap.minheight); + } +} +void set_pic_info(cam * cam) +{ + char *msg; + if(ioctl(cam->dev, VIDIOCSPICT, &cam->vid_pic) == -1) { + if(cam->debug == TRUE) { + fprintf(stderr, "VIDIOCSPICT -- could not set picture info, exiting....\n"); + } + msg = g_strdup_printf(_("Could not connect to video device (%s).\nPlease check connection."), cam->video_dev); + error_dialog(msg); + g_free(msg); + exit(0); + } + +} + +void get_pic_info(cam * cam) +{ + char *msg; + + if(ioctl(cam->dev, VIDIOCGPICT, &cam->vid_pic) == -1) { + msg = g_strdup_printf(_("Could not connect to video device (%s).\nPlease check connection."), cam->video_dev); + error_dialog(msg); + if(cam->debug == TRUE) { + fprintf(stderr, "VIDIOCGPICT -- could not get picture info, exiting....\n"); + } + g_free(msg); + exit(0); + } + + if(cam->debug == TRUE) { + printf("\nVIDIOCGPICT:\n"); + printf("bright = %d\n", cam->vid_pic.brightness); + printf("hue = %d\n", cam->vid_pic.hue); + printf("colour = %d\n", cam->vid_pic.colour); + printf("contrast = %d\n", cam->vid_pic.contrast); + printf("whiteness = %d\n", cam->vid_pic.whiteness); + printf("colour depth = %d\n", cam->vid_pic.depth); + print_palette(cam->vid_pic.palette); + } +} + +void get_win_info(cam * cam) +{ + gchar *msg; + if(ioctl(cam->dev, VIDIOCGWIN, &cam->vid_win) == -1) { + msg = g_strdup_printf(_("Could not connect to video device (%s).\nPlease check connection."), cam->video_dev); + error_dialog(msg); + if(cam->debug == TRUE) { + fprintf(stderr, "VIDIOCGWIN -- could not get window info, exiting....\n"); + } + exit(0); + } + if(cam->debug == TRUE) { + printf("\nVIDIOCGWIN\n"); + printf("x = %d\n", cam->vid_win.x); + printf("y = %d\n", cam->vid_win.y); + printf("width = %d\n", cam->vid_win.width); + printf("height = %d\n", cam->vid_win.height); + printf("chromakey = %d\n", cam->vid_win.chromakey); + printf("flags = %d\n", cam->vid_win.flags); + } +} +void set_win_info(cam * cam) +{ + gchar *msg; + if(ioctl(cam->dev, VIDIOCSWIN, &cam->vid_win) == -1) { + msg = g_strdup_printf(_("Could not connect to video device (%s).\nPlease check connection."), cam->video_dev); + error_dialog(msg); + if(cam->debug == TRUE) { + fprintf(stderr, "VIDIOCSWIN -- could not set window info, exiting....\nerrno = %d", errno); + } + g_free(msg); + exit(0); + } + +} + +void set_buffer(cam * cam) +{ + char *msg; + if(ioctl(cam->dev, VIDIOCGMBUF, &cam->vid_buf) == -1) { + msg = g_strdup_printf(_("Could not connect to video device (%s).\nPlease check connection."), cam->video_dev); + error_dialog(msg); + if(cam->debug == TRUE) { + fprintf(stderr, "VIDIOCGMBF -- could not set buffer info, exiting...\n"); + } + g_free(msg); + exit(0); + + } + + if(cam->debug == TRUE) { + printf("\nVIDIOCGMBUF\n"); + printf("mb.size = %d\n", cam->vid_buf.size); + printf("mb.frames = %d\n", cam->vid_buf.frames); + printf("mb.offset = %d\n", cam->vid_buf.offsets[1]); + } + +} diff --git a/src/v4l.h b/src/v4l.h new file mode 100644 index 0000000..5b8ff10 --- /dev/null +++ b/src/v4l.h @@ -0,0 +1,71 @@ +#include <unistd.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <getopt.h> +#include <sys/types.h> +#include <sys/stat.h> +#include <sys/ioctl.h> +#include <sys/mman.h> +#include <fcntl.h> +#include <gtk/gtk.h> +#include <linux/types.h> +#include <linux/videodev.h> +#include <signal.h> +#include <png.h> +#include <glade/glade.h> +#include <gconf/gconf-client.h> +#include "eggtrayicon.h" + +#define PICMAX 0 +#define PICMIN 1 +#define PICHALF 2 +#define JPEG 0 +#define PNG 1 +#define PPM 2 + +typedef struct camera { + int dev; + int x; + int y; + int depth; + int desk_depth; + int size; + int dither; + int contrast, brightness, colour, hue, wb; + int frame_number; + struct video_capability vid_cap; + struct video_picture vid_pic; + struct video_window vid_win; + struct video_mbuf vid_buf; + struct video_mmap vid_map; + char *video_dev; + unsigned char *pic; + unsigned char *image; + gchar *capturefile, *rcapturefile; + gchar *pixdir, *rpixdir; + int savetype, rsavetype; + gchar *rhost, *rlogin, *rpw; + gchar *ts_string; + gchar *date_format; + gboolean debug, read, hidden; + gboolean cap, rcap, acap, show_adjustments; + gboolean timestamp, rtimestamp, usedate, usestring; + gboolean rtimefn, timefn; + GdkPixmap *pixmap; + GdkWindow *window; + GtkWidget *da, *tooltips, *tray_tooltip, *status; + unsigned char *pic_buf, *tmp; + guint timeout_id, idle_id; + guint32 timeout_interval; + GConfClient *gc; + GladeXML *xml; + EggTrayIcon *tray_icon; +} cam; + +void camera_cap (cam *); +void set_win_info (cam * cam); +void get_pic_info (cam *); +void set_pic_info (cam *); +void get_win_info (cam *); +void set_buffer (cam *); |