diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-19 03:13:10 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-19 03:13:10 +0000 |
commit | 3c57dd931145d43f2b0aef96c4d178135956bf91 (patch) | |
tree | 3de698981e9f0cc2c4f9569b19a5f3595e741f6b /plug-ins/gimpressionist | |
parent | Initial commit. (diff) | |
download | gimp-3c57dd931145d43f2b0aef96c4d178135956bf91.tar.xz gimp-3c57dd931145d43f2b0aef96c4d178135956bf91.zip |
Adding upstream version 2.10.36.upstream/2.10.36
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'plug-ins/gimpressionist')
134 files changed, 13611 insertions, 0 deletions
diff --git a/plug-ins/gimpressionist/Brushes/Makefile.am b/plug-ins/gimpressionist/Brushes/Makefile.am new file mode 100644 index 0000000..fa8860d --- /dev/null +++ b/plug-ins/gimpressionist/Brushes/Makefile.am @@ -0,0 +1,66 @@ +## Process this file with automake to produce Makefile.in + +brushdatadir = $(gimpdatadir)/gimpressionist/Brushes + +brushdata_DATA = \ + arrow01.pgm \ + ball.ppm \ + blob.ppm \ + box.ppm \ + chalk01.pgm \ + cone.ppm \ + crayon01.pgm \ + crayon02.pgm \ + crayon03.pgm \ + crayon04.pgm \ + crayon05.pgm \ + crayon06.pgm \ + crayon07.pgm \ + crayon08.pgm \ + defaultbrush.pgm \ + dribble.pgm \ + fabric.pgm \ + fabric01.pgm \ + fabric02.pgm \ + fabric03.pgm \ + flower01.pgm \ + flower02.pgm \ + flower03.pgm \ + flower04.pgm \ + grad01.pgm \ + grad02.pgm \ + grad03.pgm \ + heart.ppm \ + leaf01.pgm \ + paintbrush01.pgm \ + paintbrush02.pgm \ + paintbrush03.pgm \ + paintbrush04.pgm \ + paper01.pgm \ + paper02.pgm \ + paper03.pgm \ + paper04.pgm \ + pentagram.pgm \ + scribble.pgm \ + shape01.pgm \ + shape02.pgm \ + shape03.pgm \ + shape04.pgm \ + snow1.pgm \ + sphere.ppm \ + splat1.pgm \ + splat2.pgm \ + splat3.pgm \ + spunge01.pgm \ + spunge02.pgm \ + spunge03.pgm \ + spunge04.pgm \ + spunge05.pgm \ + strange01.pgm \ + thegimp.pgm \ + torus.ppm \ + wavy.pgm \ + weave.pgm \ + worm.pgm + +EXTRA_DIST = $(brushdata_DATA) diff --git a/plug-ins/gimpressionist/Brushes/Makefile.in b/plug-ins/gimpressionist/Brushes/Makefile.in new file mode 100644 index 0000000..2c35feb --- /dev/null +++ b/plug-ins/gimpressionist/Brushes/Makefile.in @@ -0,0 +1,864 @@ +# Makefile.in generated by automake 1.16.3 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994-2020 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@ + +VPATH = @srcdir@ +am__is_gnu_make = { \ + if test -z '$(MAKELEVEL)'; then \ + false; \ + elif test -n '$(MAKE_HOST)'; then \ + true; \ + elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ + true; \ + else \ + false; \ + fi; \ +} +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +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 = : +build_triplet = @build@ +host_triplet = @host@ +subdir = plug-ins/gimpressionist/Brushes +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ + $(top_srcdir)/m4macros/alsa.m4 \ + $(top_srcdir)/m4macros/ax_compare_version.m4 \ + $(top_srcdir)/m4macros/ax_cxx_compile_stdcxx.m4 \ + $(top_srcdir)/m4macros/ax_gcc_func_attribute.m4 \ + $(top_srcdir)/m4macros/ax_prog_cc_for_build.m4 \ + $(top_srcdir)/m4macros/ax_prog_perl_version.m4 \ + $(top_srcdir)/m4macros/detectcflags.m4 \ + $(top_srcdir)/m4macros/pythondev.m4 $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = +SOURCES = +DIST_SOURCES = +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__uninstall_files_from_dir = { \ + test -z "$$files" \ + || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ + || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ + $(am__cd) "$$dir" && rm -f $$files; }; \ + } +am__installdirs = "$(DESTDIR)$(brushdatadir)" +DATA = $(brushdata_DATA) +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +am__DIST_COMMON = $(srcdir)/Makefile.in +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +AA_LIBS = @AA_LIBS@ +ACLOCAL = @ACLOCAL@ +ALLOCA = @ALLOCA@ +ALL_LINGUAS = @ALL_LINGUAS@ +ALSA_CFLAGS = @ALSA_CFLAGS@ +ALSA_LIBS = @ALSA_LIBS@ +ALTIVEC_EXTRA_CFLAGS = @ALTIVEC_EXTRA_CFLAGS@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +APPSTREAM_UTIL = @APPSTREAM_UTIL@ +AR = @AR@ +AS = @AS@ +ATK_CFLAGS = @ATK_CFLAGS@ +ATK_LIBS = @ATK_LIBS@ +ATK_REQUIRED_VERSION = @ATK_REQUIRED_VERSION@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BABL_CFLAGS = @BABL_CFLAGS@ +BABL_LIBS = @BABL_LIBS@ +BABL_REQUIRED_VERSION = @BABL_REQUIRED_VERSION@ +BUG_REPORT_URL = @BUG_REPORT_URL@ +BUILD_EXEEXT = @BUILD_EXEEXT@ +BUILD_OBJEXT = @BUILD_OBJEXT@ +BZIP2_LIBS = @BZIP2_LIBS@ +CAIRO_CFLAGS = @CAIRO_CFLAGS@ +CAIRO_LIBS = @CAIRO_LIBS@ +CAIRO_PDF_CFLAGS = @CAIRO_PDF_CFLAGS@ +CAIRO_PDF_LIBS = @CAIRO_PDF_LIBS@ +CAIRO_PDF_REQUIRED_VERSION = @CAIRO_PDF_REQUIRED_VERSION@ +CAIRO_REQUIRED_VERSION = @CAIRO_REQUIRED_VERSION@ +CATALOGS = @CATALOGS@ +CATOBJEXT = @CATOBJEXT@ +CC = @CC@ +CCAS = @CCAS@ +CCASDEPMODE = @CCASDEPMODE@ +CCASFLAGS = @CCASFLAGS@ +CCDEPMODE = @CCDEPMODE@ +CC_FOR_BUILD = @CC_FOR_BUILD@ +CC_VERSION = @CC_VERSION@ +CFLAGS = @CFLAGS@ +CFLAGS_FOR_BUILD = @CFLAGS_FOR_BUILD@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CPPFLAGS_FOR_BUILD = @CPPFLAGS_FOR_BUILD@ +CPP_FOR_BUILD = @CPP_FOR_BUILD@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DATADIRNAME = @DATADIRNAME@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DESKTOP_DATADIR = @DESKTOP_DATADIR@ +DESKTOP_FILE_VALIDATE = @DESKTOP_FILE_VALIDATE@ +DLLTOOL = @DLLTOOL@ +DOC_SHOOTER = @DOC_SHOOTER@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +FILE_AA = @FILE_AA@ +FILE_EXR = @FILE_EXR@ +FILE_HEIF = @FILE_HEIF@ +FILE_JP2_LOAD = @FILE_JP2_LOAD@ +FILE_JPEGXL = @FILE_JPEGXL@ +FILE_MNG = @FILE_MNG@ +FILE_PDF_SAVE = @FILE_PDF_SAVE@ +FILE_PS = @FILE_PS@ +FILE_WMF = @FILE_WMF@ +FILE_XMC = @FILE_XMC@ +FILE_XPM = @FILE_XPM@ +FONTCONFIG_CFLAGS = @FONTCONFIG_CFLAGS@ +FONTCONFIG_LIBS = @FONTCONFIG_LIBS@ +FONTCONFIG_REQUIRED_VERSION = @FONTCONFIG_REQUIRED_VERSION@ +FREETYPE2_REQUIRED_VERSION = @FREETYPE2_REQUIRED_VERSION@ +FREETYPE_CFLAGS = @FREETYPE_CFLAGS@ +FREETYPE_LIBS = @FREETYPE_LIBS@ +GDBUS_CODEGEN = @GDBUS_CODEGEN@ +GDK_PIXBUF_CFLAGS = @GDK_PIXBUF_CFLAGS@ +GDK_PIXBUF_CSOURCE = @GDK_PIXBUF_CSOURCE@ +GDK_PIXBUF_LIBS = @GDK_PIXBUF_LIBS@ +GDK_PIXBUF_REQUIRED_VERSION = @GDK_PIXBUF_REQUIRED_VERSION@ +GEGL = @GEGL@ +GEGL_CFLAGS = @GEGL_CFLAGS@ +GEGL_LIBS = @GEGL_LIBS@ +GEGL_MAJOR_MINOR_VERSION = @GEGL_MAJOR_MINOR_VERSION@ +GEGL_REQUIRED_VERSION = @GEGL_REQUIRED_VERSION@ +GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ +GEXIV2_CFLAGS = @GEXIV2_CFLAGS@ +GEXIV2_LIBS = @GEXIV2_LIBS@ +GEXIV2_REQUIRED_VERSION = @GEXIV2_REQUIRED_VERSION@ +GIMP_API_VERSION = @GIMP_API_VERSION@ +GIMP_APP_VERSION = @GIMP_APP_VERSION@ +GIMP_BINARY_AGE = @GIMP_BINARY_AGE@ +GIMP_COMMAND = @GIMP_COMMAND@ +GIMP_DATA_VERSION = @GIMP_DATA_VERSION@ +GIMP_FULL_NAME = @GIMP_FULL_NAME@ +GIMP_INTERFACE_AGE = @GIMP_INTERFACE_AGE@ +GIMP_MAJOR_VERSION = @GIMP_MAJOR_VERSION@ +GIMP_MICRO_VERSION = @GIMP_MICRO_VERSION@ +GIMP_MINOR_VERSION = @GIMP_MINOR_VERSION@ +GIMP_MKENUMS = @GIMP_MKENUMS@ +GIMP_MODULES = @GIMP_MODULES@ +GIMP_PACKAGE_REVISION = @GIMP_PACKAGE_REVISION@ +GIMP_PKGCONFIG_VERSION = @GIMP_PKGCONFIG_VERSION@ +GIMP_PLUGINS = @GIMP_PLUGINS@ +GIMP_PLUGIN_VERSION = @GIMP_PLUGIN_VERSION@ +GIMP_REAL_VERSION = @GIMP_REAL_VERSION@ +GIMP_RELEASE = @GIMP_RELEASE@ +GIMP_SYSCONF_VERSION = @GIMP_SYSCONF_VERSION@ +GIMP_TOOL_VERSION = @GIMP_TOOL_VERSION@ +GIMP_UNSTABLE = @GIMP_UNSTABLE@ +GIMP_USER_VERSION = @GIMP_USER_VERSION@ +GIMP_VERSION = @GIMP_VERSION@ +GIO_CFLAGS = @GIO_CFLAGS@ +GIO_LIBS = @GIO_LIBS@ +GIO_UNIX_CFLAGS = @GIO_UNIX_CFLAGS@ +GIO_UNIX_LIBS = @GIO_UNIX_LIBS@ +GIO_WINDOWS_CFLAGS = @GIO_WINDOWS_CFLAGS@ +GIO_WINDOWS_LIBS = @GIO_WINDOWS_LIBS@ +GLIB_CFLAGS = @GLIB_CFLAGS@ +GLIB_COMPILE_RESOURCES = @GLIB_COMPILE_RESOURCES@ +GLIB_GENMARSHAL = @GLIB_GENMARSHAL@ +GLIB_LIBS = @GLIB_LIBS@ +GLIB_MKENUMS = @GLIB_MKENUMS@ +GLIB_REQUIRED_VERSION = @GLIB_REQUIRED_VERSION@ +GMODULE_NO_EXPORT_CFLAGS = @GMODULE_NO_EXPORT_CFLAGS@ +GMODULE_NO_EXPORT_LIBS = @GMODULE_NO_EXPORT_LIBS@ +GMOFILES = @GMOFILES@ +GMSGFMT = @GMSGFMT@ +GOBJECT_QUERY = @GOBJECT_QUERY@ +GREP = @GREP@ +GS_LIBS = @GS_LIBS@ +GTKDOC_CHECK = @GTKDOC_CHECK@ +GTKDOC_CHECK_PATH = @GTKDOC_CHECK_PATH@ +GTKDOC_DEPS_CFLAGS = @GTKDOC_DEPS_CFLAGS@ +GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@ +GTKDOC_MKPDF = @GTKDOC_MKPDF@ +GTKDOC_REBASE = @GTKDOC_REBASE@ +GTK_CFLAGS = @GTK_CFLAGS@ +GTK_LIBS = @GTK_LIBS@ +GTK_MAC_INTEGRATION_CFLAGS = @GTK_MAC_INTEGRATION_CFLAGS@ +GTK_MAC_INTEGRATION_LIBS = @GTK_MAC_INTEGRATION_LIBS@ +GTK_REQUIRED_VERSION = @GTK_REQUIRED_VERSION@ +GTK_UPDATE_ICON_CACHE = @GTK_UPDATE_ICON_CACHE@ +GUDEV_CFLAGS = @GUDEV_CFLAGS@ +GUDEV_LIBS = @GUDEV_LIBS@ +HARFBUZZ_CFLAGS = @HARFBUZZ_CFLAGS@ +HARFBUZZ_LIBS = @HARFBUZZ_LIBS@ +HARFBUZZ_REQUIRED_VERSION = @HARFBUZZ_REQUIRED_VERSION@ +HAVE_CXX14 = @HAVE_CXX14@ +HAVE_FINITE = @HAVE_FINITE@ +HAVE_ISFINITE = @HAVE_ISFINITE@ +HAVE_VFORK = @HAVE_VFORK@ +HOST_GLIB_COMPILE_RESOURCES = @HOST_GLIB_COMPILE_RESOURCES@ +HTML_DIR = @HTML_DIR@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INSTOBJEXT = @INSTOBJEXT@ +INTLLIBS = @INTLLIBS@ +INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@ +INTLTOOL_MERGE = @INTLTOOL_MERGE@ +INTLTOOL_PERL = @INTLTOOL_PERL@ +INTLTOOL_REQUIRED_VERSION = @INTLTOOL_REQUIRED_VERSION@ +INTLTOOL_UPDATE = @INTLTOOL_UPDATE@ +INTLTOOL_V_MERGE = @INTLTOOL_V_MERGE@ +INTLTOOL_V_MERGE_OPTIONS = @INTLTOOL_V_MERGE_OPTIONS@ +INTLTOOL__v_MERGE_ = @INTLTOOL__v_MERGE_@ +INTLTOOL__v_MERGE_0 = @INTLTOOL__v_MERGE_0@ +INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ +ISO_CODES_LOCALEDIR = @ISO_CODES_LOCALEDIR@ +ISO_CODES_LOCATION = @ISO_CODES_LOCATION@ +JPEG_LIBS = @JPEG_LIBS@ +JSON_GLIB_CFLAGS = @JSON_GLIB_CFLAGS@ +JSON_GLIB_LIBS = @JSON_GLIB_LIBS@ +JXL_CFLAGS = @JXL_CFLAGS@ +JXL_LIBS = @JXL_LIBS@ +JXL_THREADS_CFLAGS = @JXL_THREADS_CFLAGS@ +JXL_THREADS_LIBS = @JXL_THREADS_LIBS@ +LCMS_CFLAGS = @LCMS_CFLAGS@ +LCMS_LIBS = @LCMS_LIBS@ +LCMS_REQUIRED_VERSION = @LCMS_REQUIRED_VERSION@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LDFLAGS_FOR_BUILD = @LDFLAGS_FOR_BUILD@ +LIBBACKTRACE_LIBS = @LIBBACKTRACE_LIBS@ +LIBHEIF_CFLAGS = @LIBHEIF_CFLAGS@ +LIBHEIF_LIBS = @LIBHEIF_LIBS@ +LIBHEIF_REQUIRED_VERSION = @LIBHEIF_REQUIRED_VERSION@ +LIBJXL_REQUIRED_VERSION = @LIBJXL_REQUIRED_VERSION@ +LIBLZMA_REQUIRED_VERSION = @LIBLZMA_REQUIRED_VERSION@ +LIBMYPAINT_CFLAGS = @LIBMYPAINT_CFLAGS@ +LIBMYPAINT_LIBS = @LIBMYPAINT_LIBS@ +LIBMYPAINT_REQUIRED_VERSION = @LIBMYPAINT_REQUIRED_VERSION@ +LIBOBJS = @LIBOBJS@ +LIBPNG_REQUIRED_VERSION = @LIBPNG_REQUIRED_VERSION@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIBUNWIND_CFLAGS = @LIBUNWIND_CFLAGS@ +LIBUNWIND_LIBS = @LIBUNWIND_LIBS@ +LIBUNWIND_REQUIRED_VERSION = @LIBUNWIND_REQUIRED_VERSION@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +LT_CURRENT_MINUS_AGE = @LT_CURRENT_MINUS_AGE@ +LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ +LT_VERSION_INFO = @LT_VERSION_INFO@ +LZMA_CFLAGS = @LZMA_CFLAGS@ +LZMA_LIBS = @LZMA_LIBS@ +MAIL = @MAIL@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MIME_INFO_CFLAGS = @MIME_INFO_CFLAGS@ +MIME_INFO_LIBS = @MIME_INFO_LIBS@ +MIME_TYPES = @MIME_TYPES@ +MKDIR_P = @MKDIR_P@ +MKINSTALLDIRS = @MKINSTALLDIRS@ +MMX_EXTRA_CFLAGS = @MMX_EXTRA_CFLAGS@ +MNG_CFLAGS = @MNG_CFLAGS@ +MNG_LIBS = @MNG_LIBS@ +MSGFMT = @MSGFMT@ +MSGFMT_OPTS = @MSGFMT_OPTS@ +MSGMERGE = @MSGMERGE@ +MYPAINT_BRUSHES_CFLAGS = @MYPAINT_BRUSHES_CFLAGS@ +MYPAINT_BRUSHES_LIBS = @MYPAINT_BRUSHES_LIBS@ +NATIVE_GLIB_CFLAGS = @NATIVE_GLIB_CFLAGS@ +NATIVE_GLIB_LIBS = @NATIVE_GLIB_LIBS@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OPENEXR_CFLAGS = @OPENEXR_CFLAGS@ +OPENEXR_LIBS = @OPENEXR_LIBS@ +OPENEXR_REQUIRED_VERSION = @OPENEXR_REQUIRED_VERSION@ +OPENJPEG_CFLAGS = @OPENJPEG_CFLAGS@ +OPENJPEG_LIBS = @OPENJPEG_LIBS@ +OPENJPEG_REQUIRED_VERSION = @OPENJPEG_REQUIRED_VERSION@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PANGOCAIRO_CFLAGS = @PANGOCAIRO_CFLAGS@ +PANGOCAIRO_LIBS = @PANGOCAIRO_LIBS@ +PANGOCAIRO_REQUIRED_VERSION = @PANGOCAIRO_REQUIRED_VERSION@ +PATHSEP = @PATHSEP@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PERL = @PERL@ +PERL_REQUIRED_VERSION = @PERL_REQUIRED_VERSION@ +PERL_VERSION = @PERL_VERSION@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +PNG_CFLAGS = @PNG_CFLAGS@ +PNG_LIBS = @PNG_LIBS@ +POFILES = @POFILES@ +POPPLER_CFLAGS = @POPPLER_CFLAGS@ +POPPLER_DATA_CFLAGS = @POPPLER_DATA_CFLAGS@ +POPPLER_DATA_LIBS = @POPPLER_DATA_LIBS@ +POPPLER_DATA_REQUIRED_VERSION = @POPPLER_DATA_REQUIRED_VERSION@ +POPPLER_LIBS = @POPPLER_LIBS@ +POPPLER_REQUIRED_VERSION = @POPPLER_REQUIRED_VERSION@ +POSUB = @POSUB@ +PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@ +PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@ +PYBIN_PATH = @PYBIN_PATH@ +PYCAIRO_CFLAGS = @PYCAIRO_CFLAGS@ +PYCAIRO_LIBS = @PYCAIRO_LIBS@ +PYGIMP_EXTRA_CFLAGS = @PYGIMP_EXTRA_CFLAGS@ +PYGTK_CFLAGS = @PYGTK_CFLAGS@ +PYGTK_CODEGEN = @PYGTK_CODEGEN@ +PYGTK_DEFSDIR = @PYGTK_DEFSDIR@ +PYGTK_LIBS = @PYGTK_LIBS@ +PYLINK_LIBS = @PYLINK_LIBS@ +PYTHON = @PYTHON@ +PYTHON2_REQUIRED_VERSION = @PYTHON2_REQUIRED_VERSION@ +PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ +PYTHON_INCLUDES = @PYTHON_INCLUDES@ +PYTHON_PLATFORM = @PYTHON_PLATFORM@ +PYTHON_PREFIX = @PYTHON_PREFIX@ +PYTHON_VERSION = @PYTHON_VERSION@ +RANLIB = @RANLIB@ +RSVG_REQUIRED_VERSION = @RSVG_REQUIRED_VERSION@ +RT_LIBS = @RT_LIBS@ +SCREENSHOT_LIBS = @SCREENSHOT_LIBS@ +SED = @SED@ +SENDMAIL = @SENDMAIL@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SOCKET_LIBS = @SOCKET_LIBS@ +SSE2_EXTRA_CFLAGS = @SSE2_EXTRA_CFLAGS@ +SSE4_1_EXTRA_CFLAGS = @SSE4_1_EXTRA_CFLAGS@ +SSE_EXTRA_CFLAGS = @SSE_EXTRA_CFLAGS@ +STRIP = @STRIP@ +SVG_CFLAGS = @SVG_CFLAGS@ +SVG_LIBS = @SVG_LIBS@ +SYMPREFIX = @SYMPREFIX@ +TIFF_LIBS = @TIFF_LIBS@ +USE_NLS = @USE_NLS@ +VERSION = @VERSION@ +WEBKIT_CFLAGS = @WEBKIT_CFLAGS@ +WEBKIT_LIBS = @WEBKIT_LIBS@ +WEBKIT_REQUIRED_VERSION = @WEBKIT_REQUIRED_VERSION@ +WEBPDEMUX_CFLAGS = @WEBPDEMUX_CFLAGS@ +WEBPDEMUX_LIBS = @WEBPDEMUX_LIBS@ +WEBPMUX_CFLAGS = @WEBPMUX_CFLAGS@ +WEBPMUX_LIBS = @WEBPMUX_LIBS@ +WEBP_CFLAGS = @WEBP_CFLAGS@ +WEBP_LIBS = @WEBP_LIBS@ +WEBP_REQUIRED_VERSION = @WEBP_REQUIRED_VERSION@ +WEB_PAGE = @WEB_PAGE@ +WIN32_LARGE_ADDRESS_AWARE = @WIN32_LARGE_ADDRESS_AWARE@ +WINDRES = @WINDRES@ +WMF_CFLAGS = @WMF_CFLAGS@ +WMF_CONFIG = @WMF_CONFIG@ +WMF_LIBS = @WMF_LIBS@ +WMF_REQUIRED_VERSION = @WMF_REQUIRED_VERSION@ +XDG_EMAIL = @XDG_EMAIL@ +XFIXES_CFLAGS = @XFIXES_CFLAGS@ +XFIXES_LIBS = @XFIXES_LIBS@ +XGETTEXT = @XGETTEXT@ +XGETTEXT_REQUIRED_VERSION = @XGETTEXT_REQUIRED_VERSION@ +XMC_CFLAGS = @XMC_CFLAGS@ +XMC_LIBS = @XMC_LIBS@ +XMKMF = @XMKMF@ +XMLLINT = @XMLLINT@ +XMU_LIBS = @XMU_LIBS@ +XPM_LIBS = @XPM_LIBS@ +XSLTPROC = @XSLTPROC@ +XVFB_RUN = @XVFB_RUN@ +X_CFLAGS = @X_CFLAGS@ +X_EXTRA_LIBS = @X_EXTRA_LIBS@ +X_LIBS = @X_LIBS@ +X_PRE_LIBS = @X_PRE_LIBS@ +Z_LIBS = @Z_LIBS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CC_FOR_BUILD = @ac_ct_CC_FOR_BUILD@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +gimpdatadir = @gimpdatadir@ +gimpdir = @gimpdir@ +gimplocaledir = @gimplocaledir@ +gimpplugindir = @gimpplugindir@ +gimpsysconfdir = @gimpsysconfdir@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +intltool__v_merge_options_ = @intltool__v_merge_options_@ +intltool__v_merge_options_0 = @intltool__v_merge_options_0@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +manpage_gimpdir = @manpage_gimpdir@ +mkdir_p = @mkdir_p@ +ms_librarian = @ms_librarian@ +mypaint_brushes_dir = @mypaint_brushes_dir@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +pkgpyexecdir = @pkgpyexecdir@ +pkgpythondir = @pkgpythondir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +pyexecdir = @pyexecdir@ +pythondir = @pythondir@ +runstatedir = @runstatedir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +brushdatadir = $(gimpdatadir)/gimpressionist/Brushes +brushdata_DATA = \ + arrow01.pgm \ + ball.ppm \ + blob.ppm \ + box.ppm \ + chalk01.pgm \ + cone.ppm \ + crayon01.pgm \ + crayon02.pgm \ + crayon03.pgm \ + crayon04.pgm \ + crayon05.pgm \ + crayon06.pgm \ + crayon07.pgm \ + crayon08.pgm \ + defaultbrush.pgm \ + dribble.pgm \ + fabric.pgm \ + fabric01.pgm \ + fabric02.pgm \ + fabric03.pgm \ + flower01.pgm \ + flower02.pgm \ + flower03.pgm \ + flower04.pgm \ + grad01.pgm \ + grad02.pgm \ + grad03.pgm \ + heart.ppm \ + leaf01.pgm \ + paintbrush01.pgm \ + paintbrush02.pgm \ + paintbrush03.pgm \ + paintbrush04.pgm \ + paper01.pgm \ + paper02.pgm \ + paper03.pgm \ + paper04.pgm \ + pentagram.pgm \ + scribble.pgm \ + shape01.pgm \ + shape02.pgm \ + shape03.pgm \ + shape04.pgm \ + snow1.pgm \ + sphere.ppm \ + splat1.pgm \ + splat2.pgm \ + splat3.pgm \ + spunge01.pgm \ + spunge02.pgm \ + spunge03.pgm \ + spunge04.pgm \ + spunge05.pgm \ + strange01.pgm \ + thegimp.pgm \ + torus.ppm \ + wavy.pgm \ + weave.pgm \ + worm.pgm + +EXTRA_DIST = $(brushdata_DATA) +all: all-am + +.SUFFIXES: +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu plug-ins/gimpressionist/Brushes/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu plug-ins/gimpressionist/Brushes/Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs +install-brushdataDATA: $(brushdata_DATA) + @$(NORMAL_INSTALL) + @list='$(brushdata_DATA)'; test -n "$(brushdatadir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(brushdatadir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(brushdatadir)" || exit 1; \ + fi; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(brushdatadir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(brushdatadir)" || exit $$?; \ + done + +uninstall-brushdataDATA: + @$(NORMAL_UNINSTALL) + @list='$(brushdata_DATA)'; test -n "$(brushdatadir)" || list=; \ + files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ + dir='$(DESTDIR)$(brushdatadir)'; $(am__uninstall_files_from_dir) +tags TAGS: + +ctags CTAGS: + +cscope cscopelist: + + +distdir: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) distdir-am + +distdir-am: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$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 $(DATA) +installdirs: + for dir in "$(DESTDIR)$(brushdatadir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +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: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_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-generic clean-libtool mostlyclean-am + +distclean: distclean-am + -rm -f Makefile +distclean-am: clean-am distclean-generic + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: install-brushdataDATA + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-generic mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-brushdataDATA + +.MAKE: install-am install-strip + +.PHONY: all all-am check check-am clean clean-generic clean-libtool \ + cscopelist-am ctags-am distclean distclean-generic \ + distclean-libtool distdir dvi dvi-am html html-am info info-am \ + install install-am install-brushdataDATA install-data \ + install-data-am install-dvi install-dvi-am install-exec \ + install-exec-am install-html install-html-am install-info \ + install-info-am install-man install-pdf install-pdf-am \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-generic \ + mostlyclean-libtool pdf pdf-am ps ps-am tags-am uninstall \ + uninstall-am uninstall-brushdataDATA + +.PRECIOUS: Makefile + + +# 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/plug-ins/gimpressionist/Brushes/arrow01.pgm b/plug-ins/gimpressionist/Brushes/arrow01.pgm Binary files differnew file mode 100644 index 0000000..1c72f0d --- /dev/null +++ b/plug-ins/gimpressionist/Brushes/arrow01.pgm diff --git a/plug-ins/gimpressionist/Brushes/ball.ppm b/plug-ins/gimpressionist/Brushes/ball.ppm Binary files differnew file mode 100644 index 0000000..15d5fa2 --- /dev/null +++ b/plug-ins/gimpressionist/Brushes/ball.ppm diff --git a/plug-ins/gimpressionist/Brushes/blob.ppm b/plug-ins/gimpressionist/Brushes/blob.ppm Binary files differnew file mode 100644 index 0000000..59a546b --- /dev/null +++ b/plug-ins/gimpressionist/Brushes/blob.ppm diff --git a/plug-ins/gimpressionist/Brushes/box.ppm b/plug-ins/gimpressionist/Brushes/box.ppm Binary files differnew file mode 100644 index 0000000..b5c0a55 --- /dev/null +++ b/plug-ins/gimpressionist/Brushes/box.ppm diff --git a/plug-ins/gimpressionist/Brushes/chalk01.pgm b/plug-ins/gimpressionist/Brushes/chalk01.pgm Binary files differnew file mode 100644 index 0000000..659639b --- /dev/null +++ b/plug-ins/gimpressionist/Brushes/chalk01.pgm diff --git a/plug-ins/gimpressionist/Brushes/cone.ppm b/plug-ins/gimpressionist/Brushes/cone.ppm Binary files differnew file mode 100644 index 0000000..d354433 --- /dev/null +++ b/plug-ins/gimpressionist/Brushes/cone.ppm diff --git a/plug-ins/gimpressionist/Brushes/crayon01.pgm b/plug-ins/gimpressionist/Brushes/crayon01.pgm Binary files differnew file mode 100644 index 0000000..59851db --- /dev/null +++ b/plug-ins/gimpressionist/Brushes/crayon01.pgm diff --git a/plug-ins/gimpressionist/Brushes/crayon02.pgm b/plug-ins/gimpressionist/Brushes/crayon02.pgm Binary files differnew file mode 100644 index 0000000..1bfe3c4 --- /dev/null +++ b/plug-ins/gimpressionist/Brushes/crayon02.pgm diff --git a/plug-ins/gimpressionist/Brushes/crayon03.pgm b/plug-ins/gimpressionist/Brushes/crayon03.pgm Binary files differnew file mode 100644 index 0000000..74a9a1a --- /dev/null +++ b/plug-ins/gimpressionist/Brushes/crayon03.pgm diff --git a/plug-ins/gimpressionist/Brushes/crayon04.pgm b/plug-ins/gimpressionist/Brushes/crayon04.pgm Binary files differnew file mode 100644 index 0000000..5f8eaf1 --- /dev/null +++ b/plug-ins/gimpressionist/Brushes/crayon04.pgm diff --git a/plug-ins/gimpressionist/Brushes/crayon05.pgm b/plug-ins/gimpressionist/Brushes/crayon05.pgm Binary files differnew file mode 100644 index 0000000..ba7186f --- /dev/null +++ b/plug-ins/gimpressionist/Brushes/crayon05.pgm diff --git a/plug-ins/gimpressionist/Brushes/crayon06.pgm b/plug-ins/gimpressionist/Brushes/crayon06.pgm Binary files differnew file mode 100644 index 0000000..adb13c4 --- /dev/null +++ b/plug-ins/gimpressionist/Brushes/crayon06.pgm diff --git a/plug-ins/gimpressionist/Brushes/crayon07.pgm b/plug-ins/gimpressionist/Brushes/crayon07.pgm Binary files differnew file mode 100644 index 0000000..ee78838 --- /dev/null +++ b/plug-ins/gimpressionist/Brushes/crayon07.pgm diff --git a/plug-ins/gimpressionist/Brushes/crayon08.pgm b/plug-ins/gimpressionist/Brushes/crayon08.pgm Binary files differnew file mode 100644 index 0000000..6dd791b --- /dev/null +++ b/plug-ins/gimpressionist/Brushes/crayon08.pgm diff --git a/plug-ins/gimpressionist/Brushes/defaultbrush.pgm b/plug-ins/gimpressionist/Brushes/defaultbrush.pgm Binary files differnew file mode 100644 index 0000000..e0f52e6 --- /dev/null +++ b/plug-ins/gimpressionist/Brushes/defaultbrush.pgm diff --git a/plug-ins/gimpressionist/Brushes/dribble.pgm b/plug-ins/gimpressionist/Brushes/dribble.pgm Binary files differnew file mode 100644 index 0000000..de264ed --- /dev/null +++ b/plug-ins/gimpressionist/Brushes/dribble.pgm diff --git a/plug-ins/gimpressionist/Brushes/fabric.pgm b/plug-ins/gimpressionist/Brushes/fabric.pgm Binary files differnew file mode 100644 index 0000000..ab63505 --- /dev/null +++ b/plug-ins/gimpressionist/Brushes/fabric.pgm diff --git a/plug-ins/gimpressionist/Brushes/fabric01.pgm b/plug-ins/gimpressionist/Brushes/fabric01.pgm Binary files differnew file mode 100644 index 0000000..ab63505 --- /dev/null +++ b/plug-ins/gimpressionist/Brushes/fabric01.pgm diff --git a/plug-ins/gimpressionist/Brushes/fabric02.pgm b/plug-ins/gimpressionist/Brushes/fabric02.pgm Binary files differnew file mode 100644 index 0000000..7b9b794 --- /dev/null +++ b/plug-ins/gimpressionist/Brushes/fabric02.pgm diff --git a/plug-ins/gimpressionist/Brushes/fabric03.pgm b/plug-ins/gimpressionist/Brushes/fabric03.pgm Binary files differnew file mode 100644 index 0000000..c923c7f --- /dev/null +++ b/plug-ins/gimpressionist/Brushes/fabric03.pgm diff --git a/plug-ins/gimpressionist/Brushes/flower01.pgm b/plug-ins/gimpressionist/Brushes/flower01.pgm Binary files differnew file mode 100644 index 0000000..02dae4c --- /dev/null +++ b/plug-ins/gimpressionist/Brushes/flower01.pgm diff --git a/plug-ins/gimpressionist/Brushes/flower02.pgm b/plug-ins/gimpressionist/Brushes/flower02.pgm Binary files differnew file mode 100644 index 0000000..effe674 --- /dev/null +++ b/plug-ins/gimpressionist/Brushes/flower02.pgm diff --git a/plug-ins/gimpressionist/Brushes/flower03.pgm b/plug-ins/gimpressionist/Brushes/flower03.pgm Binary files differnew file mode 100644 index 0000000..bb7aab7 --- /dev/null +++ b/plug-ins/gimpressionist/Brushes/flower03.pgm diff --git a/plug-ins/gimpressionist/Brushes/flower04.pgm b/plug-ins/gimpressionist/Brushes/flower04.pgm Binary files differnew file mode 100644 index 0000000..e515e61 --- /dev/null +++ b/plug-ins/gimpressionist/Brushes/flower04.pgm diff --git a/plug-ins/gimpressionist/Brushes/grad01.pgm b/plug-ins/gimpressionist/Brushes/grad01.pgm new file mode 100644 index 0000000..dc7302d --- /dev/null +++ b/plug-ins/gimpressionist/Brushes/grad01.pgm @@ -0,0 +1,205 @@ +P5 +# CREATOR: The GIMP's PNM Filter Version 1.0 +200 200 +255 +ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøø÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷ööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòññññññññññññññññññññññññññññññññññññññññññññññññññññññññññññññññññññññññññññññññññññññññññññññññññññññññññññññññññññññññññññññññññññññññññññññññññññññññññññññññññññññññññññññññññññññññññññññññññññññññïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèççççççççççççççççççççççççççççççççççççççççççççççççççççççççççççççççççççççççççççççççççççççççççççççççççççççççççççççççççççççççççççççççççççççççççççççççççççççççççççççççççççççççççççççççççççççççççççççççççççççççååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääããããããããããããããããããããããããããããããããããããããããããããããããããããããããããããããããããããããããããããããããããããããããããããããããããããããããããããããããããããããããããããããããããããããããããããããããããããããããããããããããããããããããããããããããããããããããããããããããããããããããââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØ××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××ÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀ¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»ºººººººººººººººººººººººººººººººººººººººººººººººººººººººººººººººººººººººººººººººººººººººººººººººººººººººººººººººººººººººººººººººººººººººººººººººººººººººººººººººººººººººººººººººººººººººººººººººººººººººº¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶µµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµ´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««ªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªª©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥££££££££££££££££££££££££££££££££££££££££££££££££££££££££££££££££££££££££££££££££££££££££££££££££££££££££££££££££££££££££££££££££££££££££££££££££££££££££££££££££££££££££££££££££££££££££££££££££££££££££¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡ žžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœ››››››››››››››››››››››››››››››››››››››››››››››››››››››››››››››››››››››››››››››››››››››››››››››››››››››››››››››››››››››››››››››››››››››››››››››››››››››››››››››››››››››››››››››››››››››››››››››››››››››››šššššššššššššššššššššššššššššššššššššššššššššššššššššššššššššššššššššššššššššššššššššššššššššššššššššššššššššššššššššššššššššššššššššššššššššššššššššššššššššššššššššššššššššššššššššššššššššššššššššššš˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰ˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††……………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppoooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooommmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiihhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa________________________________________________________________________________________________________________________________________________________________________________________________________^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>><<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999988888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666665555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555544444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333331111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++********************************************************************************************************************************************************************************************************))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/plug-ins/gimpressionist/Brushes/grad02.pgm b/plug-ins/gimpressionist/Brushes/grad02.pgm Binary files differnew file mode 100644 index 0000000..80600ed --- /dev/null +++ b/plug-ins/gimpressionist/Brushes/grad02.pgm diff --git a/plug-ins/gimpressionist/Brushes/grad03.pgm b/plug-ins/gimpressionist/Brushes/grad03.pgm Binary files differnew file mode 100644 index 0000000..365827a --- /dev/null +++ b/plug-ins/gimpressionist/Brushes/grad03.pgm diff --git a/plug-ins/gimpressionist/Brushes/heart.ppm b/plug-ins/gimpressionist/Brushes/heart.ppm Binary files differnew file mode 100644 index 0000000..674fdf0 --- /dev/null +++ b/plug-ins/gimpressionist/Brushes/heart.ppm diff --git a/plug-ins/gimpressionist/Brushes/leaf01.pgm b/plug-ins/gimpressionist/Brushes/leaf01.pgm Binary files differnew file mode 100644 index 0000000..8f191d7 --- /dev/null +++ b/plug-ins/gimpressionist/Brushes/leaf01.pgm diff --git a/plug-ins/gimpressionist/Brushes/paintbrush01.pgm b/plug-ins/gimpressionist/Brushes/paintbrush01.pgm Binary files differnew file mode 100644 index 0000000..ce2de78 --- /dev/null +++ b/plug-ins/gimpressionist/Brushes/paintbrush01.pgm diff --git a/plug-ins/gimpressionist/Brushes/paintbrush02.pgm b/plug-ins/gimpressionist/Brushes/paintbrush02.pgm Binary files differnew file mode 100644 index 0000000..261b238 --- /dev/null +++ b/plug-ins/gimpressionist/Brushes/paintbrush02.pgm diff --git a/plug-ins/gimpressionist/Brushes/paintbrush03.pgm b/plug-ins/gimpressionist/Brushes/paintbrush03.pgm Binary files differnew file mode 100644 index 0000000..0339bd8 --- /dev/null +++ b/plug-ins/gimpressionist/Brushes/paintbrush03.pgm diff --git a/plug-ins/gimpressionist/Brushes/paintbrush04.pgm b/plug-ins/gimpressionist/Brushes/paintbrush04.pgm Binary files differnew file mode 100644 index 0000000..06aa796 --- /dev/null +++ b/plug-ins/gimpressionist/Brushes/paintbrush04.pgm diff --git a/plug-ins/gimpressionist/Brushes/paper01.pgm b/plug-ins/gimpressionist/Brushes/paper01.pgm Binary files differnew file mode 100644 index 0000000..079ae32 --- /dev/null +++ b/plug-ins/gimpressionist/Brushes/paper01.pgm diff --git a/plug-ins/gimpressionist/Brushes/paper02.pgm b/plug-ins/gimpressionist/Brushes/paper02.pgm Binary files differnew file mode 100644 index 0000000..bc1afbb --- /dev/null +++ b/plug-ins/gimpressionist/Brushes/paper02.pgm diff --git a/plug-ins/gimpressionist/Brushes/paper03.pgm b/plug-ins/gimpressionist/Brushes/paper03.pgm Binary files differnew file mode 100644 index 0000000..c1caa44 --- /dev/null +++ b/plug-ins/gimpressionist/Brushes/paper03.pgm diff --git a/plug-ins/gimpressionist/Brushes/paper04.pgm b/plug-ins/gimpressionist/Brushes/paper04.pgm Binary files differnew file mode 100644 index 0000000..4e11e06 --- /dev/null +++ b/plug-ins/gimpressionist/Brushes/paper04.pgm diff --git a/plug-ins/gimpressionist/Brushes/pentagram.pgm b/plug-ins/gimpressionist/Brushes/pentagram.pgm Binary files differnew file mode 100644 index 0000000..ebc8135 --- /dev/null +++ b/plug-ins/gimpressionist/Brushes/pentagram.pgm diff --git a/plug-ins/gimpressionist/Brushes/scribble.pgm b/plug-ins/gimpressionist/Brushes/scribble.pgm Binary files differnew file mode 100644 index 0000000..944e1f1 --- /dev/null +++ b/plug-ins/gimpressionist/Brushes/scribble.pgm diff --git a/plug-ins/gimpressionist/Brushes/shape01.pgm b/plug-ins/gimpressionist/Brushes/shape01.pgm new file mode 100644 index 0000000..61bc319 --- /dev/null +++ b/plug-ins/gimpressionist/Brushes/shape01.pgm @@ -0,0 +1,5 @@ +P5 +# CREATOR: The GIMP's PNM Filter Version 1.0 +185 185 +255 +ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ
\ No newline at end of file diff --git a/plug-ins/gimpressionist/Brushes/shape02.pgm b/plug-ins/gimpressionist/Brushes/shape02.pgm Binary files differnew file mode 100644 index 0000000..e6cd78d --- /dev/null +++ b/plug-ins/gimpressionist/Brushes/shape02.pgm diff --git a/plug-ins/gimpressionist/Brushes/shape03.pgm b/plug-ins/gimpressionist/Brushes/shape03.pgm Binary files differnew file mode 100644 index 0000000..888db5e --- /dev/null +++ b/plug-ins/gimpressionist/Brushes/shape03.pgm diff --git a/plug-ins/gimpressionist/Brushes/shape04.pgm b/plug-ins/gimpressionist/Brushes/shape04.pgm Binary files differnew file mode 100644 index 0000000..87eebdd --- /dev/null +++ b/plug-ins/gimpressionist/Brushes/shape04.pgm diff --git a/plug-ins/gimpressionist/Brushes/snow1.pgm b/plug-ins/gimpressionist/Brushes/snow1.pgm Binary files differnew file mode 100644 index 0000000..057f515 --- /dev/null +++ b/plug-ins/gimpressionist/Brushes/snow1.pgm diff --git a/plug-ins/gimpressionist/Brushes/sphere.ppm b/plug-ins/gimpressionist/Brushes/sphere.ppm Binary files differnew file mode 100644 index 0000000..7a4d1fc --- /dev/null +++ b/plug-ins/gimpressionist/Brushes/sphere.ppm diff --git a/plug-ins/gimpressionist/Brushes/splat1.pgm b/plug-ins/gimpressionist/Brushes/splat1.pgm Binary files differnew file mode 100644 index 0000000..6f3f842 --- /dev/null +++ b/plug-ins/gimpressionist/Brushes/splat1.pgm diff --git a/plug-ins/gimpressionist/Brushes/splat2.pgm b/plug-ins/gimpressionist/Brushes/splat2.pgm Binary files differnew file mode 100644 index 0000000..dbbb197 --- /dev/null +++ b/plug-ins/gimpressionist/Brushes/splat2.pgm diff --git a/plug-ins/gimpressionist/Brushes/splat3.pgm b/plug-ins/gimpressionist/Brushes/splat3.pgm Binary files differnew file mode 100644 index 0000000..5fd45ae --- /dev/null +++ b/plug-ins/gimpressionist/Brushes/splat3.pgm diff --git a/plug-ins/gimpressionist/Brushes/spunge01.pgm b/plug-ins/gimpressionist/Brushes/spunge01.pgm Binary files differnew file mode 100644 index 0000000..5638e59 --- /dev/null +++ b/plug-ins/gimpressionist/Brushes/spunge01.pgm diff --git a/plug-ins/gimpressionist/Brushes/spunge02.pgm b/plug-ins/gimpressionist/Brushes/spunge02.pgm Binary files differnew file mode 100644 index 0000000..8bb8908 --- /dev/null +++ b/plug-ins/gimpressionist/Brushes/spunge02.pgm diff --git a/plug-ins/gimpressionist/Brushes/spunge03.pgm b/plug-ins/gimpressionist/Brushes/spunge03.pgm Binary files differnew file mode 100644 index 0000000..f8ae3ed --- /dev/null +++ b/plug-ins/gimpressionist/Brushes/spunge03.pgm diff --git a/plug-ins/gimpressionist/Brushes/spunge04.pgm b/plug-ins/gimpressionist/Brushes/spunge04.pgm Binary files differnew file mode 100644 index 0000000..5597100 --- /dev/null +++ b/plug-ins/gimpressionist/Brushes/spunge04.pgm diff --git a/plug-ins/gimpressionist/Brushes/spunge05.pgm b/plug-ins/gimpressionist/Brushes/spunge05.pgm Binary files differnew file mode 100644 index 0000000..1dbbd00 --- /dev/null +++ b/plug-ins/gimpressionist/Brushes/spunge05.pgm diff --git a/plug-ins/gimpressionist/Brushes/strange01.pgm b/plug-ins/gimpressionist/Brushes/strange01.pgm Binary files differnew file mode 100644 index 0000000..eefbaff --- /dev/null +++ b/plug-ins/gimpressionist/Brushes/strange01.pgm diff --git a/plug-ins/gimpressionist/Brushes/thegimp.pgm b/plug-ins/gimpressionist/Brushes/thegimp.pgm Binary files differnew file mode 100644 index 0000000..2c23b64 --- /dev/null +++ b/plug-ins/gimpressionist/Brushes/thegimp.pgm diff --git a/plug-ins/gimpressionist/Brushes/torus.ppm b/plug-ins/gimpressionist/Brushes/torus.ppm Binary files differnew file mode 100644 index 0000000..442c9ec --- /dev/null +++ b/plug-ins/gimpressionist/Brushes/torus.ppm diff --git a/plug-ins/gimpressionist/Brushes/wavy.pgm b/plug-ins/gimpressionist/Brushes/wavy.pgm Binary files differnew file mode 100644 index 0000000..1fe9559 --- /dev/null +++ b/plug-ins/gimpressionist/Brushes/wavy.pgm diff --git a/plug-ins/gimpressionist/Brushes/weave.pgm b/plug-ins/gimpressionist/Brushes/weave.pgm Binary files differnew file mode 100644 index 0000000..dd9a3ca --- /dev/null +++ b/plug-ins/gimpressionist/Brushes/weave.pgm diff --git a/plug-ins/gimpressionist/Brushes/worm.pgm b/plug-ins/gimpressionist/Brushes/worm.pgm Binary files differnew file mode 100644 index 0000000..00a3f68 --- /dev/null +++ b/plug-ins/gimpressionist/Brushes/worm.pgm diff --git a/plug-ins/gimpressionist/Makefile.am b/plug-ins/gimpressionist/Makefile.am new file mode 100644 index 0000000..9262dcb --- /dev/null +++ b/plug-ins/gimpressionist/Makefile.am @@ -0,0 +1,87 @@ +## Process this file with automake to produce Makefile.in + +if OS_WIN32 +mwindows = -mwindows +else +libm = -lm +endif + +libgimpui = $(top_builddir)/libgimp/libgimpui-$(GIMP_API_VERSION).la +libgimpconfig = $(top_builddir)/libgimpconfig/libgimpconfig-$(GIMP_API_VERSION).la +libgimpwidgets = $(top_builddir)/libgimpwidgets/libgimpwidgets-$(GIMP_API_VERSION).la +libgimp = $(top_builddir)/libgimp/libgimp-$(GIMP_API_VERSION).la +libgimpcolor = $(top_builddir)/libgimpcolor/libgimpcolor-$(GIMP_API_VERSION).la +libgimpbase = $(top_builddir)/libgimpbase/libgimpbase-$(GIMP_API_VERSION).la +libgimpmath = $(top_builddir)/libgimpmath/libgimpmath-$(GIMP_API_VERSION).la + +SUBDIRS = Brushes Paper Presets + +if HAVE_WINDRES +include $(top_srcdir)/build/windows/gimprc-plug-ins.rule +gimpressionist_RC = gimpressionist.rc.o +endif + +AM_CPPFLAGS = \ + -DDEFAULTPATH=\""~/$(gimpdir)/gimpressionist:$(gimpdatadir)/gimpressionist"\" \ + -I$(top_srcdir) \ + $(GTK_CFLAGS) \ + $(GEGL_CFLAGS) \ + -I$(includedir) + +AM_LDFLAGS = $(mwindows) + + +libexecdir = $(gimpplugindir)/plug-ins/gimpressionist + +libexec_PROGRAMS = gimpressionist + +gimpressionist_SOURCES = \ + brush.c \ + brush.h \ + color.c \ + color.h \ + general.c \ + general.h \ + gimp.c \ + gimpressionist.c \ + gimpressionist.h \ + globals.c \ + infile.h \ + orientation.h \ + orientation.c \ + orientmap.h \ + orientmap.c \ + paper.c \ + paper.h \ + placement.c \ + placement.h \ + plasma.c \ + ppmtool.c \ + ppmtool.h \ + presets.c \ + presets.h \ + preview.c \ + preview.h \ + random.h \ + repaint.c \ + size.h \ + size.c \ + sizemap.c \ + utils.c + +LDADD = \ + $(libm) \ + $(libgimpui) \ + $(libgimpwidgets) \ + $(libgimpconfig) \ + $(libgimp) \ + $(libgimpcolor) \ + $(libgimpmath) \ + $(libgimpbase) \ + $(GTK_LIBS) \ + $(GEGL_LIBS) \ + $(RT_LIBS) \ + $(INTLLIBS) \ + $(gimpressionist_RC) + +EXTRA_DIST = README diff --git a/plug-ins/gimpressionist/Makefile.in b/plug-ins/gimpressionist/Makefile.in new file mode 100644 index 0000000..73ddb16 --- /dev/null +++ b/plug-ins/gimpressionist/Makefile.in @@ -0,0 +1,1217 @@ +# Makefile.in generated by automake 1.16.3 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994-2020 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@ + +# Version resources for Microsoft Windows + +VPATH = @srcdir@ +am__is_gnu_make = { \ + if test -z '$(MAKELEVEL)'; then \ + false; \ + elif test -n '$(MAKE_HOST)'; then \ + true; \ + elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ + true; \ + else \ + false; \ + fi; \ +} +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +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 = : +build_triplet = @build@ +host_triplet = @host@ +libexec_PROGRAMS = gimpressionist$(EXEEXT) +subdir = plug-ins/gimpressionist +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ + $(top_srcdir)/m4macros/alsa.m4 \ + $(top_srcdir)/m4macros/ax_compare_version.m4 \ + $(top_srcdir)/m4macros/ax_cxx_compile_stdcxx.m4 \ + $(top_srcdir)/m4macros/ax_gcc_func_attribute.m4 \ + $(top_srcdir)/m4macros/ax_prog_cc_for_build.m4 \ + $(top_srcdir)/m4macros/ax_prog_perl_version.m4 \ + $(top_srcdir)/m4macros/detectcflags.m4 \ + $(top_srcdir)/m4macros/pythondev.m4 $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +am__installdirs = "$(DESTDIR)$(libexecdir)" +PROGRAMS = $(libexec_PROGRAMS) +am_gimpressionist_OBJECTS = brush.$(OBJEXT) color.$(OBJEXT) \ + general.$(OBJEXT) gimp.$(OBJEXT) gimpressionist.$(OBJEXT) \ + globals.$(OBJEXT) orientation.$(OBJEXT) orientmap.$(OBJEXT) \ + paper.$(OBJEXT) placement.$(OBJEXT) plasma.$(OBJEXT) \ + ppmtool.$(OBJEXT) presets.$(OBJEXT) preview.$(OBJEXT) \ + repaint.$(OBJEXT) size.$(OBJEXT) sizemap.$(OBJEXT) \ + utils.$(OBJEXT) +gimpressionist_OBJECTS = $(am_gimpressionist_OBJECTS) +gimpressionist_LDADD = $(LDADD) +am__DEPENDENCIES_1 = +gimpressionist_DEPENDENCIES = $(am__DEPENDENCIES_1) $(libgimpui) \ + $(libgimpwidgets) $(libgimpconfig) $(libgimp) $(libgimpcolor) \ + $(libgimpmath) $(libgimpbase) $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) $(gimpressionist_RC) +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +am__v_lt_1 = +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__maybe_remake_depfiles = depfiles +am__depfiles_remade = ./$(DEPDIR)/brush.Po ./$(DEPDIR)/color.Po \ + ./$(DEPDIR)/general.Po ./$(DEPDIR)/gimp.Po \ + ./$(DEPDIR)/gimpressionist.Po ./$(DEPDIR)/globals.Po \ + ./$(DEPDIR)/orientation.Po ./$(DEPDIR)/orientmap.Po \ + ./$(DEPDIR)/paper.Po ./$(DEPDIR)/placement.Po \ + ./$(DEPDIR)/plasma.Po ./$(DEPDIR)/ppmtool.Po \ + ./$(DEPDIR)/presets.Po ./$(DEPDIR)/preview.Po \ + ./$(DEPDIR)/repaint.Po ./$(DEPDIR)/size.Po \ + ./$(DEPDIR)/sizemap.Po ./$(DEPDIR)/utils.Po +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +am__v_CC_1 = +CCLD = $(CC) +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +am__v_CCLD_1 = +SOURCES = $(gimpressionist_SOURCES) +DIST_SOURCES = $(gimpressionist_SOURCES) +RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ + ctags-recursive dvi-recursive html-recursive info-recursive \ + install-data-recursive install-dvi-recursive \ + install-exec-recursive install-html-recursive \ + install-info-recursive install-pdf-recursive \ + install-ps-recursive install-recursive installcheck-recursive \ + installdirs-recursive pdf-recursive ps-recursive \ + tags-recursive uninstall-recursive +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ + distclean-recursive maintainer-clean-recursive +am__recursive_targets = \ + $(RECURSIVE_TARGETS) \ + $(RECURSIVE_CLEAN_TARGETS) \ + $(am__extra_recursive_targets) +AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ + distdir distdir-am +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +# Read a list of newline-separated strings from the standard input, +# and print each of them once, without duplicates. Input order is +# *not* preserved. +am__uniquify_input = $(AWK) '\ + BEGIN { nonempty = 0; } \ + { items[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in items) print i; }; } \ +' +# Make sure the list of sources is unique. This is necessary because, +# e.g., the same source file might be shared among _SOURCES variables +# for different programs/libraries. +am__define_uniq_tagged_files = \ + list='$(am__tagged_files)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | $(am__uniquify_input)` +ETAGS = etags +CTAGS = ctags +DIST_SUBDIRS = $(SUBDIRS) +am__DIST_COMMON = $(srcdir)/Makefile.in \ + $(top_srcdir)/build/windows/gimprc-plug-ins.rule \ + $(top_srcdir)/depcomp README +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +am__relativize = \ + dir0=`pwd`; \ + sed_first='s,^\([^/]*\)/.*$$,\1,'; \ + sed_rest='s,^[^/]*/*,,'; \ + sed_last='s,^.*/\([^/]*\)$$,\1,'; \ + sed_butlast='s,/*[^/]*$$,,'; \ + while test -n "$$dir1"; do \ + first=`echo "$$dir1" | sed -e "$$sed_first"`; \ + if test "$$first" != "."; then \ + if test "$$first" = ".."; then \ + dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ + dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ + else \ + first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ + if test "$$first2" = "$$first"; then \ + dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ + else \ + dir2="../$$dir2"; \ + fi; \ + dir0="$$dir0"/"$$first"; \ + fi; \ + fi; \ + dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ + done; \ + reldir="$$dir2" +AA_LIBS = @AA_LIBS@ +ACLOCAL = @ACLOCAL@ +ALLOCA = @ALLOCA@ +ALL_LINGUAS = @ALL_LINGUAS@ +ALSA_CFLAGS = @ALSA_CFLAGS@ +ALSA_LIBS = @ALSA_LIBS@ +ALTIVEC_EXTRA_CFLAGS = @ALTIVEC_EXTRA_CFLAGS@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +APPSTREAM_UTIL = @APPSTREAM_UTIL@ +AR = @AR@ +AS = @AS@ +ATK_CFLAGS = @ATK_CFLAGS@ +ATK_LIBS = @ATK_LIBS@ +ATK_REQUIRED_VERSION = @ATK_REQUIRED_VERSION@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BABL_CFLAGS = @BABL_CFLAGS@ +BABL_LIBS = @BABL_LIBS@ +BABL_REQUIRED_VERSION = @BABL_REQUIRED_VERSION@ +BUG_REPORT_URL = @BUG_REPORT_URL@ +BUILD_EXEEXT = @BUILD_EXEEXT@ +BUILD_OBJEXT = @BUILD_OBJEXT@ +BZIP2_LIBS = @BZIP2_LIBS@ +CAIRO_CFLAGS = @CAIRO_CFLAGS@ +CAIRO_LIBS = @CAIRO_LIBS@ +CAIRO_PDF_CFLAGS = @CAIRO_PDF_CFLAGS@ +CAIRO_PDF_LIBS = @CAIRO_PDF_LIBS@ +CAIRO_PDF_REQUIRED_VERSION = @CAIRO_PDF_REQUIRED_VERSION@ +CAIRO_REQUIRED_VERSION = @CAIRO_REQUIRED_VERSION@ +CATALOGS = @CATALOGS@ +CATOBJEXT = @CATOBJEXT@ +CC = @CC@ +CCAS = @CCAS@ +CCASDEPMODE = @CCASDEPMODE@ +CCASFLAGS = @CCASFLAGS@ +CCDEPMODE = @CCDEPMODE@ +CC_FOR_BUILD = @CC_FOR_BUILD@ +CC_VERSION = @CC_VERSION@ +CFLAGS = @CFLAGS@ +CFLAGS_FOR_BUILD = @CFLAGS_FOR_BUILD@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CPPFLAGS_FOR_BUILD = @CPPFLAGS_FOR_BUILD@ +CPP_FOR_BUILD = @CPP_FOR_BUILD@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DATADIRNAME = @DATADIRNAME@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DESKTOP_DATADIR = @DESKTOP_DATADIR@ +DESKTOP_FILE_VALIDATE = @DESKTOP_FILE_VALIDATE@ +DLLTOOL = @DLLTOOL@ +DOC_SHOOTER = @DOC_SHOOTER@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +FILE_AA = @FILE_AA@ +FILE_EXR = @FILE_EXR@ +FILE_HEIF = @FILE_HEIF@ +FILE_JP2_LOAD = @FILE_JP2_LOAD@ +FILE_JPEGXL = @FILE_JPEGXL@ +FILE_MNG = @FILE_MNG@ +FILE_PDF_SAVE = @FILE_PDF_SAVE@ +FILE_PS = @FILE_PS@ +FILE_WMF = @FILE_WMF@ +FILE_XMC = @FILE_XMC@ +FILE_XPM = @FILE_XPM@ +FONTCONFIG_CFLAGS = @FONTCONFIG_CFLAGS@ +FONTCONFIG_LIBS = @FONTCONFIG_LIBS@ +FONTCONFIG_REQUIRED_VERSION = @FONTCONFIG_REQUIRED_VERSION@ +FREETYPE2_REQUIRED_VERSION = @FREETYPE2_REQUIRED_VERSION@ +FREETYPE_CFLAGS = @FREETYPE_CFLAGS@ +FREETYPE_LIBS = @FREETYPE_LIBS@ +GDBUS_CODEGEN = @GDBUS_CODEGEN@ +GDK_PIXBUF_CFLAGS = @GDK_PIXBUF_CFLAGS@ +GDK_PIXBUF_CSOURCE = @GDK_PIXBUF_CSOURCE@ +GDK_PIXBUF_LIBS = @GDK_PIXBUF_LIBS@ +GDK_PIXBUF_REQUIRED_VERSION = @GDK_PIXBUF_REQUIRED_VERSION@ +GEGL = @GEGL@ +GEGL_CFLAGS = @GEGL_CFLAGS@ +GEGL_LIBS = @GEGL_LIBS@ +GEGL_MAJOR_MINOR_VERSION = @GEGL_MAJOR_MINOR_VERSION@ +GEGL_REQUIRED_VERSION = @GEGL_REQUIRED_VERSION@ +GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ +GEXIV2_CFLAGS = @GEXIV2_CFLAGS@ +GEXIV2_LIBS = @GEXIV2_LIBS@ +GEXIV2_REQUIRED_VERSION = @GEXIV2_REQUIRED_VERSION@ +GIMP_API_VERSION = @GIMP_API_VERSION@ +GIMP_APP_VERSION = @GIMP_APP_VERSION@ +GIMP_BINARY_AGE = @GIMP_BINARY_AGE@ +GIMP_COMMAND = @GIMP_COMMAND@ +GIMP_DATA_VERSION = @GIMP_DATA_VERSION@ +GIMP_FULL_NAME = @GIMP_FULL_NAME@ +GIMP_INTERFACE_AGE = @GIMP_INTERFACE_AGE@ +GIMP_MAJOR_VERSION = @GIMP_MAJOR_VERSION@ +GIMP_MICRO_VERSION = @GIMP_MICRO_VERSION@ +GIMP_MINOR_VERSION = @GIMP_MINOR_VERSION@ +GIMP_MKENUMS = @GIMP_MKENUMS@ +GIMP_MODULES = @GIMP_MODULES@ +GIMP_PACKAGE_REVISION = @GIMP_PACKAGE_REVISION@ +GIMP_PKGCONFIG_VERSION = @GIMP_PKGCONFIG_VERSION@ +GIMP_PLUGINS = @GIMP_PLUGINS@ +GIMP_PLUGIN_VERSION = @GIMP_PLUGIN_VERSION@ +GIMP_REAL_VERSION = @GIMP_REAL_VERSION@ +GIMP_RELEASE = @GIMP_RELEASE@ +GIMP_SYSCONF_VERSION = @GIMP_SYSCONF_VERSION@ +GIMP_TOOL_VERSION = @GIMP_TOOL_VERSION@ +GIMP_UNSTABLE = @GIMP_UNSTABLE@ +GIMP_USER_VERSION = @GIMP_USER_VERSION@ +GIMP_VERSION = @GIMP_VERSION@ +GIO_CFLAGS = @GIO_CFLAGS@ +GIO_LIBS = @GIO_LIBS@ +GIO_UNIX_CFLAGS = @GIO_UNIX_CFLAGS@ +GIO_UNIX_LIBS = @GIO_UNIX_LIBS@ +GIO_WINDOWS_CFLAGS = @GIO_WINDOWS_CFLAGS@ +GIO_WINDOWS_LIBS = @GIO_WINDOWS_LIBS@ +GLIB_CFLAGS = @GLIB_CFLAGS@ +GLIB_COMPILE_RESOURCES = @GLIB_COMPILE_RESOURCES@ +GLIB_GENMARSHAL = @GLIB_GENMARSHAL@ +GLIB_LIBS = @GLIB_LIBS@ +GLIB_MKENUMS = @GLIB_MKENUMS@ +GLIB_REQUIRED_VERSION = @GLIB_REQUIRED_VERSION@ +GMODULE_NO_EXPORT_CFLAGS = @GMODULE_NO_EXPORT_CFLAGS@ +GMODULE_NO_EXPORT_LIBS = @GMODULE_NO_EXPORT_LIBS@ +GMOFILES = @GMOFILES@ +GMSGFMT = @GMSGFMT@ +GOBJECT_QUERY = @GOBJECT_QUERY@ +GREP = @GREP@ +GS_LIBS = @GS_LIBS@ +GTKDOC_CHECK = @GTKDOC_CHECK@ +GTKDOC_CHECK_PATH = @GTKDOC_CHECK_PATH@ +GTKDOC_DEPS_CFLAGS = @GTKDOC_DEPS_CFLAGS@ +GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@ +GTKDOC_MKPDF = @GTKDOC_MKPDF@ +GTKDOC_REBASE = @GTKDOC_REBASE@ +GTK_CFLAGS = @GTK_CFLAGS@ +GTK_LIBS = @GTK_LIBS@ +GTK_MAC_INTEGRATION_CFLAGS = @GTK_MAC_INTEGRATION_CFLAGS@ +GTK_MAC_INTEGRATION_LIBS = @GTK_MAC_INTEGRATION_LIBS@ +GTK_REQUIRED_VERSION = @GTK_REQUIRED_VERSION@ +GTK_UPDATE_ICON_CACHE = @GTK_UPDATE_ICON_CACHE@ +GUDEV_CFLAGS = @GUDEV_CFLAGS@ +GUDEV_LIBS = @GUDEV_LIBS@ +HARFBUZZ_CFLAGS = @HARFBUZZ_CFLAGS@ +HARFBUZZ_LIBS = @HARFBUZZ_LIBS@ +HARFBUZZ_REQUIRED_VERSION = @HARFBUZZ_REQUIRED_VERSION@ +HAVE_CXX14 = @HAVE_CXX14@ +HAVE_FINITE = @HAVE_FINITE@ +HAVE_ISFINITE = @HAVE_ISFINITE@ +HAVE_VFORK = @HAVE_VFORK@ +HOST_GLIB_COMPILE_RESOURCES = @HOST_GLIB_COMPILE_RESOURCES@ +HTML_DIR = @HTML_DIR@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INSTOBJEXT = @INSTOBJEXT@ +INTLLIBS = @INTLLIBS@ +INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@ +INTLTOOL_MERGE = @INTLTOOL_MERGE@ +INTLTOOL_PERL = @INTLTOOL_PERL@ +INTLTOOL_REQUIRED_VERSION = @INTLTOOL_REQUIRED_VERSION@ +INTLTOOL_UPDATE = @INTLTOOL_UPDATE@ +INTLTOOL_V_MERGE = @INTLTOOL_V_MERGE@ +INTLTOOL_V_MERGE_OPTIONS = @INTLTOOL_V_MERGE_OPTIONS@ +INTLTOOL__v_MERGE_ = @INTLTOOL__v_MERGE_@ +INTLTOOL__v_MERGE_0 = @INTLTOOL__v_MERGE_0@ +INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ +ISO_CODES_LOCALEDIR = @ISO_CODES_LOCALEDIR@ +ISO_CODES_LOCATION = @ISO_CODES_LOCATION@ +JPEG_LIBS = @JPEG_LIBS@ +JSON_GLIB_CFLAGS = @JSON_GLIB_CFLAGS@ +JSON_GLIB_LIBS = @JSON_GLIB_LIBS@ +JXL_CFLAGS = @JXL_CFLAGS@ +JXL_LIBS = @JXL_LIBS@ +JXL_THREADS_CFLAGS = @JXL_THREADS_CFLAGS@ +JXL_THREADS_LIBS = @JXL_THREADS_LIBS@ +LCMS_CFLAGS = @LCMS_CFLAGS@ +LCMS_LIBS = @LCMS_LIBS@ +LCMS_REQUIRED_VERSION = @LCMS_REQUIRED_VERSION@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LDFLAGS_FOR_BUILD = @LDFLAGS_FOR_BUILD@ +LIBBACKTRACE_LIBS = @LIBBACKTRACE_LIBS@ +LIBHEIF_CFLAGS = @LIBHEIF_CFLAGS@ +LIBHEIF_LIBS = @LIBHEIF_LIBS@ +LIBHEIF_REQUIRED_VERSION = @LIBHEIF_REQUIRED_VERSION@ +LIBJXL_REQUIRED_VERSION = @LIBJXL_REQUIRED_VERSION@ +LIBLZMA_REQUIRED_VERSION = @LIBLZMA_REQUIRED_VERSION@ +LIBMYPAINT_CFLAGS = @LIBMYPAINT_CFLAGS@ +LIBMYPAINT_LIBS = @LIBMYPAINT_LIBS@ +LIBMYPAINT_REQUIRED_VERSION = @LIBMYPAINT_REQUIRED_VERSION@ +LIBOBJS = @LIBOBJS@ +LIBPNG_REQUIRED_VERSION = @LIBPNG_REQUIRED_VERSION@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIBUNWIND_CFLAGS = @LIBUNWIND_CFLAGS@ +LIBUNWIND_LIBS = @LIBUNWIND_LIBS@ +LIBUNWIND_REQUIRED_VERSION = @LIBUNWIND_REQUIRED_VERSION@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +LT_CURRENT_MINUS_AGE = @LT_CURRENT_MINUS_AGE@ +LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ +LT_VERSION_INFO = @LT_VERSION_INFO@ +LZMA_CFLAGS = @LZMA_CFLAGS@ +LZMA_LIBS = @LZMA_LIBS@ +MAIL = @MAIL@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MIME_INFO_CFLAGS = @MIME_INFO_CFLAGS@ +MIME_INFO_LIBS = @MIME_INFO_LIBS@ +MIME_TYPES = @MIME_TYPES@ +MKDIR_P = @MKDIR_P@ +MKINSTALLDIRS = @MKINSTALLDIRS@ +MMX_EXTRA_CFLAGS = @MMX_EXTRA_CFLAGS@ +MNG_CFLAGS = @MNG_CFLAGS@ +MNG_LIBS = @MNG_LIBS@ +MSGFMT = @MSGFMT@ +MSGFMT_OPTS = @MSGFMT_OPTS@ +MSGMERGE = @MSGMERGE@ +MYPAINT_BRUSHES_CFLAGS = @MYPAINT_BRUSHES_CFLAGS@ +MYPAINT_BRUSHES_LIBS = @MYPAINT_BRUSHES_LIBS@ +NATIVE_GLIB_CFLAGS = @NATIVE_GLIB_CFLAGS@ +NATIVE_GLIB_LIBS = @NATIVE_GLIB_LIBS@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OPENEXR_CFLAGS = @OPENEXR_CFLAGS@ +OPENEXR_LIBS = @OPENEXR_LIBS@ +OPENEXR_REQUIRED_VERSION = @OPENEXR_REQUIRED_VERSION@ +OPENJPEG_CFLAGS = @OPENJPEG_CFLAGS@ +OPENJPEG_LIBS = @OPENJPEG_LIBS@ +OPENJPEG_REQUIRED_VERSION = @OPENJPEG_REQUIRED_VERSION@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PANGOCAIRO_CFLAGS = @PANGOCAIRO_CFLAGS@ +PANGOCAIRO_LIBS = @PANGOCAIRO_LIBS@ +PANGOCAIRO_REQUIRED_VERSION = @PANGOCAIRO_REQUIRED_VERSION@ +PATHSEP = @PATHSEP@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PERL = @PERL@ +PERL_REQUIRED_VERSION = @PERL_REQUIRED_VERSION@ +PERL_VERSION = @PERL_VERSION@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +PNG_CFLAGS = @PNG_CFLAGS@ +PNG_LIBS = @PNG_LIBS@ +POFILES = @POFILES@ +POPPLER_CFLAGS = @POPPLER_CFLAGS@ +POPPLER_DATA_CFLAGS = @POPPLER_DATA_CFLAGS@ +POPPLER_DATA_LIBS = @POPPLER_DATA_LIBS@ +POPPLER_DATA_REQUIRED_VERSION = @POPPLER_DATA_REQUIRED_VERSION@ +POPPLER_LIBS = @POPPLER_LIBS@ +POPPLER_REQUIRED_VERSION = @POPPLER_REQUIRED_VERSION@ +POSUB = @POSUB@ +PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@ +PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@ +PYBIN_PATH = @PYBIN_PATH@ +PYCAIRO_CFLAGS = @PYCAIRO_CFLAGS@ +PYCAIRO_LIBS = @PYCAIRO_LIBS@ +PYGIMP_EXTRA_CFLAGS = @PYGIMP_EXTRA_CFLAGS@ +PYGTK_CFLAGS = @PYGTK_CFLAGS@ +PYGTK_CODEGEN = @PYGTK_CODEGEN@ +PYGTK_DEFSDIR = @PYGTK_DEFSDIR@ +PYGTK_LIBS = @PYGTK_LIBS@ +PYLINK_LIBS = @PYLINK_LIBS@ +PYTHON = @PYTHON@ +PYTHON2_REQUIRED_VERSION = @PYTHON2_REQUIRED_VERSION@ +PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ +PYTHON_INCLUDES = @PYTHON_INCLUDES@ +PYTHON_PLATFORM = @PYTHON_PLATFORM@ +PYTHON_PREFIX = @PYTHON_PREFIX@ +PYTHON_VERSION = @PYTHON_VERSION@ +RANLIB = @RANLIB@ +RSVG_REQUIRED_VERSION = @RSVG_REQUIRED_VERSION@ +RT_LIBS = @RT_LIBS@ +SCREENSHOT_LIBS = @SCREENSHOT_LIBS@ +SED = @SED@ +SENDMAIL = @SENDMAIL@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SOCKET_LIBS = @SOCKET_LIBS@ +SSE2_EXTRA_CFLAGS = @SSE2_EXTRA_CFLAGS@ +SSE4_1_EXTRA_CFLAGS = @SSE4_1_EXTRA_CFLAGS@ +SSE_EXTRA_CFLAGS = @SSE_EXTRA_CFLAGS@ +STRIP = @STRIP@ +SVG_CFLAGS = @SVG_CFLAGS@ +SVG_LIBS = @SVG_LIBS@ +SYMPREFIX = @SYMPREFIX@ +TIFF_LIBS = @TIFF_LIBS@ +USE_NLS = @USE_NLS@ +VERSION = @VERSION@ +WEBKIT_CFLAGS = @WEBKIT_CFLAGS@ +WEBKIT_LIBS = @WEBKIT_LIBS@ +WEBKIT_REQUIRED_VERSION = @WEBKIT_REQUIRED_VERSION@ +WEBPDEMUX_CFLAGS = @WEBPDEMUX_CFLAGS@ +WEBPDEMUX_LIBS = @WEBPDEMUX_LIBS@ +WEBPMUX_CFLAGS = @WEBPMUX_CFLAGS@ +WEBPMUX_LIBS = @WEBPMUX_LIBS@ +WEBP_CFLAGS = @WEBP_CFLAGS@ +WEBP_LIBS = @WEBP_LIBS@ +WEBP_REQUIRED_VERSION = @WEBP_REQUIRED_VERSION@ +WEB_PAGE = @WEB_PAGE@ +WIN32_LARGE_ADDRESS_AWARE = @WIN32_LARGE_ADDRESS_AWARE@ +WINDRES = @WINDRES@ +WMF_CFLAGS = @WMF_CFLAGS@ +WMF_CONFIG = @WMF_CONFIG@ +WMF_LIBS = @WMF_LIBS@ +WMF_REQUIRED_VERSION = @WMF_REQUIRED_VERSION@ +XDG_EMAIL = @XDG_EMAIL@ +XFIXES_CFLAGS = @XFIXES_CFLAGS@ +XFIXES_LIBS = @XFIXES_LIBS@ +XGETTEXT = @XGETTEXT@ +XGETTEXT_REQUIRED_VERSION = @XGETTEXT_REQUIRED_VERSION@ +XMC_CFLAGS = @XMC_CFLAGS@ +XMC_LIBS = @XMC_LIBS@ +XMKMF = @XMKMF@ +XMLLINT = @XMLLINT@ +XMU_LIBS = @XMU_LIBS@ +XPM_LIBS = @XPM_LIBS@ +XSLTPROC = @XSLTPROC@ +XVFB_RUN = @XVFB_RUN@ +X_CFLAGS = @X_CFLAGS@ +X_EXTRA_LIBS = @X_EXTRA_LIBS@ +X_LIBS = @X_LIBS@ +X_PRE_LIBS = @X_PRE_LIBS@ +Z_LIBS = @Z_LIBS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CC_FOR_BUILD = @ac_ct_CC_FOR_BUILD@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +gimpdatadir = @gimpdatadir@ +gimpdir = @gimpdir@ +gimplocaledir = @gimplocaledir@ +gimpplugindir = @gimpplugindir@ +gimpsysconfdir = @gimpsysconfdir@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +intltool__v_merge_options_ = @intltool__v_merge_options_@ +intltool__v_merge_options_0 = @intltool__v_merge_options_0@ +libdir = @libdir@ +libexecdir = $(gimpplugindir)/plug-ins/gimpressionist +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +manpage_gimpdir = @manpage_gimpdir@ +mkdir_p = @mkdir_p@ +ms_librarian = @ms_librarian@ +mypaint_brushes_dir = @mypaint_brushes_dir@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +pkgpyexecdir = @pkgpyexecdir@ +pkgpythondir = @pkgpythondir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +pyexecdir = @pyexecdir@ +pythondir = @pythondir@ +runstatedir = @runstatedir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +@OS_WIN32_TRUE@mwindows = -mwindows +@OS_WIN32_FALSE@libm = -lm +libgimpui = $(top_builddir)/libgimp/libgimpui-$(GIMP_API_VERSION).la +libgimpconfig = $(top_builddir)/libgimpconfig/libgimpconfig-$(GIMP_API_VERSION).la +libgimpwidgets = $(top_builddir)/libgimpwidgets/libgimpwidgets-$(GIMP_API_VERSION).la +libgimp = $(top_builddir)/libgimp/libgimp-$(GIMP_API_VERSION).la +libgimpcolor = $(top_builddir)/libgimpcolor/libgimpcolor-$(GIMP_API_VERSION).la +libgimpbase = $(top_builddir)/libgimpbase/libgimpbase-$(GIMP_API_VERSION).la +libgimpmath = $(top_builddir)/libgimpmath/libgimpmath-$(GIMP_API_VERSION).la +SUBDIRS = Brushes Paper Presets +@HAVE_WINDRES_TRUE@GIMPPLUGINRC = $(top_builddir)/build/windows/gimp-plug-ins.rc +@HAVE_WINDRES_TRUE@gimpressionist_RC = gimpressionist.rc.o +AM_CPPFLAGS = \ + -DDEFAULTPATH=\""~/$(gimpdir)/gimpressionist:$(gimpdatadir)/gimpressionist"\" \ + -I$(top_srcdir) \ + $(GTK_CFLAGS) \ + $(GEGL_CFLAGS) \ + -I$(includedir) + +AM_LDFLAGS = $(mwindows) +gimpressionist_SOURCES = \ + brush.c \ + brush.h \ + color.c \ + color.h \ + general.c \ + general.h \ + gimp.c \ + gimpressionist.c \ + gimpressionist.h \ + globals.c \ + infile.h \ + orientation.h \ + orientation.c \ + orientmap.h \ + orientmap.c \ + paper.c \ + paper.h \ + placement.c \ + placement.h \ + plasma.c \ + ppmtool.c \ + ppmtool.h \ + presets.c \ + presets.h \ + preview.c \ + preview.h \ + random.h \ + repaint.c \ + size.h \ + size.c \ + sizemap.c \ + utils.c + +LDADD = \ + $(libm) \ + $(libgimpui) \ + $(libgimpwidgets) \ + $(libgimpconfig) \ + $(libgimp) \ + $(libgimpcolor) \ + $(libgimpmath) \ + $(libgimpbase) \ + $(GTK_LIBS) \ + $(GEGL_LIBS) \ + $(RT_LIBS) \ + $(INTLLIBS) \ + $(gimpressionist_RC) + +EXTRA_DIST = README +all: all-recursive + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/build/windows/gimprc-plug-ins.rule $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu plug-ins/gimpressionist/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu plug-ins/gimpressionist/Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ + esac; +$(top_srcdir)/build/windows/gimprc-plug-ins.rule $(am__empty): + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): +install-libexecPROGRAMS: $(libexec_PROGRAMS) + @$(NORMAL_INSTALL) + @list='$(libexec_PROGRAMS)'; test -n "$(libexecdir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(libexecdir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(libexecdir)" || exit 1; \ + fi; \ + for p in $$list; do echo "$$p $$p"; done | \ + sed 's/$(EXEEXT)$$//' | \ + while read p p1; do if test -f $$p \ + || test -f $$p1 \ + ; then echo "$$p"; echo "$$p"; else :; fi; \ + done | \ + sed -e 'p;s,.*/,,;n;h' \ + -e 's|.*|.|' \ + -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \ + sed 'N;N;N;s,\n, ,g' | \ + $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \ + { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ + if ($$2 == $$4) files[d] = files[d] " " $$1; \ + else { print "f", $$3 "/" $$4, $$1; } } \ + END { for (d in files) print "f", d, files[d] }' | \ + while read type dir files; do \ + if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ + test -z "$$files" || { \ + echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(libexecdir)$$dir'"; \ + $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(libexecdir)$$dir" || exit $$?; \ + } \ + ; done + +uninstall-libexecPROGRAMS: + @$(NORMAL_UNINSTALL) + @list='$(libexec_PROGRAMS)'; test -n "$(libexecdir)" || list=; \ + files=`for p in $$list; do echo "$$p"; done | \ + sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ + -e 's/$$/$(EXEEXT)/' \ + `; \ + test -n "$$list" || exit 0; \ + echo " ( cd '$(DESTDIR)$(libexecdir)' && rm -f" $$files ")"; \ + cd "$(DESTDIR)$(libexecdir)" && rm -f $$files + +clean-libexecPROGRAMS: + @list='$(libexec_PROGRAMS)'; test -n "$$list" || exit 0; \ + echo " rm -f" $$list; \ + rm -f $$list || exit $$?; \ + test -n "$(EXEEXT)" || exit 0; \ + list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ + echo " rm -f" $$list; \ + rm -f $$list + +gimpressionist$(EXEEXT): $(gimpressionist_OBJECTS) $(gimpressionist_DEPENDENCIES) $(EXTRA_gimpressionist_DEPENDENCIES) + @rm -f gimpressionist$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(gimpressionist_OBJECTS) $(gimpressionist_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/brush.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/color.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/general.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gimp.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gimpressionist.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/globals.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/orientation.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/orientmap.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/paper.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/placement.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/plasma.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppmtool.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/presets.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/preview.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/repaint.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/size.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sizemap.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/utils.Po@am__quote@ # am--include-marker + +$(am__depfiles_remade): + @$(MKDIR_P) $(@D) + @echo '# dummy' >$@-t && $(am__mv) $@-t $@ + +am--depfiles: $(am__depfiles_remade) + +.c.o: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< + +.c.obj: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +# This directory's subdirectories are mostly independent; you can cd +# into them and run 'make' without going through this Makefile. +# To change the values of 'make' variables: instead of editing Makefiles, +# (1) if the variable is set in 'config.status', edit 'config.status' +# (which will cause the Makefiles to be regenerated when you run 'make'); +# (2) otherwise, pass the desired values on the 'make' command line. +$(am__recursive_targets): + @fail=; \ + if $(am__make_keepgoing); then \ + failcom='fail=yes'; \ + else \ + failcom='exit 1'; \ + fi; \ + dot_seen=no; \ + target=`echo $@ | sed s/-recursive//`; \ + case "$@" in \ + distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ + *) list='$(SUBDIRS)' ;; \ + esac; \ + for subdir in $$list; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + dot_seen=yes; \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || eval $$failcom; \ + done; \ + if test "$$dot_seen" = "no"; then \ + $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ + fi; test -z "$$fail" + +ID: $(am__tagged_files) + $(am__define_uniq_tagged_files); mkid -fID $$unique +tags: tags-recursive +TAGS: tags + +tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + set x; \ + here=`pwd`; \ + if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ + include_option=--etags-include; \ + empty_fix=.; \ + else \ + include_option=--include; \ + empty_fix=; \ + fi; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + test ! -f $$subdir/TAGS || \ + set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ + fi; \ + done; \ + $(am__define_uniq_tagged_files); \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: ctags-recursive + +CTAGS: ctags +ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + $(am__define_uniq_tagged_files); \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" +cscopelist: cscopelist-recursive + +cscopelist-am: $(am__tagged_files) + list='$(am__tagged_files)'; \ + case "$(srcdir)" in \ + [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ + *) sdir=$(subdir)/$(srcdir) ;; \ + esac; \ + for i in $$list; do \ + if test -f "$$i"; then \ + echo "$(subdir)/$$i"; \ + else \ + echo "$$sdir/$$i"; \ + fi; \ + done >> $(top_builddir)/cscope.files + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) distdir-am + +distdir-am: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done + @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + $(am__make_dryrun) \ + || test -d "$(distdir)/$$subdir" \ + || $(MKDIR_P) "$(distdir)/$$subdir" \ + || exit 1; \ + dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ + $(am__relativize); \ + new_distdir=$$reldir; \ + dir1=$$subdir; dir2="$(top_distdir)"; \ + $(am__relativize); \ + new_top_distdir=$$reldir; \ + echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ + echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ + ($(am__cd) $$subdir && \ + $(MAKE) $(AM_MAKEFLAGS) \ + top_distdir="$$new_top_distdir" \ + distdir="$$new_distdir" \ + am__remove_distdir=: \ + am__skip_length_check=: \ + am__skip_mode_fix=: \ + distdir) \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-recursive +all-am: Makefile $(PROGRAMS) +installdirs: installdirs-recursive +installdirs-am: + for dir in "$(DESTDIR)$(libexecdir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-recursive +install-exec: install-exec-recursive +install-data: install-data-recursive +uninstall: uninstall-recursive + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-recursive +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_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-recursive + +clean-am: clean-generic clean-libexecPROGRAMS clean-libtool \ + mostlyclean-am + +distclean: distclean-recursive + -rm -f ./$(DEPDIR)/brush.Po + -rm -f ./$(DEPDIR)/color.Po + -rm -f ./$(DEPDIR)/general.Po + -rm -f ./$(DEPDIR)/gimp.Po + -rm -f ./$(DEPDIR)/gimpressionist.Po + -rm -f ./$(DEPDIR)/globals.Po + -rm -f ./$(DEPDIR)/orientation.Po + -rm -f ./$(DEPDIR)/orientmap.Po + -rm -f ./$(DEPDIR)/paper.Po + -rm -f ./$(DEPDIR)/placement.Po + -rm -f ./$(DEPDIR)/plasma.Po + -rm -f ./$(DEPDIR)/ppmtool.Po + -rm -f ./$(DEPDIR)/presets.Po + -rm -f ./$(DEPDIR)/preview.Po + -rm -f ./$(DEPDIR)/repaint.Po + -rm -f ./$(DEPDIR)/size.Po + -rm -f ./$(DEPDIR)/sizemap.Po + -rm -f ./$(DEPDIR)/utils.Po + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-recursive + +dvi-am: + +html: html-recursive + +html-am: + +info: info-recursive + +info-am: + +install-data-am: + +install-dvi: install-dvi-recursive + +install-dvi-am: + +install-exec-am: install-libexecPROGRAMS + +install-html: install-html-recursive + +install-html-am: + +install-info: install-info-recursive + +install-info-am: + +install-man: + +install-pdf: install-pdf-recursive + +install-pdf-am: + +install-ps: install-ps-recursive + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-recursive + -rm -f ./$(DEPDIR)/brush.Po + -rm -f ./$(DEPDIR)/color.Po + -rm -f ./$(DEPDIR)/general.Po + -rm -f ./$(DEPDIR)/gimp.Po + -rm -f ./$(DEPDIR)/gimpressionist.Po + -rm -f ./$(DEPDIR)/globals.Po + -rm -f ./$(DEPDIR)/orientation.Po + -rm -f ./$(DEPDIR)/orientmap.Po + -rm -f ./$(DEPDIR)/paper.Po + -rm -f ./$(DEPDIR)/placement.Po + -rm -f ./$(DEPDIR)/plasma.Po + -rm -f ./$(DEPDIR)/ppmtool.Po + -rm -f ./$(DEPDIR)/presets.Po + -rm -f ./$(DEPDIR)/preview.Po + -rm -f ./$(DEPDIR)/repaint.Po + -rm -f ./$(DEPDIR)/size.Po + -rm -f ./$(DEPDIR)/sizemap.Po + -rm -f ./$(DEPDIR)/utils.Po + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-recursive + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-recursive + +pdf-am: + +ps: ps-recursive + +ps-am: + +uninstall-am: uninstall-libexecPROGRAMS + +.MAKE: $(am__recursive_targets) install-am install-strip + +.PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am \ + am--depfiles check check-am clean clean-generic \ + clean-libexecPROGRAMS clean-libtool cscopelist-am ctags \ + ctags-am distclean distclean-compile distclean-generic \ + distclean-libtool distclean-tags distdir dvi dvi-am html \ + html-am info info-am install install-am install-data \ + install-data-am install-dvi install-dvi-am install-exec \ + install-exec-am install-html install-html-am install-info \ + install-info-am install-libexecPROGRAMS install-man \ + install-pdf install-pdf-am install-ps install-ps-am \ + install-strip installcheck installcheck-am installdirs \ + installdirs-am maintainer-clean maintainer-clean-generic \ + mostlyclean mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool pdf pdf-am ps ps-am tags tags-am uninstall \ + uninstall-am uninstall-libexecPROGRAMS + +.PRECIOUS: Makefile + + +# `windres` seems a very stupid tool and it breaks with double shlashes +# in parameter paths. Strengthen the rule a little. +@HAVE_WINDRES_TRUE@%.rc.o: +@HAVE_WINDRES_TRUE@ $(WINDRES) --define ORIGINALFILENAME_STR="$*$(EXEEXT)" \ +@HAVE_WINDRES_TRUE@ --define INTERNALNAME_STR="$*" \ +@HAVE_WINDRES_TRUE@ --define TOP_SRCDIR="`echo $(top_srcdir) | sed 's*//*/*'`" \ +@HAVE_WINDRES_TRUE@ -I"`echo $(top_srcdir)/app | sed 's%/\+%/%'`" \ +@HAVE_WINDRES_TRUE@ -I"`echo $(top_builddir)/app | sed 's%/\+%/%'`"\ +@HAVE_WINDRES_TRUE@ -I"`echo $(top_builddir) | sed 's%/\+%/%'`"\ +@HAVE_WINDRES_TRUE@ $(GIMPPLUGINRC) $@ + +# 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/plug-ins/gimpressionist/Paper/Makefile.am b/plug-ins/gimpressionist/Paper/Makefile.am new file mode 100644 index 0000000..6094996 --- /dev/null +++ b/plug-ins/gimpressionist/Paper/Makefile.am @@ -0,0 +1,16 @@ +## Process this file with automake to produce Makefile.in + +paperdatadir = $(gimpdatadir)/gimpressionist/Paper + +paperdata_DATA = \ + bricks.pgm \ + bricks2.pgm \ + burlap.pgm \ + canvas2.pgm \ + defaultpaper.pgm \ + marble.pgm \ + marble2.pgm \ + stone.pgm \ + struc.pgm + +EXTRA_DIST = $(paperdata_DATA) diff --git a/plug-ins/gimpressionist/Paper/Makefile.in b/plug-ins/gimpressionist/Paper/Makefile.in new file mode 100644 index 0000000..9bc30d1 --- /dev/null +++ b/plug-ins/gimpressionist/Paper/Makefile.in @@ -0,0 +1,814 @@ +# Makefile.in generated by automake 1.16.3 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994-2020 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@ + +VPATH = @srcdir@ +am__is_gnu_make = { \ + if test -z '$(MAKELEVEL)'; then \ + false; \ + elif test -n '$(MAKE_HOST)'; then \ + true; \ + elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ + true; \ + else \ + false; \ + fi; \ +} +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +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 = : +build_triplet = @build@ +host_triplet = @host@ +subdir = plug-ins/gimpressionist/Paper +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ + $(top_srcdir)/m4macros/alsa.m4 \ + $(top_srcdir)/m4macros/ax_compare_version.m4 \ + $(top_srcdir)/m4macros/ax_cxx_compile_stdcxx.m4 \ + $(top_srcdir)/m4macros/ax_gcc_func_attribute.m4 \ + $(top_srcdir)/m4macros/ax_prog_cc_for_build.m4 \ + $(top_srcdir)/m4macros/ax_prog_perl_version.m4 \ + $(top_srcdir)/m4macros/detectcflags.m4 \ + $(top_srcdir)/m4macros/pythondev.m4 $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = +SOURCES = +DIST_SOURCES = +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__uninstall_files_from_dir = { \ + test -z "$$files" \ + || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ + || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ + $(am__cd) "$$dir" && rm -f $$files; }; \ + } +am__installdirs = "$(DESTDIR)$(paperdatadir)" +DATA = $(paperdata_DATA) +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +am__DIST_COMMON = $(srcdir)/Makefile.in +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +AA_LIBS = @AA_LIBS@ +ACLOCAL = @ACLOCAL@ +ALLOCA = @ALLOCA@ +ALL_LINGUAS = @ALL_LINGUAS@ +ALSA_CFLAGS = @ALSA_CFLAGS@ +ALSA_LIBS = @ALSA_LIBS@ +ALTIVEC_EXTRA_CFLAGS = @ALTIVEC_EXTRA_CFLAGS@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +APPSTREAM_UTIL = @APPSTREAM_UTIL@ +AR = @AR@ +AS = @AS@ +ATK_CFLAGS = @ATK_CFLAGS@ +ATK_LIBS = @ATK_LIBS@ +ATK_REQUIRED_VERSION = @ATK_REQUIRED_VERSION@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BABL_CFLAGS = @BABL_CFLAGS@ +BABL_LIBS = @BABL_LIBS@ +BABL_REQUIRED_VERSION = @BABL_REQUIRED_VERSION@ +BUG_REPORT_URL = @BUG_REPORT_URL@ +BUILD_EXEEXT = @BUILD_EXEEXT@ +BUILD_OBJEXT = @BUILD_OBJEXT@ +BZIP2_LIBS = @BZIP2_LIBS@ +CAIRO_CFLAGS = @CAIRO_CFLAGS@ +CAIRO_LIBS = @CAIRO_LIBS@ +CAIRO_PDF_CFLAGS = @CAIRO_PDF_CFLAGS@ +CAIRO_PDF_LIBS = @CAIRO_PDF_LIBS@ +CAIRO_PDF_REQUIRED_VERSION = @CAIRO_PDF_REQUIRED_VERSION@ +CAIRO_REQUIRED_VERSION = @CAIRO_REQUIRED_VERSION@ +CATALOGS = @CATALOGS@ +CATOBJEXT = @CATOBJEXT@ +CC = @CC@ +CCAS = @CCAS@ +CCASDEPMODE = @CCASDEPMODE@ +CCASFLAGS = @CCASFLAGS@ +CCDEPMODE = @CCDEPMODE@ +CC_FOR_BUILD = @CC_FOR_BUILD@ +CC_VERSION = @CC_VERSION@ +CFLAGS = @CFLAGS@ +CFLAGS_FOR_BUILD = @CFLAGS_FOR_BUILD@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CPPFLAGS_FOR_BUILD = @CPPFLAGS_FOR_BUILD@ +CPP_FOR_BUILD = @CPP_FOR_BUILD@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DATADIRNAME = @DATADIRNAME@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DESKTOP_DATADIR = @DESKTOP_DATADIR@ +DESKTOP_FILE_VALIDATE = @DESKTOP_FILE_VALIDATE@ +DLLTOOL = @DLLTOOL@ +DOC_SHOOTER = @DOC_SHOOTER@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +FILE_AA = @FILE_AA@ +FILE_EXR = @FILE_EXR@ +FILE_HEIF = @FILE_HEIF@ +FILE_JP2_LOAD = @FILE_JP2_LOAD@ +FILE_JPEGXL = @FILE_JPEGXL@ +FILE_MNG = @FILE_MNG@ +FILE_PDF_SAVE = @FILE_PDF_SAVE@ +FILE_PS = @FILE_PS@ +FILE_WMF = @FILE_WMF@ +FILE_XMC = @FILE_XMC@ +FILE_XPM = @FILE_XPM@ +FONTCONFIG_CFLAGS = @FONTCONFIG_CFLAGS@ +FONTCONFIG_LIBS = @FONTCONFIG_LIBS@ +FONTCONFIG_REQUIRED_VERSION = @FONTCONFIG_REQUIRED_VERSION@ +FREETYPE2_REQUIRED_VERSION = @FREETYPE2_REQUIRED_VERSION@ +FREETYPE_CFLAGS = @FREETYPE_CFLAGS@ +FREETYPE_LIBS = @FREETYPE_LIBS@ +GDBUS_CODEGEN = @GDBUS_CODEGEN@ +GDK_PIXBUF_CFLAGS = @GDK_PIXBUF_CFLAGS@ +GDK_PIXBUF_CSOURCE = @GDK_PIXBUF_CSOURCE@ +GDK_PIXBUF_LIBS = @GDK_PIXBUF_LIBS@ +GDK_PIXBUF_REQUIRED_VERSION = @GDK_PIXBUF_REQUIRED_VERSION@ +GEGL = @GEGL@ +GEGL_CFLAGS = @GEGL_CFLAGS@ +GEGL_LIBS = @GEGL_LIBS@ +GEGL_MAJOR_MINOR_VERSION = @GEGL_MAJOR_MINOR_VERSION@ +GEGL_REQUIRED_VERSION = @GEGL_REQUIRED_VERSION@ +GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ +GEXIV2_CFLAGS = @GEXIV2_CFLAGS@ +GEXIV2_LIBS = @GEXIV2_LIBS@ +GEXIV2_REQUIRED_VERSION = @GEXIV2_REQUIRED_VERSION@ +GIMP_API_VERSION = @GIMP_API_VERSION@ +GIMP_APP_VERSION = @GIMP_APP_VERSION@ +GIMP_BINARY_AGE = @GIMP_BINARY_AGE@ +GIMP_COMMAND = @GIMP_COMMAND@ +GIMP_DATA_VERSION = @GIMP_DATA_VERSION@ +GIMP_FULL_NAME = @GIMP_FULL_NAME@ +GIMP_INTERFACE_AGE = @GIMP_INTERFACE_AGE@ +GIMP_MAJOR_VERSION = @GIMP_MAJOR_VERSION@ +GIMP_MICRO_VERSION = @GIMP_MICRO_VERSION@ +GIMP_MINOR_VERSION = @GIMP_MINOR_VERSION@ +GIMP_MKENUMS = @GIMP_MKENUMS@ +GIMP_MODULES = @GIMP_MODULES@ +GIMP_PACKAGE_REVISION = @GIMP_PACKAGE_REVISION@ +GIMP_PKGCONFIG_VERSION = @GIMP_PKGCONFIG_VERSION@ +GIMP_PLUGINS = @GIMP_PLUGINS@ +GIMP_PLUGIN_VERSION = @GIMP_PLUGIN_VERSION@ +GIMP_REAL_VERSION = @GIMP_REAL_VERSION@ +GIMP_RELEASE = @GIMP_RELEASE@ +GIMP_SYSCONF_VERSION = @GIMP_SYSCONF_VERSION@ +GIMP_TOOL_VERSION = @GIMP_TOOL_VERSION@ +GIMP_UNSTABLE = @GIMP_UNSTABLE@ +GIMP_USER_VERSION = @GIMP_USER_VERSION@ +GIMP_VERSION = @GIMP_VERSION@ +GIO_CFLAGS = @GIO_CFLAGS@ +GIO_LIBS = @GIO_LIBS@ +GIO_UNIX_CFLAGS = @GIO_UNIX_CFLAGS@ +GIO_UNIX_LIBS = @GIO_UNIX_LIBS@ +GIO_WINDOWS_CFLAGS = @GIO_WINDOWS_CFLAGS@ +GIO_WINDOWS_LIBS = @GIO_WINDOWS_LIBS@ +GLIB_CFLAGS = @GLIB_CFLAGS@ +GLIB_COMPILE_RESOURCES = @GLIB_COMPILE_RESOURCES@ +GLIB_GENMARSHAL = @GLIB_GENMARSHAL@ +GLIB_LIBS = @GLIB_LIBS@ +GLIB_MKENUMS = @GLIB_MKENUMS@ +GLIB_REQUIRED_VERSION = @GLIB_REQUIRED_VERSION@ +GMODULE_NO_EXPORT_CFLAGS = @GMODULE_NO_EXPORT_CFLAGS@ +GMODULE_NO_EXPORT_LIBS = @GMODULE_NO_EXPORT_LIBS@ +GMOFILES = @GMOFILES@ +GMSGFMT = @GMSGFMT@ +GOBJECT_QUERY = @GOBJECT_QUERY@ +GREP = @GREP@ +GS_LIBS = @GS_LIBS@ +GTKDOC_CHECK = @GTKDOC_CHECK@ +GTKDOC_CHECK_PATH = @GTKDOC_CHECK_PATH@ +GTKDOC_DEPS_CFLAGS = @GTKDOC_DEPS_CFLAGS@ +GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@ +GTKDOC_MKPDF = @GTKDOC_MKPDF@ +GTKDOC_REBASE = @GTKDOC_REBASE@ +GTK_CFLAGS = @GTK_CFLAGS@ +GTK_LIBS = @GTK_LIBS@ +GTK_MAC_INTEGRATION_CFLAGS = @GTK_MAC_INTEGRATION_CFLAGS@ +GTK_MAC_INTEGRATION_LIBS = @GTK_MAC_INTEGRATION_LIBS@ +GTK_REQUIRED_VERSION = @GTK_REQUIRED_VERSION@ +GTK_UPDATE_ICON_CACHE = @GTK_UPDATE_ICON_CACHE@ +GUDEV_CFLAGS = @GUDEV_CFLAGS@ +GUDEV_LIBS = @GUDEV_LIBS@ +HARFBUZZ_CFLAGS = @HARFBUZZ_CFLAGS@ +HARFBUZZ_LIBS = @HARFBUZZ_LIBS@ +HARFBUZZ_REQUIRED_VERSION = @HARFBUZZ_REQUIRED_VERSION@ +HAVE_CXX14 = @HAVE_CXX14@ +HAVE_FINITE = @HAVE_FINITE@ +HAVE_ISFINITE = @HAVE_ISFINITE@ +HAVE_VFORK = @HAVE_VFORK@ +HOST_GLIB_COMPILE_RESOURCES = @HOST_GLIB_COMPILE_RESOURCES@ +HTML_DIR = @HTML_DIR@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INSTOBJEXT = @INSTOBJEXT@ +INTLLIBS = @INTLLIBS@ +INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@ +INTLTOOL_MERGE = @INTLTOOL_MERGE@ +INTLTOOL_PERL = @INTLTOOL_PERL@ +INTLTOOL_REQUIRED_VERSION = @INTLTOOL_REQUIRED_VERSION@ +INTLTOOL_UPDATE = @INTLTOOL_UPDATE@ +INTLTOOL_V_MERGE = @INTLTOOL_V_MERGE@ +INTLTOOL_V_MERGE_OPTIONS = @INTLTOOL_V_MERGE_OPTIONS@ +INTLTOOL__v_MERGE_ = @INTLTOOL__v_MERGE_@ +INTLTOOL__v_MERGE_0 = @INTLTOOL__v_MERGE_0@ +INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ +ISO_CODES_LOCALEDIR = @ISO_CODES_LOCALEDIR@ +ISO_CODES_LOCATION = @ISO_CODES_LOCATION@ +JPEG_LIBS = @JPEG_LIBS@ +JSON_GLIB_CFLAGS = @JSON_GLIB_CFLAGS@ +JSON_GLIB_LIBS = @JSON_GLIB_LIBS@ +JXL_CFLAGS = @JXL_CFLAGS@ +JXL_LIBS = @JXL_LIBS@ +JXL_THREADS_CFLAGS = @JXL_THREADS_CFLAGS@ +JXL_THREADS_LIBS = @JXL_THREADS_LIBS@ +LCMS_CFLAGS = @LCMS_CFLAGS@ +LCMS_LIBS = @LCMS_LIBS@ +LCMS_REQUIRED_VERSION = @LCMS_REQUIRED_VERSION@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LDFLAGS_FOR_BUILD = @LDFLAGS_FOR_BUILD@ +LIBBACKTRACE_LIBS = @LIBBACKTRACE_LIBS@ +LIBHEIF_CFLAGS = @LIBHEIF_CFLAGS@ +LIBHEIF_LIBS = @LIBHEIF_LIBS@ +LIBHEIF_REQUIRED_VERSION = @LIBHEIF_REQUIRED_VERSION@ +LIBJXL_REQUIRED_VERSION = @LIBJXL_REQUIRED_VERSION@ +LIBLZMA_REQUIRED_VERSION = @LIBLZMA_REQUIRED_VERSION@ +LIBMYPAINT_CFLAGS = @LIBMYPAINT_CFLAGS@ +LIBMYPAINT_LIBS = @LIBMYPAINT_LIBS@ +LIBMYPAINT_REQUIRED_VERSION = @LIBMYPAINT_REQUIRED_VERSION@ +LIBOBJS = @LIBOBJS@ +LIBPNG_REQUIRED_VERSION = @LIBPNG_REQUIRED_VERSION@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIBUNWIND_CFLAGS = @LIBUNWIND_CFLAGS@ +LIBUNWIND_LIBS = @LIBUNWIND_LIBS@ +LIBUNWIND_REQUIRED_VERSION = @LIBUNWIND_REQUIRED_VERSION@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +LT_CURRENT_MINUS_AGE = @LT_CURRENT_MINUS_AGE@ +LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ +LT_VERSION_INFO = @LT_VERSION_INFO@ +LZMA_CFLAGS = @LZMA_CFLAGS@ +LZMA_LIBS = @LZMA_LIBS@ +MAIL = @MAIL@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MIME_INFO_CFLAGS = @MIME_INFO_CFLAGS@ +MIME_INFO_LIBS = @MIME_INFO_LIBS@ +MIME_TYPES = @MIME_TYPES@ +MKDIR_P = @MKDIR_P@ +MKINSTALLDIRS = @MKINSTALLDIRS@ +MMX_EXTRA_CFLAGS = @MMX_EXTRA_CFLAGS@ +MNG_CFLAGS = @MNG_CFLAGS@ +MNG_LIBS = @MNG_LIBS@ +MSGFMT = @MSGFMT@ +MSGFMT_OPTS = @MSGFMT_OPTS@ +MSGMERGE = @MSGMERGE@ +MYPAINT_BRUSHES_CFLAGS = @MYPAINT_BRUSHES_CFLAGS@ +MYPAINT_BRUSHES_LIBS = @MYPAINT_BRUSHES_LIBS@ +NATIVE_GLIB_CFLAGS = @NATIVE_GLIB_CFLAGS@ +NATIVE_GLIB_LIBS = @NATIVE_GLIB_LIBS@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OPENEXR_CFLAGS = @OPENEXR_CFLAGS@ +OPENEXR_LIBS = @OPENEXR_LIBS@ +OPENEXR_REQUIRED_VERSION = @OPENEXR_REQUIRED_VERSION@ +OPENJPEG_CFLAGS = @OPENJPEG_CFLAGS@ +OPENJPEG_LIBS = @OPENJPEG_LIBS@ +OPENJPEG_REQUIRED_VERSION = @OPENJPEG_REQUIRED_VERSION@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PANGOCAIRO_CFLAGS = @PANGOCAIRO_CFLAGS@ +PANGOCAIRO_LIBS = @PANGOCAIRO_LIBS@ +PANGOCAIRO_REQUIRED_VERSION = @PANGOCAIRO_REQUIRED_VERSION@ +PATHSEP = @PATHSEP@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PERL = @PERL@ +PERL_REQUIRED_VERSION = @PERL_REQUIRED_VERSION@ +PERL_VERSION = @PERL_VERSION@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +PNG_CFLAGS = @PNG_CFLAGS@ +PNG_LIBS = @PNG_LIBS@ +POFILES = @POFILES@ +POPPLER_CFLAGS = @POPPLER_CFLAGS@ +POPPLER_DATA_CFLAGS = @POPPLER_DATA_CFLAGS@ +POPPLER_DATA_LIBS = @POPPLER_DATA_LIBS@ +POPPLER_DATA_REQUIRED_VERSION = @POPPLER_DATA_REQUIRED_VERSION@ +POPPLER_LIBS = @POPPLER_LIBS@ +POPPLER_REQUIRED_VERSION = @POPPLER_REQUIRED_VERSION@ +POSUB = @POSUB@ +PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@ +PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@ +PYBIN_PATH = @PYBIN_PATH@ +PYCAIRO_CFLAGS = @PYCAIRO_CFLAGS@ +PYCAIRO_LIBS = @PYCAIRO_LIBS@ +PYGIMP_EXTRA_CFLAGS = @PYGIMP_EXTRA_CFLAGS@ +PYGTK_CFLAGS = @PYGTK_CFLAGS@ +PYGTK_CODEGEN = @PYGTK_CODEGEN@ +PYGTK_DEFSDIR = @PYGTK_DEFSDIR@ +PYGTK_LIBS = @PYGTK_LIBS@ +PYLINK_LIBS = @PYLINK_LIBS@ +PYTHON = @PYTHON@ +PYTHON2_REQUIRED_VERSION = @PYTHON2_REQUIRED_VERSION@ +PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ +PYTHON_INCLUDES = @PYTHON_INCLUDES@ +PYTHON_PLATFORM = @PYTHON_PLATFORM@ +PYTHON_PREFIX = @PYTHON_PREFIX@ +PYTHON_VERSION = @PYTHON_VERSION@ +RANLIB = @RANLIB@ +RSVG_REQUIRED_VERSION = @RSVG_REQUIRED_VERSION@ +RT_LIBS = @RT_LIBS@ +SCREENSHOT_LIBS = @SCREENSHOT_LIBS@ +SED = @SED@ +SENDMAIL = @SENDMAIL@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SOCKET_LIBS = @SOCKET_LIBS@ +SSE2_EXTRA_CFLAGS = @SSE2_EXTRA_CFLAGS@ +SSE4_1_EXTRA_CFLAGS = @SSE4_1_EXTRA_CFLAGS@ +SSE_EXTRA_CFLAGS = @SSE_EXTRA_CFLAGS@ +STRIP = @STRIP@ +SVG_CFLAGS = @SVG_CFLAGS@ +SVG_LIBS = @SVG_LIBS@ +SYMPREFIX = @SYMPREFIX@ +TIFF_LIBS = @TIFF_LIBS@ +USE_NLS = @USE_NLS@ +VERSION = @VERSION@ +WEBKIT_CFLAGS = @WEBKIT_CFLAGS@ +WEBKIT_LIBS = @WEBKIT_LIBS@ +WEBKIT_REQUIRED_VERSION = @WEBKIT_REQUIRED_VERSION@ +WEBPDEMUX_CFLAGS = @WEBPDEMUX_CFLAGS@ +WEBPDEMUX_LIBS = @WEBPDEMUX_LIBS@ +WEBPMUX_CFLAGS = @WEBPMUX_CFLAGS@ +WEBPMUX_LIBS = @WEBPMUX_LIBS@ +WEBP_CFLAGS = @WEBP_CFLAGS@ +WEBP_LIBS = @WEBP_LIBS@ +WEBP_REQUIRED_VERSION = @WEBP_REQUIRED_VERSION@ +WEB_PAGE = @WEB_PAGE@ +WIN32_LARGE_ADDRESS_AWARE = @WIN32_LARGE_ADDRESS_AWARE@ +WINDRES = @WINDRES@ +WMF_CFLAGS = @WMF_CFLAGS@ +WMF_CONFIG = @WMF_CONFIG@ +WMF_LIBS = @WMF_LIBS@ +WMF_REQUIRED_VERSION = @WMF_REQUIRED_VERSION@ +XDG_EMAIL = @XDG_EMAIL@ +XFIXES_CFLAGS = @XFIXES_CFLAGS@ +XFIXES_LIBS = @XFIXES_LIBS@ +XGETTEXT = @XGETTEXT@ +XGETTEXT_REQUIRED_VERSION = @XGETTEXT_REQUIRED_VERSION@ +XMC_CFLAGS = @XMC_CFLAGS@ +XMC_LIBS = @XMC_LIBS@ +XMKMF = @XMKMF@ +XMLLINT = @XMLLINT@ +XMU_LIBS = @XMU_LIBS@ +XPM_LIBS = @XPM_LIBS@ +XSLTPROC = @XSLTPROC@ +XVFB_RUN = @XVFB_RUN@ +X_CFLAGS = @X_CFLAGS@ +X_EXTRA_LIBS = @X_EXTRA_LIBS@ +X_LIBS = @X_LIBS@ +X_PRE_LIBS = @X_PRE_LIBS@ +Z_LIBS = @Z_LIBS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CC_FOR_BUILD = @ac_ct_CC_FOR_BUILD@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +gimpdatadir = @gimpdatadir@ +gimpdir = @gimpdir@ +gimplocaledir = @gimplocaledir@ +gimpplugindir = @gimpplugindir@ +gimpsysconfdir = @gimpsysconfdir@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +intltool__v_merge_options_ = @intltool__v_merge_options_@ +intltool__v_merge_options_0 = @intltool__v_merge_options_0@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +manpage_gimpdir = @manpage_gimpdir@ +mkdir_p = @mkdir_p@ +ms_librarian = @ms_librarian@ +mypaint_brushes_dir = @mypaint_brushes_dir@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +pkgpyexecdir = @pkgpyexecdir@ +pkgpythondir = @pkgpythondir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +pyexecdir = @pyexecdir@ +pythondir = @pythondir@ +runstatedir = @runstatedir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +paperdatadir = $(gimpdatadir)/gimpressionist/Paper +paperdata_DATA = \ + bricks.pgm \ + bricks2.pgm \ + burlap.pgm \ + canvas2.pgm \ + defaultpaper.pgm \ + marble.pgm \ + marble2.pgm \ + stone.pgm \ + struc.pgm + +EXTRA_DIST = $(paperdata_DATA) +all: all-am + +.SUFFIXES: +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu plug-ins/gimpressionist/Paper/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu plug-ins/gimpressionist/Paper/Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs +install-paperdataDATA: $(paperdata_DATA) + @$(NORMAL_INSTALL) + @list='$(paperdata_DATA)'; test -n "$(paperdatadir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(paperdatadir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(paperdatadir)" || exit 1; \ + fi; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(paperdatadir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(paperdatadir)" || exit $$?; \ + done + +uninstall-paperdataDATA: + @$(NORMAL_UNINSTALL) + @list='$(paperdata_DATA)'; test -n "$(paperdatadir)" || list=; \ + files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ + dir='$(DESTDIR)$(paperdatadir)'; $(am__uninstall_files_from_dir) +tags TAGS: + +ctags CTAGS: + +cscope cscopelist: + + +distdir: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) distdir-am + +distdir-am: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$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 $(DATA) +installdirs: + for dir in "$(DESTDIR)$(paperdatadir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +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: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_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-generic clean-libtool mostlyclean-am + +distclean: distclean-am + -rm -f Makefile +distclean-am: clean-am distclean-generic + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: install-paperdataDATA + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-generic mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-paperdataDATA + +.MAKE: install-am install-strip + +.PHONY: all all-am check check-am clean clean-generic clean-libtool \ + cscopelist-am ctags-am distclean distclean-generic \ + distclean-libtool distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-paperdataDATA install-pdf install-pdf-am install-ps \ + install-ps-am install-strip installcheck installcheck-am \ + installdirs maintainer-clean maintainer-clean-generic \ + mostlyclean mostlyclean-generic mostlyclean-libtool pdf pdf-am \ + ps ps-am tags-am uninstall uninstall-am \ + uninstall-paperdataDATA + +.PRECIOUS: Makefile + + +# 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/plug-ins/gimpressionist/Paper/bricks.pgm b/plug-ins/gimpressionist/Paper/bricks.pgm new file mode 100644 index 0000000..c721f76 --- /dev/null +++ b/plug-ins/gimpressionist/Paper/bricks.pgm @@ -0,0 +1,43 @@ +P5 +# CREATOR: The GIMP's PNM Filter Version 1.0 +96 95 +255 +§¾Ãºœªš§šš®³£’Ž• ¤˜›ŽŒ‹Š„ƒžˆ‚£Žž’¦¡¢©Ÿ±¢©˜Œ¥„§œ³§´’°˜œ¢‘¡ž¥¡®±Ž²½Â©¼×±¯©¢Œ—˜„¦š 㪰´› ÔªÅˮٳ™„Ÿs¯ª•¡‘«¬—•’Š§—–¸¬´Å±ª¤§«°©•£¦•¢~œ˜¦¥µ‰¨¥¡¡½®¯¨–Ž¥°Ï˳Ý×Í{˜°—º·¡¯¥Ä–ÓÓš±³¨²š«·œ¯¯”¹±ž©––ƒœth…~˜w†uj}†—©˜‰ uˆ£š©²ÆÄÍ°¿¸Ó˪¬›µœº·±–Ÿ¥‘”²¨‘ª‚yŒµœŸ¥¢d‰‚¹‹|—‹’œš—£Ÿ²ž”“™¢»¼—ª£°¬¡§ª’Á»q‰o‚r}¨fbaq—È…¼S„iÐßÌÁµ¤}|]`¦gŠŽ·°©l‹€nŠ¥…l„Ui›££#9Å•nˆ“–pvÆ¥u¤˜šžÂ£°¥˜†”©½‡¡Š§›˜˜¥ƒ²–ˆ£¢Ž’1‹r’X„˜¬ }“±“NÛÃœ•¡sGX`-wzvr¦‰¢—q_x…Ukpzuy‚G—« ³»‡kª~„°Z{²´¤”§Œ–¼ªŽ°¤œ‘ˆ›“lŠ„w—œ”’•—•„¢¶‡rƒ‘“›§¨OÈ®ŠŠŒ‰ˆƒ„„¾š—Ås’‘O_r†oŒŽŠ^drm¥ ³Ê‡•’ˆ‡ƒ‘‡…—¡ƒšš±È¯¸•“šŸšª~²˜z†žl£„Ž¢£‹‹—ƒ zdrˆÃ—"¾£|~} ŒuA|£›¸}š–Š&pc`Ywy”Kc„›y¦ ·›‡{†sŽ˜št‹O‚•Œ¨®¦§³~z‡‚}ƒ…qˆ¢³§‚¨ „¡’œx~[t…²…ƒI
«¹°gŒ{›'z‹W±q™}ƒ£Vwvjn]}ƒW4}…–¢WvÒz€…ˆ“¬o”¥‘nŽ…©¨©°£ƒ™”š“‰gofˆvp‚–¦…©’†”’“§y…˜Ž°Ÿ_ƒ‚vžtm}fN+:}ˆ”g‘xœ¡~mttlpS‡›}•†§‹Sh·œ†žŠ}’|o‚}˜n’“ž›¨«–Ÿ‚žxq`l^ƒ„Ÿš¡£ª¦›¡††|‡’œ±²Wnƒz&®3|sxˆ™dgš›¢©‡Ÿ—œ¥x…|w©š„•|yƒ†…˜€-®°bkl™\–™—ˆwT‘–¯¦Ÿ†š” ˆ“«{…†ŠvŒ©•˜ª‰ž‹‰rœŸ±Pgvk¶§ž«™š”Š›¥|už››¥†y|zm†w‚“„œ›“"¯Š˜¤Œ‡§z›l ˆŽ˜¯¢›Á˜~—Ÿ‰„”€—fŽ“¬žœŠž¢w}¢¥K^Š’ˆ_T `´¤vŒ†·yl‚©¥’•‘ªŒšomj‘o•¾Ž•‹}‘›”’¨¸}tZ€‹©p}Ÿ§›ž„Š¡‘Š£¨²š~x™‹‡‚~›’¡££~œŠ™‡‡¢–HFT=QIt_qPԧ˳ª©Žyjµ¯š£ ¯¯€¢}}ŸŠiy¡Y}š§È~ŸŠoJd›‚‚„›v—s²—‚ž¼Jq…—ˆŒ‘„…•‰¶ŠŽ„ˆˆha^‚obˆl„$kÖ¿¥£¨~’ œŽƒ“§œ„¦ƒ}‡}Š~Š¢±‰Ÿž™ Äqš„{vG`©Ž”Ÿ´°ˆ•‹Ÿ°ª‚¾œS‡«¦—†~—xŽl†—ž²“‚jsxb/†UŽ|]- +u¼ªÈ›«µŠŽ™£§—¦ˆ†l†{yn‘’„…žw›Š£œ¯‚ [–¦cnƒ¤•Ÿpqmˆ’¥”£šh{³x“~j}†”¥‰‰ˆ¦•†¡®‘u_\U€Y]‘j-- +aÚ·²¤”¥ŽxŽ—ƒ™„†›…}‚†Žv™ª¬¤©¡o ®„¢yqŠgq¦`{‰}˜˜“˜ˆ…’ƒs”u¦}˜‰€sp‡ª£®‰‡SrnoFsxUTl`ÔÇᎉŸŸ†Š–Œ ¡|†‹—†”‡”ˆŸ }„—y* +”œr‚w—Œ•‰“§™—Ž«†—Ÿ¹½‘“”|ž•{t—ššŠ”¦£fx›\…vnigzpy/
iÏ¢¹†|Ž‰g‘ˆ©“‡¡•œ‡”“’}¤œ’¨™”¡É +œz”vr€€Ÿb©{«¯£€¤Œ«“œœŒw†‘Œs‚—‹¥”“’‰Ž€j{tm“Ž‘¢{|F_׳›¶”Æ¢’›¡w¡§•ˆ‹–² šˆ‚šš šŸ£ž¡¢¥”‡v€“‡sh†žŸ·ªz~€’‰•’•œ†¢i‰h’z„¡—±s›zž˜¡£‡‰Šz…y’¢œ‘n#j°—Õ©Œ‹Ž˜•¦wt~žŒŠ—ŸŒ„š™¤´¼™ls_”A„ˆ¶†¡y`“‹ž”†²”’¨–ƒSQ{X†•‡¥ž‡š’‡i€Š‹iddvz¸ž¥£afοwÁ°©¡–«¢ŠŽ–—’•ª’’›¶œ¢©®®«©¶§‡+ ˜r†ƒnxo“®……•ˆ’¬“°®ƒ„†…ˆX]˜€¦’›‘‰‰rŠ†“„‹™^knzm´}u97 +aÖ‚F{ºƒª¯«¤©n‰Œ©¬¥¡«‰…Š¡ v–‰›º–jD£«\20Bo‘—’ƒ}‘‘“›„š‡nh_o81ƒ“Lo}‚šŽyšmžº¬zkYO].Ej—`< +˜M)2-#31$FI8%$/)%!«’<&X³'€–Œ…¤rclŒ¼gzOO(5;lp5bqœ™“”¢¢«}‘tbon=Yd‚i + +#
ypPŒ°‘—dO™„‚b‚º£²„Q"<GV$CSS1aba‰')(hepU^œKRhŽL/5/
>2[fg}D$–€››Ž†e[," ! ( zŸ|ƒvA)% + +-)7,)
2?&21("…Xt‹c^T[>b`8
+
":\u_u€¦º§‡™€‘•q;€\'$%!$;2 -k+#!3‘~NMhjTUkF8Nfpyx³½¿¡¡»žª‡›Œvd^o~#!YZy‡‘Š‘Œ«`‹X‚–ƒp]hz{qimƒ{”xmP| ´¨ ´Ÿ±°²§§¸šÆ™¡“™™žµÁ¶¸´³¾½²³³¯Ÿ«·›¯½¨£ž¬œ™”‡œ«1L|••nQ="%C€Šf–‹™¦“wi— ˆ´z©”›¥–™Š’”“Œ…£^‡›¼¤¯ š°¥¶¡“«”¤ÆÁš¯ž®ÃÏƺÄǬº½¡±Èõ‰œ¸´«»¦œ¹ª¨¢Ž—“´´±œ¢®¡µ™™š±¢œ“¦—ª¡”°ˆ´¤¨•¹©³±‘š “’ƒ¦šž¡«°•Í³¥¼º®¡¨§›‘£¯Ÿ°£´»‘¹£¼À¶¨³Ë¿ ·wx™«¯²˜¥ƒš–ª¡³±®¼²®¥¬¦Ÿ¦xž2?Ž¥•¡ž´t³¼ÃœŽƒž¨¨§«²¨}jž¦¨½·¾‹µºªŸ¯¼½¬«ŽZ¢x™‹w=k²|Y‡Ž¡ª¸°©¹¬…Z³§Ÿž°ŽHXy€¤¨Í¹‘¯œ¦vjuŽ©®gƒ~qln•ªÀµ¿¶¢±°œ©¼²¶¤›—Š‰”†NU©À¨¬‰¡ž‹ˆ‘Ž•mdq’²´¯°¢®ªŸª˜š’¥š„“Œlw£‡gzUˆ~Š$Ÿ¸´©ƒi”‰ž©³¸¦ª¶‰§¦©£±ª´žp“½¹±²¼Ê©«‹¡©š¤Ž«!Fž°²š„‹§œš„cxˆvOovqŸ¥…zƒˆod_Udk‹qpt‚aˆ¥Ÿw‡€Š‡d +Š‘ž¦s£¢£¬§ªµ¾Ü·ÉĽ§€‹”ÃÄÂÀËÁÐÊÎÌÇ«Ïɺª¥µÂ²±‘©¸½šŒœ›œ£œ¨›\“Ÿ†“Œ§–ˆ“yw•—ml‰¥I”† ½†g˜„yT1ˆ¹ÉºŸŸ•¬µ¯À¥ÈÆ»´¯·¾ÀÆÄÆÁ¸¾¿Ç¼ªµÃÒª¨¢¬½¯Æ£
ˆ«Â¸—›¤¥ƒ–©‡’µl“o•ƒ¢‹…”y’gizr“‡Œ•Qœ—•x|³‰+O#x™Ÿ½Ô°°§½»¼Í·½ÑÀɣ˴ÀºÅÊÈÙ¹¿ÎÓẽ¡—œ²‘¯‡
`¦Âœ”¦§¢ª—¬z›’²‹“²Äœ™{x [hŽ—°Ë”²uœ¡Œšs… ;œÇ¼Êº¿¾ÃÑÚÆÇ»©Æ½¹®‘®°žÁÁÁ¹ž²¬«²¸Ÿ«¡‰–ˆ|.
œ¹ª¥¡»©¦ª““Ÿƒ‰–›œ˜£Ž¬®žƒ~s£x…zw‹¤|ˆ°˜¼¢y‡Ž©™!# •Õ·º±ÂÇÅÈÀ§—£¨™ ©…¸Š¢«ª›¬ §ªžŒŠ£‹¥ˆ›x†uŒZ ¾Á£Œ™‰¡¬š¦Ÿf_x‹ŸŸ¬œŠ}‚s§|€q„·Ÿ§”§ª¡¢oŽ†s’¼©¼µØÆȨˆ š¨‘ˆ†µ¢±™·£˜®¯‘¦ ¢m~`”˜i_ƒ™M€Ë¥•¨¢¤© ›˜‰’{l’¬˜‰°ˆ~”z{™–qvŠ‹o¥¬¬¯®˜Œp‹‘xuµ©”»¤·zž—–Š‘¢‹ž™¡¦ž}{Çž¡ªžž¯˜¤’•w_}‹c~S›™ +BÑt›”Œ¯¢ŒŸ•‚˜Œ’¦¢ƒ¯¡‡™š„™Œiœ€Ÿ¨¨²¬œp…„¸¦š¯¼…ÈΪ‡¬µ§Ÿ”qqœŽ¡‘½š†šz›§ª§”s‘¥‡§qv‹^Ž¡U)ÒÀ˜Š‹¡•rh¢‡ Ÿ±†•–†™ } “¼©k™„•¨˜¡¥Ì}¢¨œ¬†' £Ówߧ{•¾¦¨²¥Ÿ¨¡œ¥‹©›—Š™™£¹ªŸ›˜„h‹}[o~”‚Zu 8Òµ—›©¯±¤Ž¦§ž’”ŽŒ¤g´°…Sy©Šª‘¦šœ§²¬²„’§ˆ¬’•+”µ³Qê—uš—o¥—‹¡£¬’Ÿž¤ª«¼”¡±£„•¥™‰~´šF—š“ƒ†ž™°®žŸ‡Œ²ž•š…³°³—yiŒ‰™›‰—•oz‡”~†¤¬§¥{ªy›“®ŸCp¦ËwÕp‚ªŽjšŠ…–¡Ÿ˜³¬±¥«¤«Ÿ‰ž—¤ž²˜{†°td‰}y§u!ÖÓ®£·™®Á¯†¤}‹œupq¹šw‡Ž•¡c«¦‚ª±¨¦¥›a–ª¥±t“®¦à¦³gŽŠ–¥”š’¤—¨¾¯® ª ¢”¥ž¥‚’œ¯¢“p{{†—yˆ†C›ÂÏ®¥¤¨´•™“žšŠ{ŒŸd“~oŽn¦‘œ‰ › j¢Œ y¨¯±ž·y‹ +²˜™˜ŠtŠX^—…’ž„ –¦³¥¬¡©¨ ¬•Ÿ€‰˜†‘’Ÿ¥vtA“˜F”E Ƭ§‘‰¨§¡r§‡¦Šzwˆ›œ¨ u¥}·¢˜Ž£§{¸±©žx‘s’»Ó£qjxkg„[žŸ~š¦—§©¬œ˜¦‘Ž’ „¢”Œž£pR~[ˆŒ–¼Ü ¥nlw‘–„…†~™vˆqŒŒm€® zŠ£Ž¤›’ Ž ¡’€‹¢–†‡˜S©µ¸¯„ˆˆh†—«zŒ©x“¢À¥–³–ˆ…ƒ²–—y•Œ®ƒqqr›ŒŸ¬ì „[krŒvq‘®Ÿ¥x~}‡¤•¦ ¨i€w£x¥—y‹bŠ¡…p Ÿ¹Â·xyXunœ™‹rh~…©Ÿ Ÿ¦š›‡œ‰ž§r’{‡Ž\iK dIR‹]¥Ê—en—s„„€k`€©žšx…‡c|œ«†œ¶W|¶ŒŒªqŽŸªª†x|hJD*ª®¬Îh}c}™}l”‹¦š¨¦–©£”¡†Ž‰rZ–\o˜xoLkvph\ + ›Öt‚xž{‹Ÿ‰ ““˜–Š–—‘‘¨¦i¦£ ¸ž™{~†y°š~u˜©«ˆO!¤´Å¥km^iT¦ •ˆ›«§¨š¹±–‹qœ¢££…[•„u^ D{U¶YjQ¾`~Œ†‘–””…±¥…~KvŽ¢„Îç¬ys¯®”†‰–·œ«”Ÿ"i˜¬›ŠŽ‚†™b’‡¥†€w ¾ª¦´¶¥¡ƒ‘aQ’Yyk|jprŒx0W:
·¶§–¦ª¨¥„‚ƒ‡}•‡ˆ¦}£¡“†‡¦›‹‚’¤Ž¤§«šƒœ«³“•’ˆ (£y¸ª·µe|V…Š‚}z‘±È¹¯˜¬š„eFwR$BSpf†Y3@Bu!': ·¿‹¶“ž{›—Ÿ{§¢˜…S€‹gjc“†š‰›€¤™†›–°f2 :È ”Œ§ƒž¦¨›‚†|¹³¸¿•¥±ª…rr<T1€€glJY}'3=¿¾¡¢¢£ŽŽR[‹žEOerSL<CY^dxŸ¥‘¬’–Cq˜•ª±¢§~‡JasbgLj•²ª¶Zœ ¢Ê’](+~p›¥_6%#/ ‹º’†’œ¢Š£TQ'Zƒnj=<^ˆs-.Hryss‚—|ŸƒJ3%iuaŽ±‚E +
+ +
+
+
}¹¤Ã/LbMV=C;VJBY7*03GWd€Zp£¦œ€RI7># +
*]¢°°“šŠq9 +'
G½¯œL$-J{”A}sRx@E‘¤š~')IPcbg{fN6Q^
+
b¾²½ ¢§žŸ´¤Ž—‘Šž™X +
ŽŠ Ážȶ%
"!6 €?EwŒ¨¬¯¸½Â¾¹£ž·ªÀÀ°›‘˜¦ ¥•§„L 6…š¡˜¤¢›µÎ°È¹Çä½Ë¯ÅÁ§p
j®Ä¼ÅÅ<.Q·Íº·¼¯¯«›µžŽŽŸ¥u¢x†¡¼¯š§‘ƒlmq~€“”¯ª«™¸¹¯ª±¶’eRW£™•¡nƒž¢Ðž‹‹‚…œµ“„Ñ™Œ ‰ÉÝÕ׿ÍÁÛÜÎç˰̽µ¸³¾ÉÍÁ¨Ë»Èʦ±È¶˜“Ž¡½ÇÇËÇÊ¥oˆ¢t¦–©˜Ã¨Ÿ£“¥Å ‰Ž¥¤›¡`RXkŽ’ŒX.QѺª®t†9m¨ºÉº¼¹½‰³¿½°™Ì²¬®ÄÁÊüìˬ¢Ű¤¬¸§™ŒŒ‹xŽ”–p[w—‚ƒ‰ª¯±xŒs‹“š†¡ª§”—Š„''19‰|B`>\Cg°‰¡¦vt‘C%P–¬ÓÍÐ䜜©ž§¯«“«´º±¦¯œ´¾¿ °ºª¯ÃÑò¨‘œ•~„š~„Ž‰—n’~k mœ›¥¢ˆyO}‡–r‡–‘´¥|fQpYe’…£©«Ÿ›·{¤žˆ_YaO ; ÆÁÏ»¡’¡’¤¥¯¸¸¶¨š¯¨»²ª·Äµ¦¬µ°³”•¤q_ƒxr˜‘‘t`k€…”¦„ƒ|rwžvts”v¤¯ž™™jtqƒ˜™ž´¯£«®”‹‘”gp(ÔÏÁ…¦‘ µ’±¡¤¯«£”ž³ª¥ºÄ»»µ±½©¢£©ª¤Žmƒ–[l“‡zuˆ™†˜¦³Ÿ…’‡n‡†™‡yp€œ›f}}hP’rp’™£ –‹‰{… }a„h& +·Á±ž¥Ÿš¯¹°–¨¨È¯š£©œ©µ«¼Ï‘°´±¼¥·¯µ•œŒˆšˆX{˜W3Ts™’¡¨¢sfˆzŽ¬ˆsˆŽ“¢^_˜}^’t‘£¶¹•• –¦¸¦©€‰Œc
V´Î“«£œ®¦¸˜• ¦¢ž²¸“•µµ¿™¼œ™¿§²·¯¡›¤˜ž“„x›”xj^iˆ„Œˆˆk|w”†rvf¡•š‘†w¸J°¤‡§‹¨}¡ž°¤©®šŠ¡|f/¬Ä‘§ª¥›˜—“”’–Á–¯¥Ž¥³¨šÑ«¨œ³«¸¥±žœŽš‘…˜‚nQx…˜‰Œ€}gS€}tf†‹‚™œj›¯—jE‹„µŽ™Ž—”Ž~g’„Jl + +e·« Š„›œ›¡~¯…·ž¿°Á§¹¾µÊ©·¡ˆ§¬”¹¶ª Ÿ¥˜œŽ}Š˜~xrm‘Ÿ‚~^yŸUhŽyWy„ …‚œµzy_e’xp˜˜‹{uˆu} š {Ct +†¾°¢r™—¢ˆ’v£¨©Ž¸ª‡¡¢§‘¯¤ˆ©ª˜¦¯¨«°–¢Ž}Œ—w^iy’ƒa†Œ†~„Yx˜…wu±¡„®œ—„m[ž~pºÎ£‘ƒd„t¥¥Ÿvf‡–¥ª†ˆ¬”ƒ–‡€‰œÇ« ·‹–‘š¤«»£‘œ¡§«™ž£¢“{Šu”“›i‚‰“v—}‰pz–´¢–y¢‡¿˜§¦–Y0vt™¡œœˆƒZ„™Ÿ¦¡{RzŸ—‹¼ˆ‘’o¯˜£˜‹j¦¡²¡½~œ‡‘š¦¦ –—•˜q‚„…uf}€pq˜‹f…Œ¥Œy“s²dSŠ”šy˜ZdT‹Ž¡†’“ƒ‰Šœ‘†k†d¯¸©‰wN¡¥˜–ŸŸ¸šŸŠœ®r®µž•²¡›™¨¢®”–|}ƒ‹‡u{[]t…{¨ˆ|—d˜ˆ –ˆŠ „šŠ¢°¢›ŸŠr2Yƒ¡˜ª°}…—››²´£ŠUŸ… ¢ ¤~†‰‡“•¤‡‚yc¥Ž²•“¬›•ˆ²ž•š“¨“¡‚žª–yr|\‘†…of]dd’—š¬ªm‚¡±šŒ‡±’Š›Àž‰„¢pVƒŽ£d¾–‘xŒŒ…•…°“œcž¦½›i‡›Š˜¬ ‘…£‰±–º§©Âœ™’°£¤™˜©Ÿ«¬—~ee’†\…ygXˆo†r‹•~‹šƒ’ŠÂ¨€£”¥¨™¢xtƒ¤‹‹¬‰v“˜ˆ–¤”•¢Ç x„“y’Ç•}Š§r³–«{™¶“¶²¬«µœŽµ´¯¶¥›˜¯©¨›¤fˆŸ„„pŠ‚pX|}„qkxU¤¦ ž“…t~Žš¨©›Štc€‚¯¬Ú„’‘±šŽ± £‚3‘¦™mœ”‡³¥¡œ¦©¥œ¢«Â©©…”²Ÿ¤¡®¡§–—ª’‚šxo‡Š‘oapcp„]h’œ ™°‘¾¤ ‡Ÿ‹‚Œzt§™©™Ážw¯…陸¤™Àšž™œwYš¬¤‚›‘ª±¥¡Š«½½¢£©³®—®Š“š—¤¬¥’‹“®ž††u‰ry…„‰vYzTm”©‡©€œ©¹šÁz™¢|”± •›‹‡Ž‡–«¬¢€£o§Ÿ’ ¡¨µµˆšƒ‚)”½½‘‚‹¨±¢±¦‘ƒ˜¬š„ª’—ž„–¦®”ƒªšvvw{}m”~|Žhzn†‡Œ¦|\˜ ±¸Š{Š„•¢Ÿ•”¢°Ë¥À²´™—~¡Åű ¦¶¢´¡°w`}¸¡Ìr“c•·±–¯ u¹‡¾…œ£‘šŒ€“©ž—¨™|‘†jx|akj`y{vƒˆŽ„{|s}Š‚•—¥Š¯¨¬®° –©®Á™¨Ÿ¥” ¡²—‹‘¢—°‰) +º˜°œ¢«ª›Ÿœ…’ª§”’x•“’‡±«•°¯¦©¨„~aš€gMka]€azŽzdjr¥š“p“u ‚„”¢°¡’ƒ–œ¨•—¨·°„—“¬«®¿¤²·½º¨”›ž/¥Žµ»ˆŽ–®¥«œ¦ ™”À›†l³—¨—¥Â´²›x‰Žkty`qCqwt~‹Š…o‰ˆt…Zvwm†eba¦ž˜{‡ªŸl‡§›Š³™²Ÿ¼¹¢‘¦£¦( +À¶®Ô™±ŽŸ¬À˜¬˜²³“šŒˆ›¯½¢£ª·’ÆÒ®»“|v|~|‚Ž~sbebirVs‹uzeX‰Z_§¦¥v™ˆ—Œ¡Œª“†i…¤§¢£«™¾¢˜¦«´±£Ÿ™žƒ›#·®·Ú|¨¨¯±À¢–¨–¥º“˜™¨™”¬yá~©RayŽxnx„…l€…wwsŠzinPnun†™¤‡Ÿx†‡…“q“‡~|Ž£¡œ±°Ÿ®¥¢³«š“¨’˜›´¨·Ïˆ®´¶¨±ª™¤¬Šš‹¨ªšˆµžž«¤¶ÂMŽf„’Ÿ‹›{tmq€sekqycZ€]wtwŒ…‘llbƒr~˜Œ‚©z„n Œ—§¤•®©¥ ”•œ³Ÿˆv™[5f¬®²ÌÇÚ¹¹¨§¨‘›‡œ‘£”‡ƒ¢º¬±–-H&$BYf^igmwlnuwqSrŒbcg…‰tX}sg—ž•žžyŠ“…¬¥°³¢·¢¥ m†§§Š‰k‡oa_~ž·ÒÀ΢¬¬™—thnk’rœŽ¢ª¯ž–W)*hB‚jG"7((Y]x|x‚„wjt}¨—„s}|Z‰…¡„¦˜—‘w‚]¼¡ «œ¬…‡D…´U{n—V9d ŽÅ©·»Î©ÃÒ¶vXbž£’ŽŸŸ¯¸´“c@&,#GL€g<"#7AbŒmtecg„f–“ž|ks…‹l‰›}«X“…Š}•¡´”€ij'!<´”‚pJ¤|‚Œ$P¯“ž²š‚ˆ}d…[h‚›£‘‘² ¨¡ !1)DD5LZˆ‘…f_T(F#2„Xbx‡œf¢©qulo€~tVj‹|C=5u‘³©”½€ƒT~žž´‹ n¤™•’˜u{¹‘Š”›£ƒ‹‚w®˜’£¬¦§Ÿ³€2 !^¤{m‘š''09_xa+.#B"_emt\@<**,"+!\{Œž™l—¾‰“º¬‡l‚¬ƒ…LÇ®qu?
%+Nbre•Ž‹…vw„R! #%*+
*#) +2"
)
+'.6bbiv´|ŽŒa„mXqpž„ˆM +À¼½†u_M#% +
# +('&SWb# & º¦¬¸šœ³¸Ï¡
&!
% +$4PKhcŒ}kƒ~ˆI
+
#$)‚«¬¶’Š¥Žš¤Œ¶´¡Z'Š«³¾¢o#S€•°¥ƒ8oDA$š¼rª»®““AŽ™´ž¥¤Á¨¯¨¨½¸¨¢˜—¨˜²žt +',7”¡¡¦¯Ïʿ͹´¹ÄÄž¬VŸ’Œ=EwÏÒ¶²°»¹Ô¤½¨¢§Æº¼Â§¹Ø³·©¥¶¬Â¼´Ã²ª¥¬¼¼˜Ä²Õµ²¾½µ¼»Ã·Ø¹ÇʶÂÀ־Ͼ»ÂÑÏ¿¬Á¯²°½Á¾»ÎÁ¶Ö¯Û—¿ÊÓÑÄÊɵÒÇÅÃ
\ No newline at end of file diff --git a/plug-ins/gimpressionist/Paper/bricks2.pgm b/plug-ins/gimpressionist/Paper/bricks2.pgm Binary files differnew file mode 100644 index 0000000..a7d9c2e --- /dev/null +++ b/plug-ins/gimpressionist/Paper/bricks2.pgm diff --git a/plug-ins/gimpressionist/Paper/burlap.pgm b/plug-ins/gimpressionist/Paper/burlap.pgm Binary files differnew file mode 100644 index 0000000..6eb247b --- /dev/null +++ b/plug-ins/gimpressionist/Paper/burlap.pgm diff --git a/plug-ins/gimpressionist/Paper/canvas2.pgm b/plug-ins/gimpressionist/Paper/canvas2.pgm Binary files differnew file mode 100644 index 0000000..0ff93e7 --- /dev/null +++ b/plug-ins/gimpressionist/Paper/canvas2.pgm diff --git a/plug-ins/gimpressionist/Paper/defaultpaper.pgm b/plug-ins/gimpressionist/Paper/defaultpaper.pgm new file mode 100644 index 0000000..da32d96 --- /dev/null +++ b/plug-ins/gimpressionist/Paper/defaultpaper.pgm @@ -0,0 +1,5 @@ +P5 +# CREATOR: The GIMP's PNM Filter Version 1.0 +100 100 +255 +¢£ov†nƒ—‘w‘›ˆ“™„}’žv£–Š}š§’–“¦ŸŒœ‹“¡œÀƒ}Œ†ˆ’y…Š”¨—«‰ªË¬—“¢³œo“£}±œ”ž‚rrŠ„o¢Œmš‰y‘…{–’‰{‰‹‰Šmgœ›¨§ˆ‘‚€®š—†¬’……™«’…™š£™ž†„Œƒƒn”…™Œr|–›–˜ž ¹¿¤†Š¨ª©¤˜c¡¡š‘—¢ ž—‰”‚ut‘zv‘Š’ŒŠ†z‚‰¢“˜„”šs†wt¢¸Š²›™‰ŠŸ‰—„¤§¨¡šz›¨žŠ––s«Š€…w€‰y‰‚ŒŠ–¢™’§«™›®¡˜¤®®œˆ§—‹³´”–ž”šŠ™¢‹{…e|„…‹¡°„˜’–‰ˆ–‹Œ¡”™¤}}µŒ¦‚¢©…œhz§’y”‹„— Ÿ™Œ‰ššŒ—®‚p‰–po† ¤¦˜¡––¡¦—«¡§ ‘ž¡^‹ªª²¡Šˆ|‹Ÿ¡’–ˆ€u‹u†——œˆ‚n¦”t}›{y˜¨’˜³¢œ¨Ÿp}“§‘y‘—¬ˆ…‘…ŸªŠˆw“‰ˆ“œ}†œ…\|Œ®±‹ˆ££”ž©«š‘}¡€¤·®¦˜©µ¢‹—‹€’—›’Œ’—‹{w†Œ—†sg†‚˜‹’i…œ€š®—¦·—„}¹{d’†– ¡}h‰ˆ§¢am{…”›€†w…‰w€¡Œ„sŠ‹ ™†žw‘—¤¬¬¤šz}{u¢ž´À¤·™™™Š‹–›ž¡„™¬›Š|œ›zwƒw‘˜Œr“±kˆš§¢Š{ž vrrv£—¨ž|u€Švvžƒnu‚’‚†m{›Ÿuw’ž›£™Œ’ž‹¢§ ˜š’–spwžÏ´‰–¡‹„¦”‚—{–šy¢™‹††š‘›‰w“|z¡—tœ–€›‹ ²uwš¤…_k’’¤†† ©Ÿ|t…t˜œˆhr‘pyƒ™šœ„„‰¡›¡šŠ™–ˆ’“¦š‘zœ„ŸŸ±²–Ÿ£€ušˆ}¡“––ˆ‘‹‹†‘©”¡„–…€}ŒŒkh†¤Ÿ|€ƒ€ª¦Œ—™«”€o€¡Ÿ¢ˆy›†–¡“‹ˆ€v‚y‰€ni’ªƒv}}™–˜‘ŠŠ™š†™…e›– ”®±‰™„“œvif—š±žž‚‘‹˜¬¬ˆ‹¡Š|—†Œˆ…Ÿ‚™––‹—ž˜ŠŒ¢“’¢™‹ƒ“vt ª‹wsev…l]’™‰tt’—©›–‘Ÿ–©”˜™’pŠ¢ž©©–¦ŸŠ”–žgz}ˆŠ—¢–‚›Œœ –˜ Ÿž“Œy€‰‘Ÿš’–‚––¦š©¿”¢€—–¢ƒ¦››‚ˆ‹‹šyv™‘Šl…no–„sn†Šš¢’žu†‹™‰©Ÿ‰Š‘†‰ˆžŒ›šˆˆu¢£ž§‹‹‹{o‹™‚˜“™¡ž¢ž””£–š¢ †¤™›l‘£©®§›£¡—¦‘’‹|wu™“|_™«—]nƒ‚t‚„š˜‘‘}‚Š‰–‹ „‚‘y|„‰—‚‰Œhz……™œ”‹”{˜t}Šƒ‚¢—¡¦¤™…lv¦°‘¨ ‘£”‹—œ‚—˜–Š‰‘‹£©¹£—‚€u—™‹pƒ™šŸ™‹˜o|s˜—›’zˆ‘Œ›{…|“Š—vy†””v^Œ‹‚€œŠŒ¬œ|‹¦“›l‚ƒˆ“¬©¶©Œšœ…{o™y¼©–‘£wƒ°¢®¤npvµ–¶¶¡¢zƒ“…ˆ–‹€…€ˆ¦Œ—’Œ¨‹ˆ|”“–‰Š‚‰›˜t‹wŒŒˆ‚wƒzvŒˆŒ‚ˆˆ–—š¡ˆ—}}…†‚‚‰’—¨£ˆž±Ÿ…|›”¬––y„™žp“ž‹ŒŒ¡©¢©µ”„…}Œ£ž…\„†z’›““‹‚‚|œ¬˜r€…„‹}Œ˜‰„—¡”™”y–Œ|„Œ„“‹“€…—l|ª–’‹urpš›’Ÿ—}©ž¬šŠ‹—Œ{‰¢ª—wž—{£ œ€v’¬¢› ¡yˆŠ‰–ˆzsyvˆ®£r{}Šƒ‚sŸ¢™–‰|‹…›˜v–“‰‰‹€‹‘“ž£—›tuz€‚’’}‚‚–›¨¡–„ž´ŠŒ¡£Ššœ‰ƒ¡‹˜z}›”“ Š–›§·©|p|¡®…Šƒf…Š–€€dˆ—|‘œ˜ŒuSs†¡¬¤“‰…‰š›‰ƒ…rŒ“€‰† ™†“¤›v–ru}“”y‹—‹‰¢ž˜Œ¤£˜¨€ˆš¡”œ’—y¦—v„‹¦ž¦Ÿ¬œ¶®‰‰£¢¢‰¡wl|—uw‹ˆ¤…{{Œzotrƒšœ¤¦’™œ}˜zgr‰‹”’Ÿƒp‹ˆ‘Žr……{‰Š‰’’£¡ŒŸ£’—Ÿ—†–’–’¢…”„‹™Š®«§¦–š–{‚²ªˆcƒ”sŠžƒd”‹ˆ‹v…}\{{mt|‰‹ ‰š§¢€† ƒ”Š‹“Œ‰Œy}Š‹r’ˆ‡z\`tƒ™€tŸœ©›‰“„’ƒ¬”‰›™“™’yož–†€›ž‚ªœ€—±‹{‰–¤£œ§–nš°¨w|ez’ Ÿs^{e€}ƒhrŒ“˜”¨·‹…|˜¶šŠˆ„ƒƒ’—ww•‡~˜ššsbmly‹„zn“¦›¦¨ŠX z†¹¤†–€©Œ‚‚œ‘—ª¨”“ƒ‹ª¤…v—©‚w”£ƒˆ†gvŒžtŒdŒ€|o‚y^}‘Ÿ‘Ÿ©®ž‘ ’Š‘’‘ŠuzŒ…‚ŒœŒs‡s‹ŽZ…m’†šŸœ†˜§‘ˆw€š¦“ ™¬“‘w‘²““‘ ²o‰ts’–¢‘Œ›Ÿ½œwˆo—{™t‘‹Œ{††p^˜š‹ ‹‘ ‰‹›u}‹‰‘† †l lw‰}˜s†‚ƒ™¤pfu‘›‹†¨—¼ }“˜žz†¦š˜´·¨‹}ž˜”¨“e]Œžoz™’¹ ›±œ¤«|„‹ƒ€uyh £†|{‹a{º“Š}‹«¸“}‘Š†y†{£¨y‹››}‹Œ‚uyh™†……˜‚“¨‘m‹«‘²¡—‘‹¸‘”m^z‰²Ã¨ ›uu–ž›€…š™||¤—˜Š…žu€²œª“z„zwr…Št‚Œ‘yˆŠ“w„‹’¨œœ€‰rŒš –˜›œ‡ž†zwrƒƒ€…u¡ ²¢”€„[u¬¬’¡¬¼–‹·Š^¢œŠ“¬ÆÉŒƒ}¢ˆƒ™§”y——wyŸ|uƒ™¨˜ž…™š€„‘m}vp™ ‹‰vc”–˜Œ‰Œ|†”Š”Œœ«œ›°¬¨™š€„Œu€Ž›–°“—ž„f‰‹e‰¸¤”žª–ƒ…ž£¢ž”›}¸·«vˆy…Œ£|m}¤©m}ŒŒŸœfy¬{£˜ˆm{„y‰Šmtƒ”|””c„š›””š—˜™š”˜§®§®”}£–ˆ€††Œ™š§Ÿ—–™‰tzo¤£—Œ‹¹±—““…§¾Š‘“—ºª¡†ƒ¬§ˆn„‚}«–Š§ƒ›}}†‘ –—œ†ˆ‘sy‹‘}kc|˜³“Šy|˜‹¡§–…’žš–ˆŒœ©¬«Ÿ¢žŒ|Œ{‰Œ‘˜”Ÿ¡±§¢“”¶˜¢¨¡šˆ§š®ž¨ ˜…®Ÿ‘„’ ²ª§¸‹‘¼‰‚‘”‘”zsˆ}Su“—‘˜“™zŠ“”‘z]u–—ˆ†y†¤µ§‰€Œ™ž…‘®¢–š«¨™®™—Žˆ’}Œ¢ž¨‘µ¢€Œ… §§Ÿ¨¬«Œ™›‘–§¡›‘«®“™Ÿº«£¡“›”™˜ ’‘ƒ€}‹Š‰pŒšƒ…‚¬“ƒ‘“¡£’tM„†šª®”Ÿ¡“š˜††›”«šª³–¥¥ŽŒŽˆœ‰Ÿ—–š£¦Œ†š¢›ª¢¨˜Œ«ˆ¡³ž|˜±w–§Œ¡´°œ…®· §š·¬’‰ŒleŒ§¤…l‚„ž|„†˜ŒˆŠ‹}š ˆw„‹†‘¢“†”˜ Ÿ™›—…ŒŒ¡™ªŸ˜…ž ‡Œ”“ª˜}†Ÿ œœŸ›¡™—žš’‚ƒ¡©¼˜““’‰–™£¹›˜£Ã§–ª¾Ëœ‹’…]}‚t–†œ‘§u‚{‚˜ˆ†¢¤yorƒš£‘”¤¦žžžƒ†”š‹œ“–˜ˆ‘Ÿ ›†’‹“‘‰™£’¨¨ž™Š„™²’r„§Ÿ––Œœ‹–§¨²ž‰´Á¤ ¬Å«v…šo€®œ‚€‚§ŸŒ„rcrw{š››Ÿiy‹“””ŒŒ šŒ™–‘›™—³²…”””–Ÿ ƒœ¡”ˆ—t}Ÿ”{Œ’™›œ˜Œ™{†”¤””–ž œ¬ŠŒ—¨ª”›©³®®«±¶w„°£Ÿ–¡ž£©…‰“Œmc†|o†Š°–œŒlio™¨—…–y‚ª¢Šš…–¶ ™›“‹‘Šœž{˜p—‘Œ«žƒ‹§ˆ—…“œŠtš§Ÿ‚–²–˜£Ÿy˜§˜£¤¸³§œš–˜¬¡™žšƒoŠˆ¤“|aah€„˜¨k„…‹Œ}‰œš ‘’–®˜›© Ÿ›—‰Œ¡‹‰¡œ“©£”€«‹€€ªžŠ›¢ ™ž…“Šš‘ Ÿ¶¨š˜”‘ª{£°¿©‹‰¤±˜…ƒ´´ž ˜soŒˆ€“™“„ƒyv„uoc–¤—‰mhœ£Œ‘¦’¦Ÿ¤¤ª³™}†“’ƒ}Œ”²ªž’Œ y štž§„{ž¼Ÿ“¡¤ƒr”ž‹„’’ˆ§š§|Šœ‹§µ’Œ˜¦ž“«˜ ™…“ŸŸŒ›ž…n€’«¤‘rouƒ€†Š–™|†‘’‚Œ ’¦ªŸ”§”—¤š™¡À¡¢©‚‹‰‹–i›¦¡¬ œœ—ˆ“‰˜š‹uy¡†²Ä¬˜§§©vŒŒ¦ Œ‰…—²—”z|…†|˜°yt‚|yv‹†œ§“œƒ}‘š”¦±²ª£’˜Š£ˆª”¬ª¢“®§ ¡r†Š˜‰y‹–®µ¢£ª’ „Š–wu„¦›“£©¤µ¨žtƒƒš—’”ž’‘ƒšœ“œ‹o|€}–ˆ”}’v‰’‘Ÿ—m‚†Ÿ“Œ¤ª©¡¨}ˆž›‰‘”ž± ªˆy¦„ƒ€Œ˜z¢™“…‰³ž™°£ ›|†™˜}””žªi´°ž”‘}t‹Œ‰|f’†›¢™ƒ¡u…–‘}’”™ˆ…{{}–y€—…›‰‘}†¢Š±›†©§ŒŒª–ª«‹z…szv™—£¢™ ¤™¤¹—˜’–y‰ˆ…†–š–¬©–›¡¡™‘„„lw”œ¢ˆpœ›’rzŒŒŒª–Œwƒ§‚‚’ˆ{}h‰‘—’’…†|…††—„±˜š¤——wš¢’¡v€c†‘Œ“˜š†¢ž¦™™›€™«’™–m…†ž‹š¤®˜w‘’Œ›‘ˆ™€o’€…’š‹v‚ƒ˜¤†ˆ——„€ut„‰‹sˆ‘“š—˜‹ŠŒ{Ÿ›Š‹º¢œ˜’”¤¦˜‹”iœvv“‹ƒ¤œ‰„³’—“†“——™£™ z…¢¤Ÿ€Œš™Š—›©ƒoœ˜—“}mˆ§¡wˆeŒšƒ”œ‘˜šz€‰vn€“‘Œ¤’œ‘uŒvœ’–„š–ŒŠ£š‹“”¦œŒ…ˆw{“‹ ‚“Œw¦®¡ŠŠ„Šš–’Ÿ…’—“…˜ ™›“”¤Š‹‚‰§«œ‘™–yƒšŒžŒ„Šƒ’}ŠnŠ© °‘‘|{Š{h……Šš…|Ÿ‹vr—ˆ€¤žh“š—v¼«{Ÿœ˜‘…”‚˜’’¤œœ³‘„ž”’”’¦”—}ƒ——Š†ƒ›’«‰“”“}“ŸˆŸ‰‚—ž}‘™ˆ}ŒŸ’z¦˜ˆ¢ œ’…myw€„‚‹ƒ™‘€‚ˆ…Šs—›‘–’¡¶©”œ“‚¡®¤ƒ“¦’¤š–“‰Ÿˆ¢‘¡”ž‚ˆŸ›——ƒ|ˆ˜£˜˜š{—žœ›“˜„’¤˜Ÿna‰°§œ¢‹‚šˆ—“ˆž›‘‚‚s}z–ˆ‰“ˆ‚}‹Š›Œ’tr…¤ §§¡¢œ‚©ž}s§¾˜t”¤“šy–£—¤‘„…Œ ˜ƒƒ‹—˜“‰“†‹˜š®¡—´£{¨“{Œ‹§ªªš°®Œ”‚‚|œ™Ÿ‹|}‰œ…ž}{ˆww‘¡’“™|u}š¢˜ž¢ƒ–ª—… ¬ …‚‰‰›¨yŒŒv“ª™—Š‘“–‘¦›–…”‘Ÿw“¨šyœ”˜¤«´‰‘‰ezŠ…˜´ˆš¤ž ž“‚s|››‘«v‘’vsotr{™˜›Ÿ‰eo}|Š¬œ ¤’Š…–™¿™l¦ŠŒ”‘”š“›šžŠ¢Ÿ˜Œž™“”ƒˆ‘„‹}‰“š‰šˆ˜v±¡¦«¢–{{…|ˆª’ ™”€›¦”‹‰”ƒsŠvœ“«š€u}tv†`Œ‘€ —ozwhyŸ¦Œ«£“Š±´€¦ž{„¢ ‘˜¨³œ¡›‚†±‘’ w†ƒŠŒmnœŸ‚Šˆ“”’˜˜€´žv™¹ªˆyž¢–‰¢Œ—¤–Ÿƒƒy€|ˆ›Œš†Š‚†p…‰y†ž†™‚n’‰z}–”˜Çšs¡ “€ˆ®„}©«°š¤¢¡ƒ„£…Œ’‘…€†ƒft’’†y¦…Œ§|“›¤™«²ž…µ²„r˜‚” ‰Ÿª mu“‰„…ƒsŠt‹ƒšž‹w£‹z{—i}˜¤†ž„†sŒ‹{}Ï¢wl£ž„€ƒy£ ™’¢ž¨‹£«”¢°€„‰¢ˆ’y…Š”¨—«‰ªË¬—“¢³œo“£}±œ”ž‚rrŠ„o¢Œmš‰y‘¢£ov†nƒ—‘w‘›ˆ“™„}’žv£–Š}š§’–“¦ŸŒœ‹“¡œÀƒ}Œ†…™Œr|–›–˜ž ¹¿¤†Š¨ª©¤˜c¡¡š‘—¢ ž—‰”‚ut‘zv‘Š’ŒŠ†…{–’‰{‰‹‰Šmgœ›¨§ˆ‘‚€®š—†¬’……™«’…™š£™ž†„Œƒƒn”‰y‰‚ŒŠ–¢™’§«™›®¡˜¤®®œˆ§—‹³´”–ž”šŠ™¢‹{…e|„…‹¡°„z‚‰¢“˜„”šs†wt¢¸Š²›™‰ŠŸ‰—„¤§¨¡šz›¨žŠ––s«Š€…w€–po† ¤¦˜¡––¡¦—«¡§ ‘ž¡^‹ªª²¡Šˆ|‹Ÿ¡’–ˆ€u‹u†——œ˜’–‰ˆ–‹Œ¡”™¤}}µŒ¦‚¢©…œhz§’y”‹„— Ÿ™Œ‰ššŒ—®‚p‰…\|Œ®±‹ˆ££”ž©«š‘}¡€¤·®¦˜©µ¢‹—‹€’—›’Œ’—‹{w†Œ—†ˆ‚n¦”t}›{y˜¨’˜³¢œ¨Ÿp}“§‘y‘—¬ˆ…‘…ŸªŠˆw“‰ˆ“œ}†œ„sŠ‹ ™†žw‘—¤¬¬¤šz}{u¢ž´À¤·™™™Š‹–›ž¡„™¬›Š|œ›sg†‚˜‹’i…œ€š®—¦·—„}¹{d’†– ¡}h‰ˆ§¢am{…”›€†w…‰w€¡Œ’ž›£™Œ’ž‹¢§ ˜š’–spwžÏ´‰–¡‹„¦”‚—{–šy¢™‹††š‘›‰zwƒw‘˜Œr“±kˆš§¢Š{ž vrrv£—¨ž|u€Švvžƒnu‚’‚†m{›Ÿuw¡›¡šŠ™–ˆ’“¦š‘zœ„ŸŸ±²–Ÿ£€ušˆ}¡“––ˆ‘‹‹†‘©”¡„–…€w“|z¡—tœ–€›‹ ²uwš¤…_k’’¤†† ©Ÿ|t…t˜œˆhr‘pyƒ™šœ„„‰–˜‘ŠŠ™š†™…e›– ”®±‰™„“œvif—š±žž‚‘‹˜¬¬ˆ‹¡Š|}ŒŒkh†¤Ÿ|€ƒ€ª¦Œ—™«”€o€¡Ÿ¢ˆy›†–¡“‹ˆ€v‚y‰€ni’ªƒv}}™›–‘Ÿ–©”˜™’pŠ¢ž©©–¦ŸŠ”–žgz}ˆŠ—¢–‚›Œœ –˜ Ÿž“Œy—†Œˆ…Ÿ‚™––‹—ž˜ŠŒ¢“’¢™‹ƒ“vt ª‹wsev…l]’™‰tt’—©žu†‹™‰©Ÿ‰Š‘†‰ˆžŒ›šˆˆu¢£ž§‹‹‹{o‹™‚˜“™¡ž¢ž””£–š€‰‘Ÿš’–‚––¦š©¿”¢€—–¢ƒ¦››‚ˆ‹‹šyv™‘Šl…no–„sn†Šš¢’‚Š‰–‹ „‚‘y|„‰—‚‰Œhz……™œ”‹”{˜t}Šƒ‚¢—¡¦¤™…lv¦°‘¢ †¤™›l‘£©®§›£¡—¦‘’‹|wu™“|_™«—]nƒ‚t‚„š˜‘‘}‘Œ›{…|“Š—vy†””v^Œ‹‚€œŠŒ¬œ|‹¦“›l‚ƒˆ“¬©¶©Œšœ…{o™¨ ‘£”‹—œ‚—˜–Š‰‘‹£©¹£—‚€u—™‹pƒ™šŸ™‹˜o|s˜—›’zˆ‰›˜t‹wŒŒˆ‚wƒzvŒˆŒ‚ˆˆ–—š¡ˆ—}}…†‚‚‰’—¨£ˆž±Ÿ…|›”y¼©–‘£wƒ°¢®¤npvµ–¶¶¡¢zƒ“…ˆ–‹€…€ˆ¦Œ—’Œ¨‹ˆ|”“–‰Š‚Œ˜‰„—¡”™”y–Œ|„Œ„“‹“€…—l|ª–’‹urpš›’Ÿ—}©ž¬šŠ‹—Œ{‰¢¬––y„™žp“ž‹ŒŒ¡©¢©µ”„…}Œ£ž…\„†z’›““‹‚‚|œ¬˜r€…„‹}|‹…›˜v–“‰‰‹€‹‘“ž£—›tuz€‚’’}‚‚–›¨¡–„ž´ŠŒ¡£Ššœª—wž—{£ œ€v’¬¢› ¡yˆŠ‰–ˆzsyvˆ®£r{}Šƒ‚sŸ¢™–‰…‰š›‰ƒ…rŒ“€‰† ™†“¤›v–ru}“”y‹—‹‰¢ž˜Œ¤£˜¨€ˆš¡”œ’—‰ƒ¡‹˜z}›”“ Š–›§·©|p|¡®…Šƒf…Š–€€dˆ—|‘œ˜ŒuSs†¡¬¤“‰™œ}˜zgr‰‹”’Ÿƒp‹ˆ‘r„†{€ˆŠ‰’’£¡ŒŸ£’—Ÿ—†–’–’y¦—v„‹¦ž¦Ÿ¬œ¶®‰‰£¢¢‰¡wl|—uw‹ˆ¤…{{Œzotrƒšœ¤¦’§¢€† ƒ”Š‹“Œ‰Œy}ŠŒo—“Šz_`tƒ‘™€tŸœ©›‰“„’ƒ¬”‰›™“™¢…”„‹™Š®«§¦–š–{‚²ªˆcƒ”sŠžƒd”‹ˆ‹v…}\{{mt|‰‹ ‰š”¨·‹…|˜¶šŠˆ„ƒƒ’—wx–‹‰–‡~uiy‹„zn“¦›¦¨ŠX z†¹¤†–€©’yož–†€›ž‚ªœ€—±‹{‰–¤£œ§–nš°¨w|ez’ Ÿs^{e€}ƒhrŒ“˜Ÿ©®ž‘ ’Š‘’‘Šu{‰„‘˜~ŒŒ€€›„‘‘Z…m’†šŸœ†˜§‘ˆw€š¦“ Œ‚‚œ‘—ª¨”“ƒ‹ª¤…v—©‚w”£ƒˆ†gvŒžtŒdŒ€|o‚y^}‘Ÿ‘‹‘ ‰‹›u}‹‰‘† †lœvŽ’}žŠ™—|u£§qfu‘›‹†¨—¼ }“˜žz†¦™¬“‘w‘²““‘ ²o‰ts’–¢‘Œ›Ÿ½œwˆo—{™t‘‹Œ{††p^˜š‹ ‹«¸“}‘Š†y†{£¨y‹š›ƒ”{}š“‘Ÿˆ–—•žž‚“¨‘m‹«‘²¡—‘‹¸‘”m^š˜´·¨‹}ž˜”¨“e]Œžoz™’¹ ›±œ¤«|„‹ƒ€uyh £†|{‹a{º“Š}’¨œœ€‰rŒš –˜šŽ|„‹¥£›¤š‹¤ ²¢”€„[u¬¬’¡¬¼–‹·Š^z‰²Ã¨ ›uu–ž›€…š™||¤—˜Š…žu€²œª“z„zwr…Št‚Œ‘yˆŠ“w„‹–˜Œ‰Œ|†”Š”Œœ«œš¬™‘€™ª¢™˜’…›•°“—ž„f‰‹e‰¸¤”žª–ƒ…ž¢œŠ“¬ÆÉŒƒ}¢ˆƒ™§”y——wyŸ|uƒ™¨˜ž…™š€„‘m}vp™ ‹‰vc””c„š›””š—˜™š”—¡ªŸ‹†ŸŸ•“‰‚‰‹™š§Ÿ—–™‰tzo¤£—Œ‹¹±—“£¢ž”›}¸·«vˆy…Œ£|m}¤©m}ŒŒŸœfy¬{£˜ˆm{„y‰Šmtƒ”|”Šy|˜‹¡§–…’žš–ˆŒ›¦¢¢¥¤”{Ž}‹Œ‘˜”Ÿ¡±§¢“”¶˜¢¨¡šˆ§š®ž“…§¾Š‘“—ºª¡†ƒ¬§ˆn„‚}«–Š§ƒ›}}†‘ –—œ†ˆ‘sy‹‘}kc|˜³“†y†¤µ§‰€Œ™ž…‘®¢–š¡¥£¯›‘ˆ’}Œ¢ž¨‘µ¢€Œ… §§Ÿ¨¬«Œ™›¨ ˜…®Ÿ‘„’ ²ª§¸‹‘¼‰‚‘”‘”zsˆ}Su“—‘˜“™zŠ“”‘z]u–—ˆ†šª®”Ÿ¡“š˜††›”«šª²—¡¥ŒŽˆœ‰Ÿ—–š£¦Œ†š¢›ª¢¨˜Œ«ˆ¡³‘–§¡›‘«®“™Ÿº«£¡“›”™˜ ’‘ƒ€}‹Š‰pŒšƒ…‚¬“ƒ‘“¡£’tM„‘¢“†”˜ Ÿ™›—…ŒŒ¡™ªŸ™…¡ˆŒ”“ª˜}†Ÿ œœŸ›¡™—žš’‚ƒ¡©¼ž|˜±w–§Œ¡´°œ…®· §š·¬’‰ŒleŒ§¤…l‚„ž|„†˜ŒˆŠ‹}š ˆw„‹†š£‘”¤¦žžžƒ†”š‹œ“–˜ˆ‘Ÿ ›†’‹“‘‰™£’¨¨ž™Š„™²’r„§Ÿ–˜““’‰–™£¹›˜£Ã§–ª¾Ëœ‹’…]}‚t–†œ‘§u‚{‚˜ˆ†¢¤yorƒŒŒ šŒ™–‘›™—³²…”””–Ÿ ƒœ¡”ˆ—t}Ÿ”{Œ’™›œ˜Œ™{†”¤””–ž œ–Œœ‹–§¨²ž‰´Á¤ ¬Å«v…šo€®œ‚€‚§ŸŒ„rcrw{š››Ÿiy‹“””–y‚ª¢Šš…–¶ ™›“‹‘Šœž{˜p—‘Œ«žƒ‹§ˆ—…“œŠtš§Ÿ‚–²¬ŠŒ—¨ª”›©³®®«±¶w„°£Ÿ–¡ž£©…‰“Œmc†|o†Š°–œŒlio™¨—…š ‘’–®˜›© Ÿ›—‰Œ¡‹‰¡œ“©£”€«‹€€ªžŠ›¢ ™ž…“Šš‘ Ÿ¶–˜£Ÿy˜§˜£¤¸³§œš–˜¬¡™žšƒoŠˆ¤“|aah€„˜¨k„…‹Œ}‰œŒ‘¦’¦Ÿ¤¤ª³™}†“’ƒ}Œ”²ªž’Œ y štž§„{ž¼Ÿ“¡¤ƒr”ž‹„’’ˆ§¨š˜”‘ª{£°¿©‹‰¤±˜…ƒ´´ž ˜soŒˆ€“™“„ƒyv„uoc–¤—‰mhœ£‚Œ ’¦ªŸ”§”—¤š™¡À¡¢©‚‹‰‹–i›¦¡¬ œœ—ˆ“‰˜š‹uš§|Šœ‹§µ’Œ˜¦ž“«˜ ™…“ŸŸŒ›ž…n€’«¤‘rouƒ€†Š–™|†‘’}‘š”¦±²ª£’˜Š£ˆª”¬ª¢“®§ ¡r†Š˜‰y‹–®µ¢£ª’ „Š–wy¡†²Ä¬˜§§©vŒŒ¦ Œ‰…—²—”z|…†|˜°yt‚|yv‹†œ§“œƒ†Ÿ“Œ¤ª©¡¨}ˆž›‰‘”ž± ªˆy¦„ƒ€Œ˜z¢™“…‰³ž™°£ ›|†™˜}u„¦›“£©¤µ¨žtƒƒš—’”ž’‘ƒšœ“œ‹o|€}–ˆ”}’v‰’‘Ÿ—m‚…›‰‘}†¢Š±›†©§ŒŒª–ª«‹z…szv™—£¢™ ¤™¤¹—˜’–y‰ˆ…””žªi´°ž”‘}t‹Œ‰|f’†›¢™ƒ¡u…–‘}’”™ˆ…{{}–y€—’…†|…††—„±˜š¤——wš¢’¡v€c†‘Œ“˜š†¢ž¦™™›€™«’™–m…†–š–¬©–›¡¡™‘„„lw”œ¢ˆpœ›’rzŒŒŒª–Œwƒ§‚‚’ˆ{}h‰‘—’˜‹ŠŒ{Ÿ›Š‹º¢œ˜’”¤¦˜‹”iœvv“‹ƒ¤œ‰„³’—“†“——™£™ z…†ž‹š¤®˜w‘’Œ›‘ˆ™€o’€…’š‹v‚ƒ˜¤†ˆ——„€ut„‰‹sˆ‘“š—‘uŒvœ’–„š–ŒŠ£š‹“”¦œŒ…ˆw{“‹ ‚“Œw¦®¡ŠŠ„Šš–’Ÿ…’—“…¢¤Ÿ€Œš™Š—›©ƒoœ˜—“}mˆ§¡wˆeŒšƒ”œ‘˜šz€‰vn€“‘Œ¤’œ‹vr—ˆ€¤žh“š—v¼«{Ÿœ˜‘…”‚˜’’¤œœ³‘„ž”’”’¦”—}ƒ——˜ ™›“”¤Š‹‚‰§«œ‘™–yƒšŒžŒ„Šƒ’}ŠnŠ© °‘‘|{Š{h……Šš…|Ÿƒ™‘€‚ˆ…Šs—›‘–’¡¶©”œ“‚¡®¤ƒ“¦’¤š–“‰Ÿˆ¢‘¡”ž‚ˆŸ›—Š†ƒ›’«‰“”“}“ŸˆŸ‰‚—ž}‘™ˆ}ŒŸ’z¦˜ˆ¢ œ’…myw€„‚‹ˆ‚}‹Š›Œ’tr…¤ §§¡¢œ‚©ž}s§¾˜t”¤“šy–£—¤‘„…Œ ˜—ƒ|ˆ˜£˜˜š{—žœ›“˜„’¤˜Ÿna‰°§œ¢‹‚šˆ—“ˆž›‘‚‚s}z–ˆ‰“ˆww‘¡’“™|u}š¢˜ž¢ƒ–ª—… ¬ …‚‰‰›¨yŒŒv“ª™—Š‘“–‘¦›–ƒƒ‹—˜“‰“†‹˜š®¡—´£{¨“{Œ‹§ªªš°®Œ”‚‚|œ™Ÿ‹|}‰œ…ž}{otr{™˜›Ÿ‰eo}|Š¬œ ¤’Š…–™¿™l¦ŠŒ”‘”š“›šžŠ¢Ÿ˜Œž™“”ƒˆ…”‘Ÿw“¨šyœ”˜¤«´‰‘‰ezŠ…˜´ˆš¤ž ž“‚s|››‘«v‘’vsv†`Œ‘€ —ozwhyŸ¦Œ«£“Š±´€¦ž{„¢ ‘˜¨³œ¡›‚†±‘’ w†ƒ‘„‹}‰“š‰šˆ˜v±¡¦«¢–{{…|ˆª’ ™”€›¦”‹‰”ƒsŠvœ“«š€u}t†p…‰y†ž†™‚n’‰z}–”˜Çšs¡ “€ˆ®„}©«°š¤¢¡ƒ„£…Œ’‘…€†ŠŒmnœŸ‚Šˆ“”’˜˜€´žv™¹ªˆyž¢–‰¢Œ—¤–Ÿƒƒy€|ˆ›Œš†Š‚‹w£‹z{—i}˜¤†ž„†sŒ‹{}Ï¢wl£ž„€ƒy£ ™’¢ž¨‹£«”¢°€„‰¢ƒft’’†y¦…Œ§|“›¤™«²ž…µ²„r˜‚” ‰Ÿª mu“‰„…ƒsŠt‹ƒšž
\ No newline at end of file diff --git a/plug-ins/gimpressionist/Paper/marble.pgm b/plug-ins/gimpressionist/Paper/marble.pgm Binary files differnew file mode 100644 index 0000000..589d8d3 --- /dev/null +++ b/plug-ins/gimpressionist/Paper/marble.pgm diff --git a/plug-ins/gimpressionist/Paper/marble2.pgm b/plug-ins/gimpressionist/Paper/marble2.pgm Binary files differnew file mode 100644 index 0000000..0090344 --- /dev/null +++ b/plug-ins/gimpressionist/Paper/marble2.pgm diff --git a/plug-ins/gimpressionist/Paper/stone.pgm b/plug-ins/gimpressionist/Paper/stone.pgm new file mode 100644 index 0000000..a1c0e34 --- /dev/null +++ b/plug-ins/gimpressionist/Paper/stone.pgm @@ -0,0 +1,6 @@ +P5 +# CREATOR: The GIMP's PNM Filter Version 1.0 +130 130 +255 +µ¤´¬±º«¾ÂËÏÐÕÕ™%+/Guž¤ž¬¸®Ë¹©Ÿ²©¥›¯ ±ªÊůª|Ÿª«°¿žœŸŸ¬¦¨£¨©³ÂÐÀÀžI
c™«§®¤±³§“‰’yx‘™¬¶ŠŠsuweekzuyz‡•¶¢–šÝÝÐǽ®±³ÀÌÔÇö½ª´¯¶¯±»ÃÆο¸½¶¼¨}LX’¥®·š¥™ ¯¡±¦®¿¦›±È´¨µµ·Ä²ªË¤Ž›Š£¤¼«¯²¡®©ª›±ÙÕÖÀ`cNDs¥ÖÛÉÄÄÁ¸»¼³ ~`n¡—‘£¸²´¬¬Â¼·¹°µÅÈ¢·Á³ÔÉǺÃǬ¾¿¶µª³¿ÄÁ¼²¯¡«·À½ÁÅ´»º°ÇѸž4s¬¯¡±¢”“¶·¾¸ ¨ÒÏǺÊÖúвµÈ¦®ª¬›°±¿º©ª–¢—‘®ÃÌã¾n1Toœ¸ÜÛÞáààÕËÓ×Ǻ¢VJŽ’®¹´¯¹¼¨¸µ¼½¡ªÆÇËÌ”›š«Ë²²À¼ÃÇ˼«·°¡¾ÎĹ«¸¤©ºÀ¸¸¶½¼·Â³ÌĹtG&*N·²§—ŸÌ¿Ä¼§¡½ºÂÔÖÓͶ¶œ£¦«¬¸¨µ”¥“–š˜§³¤jz^‰›»ÉÕÅÄÎàØÙÔÍÓп³ o\’š±¾¿ÈËÁ¾ÅÏ·¼½«Â¿ÅÄ°{̯³¿´½Â¶³°»¦¬¶Ê±¥«¡—±²¸·²ªÌÉƨ£¯¢··ƒ7#—ª¼ÂºÄ̶‘—›¦ªºÁ³®¶»¸´‡””š¢˜”œ“³«¡¦¡ ”°£W$m ÌÏÖDzÁ»Á¿¸ÂÍÇÍɱ¢“Šv“´À¹ËÍÀÅÓÛ¼¼Á²ÁÈÂÁÀ½‰zŒÇ¤µ¸ª´¼¯®ª»—¤©·´Èº®È¿¾«¡Ÿ´½½ª¢³¾º¾š…zZ.r¶Ì½Ÿ¡¾Æº£¦•®£˜œ‘²0X‘}“žƒ™Ž¥•¥ˆ—žŽs0%`›×áËÔßàáËÅÇļ¶ÈÈ» Š‘’{†Â³¯½ÀÀ½½¿ÒÕÁ¹“ ¥Ã¶«®ux‡wµµ¼¶¿ÆѺ»ÆÐÕÅÉ̽ı·¹¸¹¸±±¬´¾À°¯¦±»•wna5+7 '_ºÕÏÐÌý°±¼¨¬„Vmœ¦ ¨ªµÀ¦·²©†‚sM<:dÎØÐÇ×ÎËÔ³¾ÂÈÀ¬º°¦†’—Œ€–•¸ÄÅÆÊÂÀÆÀñ¥Ž²«‘”x}ˆs £´ºÃÍÐÏ×ÖÍÌÆÊÀϦ ²²º´´ºÌο¹Á¼«¥£…gi|‡wlZS:"Av¹ÃÎЯ¦ª»Ã˦…8‰†“˜£§±®§®®ËÆ´u&?w§»’°Å¾ÉÌÑ·»¼Å¸ÉÉ©¦²Šˆš¢š¡_>]–²´»ÈƼ¾Á¬½¨–†“j~oR ¬°³¹É¿ÐÜÐÄËËÀ½Æ·°·ºÊ³¹ºÄɬ ´µ´ z]Xnž½Æ½—€Z</)-J]cŠ’ž©ÍµžpZdtl†‹”›ª°¬µœzN<;>j’¦º§¯¢¹®ÉÆʼ¼ºÁÁÈË°•¨Á‡€–¡›£–MJMȾ¼º¼¾¾¶¬§¶—yfu|lM•ÂËÏ¿ÃÃÙѽ¸Äź·Çº©°ÁËËÑŶ²Ÿ¥®¦³ŽRdx’¸Ó×Ø×ÖɬU1.( ;nŠ¤]6O‚x]e˜•‹”£š˜X4U™»µÂÅÏ®ÈÂ㱶¹àɵʸ— ¹Ë—‚–¡™¦““_EÑÜȵÂŽ»°¬¦µ¶¢ƒtdaV«ÉÖÜŲ¯º·¼ÊŸ«³Ã¦´ÄØÚ¾ºµ´³®¿¶‘gJW¨¶¼ØàâáàÖÌÅÁ q2&*!>YyF]¤§”ƒa
HfpO¤À¯®ÉÉÙÒ¾›“¦ºÀƱ¸Á¦Ÿ…u…£§Î¸—š|¡««ÃÖκº²£³·£’”“V¦Æ¹º«¦Â²µ¿Åµ²¦°£ÃÅÆÒÉǵ¶ÁÀ¯³•X2Ll„·ÔÁ¾ÓÛ×ÒÍÎÎÕÒ˸vMMCD8>g‰–D=_U:)(,?9€n„¬ÂÖÞÒÖ×È»ÍÈ»¿±¶Ä¹©povrŽ‰og{~¨´¬¨±·²²µ´¯¶³°¥ž s›ÍÀÏÀ·Ì½´½Ã½²—¥²ÅÄÃÏÑ¿¾ÂÒÙÒ«X/+KMDsÖÙ§ÅÙØÆÎÚÚÙØÓÑÐÖÏĺ±®§¦»Ð×¥}VKNYYTVSTXXGC8o®¨„‘ºØàßØÞåßßÍ¿¶«—‹šªšˆv}‡x^nn‹° ¢¦ui^j‡ƒ¢²µ·¶¯¯•}~¹ÉÞÏξÍÆÄ˽ª¨±ÀÉÏÏÚص¼ÀÏÅ“QFGcqd82½éÑÕáÜØÛÕÚÝÔÕÓÓÝÖÌÐÖÍ»ÁÕÞÛÙÑÆÁ¿¼´ª«¥©¢z[ZI+cwÆé¦r²ÖÝÎÒØßåÏǶ™”ŸÊË¿ÁÉÍÂŒ™‰®¿¿Â·©¢uUL<Iq’±¸«¤ ‘t•ØÝÊÌÀÊǽÌļÁÂÅÌÝÝÖµ¾×Ê}F‚x„’x[,€ÍËÎãêÞßÙÝàÖÖØÜÜÔÔÔÖÏ¿¾ÄÆÃÉÉËÏÐÌȾ¶·º´ª¨š¡~pXSšÎ£‹žÆ¯²º°½¾¥§¥ºÄÎÚÌÎÖÙÕʼ§c¯Î·ÁÁÀ²ª·µ‘ƒKCZOn…ƒ„~c>mÁÄÒ̾¿¿ªµ¸ÎÌÈÐËÈÈÆ®ˆ¬ÎÌÆǽʳ˜[4£ââÞåÜßâÛÝåàÛØÓÏÖØØÒÍÎËÄÁÃÅÆÇÇÄÁ¿´²¸¸´µ©¹±„ƒkU’¥tQ «Ä½Â¼½ ›¿ÕØÚÏÌÍÕÖÛÜ͹—ÄÞÕÚÛÛϾ¿¨sž’x€ ¦£žœuY®ÒÕÓÑÁ´ÏÁ²½ÁºÄƵ»[s·ÚÞÙÛÙØÜÌ°”{-GÎáÖÂáÝÛÖÝäÞÛÖÚÖÐÍÒÌÊÖØÑÌÅ¿¶³¹¼¹··³¾Â¬©¤¦¹®³s<FA5b•¤·¬—ÖÜÝáÔÑÔ××ÛÕÛɱÕÞ×çéáÜÜÝ·Œ®½¬¢®¤ª³¹¶¶¾§—µáÜƼÏÀ©¨¢¤“ x„mŸØÖÒÀËÑÛÚÒÁ£K:m¶ÞÐÒàÜ×ÛáãÞØÓÌÌÉÏÌÍÙÚÔÓĽ¾Â¾¶·¼¾¼¸±«¬¦±«Ÿ¹®“ynJDR„£ œÍàßÚÙ×ÔØ×ÕØÔÕ©‚¶ÕÛáãÖÈÍ˦–²¨°´¬¯¬±±¬½¦ž¼ÈÖͼĸ¦ªµ®ŽVvnuy³º½Áª´¹ÄÊÓÐȳ_1ƒÕÕÃÏÙØÖãááÝÓÐÎÏÕÏÉÕÜÝÔ¿ÂÆÊÊÍÄÆÆÀ»¼»±¡«¨–™½ÑËÌ̧…NIk†µá×áÔÔÖÒÑÙØØØ° ‡¤½ÚÖÏËÁ»¼™ ³§¨²±±¦¡¤¶¶Ä©w‰»¿º¡{|ooˆ¢±Á ji‘ÏϺÀÊÀÆÒØÒ×ßÞÜÌ}„ÁÒÒÖÕÜÛâãÞÝ×ÒÍÍÏÔØÚÖÔÊÊÐÓ;½´¹¼ÍàâÔ󱕓¢°¯È¾À¿Á§„iQ~ÀÑÑÛÆÍ×Õ×Ø×Ù·ÜÓŒlŠƒ’‚ldPI^”¯½½©®±ª¦®¶²¸«¯–À¶¡~^uŠ©Íº{_«ëâÞÜÓÏÑÕÚËÐÛÚÕÝÖt¢È¿ÁÂÎÒØØÒÕÓÉÏÏÎÌÍÒÓÖÒÆÑÖÐÁÄÂÿÌÙÖϼ«¯¢£©¥¨·¯®¯µ¿°¬¡o»¾ÏÌÒÛÖÑÑËÕË–É g@*5!9.!. c¾ÄÂÀÁÁ¸´¤©¡¬²¶²¨šo”¼«¦®®¸ÇØžÚèÖÐÓƹÇÊÆÅÄÉÈÎÜÔÔÓ‡»½°À»¾ÍÊÐÑÑÌ×ÖÖÓÔÐÇËÒÕÚÞÛÏͼ·³¢ ¯¾›‰——®¯µ¯¨ªŸ§¡—¢’¶ÔÓÑÛÖÓÏ¥‘~{M=YPwˆ{ez¦»¨Œ”¿ÉÌËÁ·¡¨¸±³©‚By£¨–³ÆÆ¿²½ÊÚÅãÚÕÐÍÍÀ¾ÇÄÊÊÌÌÂÆÑÊÒØ·xf·¿ÐÐÑÓÚÚ×××ÜÙÚÎÏÔΞÄÅÌÕÓÒÆ¿·«¤£¢¢… ¬³«¨¥±®¹µ±À¯¶ÃŇ~«¡˜Œ|“¸Çƺ«¶¸ÇÐÒÜ¿‡¨¥¯§ºÃ½º±§~_\KP[®°®²¶³ººÇÉŸÊÞÎÒÊËÒÔÈÃÆÂÉÏÌÈÁÀĹ¾ÏÊŒUi ÆÐÊ°Ç×ÖØÚÖÓÚÏÒк¬¯Ä§Ž›¾àÞ×йpi¯¸±´Ã½µ˜œÆÙàÒÔÎÒÔ· •ƒ`4ˆ¾ÓÜÔ×ÖØÖÜ˽ÀǼËÁÍ©l¥¨•š¨µ®±uL6-CTdxˆ¢·½¹¹±¯ÂÆ¥|§ëØÔÎÐÍÐÏŽ¾ÄËÎÏɼ½À¿ÃÔØ°oEk¹Áþ¾ÃÊÓØÍÍÓÁËÌ´£¨‘ ¾ÔæãäÛÏz#Z~‹—¹ÃÌÄ«Y‡ÊâØÛÐÕϼ¤ƒs_yÜâãÜæáÚÕÓ¾º¸ÃǼÆιC9¢¡¡’«®¥>¬¨¢¤«¡ŽQQj˽¹¼¾³£rçÌÍÑÒÖÔÐÍ÷¸½ÀÅÉÌÄÇÊÈÈо¯§iVk‹•¤’}vZLp††{IHLlàìòîéæâÛÔÄž}T9/0E{†raGILXbo“Ë»£¶ÔÙÑÍ×ãßÛÚ×ϲ¸ÇÐÔ¶¢X%¯«“ƒv “93ÄàÜáÛæàÙáæÙH‘—ƒšš¿ÞéÞÑÎÍÐ×ÒÏÉÆÁÀÆÇÈÄÈËÐÓÈÁ»¤‹‡H=Qs‡›pPPMS)EPa’·æëîìèáÜÜÜÜÔȱžmRQ`Š³¸ÁÅÇÅ«m_œŸÀÑÏÐÕÖÔ×áàÖǹ¸»Å»ybHjÉÙУu{uFV¤ÛÑÔÕÚ×ÝßÙá溷±ŒŒ·ÔÚÚ׿ÂÈÈÁºµ¥¯µ¶ÅÑÛÔÏÐÐÒË̬€E1.[‹©·ÁÁ¾Çĺ³ª•=2b†´ÈäêìéãáââåìðòìÕ—……ªÎÕâÞÙÕÍ×ÚÍѵƒ¬ÀÃÒÙÖ×ÝáÛÓű·²«|-E˜Òæäå¸zZDS¯ëÔÈÍÓ×ÛÜÏÆØÝçéÚǷƾÂ䙓’ŽŽ~RUPDU{™‡‚§ÃʳH3x´·¸¼¾¸±º»¹ÊÍ\XzÂÔàäàÜÜßãèíñð縪¤‡g®ÖãáäãÙ×ÎÏÕÓÇ©ÁÎÌÒÖÔÚÛßÜ˽´q\d„ŸÊÝäÚ×ÖÄ®¥—sšæÍÔØÒÑØÖÖÛÛááÛÖš±ª¦©‹‰’¡¬Ÿ§¢£‡G;i¢ „kSg= Uls»½»¼¾»¸¼½ÄÅÄÊÀËÊ»”psƒ®ÎÛÚØÛàåæçääáÔ®‡JPÆßèãÜÕÆÏ×ãÙÁÕàÔÌÚßÝÞÝÙÉÆÑ–B{¾ÑÞàãÐÆÙäàÛÂqBÉáâÔÍÎÎ××ÎÙáâØÉUq–¡•ÈÌÀ©—§³ÄÐÎÆ¿½ÅÄĶžb*D¿Ç¯¸¸½ÁÁÁÁ¿¼µµ½ÅÈÊÉÎÃÆÂÔ×ÚÓÄÃÍÙÝãååßÝÝÞݾž–}Z[‡¨ÅÎÙÚØ͸¹ãèáÞà×ÎÔÑÄàÍ(6xƒÈâäåÜÝÚááäÖÐØÞÙVmºõãÒÏÎÎËÈÔäÞÚ®¶·ÃËÅÍǹµ¼µ·ÂÈÉ®•¢¯¼²xAYˆÔ͹»¼¿ÇýÇǼ½ÁÁ¾Ãź½ËﵶÁÍȶÂÙÙÞãàÛ×ÚÙÖ«ž”ž{gem¦¹ÉÑÙÅ¥œÐäçèÚÍÙÜⵃgjw–ÈâãßÓààâßÞÒÎÏËÔ¯ZkÅçáÔÑÁÅÂÔççׯ¸ÂÆÎÊÁ»¹½º¿Á¾»¹´ xn’¥‘FKÆÚÍÒкÅÃÐÑÎÔÌÇÅ¿¾¹½¼¾¾·®®¶¿ÅÎÓÁµÐàßááÕÓ×Þѵmf½ØÛе¡Žlt‘˜zz®åáÕÉÏåܶ‡¶Ô»’~MlÝêæßÞÙßÚØÐÐÉ¿ÅÏÕ£g´ëÞÔÈÃÄÏßäÑÜàÜÖÔÉ»¼½¾µ½¼ÀÇÆvk–’Lb²ØÌËË¿¼ÈÄÇÄÅÊÅËÆ¿ÄÃÃÀÄÅÃÃÁ»ÁÂÓǧ¼ÕÞßÞÖÑÕÜÁ¿Œˆ½äöìãèêÓ°³ºÏʨ†ŸÞØÌÖÔÀƒ³Í×ÍdzzM\©àÝÕÖÜÖÔÑÕÓËÏÎÏѺ¿£æäÙÍÎÛÝÑÐÜÖÖÏÉ¿´³µ¼¹¶½ÆÎÒɹo(]W“ÀÝÞËÐͽ¿¾¹´¹¼¹¼¯¶´œ«³¿ÉÌÐÍ¿ÃÂÖ•ˆËÏÈÈËÅÊÈÁÀ¯_ªØêçèêííêïôóõõÞ¬¬ÔàëGV”ÌÆÎ×ÐÖÓνˆXoÃäÜßØÎÄÆÐÕÚÙÉÍÖÑÇGcÒçßßëÁÂÕÊÈÆÁ¸µ¯©²¶³¼º³¶Æ¾”Z<Ë×ØÙÏÊÊÁÁµº¶µ¼¼¼¼ºÁ°§·ÄÑÒÖÙÕÔØƧÒÅÀ½½¶½¹¿¿©}ÅÞáÕêïòîïïóéÚÛÊ¡·ßÛÃ^¶ãØÑÆÍÕÙÓÕËЗOw¿ÔÛÒÐÏÉÒØÙÑÖÕÌÒÝOtÖäÚØ–¿Ä¬µ·²±¯«´¹¶°¯¹Á´£¨•ŒÍÑËËÎÉÁÿ¾Â¾²²°£¥´½¼³¾ÂÇÌÊÎÕÚáÖ˜²Ë×ÔÓȃhP< ;¶ØÀÖèØËÜæáåܶŠ¥«¢{3~ÍàáÙ×ÍÊÆÂÅÑÓÉÒΞ†ªÏÅÌ×Ñ×ÚßÙàØØÙºV{‘‚˜¡™£·°¥Ÿ¤«©µºª¬ª¦¨«¥ „ÓÏÓÍÁÁÉʾÀ̾²¿Ã´¼ÊÃÃÄ¿ÉÊÈÉÈÈÌÒÚ±} ~soU=@DIE@PÈëåêíãÛè܇”‰‚¾Äµšss‘»ÈÑÕÛÓÊÉÎÃÈÈÉËÍÇ󋊬ÕÜãäÞÞáÉ¢}rš£©•„£¨¶µª¶¬£¥§µ·³¦¥ •™¤¥¦‹Qišª½¿´·ÊÉÇÌÒÆÅÑÔËÊ˾Ì˺ÁÊÀÈÆÃÌÅÄ}\R05hµ¯§k„ØöõôñäË•UZWjRL™ºº¯š§ÈÎÁÉÅÑ×ÓÏÇÂÌÇÀËÿ˾‘UYµÕàÞØàÀƒOWn²½ÐÄ¿ÏÏÌǹ¯£¨±°¯¢ ª±¤¢®µ¤Ÿª“‡‚usenˆ“”}›ºÐÎÐÎÔÖÒ×ÆÍÌÐÖÍÔØÒÎÍÍo20K‡»ÁÊÕÜééäÖWGR¼Áo\‚˜œ¦¡¨‰UACO€ª½ÍÏ¿µÀÅËÏÓÌź´ÊÉΤu†¨²‚zn¨ÐÒ‚iTK|‹¤—ž›´ØÚÖ¾©´µ°«±º£™˜– ¨¬«¢€r¨£›§©NbW<3a‰‰°À³¾ÏÎÕÖÎÎÙß×ÌÑÖÑZd•µËàäæçàæöîÓqKmŸ?9pª©ªšª¯µµµ˜gkŽ±º²¹²¸ÅÂÅÀµ¯¬²Åלž»¿È£ž…l'q~p‹‡š³²’‚ªÉááÕǹ´°¾º¾Á¾´¼±ŸƒhXaµÈÆÆÃËÕžž…ƒg|rahsZ;TonŽº½Ã×ÓÚÚØÔ E&AXZx¥¡¸Î”F>PIDDn’ ¥©°§¦©·µ´½ÎËÄÅË¢€Ÿ«¯µ¾ÄÁ¿ÂÀÃ¥€„›ÉÖ¿³·“¯¡~]kd“µ¼¿¬¾ÅÌÀ–‰©ÇÄ¿ÀÀ»»enln}mVOHAŒ¢³ººÄÅÆʱ“«£¯ÅÏÑËÒÇ€]RZaž¨®º¾³³»±„k[I622.6?b•‹xgYc}vž¥ª¡¦ ´©£ª®·¹ÁÊÊÂÈ«ŒŠ›«³¶»ÁËʲœˆ¥ÁÕØ̾¶µ›ª¥•Šz¶ÄÐÔÉ¥’ˆ~uˆŽxwk17,(8OS\n{ÍÀº¾¸½ÉÇͼpйºÊØÛÑÐÛÞÒ±’nwű§½¶¡™¢ÀÊÒÌÀ·¨™˜«»ÆÕ×¥ƒamÁ³¨£œ•°¬©«©©¦²¶Å¼~y•¸Ã¶¶½Ä¹’u¢¸ÐÓÅÉÃÉÃÌŒš»Ä¢œ~ŸÊ•{MDX{“‰fJB'20©¨ª§ ¤¨±¨oËÊÏÖÙÒÓÔÕË¡Î×ßßÞÛÔÊÎÙÙÛ»M^¥¼ÓÊÏÐÉÐϼÂËÓÏËÏÏÌÒÜÓËÊ×Êoyž±–£”’•ž¥¢©¹¶µ·Á¿Å”cJu³ÉÄ·¨rs·ÑØѱ±ÌÏÐ˱‘¸¾»¸¥o{s}pm~Œ‡ˆœ•¤ Œ¬¶±±µµ²²¸²²¶Ÿ½ÙÒÈÒáâØÛÚŽÞÔÍÎÍÓÖÖ×ãàäéAB—ÄÒÎÇÖ×ØßÙÛÜÌÑÓÏÑÞÜÚàÝÖÏš\%g˜ª˜¢¢—ž¬³¯¸ÉÎÎÖÕÉ“uqq}¯ÆÁ ‘–‡…ÑÞÖÕÓÀÄÑÒÍÇ£²¾Âž·§¦®ÂÎÜÚ×åâÙ°¡³ª¨®±´´±¢³±¶—¨À»¶ÂÑÈÈСhÊÉÙËÏÒØÙÑÜàçéÒxIy•¤¤ª²©ª³º³»´³¼ËÉÆÒÚÛÑÊ–D5ušŸ¡«¡Ÿ¡®¯°¼ÆÉÖÞÚ«‘—eƒ¯¨ –”¡ž×ÝÑÊ̽ËÒÕÀººÄÌÍÏÉÈÒÖÕÔÖÚßßÜ¡y³¬¬¥ ¦¬«´¦±²˜¾ÀÁú½Ç}‚Ô·ÇØÐÒÐÒÖÝ×ÞâêÎm<.'&0BBX‡}z~~„‘©º¶œž£°ª¾¤uaC†¤–˜§²¸¹²µÄÊ×åâ±—§œ]”¡¦Ÿ¦ÀÄãÞÐÆÈŹÅÏÙ·¾ÇÐØÎÏÓɶÎÎÓÏÔâæÎHv¥´·´£¤®·¹¸Â¼¶¶KJOJQKSSU`\ÍÒÖä×ØÙÙÔÝÜÙÙäâš^>BQt‹—«ËÓ̹ª¸±±±ºÌÀ½»Á»¶¬žš˜®³“‘rbXTd‚£ÄÊÌÓÚ³š¡›œsS]†¢ÅÒÖáÓÆÇÈÌÃÉÍÕ¥ÂÄÅÓÌÉǼÊÆÎÊÐÄfs™¯¹µ«¨«¤ªºÂÒËËÌÑ])(,hE@‘Ìêå×Ñ×ÛåßØÔáåµmGož¾ÆÍÙÑÚѵ©Éò¹ÁƾÅÄÄÎÈÌÆ¿ÑÏÈÁÁ³§“kI?Uy¤¼ÇÊž“¬™…;<pœÔÙÚÙÍÄËÈÍÈËËÌÈÄ¿Ä°£¨¯´³°¶ÄÜ«3dŸ§ºÅ±¦«µ«ªºÅ¼·¸¶¯œÓâÌ÷®§´ÃĽ’V0Ykt‘·ÀÝâèêÇħ€Œ»ÄÅÀ»Æ®œºÊ·³ÅÆ¿·±¨©¬Ê;¼§±¶·¾ÈÐÏͺÅÑɦËÅ ‘iPu‘ÄÔÓÌÚÏÎÈÊÃÄÊ¿›Æ¿¥––®ÔâéãíëÙÒ¿ ª®›H.t’§q‰ ¶¿¿–£Ÿ²‚˜×ÀÃÍÅͺÑÙÞßÇ“˜§¶š‚i€–˜{Zƒ²œˆp‡‘— ¦¼ªŽ´¨±³¶¹¶º £®ÅÄ·Á·µ»ÄÍÉÄÁ¾ªªªŸ“ ¾¿ª¨ˆq‰ªËØλÚÎËÅÄÃÁÉ¢„ª”vz ®²º¿½µ¶·´¸¶·¹¿’>.2K*Q—½®µ¢˜—v³Ò½ÑÊκ½ÇÔáÛØÔÍÙÕÑŠ
# [Œwotcusq|ˆ¨¡ŠŽŒˆ™¡¼Ã²´²¾Á»½Âª±ÅÏ¿±¦¡Šˆn{†ª¶¤¢ ªl¹ÔÑÀ°ÐÇÉÀºÄ¼Åvh”€qy“”Š–›—t¢¼À¹»¸y‘nL0¤£žsFž£Ž‹ŽSSW>Š¹ÚÇÈÁ»ÇÈ×ØØÜáÜàÒÈži0Lapxi\QC447>>JNTtu~‹›œ–Œ—š¾ÌÆÁÊ®«Âµ¡Ÿ¡ªœ˜ˆ‰‹wıv¹ØÕ¶ªÇÄÈÄÀ¾¸¿o\’¤¬·ÁÆÈÈÊÖ¦HXe›·–p–¥Â¾¼°Ûçâ²JH‡„‚šJ+m¶ÅÏѼ¹³Ñß×ØäßàÏÕÞÆ„]z§»¨–®º¹»ŠU $6/57AOENSgu€¶ÉÁð²Æ¼§™ž²®”‹‹’”ˆ…\¤Æœo¦ÔÏ´¬ÃÅÀ¿Ä¸·Âu]Ÿ«¼ÁÆȼ¼Ñ¿]3UŽoSœØßÚÞáÚÓÐÎâê:Hmœy¹ÔÜà»W7r•´¶¾¼ËÄãÙÕÒÐÔÊÑÝϯÛñöëãêéçïíìéܸl[jj]=L=8H7IB24:,0;Q:;f…–œ¡––}p{©Œh³ÊŸ§¥œÖÔÔžÈÑÿÎÄÅÌ{x¸¼»ÄÅÆÆÀÅÉ·¯‚KµáåíâØÝÜÕÜÙÒÌÞæk^‰£×ääÞßÁ@=“¿¼®ÁØÛàâÓÎàÜÌÓ¯ƒÙïìçêïéäëèåçêéàâéèÝ»Â×ÚââÛÛ¿‹fQM<-(Iu™—n{Œž½ŠiÀ‘žÈµ«£ÊÓÌÐÏÔÔÅÐÌqzÂÆÆÅÂÀ¿¾ÁÃÂŹÑçåæåÖÑÑ×ÒÜ×ßßÎ’lžÎÍÙÚÛÛàÞÛ¼[Up¤ÄÂÉÖØßÙÕÝÐÌඊØîòêãååäëàßâáàáêîëñ¸t‡°ØÛÕØÛßÞÏÉÉÇ^3 D_n~¤´ºÌvo†“Àà̺¡µËÁÙÓÊÎÑÇÍÈ…¼¼ÅÃÊÏÎÎÄÆÀ¡œÎçèâàÎÖÕÑÐ×âñÜp^´ÇáæèÜÕÛãàèÞÊ¥Q6<£ÝÇËÙÞßã×ÌÐÛÑ’ÔåóîáÛÜãèèæèßÙßäæâßç‡Y«ÞàÙØÓ×ÛÝÙÒ®…¯Í‹G69W„ªÃÊÇÁ`Qy»ÊéÈDz¤¸ÅåÙÍÈÒÊÏɉ•¼½ÂÂÓÓÕÛË´–egÈÙæàÔÔÏÔËÊÒì†:‰ÊÏÐÖ×ÙáâæßÝãëâ߇tTGŽÉ×ØÖÏÄèêåèÃexÉéëêéááêäßÚÙÝÞåâÝæãÙžt°ÀµÏÜßâÖÚ¿±ÎÝèËŸ|^k–ij³ÀŸ`o£ËÌÚÔØÍ·¤žÀåÓºÉÇÆŇ¥šœ—£ŒyuUNKNZ¿àêÜÍÔÀÏÕÔã½q¶ÕмÍÖÒ×ãåäàÛáíäÖ•yxŠuPÍÝÜÈÉÌÜáé™r@ŸäîòçäåâäßÙßçØÜãâÖâÇÛ¦«Ä¿ÆÅÍÒÌÜÑÎâäëÔ¦le±Ãº¹¯„=‹³»ÙÆØû½±º¡É˽ÇÒÌ¿k`wslYXXs•¯¬ªÂ¢ÅáßÔÏÔÐÍÖáßtÕÒÂÁ¨ÉÖÒÖÜÜàÙàäè¡I<zºËÒÜPp½ØÚËÅÕôq—ëëëåÞÞèÙÐØàçÞßßâäÝîìíç͸·ºÈ¾ÃÖÚÛÛÚïãÄx“±²¶¿¥~xª¿·åÝÔµ¼Ê»±¢šÐÏÇÂÀµw’¿ÕÝààÚÙÖØÚÞÚÛÀçÙ×ÊÔÍÔàÆfÏÏÍÐÓÍÍÒÐÏÛßÛÕãÊ€hh–¯×ÕÓÒª€ry¥ÎÑÚæ ˆˆÆïïñåÛÛâÔÍÞâàÙÞçãàîââãèæÜÉÀÅÂÍÞßÜÕÐÛØÁ‡€£¼¶ª®ˆlœ¸¾ºä仧ÃäÃÄ«¾ÚÕÅ»ªÉÛÝßÝÐÐÓÒØÖØß×ÈâÚÓÛÛÔ”¬ÜÑËÚáÔÉËÊÊØßßá¾z*x¿ÙÒÜÕÒÐÌÆ>;ÝëåÙ¤Œ¬æðíìêÞÕÙÈÓàçå×áïàÝíÆÚéçêñäÓÓÙÛÖãäÒÛâÚ˱‘–¹§ª¥}•¤º¶ÂãÝ®•¶´±ÚÔɬØÔÉĸŽ«ÈÙÙÖÛÒÏÖÕÜ×ÙÞ×±ìãÚåÜplºÙÒÎÝÞØÔ×ÒÇÑÙÚÊŠD\ºÄÐÖÛÛÓÈÃÉÌ×Àž3pæõŸÂ¾éîæØãèäÛÑáÕàèÚåìåãñèãéåëíçãäàÌÉ×áÞÜââßÓ§œº·£‘†ª¦¼®ÉæÒĹп¼¿Èʾ¿âÖƺ”ÀÌÓÌØØÔßäßÑÇ»ujÖèôÝ‹˜ËÝÓÓÕÝäÙÙ×ÓÏÔÈ•EtËÚÎÓÑËÃÇÄËÔÙáàÝ`,hžžÒÑæðôæÙåçæÞåÞãçàçééáéìéìèëðêãâáÑÇÀÆÇØÜÙÓÕ¡‹¸µtŒ¨²Æ·ÆÛÔËÃÓÃùľͳ©ÙŲ‹¥¼ÇÏÍÔÑÕÝÚÕÅÄq2_ƒ¢„~”tšÊ¶âãáçß侤¯“ËÏÇÐÊÄÆɽÂÆËÜØÓÊÄɱkNMsëçëìëçäÞßÜáÞáÞâæèìãèëèàâæåèìæàÏÆÂÌÁÏÜÏÉλ—Ÿ¸žl›§¾¾¶¿ÙÆ¿ÀµÇµÃÅÀÎÓ²¥¶‘s¢¾ÉØÒÛÙÖÛÉš’rzªz™£¡•š„OH2ÖâáÒœO+¹ÎÏÄÇÅÅÂÄʼÃÑÚØÈÁžÒÑÊŽz„ÏëéëíêÞÚÚæßÙÝÔçàÝäßìòéÚàèåêïãØÅÍ×Ò°ÀÖÌÏßؘtœ™‹¬¡À¹½¼ÄȾÃÆÉÄÂÃË×Ó½ŒŸiÌÐÜÛØÜÝÇŒ=n¶ÊÏËȺÌÔ£•ˆG*!Zf¢ŠKo…ÑÏÍÍÅËÃÀ³¥¸»¿ÈÑÃŶ·Ç¾·Â¶VJs¥¨¶ÞåìåäÞÜàÒâÕØäÝæíéäåæåæèäÞ×ÕÑÖ½½ÒØÒÚÚʘ•›“¬µ¹¹É¾Æõ®ÁÏÄÀ³ÂßÊÄ¡˜—‚ƒÍÒÙÝØË„dz«ÄÒËÐÏÅÇÉ»¿¼³ˆ…ˆ+!Q“·ËÛÕÓÏþ¾‰œ·ÆÒÉÁµ·Á‰¢Ø¼¾†%%8‘Ÿ¢½áñßßáÞÓÞÖØàØãííêââçååçâÛÑÍÞÓËÒÜÒÐÓàÉsq©¹Ã¶ÀÐôœ¼±³’¾¶ÀÝÈ‘ÉÑåÕà¢@v¬ÈÑÂÆÑÆÈÅËÊÄÄȲ|Žˆ_24K™ÓÐÉ¿¯œ¯º·µ¹«ÄÊÅ÷§§ºº¼Ý¨b¼ÖßãßÈhFŠ˜¥ÜÜáäááÓÓÝÞÙçéÞØÒÔÚßáÝààâØÐÂÍÎÙäàØÔã…:–Ÿ©¶³»¸´«Ìµ—¡²ÃÆÎÔü¤Œ—€cÌ;£C|ÍÈÇÊ×ØÑÏ뵶À¹ÉÎÓÕĈu‡¤ÈÇ̽´·±¯¸µ¶·½¶ÀÁ¿Å¾ÀÃÁ·¢¤qŒÚééêìëâ¼|“¦¡®ÃÕÕàÒÕÖØÛåàØØÜØÒÚäáàâãÚÙËÒÝÙÜ×ÛÜÛ¡\ƒ˜°°µµ·Å°°®©ÃÅÌ̼´£‰Ÿˆž—”pÍÆÅ»ÏÈÊÏÌÁ©²¿ÀÍËÈÚ½‰›´ÀÄ¿¹ÈǾ¸º»¹¹¾ÄÆ¿º½¼»»ÎÁ©€?Ok¥àõïôóòïôììÜ<Y¢ÍØÍÏÑÒÛÛáçæëæÙÙßäåâßßßÒÖÚÚÕØÞàÞ̓]¤¢¦«³»¹¶´Ìº¥¯ÆÎÑ´¶¦‰”©«€WS¶ÊÊÀÏÎÊÃÉÈı¦±¹¸ÀÆËÊÚŽµÃÉËżÄÂÃÁ¼ºÂÊÈÊʽ½¹ÆÊËÅfOI…¥²ÂÈÍãêóòöòòñæ´™}fRÑÑØØÑÕèåãêíáàÝÜÜÜÔÞÝÐÐÕÑÔÛØÞàݪR€£›¢žœœ¡„€•¦¶ÃÐÕµ¶“ƒ›§ž‰‘¥ÓÕÍÄËÏÊÄÅÇÈ¿²²±°±–ogT¸ÕËËÐÅÇÄÉÂÁ¾¼ÐÔüÁÀ½»ÈÌÇÅw+]p€¨§Á›§ÛäïðòóôõòæåØ9nµÔÛÓÞëáåéìâãÜÚÞÝØßÜÖÏÒÖÚØËÚãæÈhi ¯£™ŒoxUi|˜±ÂÁÉͶ¶‘‰Šˆ—ªÉÕàØÊÆËÕʾ¸ºÀ½®¯º-$!mÇÄÆÏÇÑÐÆÅÀÊÎÍÑÁ¾Ç¾»Ë¸¸½Ó×6%Zhn±É¦ªË²’³Ùðõòóíöíèâç«2y½§ËßçÞÚÚÝØÞáØÚÔÕß×ÍÔÐÄ¿ÖÔÑÓ®M25;e‹¤°¿ÈÊÄÄþ·’wz—ÉÏ¿¨³ÁÈǶ³Ò¿¥¤±º¡¢†1;m„ÐÉÐÔÝÚÑÒÌÊ¿ÄÆÇǽ¸¼¼µÀºÂ½°Œ QoiZJ]VP]r|fXu”¡¥¨¤§¬°¸·§Y1"DG…±ßëàÛÝààÞÙÚÒ×ÝÙÒÒξÆÚÝÓÌÃyR@>V[›¼Ã¹¶¹ÂÅü¹²¡†…£ºÍʶ±ÄÀÊÌÄÀ½»ª«¯·_BUcsc±ƒŸÍÚÞÌÔÒÑÀ¸¸º»½»·¶²¶Ä£xQ9hry{vP_i_]apvzvywiZRcsx|‘‰ƒ¤wb"/>nŸÍîèãçèãÉÆÑÑÙÖÙݾ¿ÑÖÔÔѵ…’«²ªŠÕÍÄ·¿¸¾²·±¬§´»·ÁËÏÁ̺Åľ¶ª¸®«¯Ãž–ª¥¥¡™…wA;e¥ÔÙÒɽ¶À»·²¶¼º¾ÇºZ)ElŠ‘«¸°ÃÐÊÅÇÐÞÞÝÜæ×ÓÍ®½ÊÏÉÌÐÒÏÅÒ†5(W¿íæáßÐÀÈǽÆÒÕÛÑÃÉ×ÞÛÜÔ¸³ÎÚ×´€°ÊǽƳ¬±¼·®©©£·ËÉÈÂÆÆÄÁÁ¿°«³¼ÖÎÑÐÐÉ¿ÅÊ{½n&5`ŸÎβƒ˜«®³¶¯²£yRtx…£Å—ÅÕâââØßãååáÑÙÝÝßÖ¶´ËÏØÊÈÃÈÉÖˤq7)2g Žez“±—¹ÅËÊãáÊÁÛÖåàÆN@b©ÖÌž…«w»®œ”§ž˜¸ÓÖƼ»»ËÏ̪¯ µ·ÅÔÜÛÛÕ×ÓËÆÐÖÒ—EEzs(¢˜Œ“°˜€z¢µÁÌÙËŸ²ÄÌÚåæàÞÝÙØÔÖÛÙÚÌÒ¼¸¾Á¾À¿À¢ÁÕ±œ…cH*00:^j‰›xkš}[Ju–¦©Ä¬ƒ/',7uŠ¬v3k…YRp‡‹–¸Ëʶ¦ ¢§Äɼ¾²`j¤¶ÇÑÓÓàÙÖÕØßÙÞÓÝ×–+$!)3@^‚†‰¤Å»¶³¨¯„KI¸×ÝáÔàÝâÜÛÞäÕÀ¸µ¾¼ÇÀľ½´²£|¦ž¯¸¾ÉÐÓßà×Óĸ±£]EG@PQp„z}Še1"+<8ZYXQZ¥¯±¶¾Â´´ÐËœƒaCX„®»ÒÌ×ÕÑÛÛàêèâàÝÚσzM:<HM]fYuŸ«©®¹¿¿¹¾«¬ŽtOFq½ÛÞàâáÛÞÞßÙÜÏɾǷ¶»ÄÒÇ·š‡hl†ÑÏÌÍ××âÞäáæßÜÇ´¹¥op~}}”¦ª”wiUB^Vvz ´À¾¹µÆÍ¿·¹¦‰vWhr|z¨¿ºÂÉÏÑÍÌÐÖÝàÞãáÜÉáȘ~hutl‡³Çɸµ±ÀÉÎÊÌÇÎœ}px‹¥ÝâááÞÚØÌÁÊÍäàἸ¯ÂÝÞö·[/+5x€|°Àµ¸ÆºÆÎÏÕÆÊÉΖyjl…¸º¶º½«›tnx^½ÆÆÉÇûÉ̼¼¨`"Gs€„…¾Â¼´ÅÊÉÎËÏÆÊ×ÒÓÔ×ÕáÕËË©•†C!¨×ÐÓÎÍÍÉÄ¿ÁÌÅÑÔΘƒnZs¡³Æ±³¹ÈÈÓÕÏÍÄ«ÓÜÜÕÖÚ©ž“‰š’z].)bÉÇ´º»¼º½§«°¹©yl]¬Ç¹¼ÏÓÈÀ©«¦YW•ÆÐÏÉÁ¼ÉšuhUbo~‡’˜ƒ]O‚Çĺ·ÑÉÄÁÈÇÆÌÌÕÝÞØÕ×ÕǬY!E§ÞÝ×ÔÍËÆÊÌÁÇÈÒ˹¨¯]e–Ÿ¬ÁÉÝËÍÕÔÍÓÌÎÓ×âáâÏ›™ŒÁ½¼«t31}±¹¶¹¾§©©±©£¡”psŒ´Å¯¶ÏÒÉÂÁĹ”zw“¨³¹•t‹ˆ]f|‡ƒ‡†˜’ˆ—N+`¡¼ÈÁ½º½¼Í®ÃÈÍÑÈÎÖÛÚп©žR-‡ÏßÚÎÒÏÈÌÆŽÈÌÓØáËš_A?ˆÊÈÝÛ×ÓÒËÎÈÆÈÃËàÝÙ¯¥…¾Ò´ÅÜÀœJ%bð¼ÀƳ¹ÂÁˆYs~ÐÚÏÍÍÕÞѿŸÀ²[=;$;\€“‹{—¢˜‡…’“ˆ@A£ÈÁµ·À½¾±ÆÂÆÑÅÍÓÔÐÉź¯ pFk¢ÛÜÕÓÍÑÇÊÅÊÊÑÓÜ×Å•F7[ž·ÕÐËÒÈÁÆÊÌÒÆÊÐÒÆÓ¿‘½ÕÅÆÒÌÀŠXS`£ºÈ½Á¼ÊÉ«y^€hS„ÅÛáÜÜÞ×ÑÑÉÆÁÇ™]O*9OF\„…|VBtŽœ–žª£›e—þ½Åƽ¹½ÄÆÇÈÌÌÎÊÈÕÑÊÌϧk9]²ÙÙÔ×ËÏÀÄÃÍÌÊÓ´‘~’ª¶ÅÒÏÏÆÉÌÉÂÁÆÎÌÄϯ”»ÆÑÊËÍÛÓÄdFjÅÃËÅɧk}“¨Œ`,WZ|½ÚÚÖÙÖËÌÉËÌÅ´ŠwŠ•o€˜“„~›Ÿl;?DIILtŠ¾ÃÃÀÈÍÈ·ÈÌÊÀ¾ËÊÎÏÑÊÆÈÉÕÕ®T<ÔßÖÐÔÑÉÐÎÈ¿ÃÁ’„|…ˆ¿”¸Ðà×ÎÎËË»¿»Ê×Ò·£µÇËÅÊÃÕÜáÓ®G*yºÆËÏ m€˜ª¥“l;Zƒ•»ÚÙÊÈÎÒØÓÓÀ«“tW•¬œ¢ž›ŒYG0.10nnƒˆ|xuz˜1Ja¥ÉÑÓÒÅÉÔ½¼ÊÙËÂËÀ|2jÈÐÃÉÎÒÔÛÙØØäåÜØ‹‰´¦´ÆÑÊÍÒØÁÃÒÎØÏÀ§ÉÓÚßâÕÙÐËÉÓÛ°M@cÆÀ’›¾ÇÈÀÀÀw:7IPe†¼¾ËԺľ¹° 3‘·µ¨««´³˜¤¦¬°¨¼¶°¥skZ82RT<vš¹ÐÚÛÖÉÉËÂÎÔÔÃ|e8}·Ò×ÒÓÒÓØÓÔàåè×À¨‰uv½ÔÔÏÇÅÈËÒÇÈĪ·š¾ÅÏÍÒÎÐ×ÞØÔ×ØÀkM›¥—¾¼ÃÀÁ󦑀ha]Ra‰¢½¿ÅËÉ‹F}¯¶«¯¯²©›¦¤§¬°°³°©«¨•iŸ{*
FŒÂÒÞÙÖçÙÙËÏ΋z8GÝß×ÙÜÕÝÕÑÛÝæèèéÍeRªÐÙÓȽÍÐ×ËÐÔÊÂŒ¾ÌȽÆÈÊÐØ×ÖÞÚÖÓDTx”©Å¼ÃÆ»²´žƒq—qL[go—ÀÆй¡Šyxož± ¡¥ªŸ’’‡Š’¡š˜š‘¨¨ª«©Kl_E$#'DL^SUZ‘¯ÔÕÏ®ŒqNRˆÐÛÚÔÔÍÈËļ¼È±¤fuq¢ÜÜÏÊÍÜÚÖÊÏÒÔ͉¶ÄÃÁÎÍÓÉÂÁÈÛÙÙÏÇšŠ{§ÉÊÅÄ»µ¨°µ§‘Ÿ±¬¡•bEmƒ¼¾¸¯¢˜r‹¬¤§ªŸ¥£¡¦¡¨˜™ —™–˜qLcq}~rEPF45hT,:˜ÂØÒ¤Šk+
4šŽ}l=EG//6$-""S€BÛëèß×ØÔÒÓÕÏÛÌ‹®»Â·ÇÚÛÓ˺ÈÊÕØÊË‹y ¿Éº½Ã²£²¸¸±°·¹¿ÏϨfPJ£ÂÏËÆ™v€§¡Ÿ ©¤±©ª´«·«œ•œ—“k/B•µ»¯œ½¹¹ºÌ±ÊÈÃÂ~+#0^†vwJ% + $@Q`HAF@qŽ‡nA§Ïâïæçá×ÕÑ«½À´½º¼ËÄÁº½ÍÎÉÎÑÁš…{š›¯¶¥£’±½³´¼ÂÍÔÊÊÔÚÏÁ±™¹Á£†aª£ £¢ ”™¯¾²§¥—¥DNm»Ä¶º¦´ÁÅ»ÄÀȹÈžE"FmvphS:GY\\f„ ÄÌÒÔÖÔ³¶Ì×Ó”oa†²èàáÞØÓ¹¬Ÿ¾Ç¼¿»¿È¾º¸ÀÇÁÆÍήšpª¶²µ¬˜‰˜¬·±´¸¹ÅÌËÎÚÙÐËËžŽ¥¢švLš¤¥¤ žœ£©¦£›•• ~X>oš¥ÏλÁµµµÊÙÒÎÆÈÙÒÊÁ•QE[axz||›ÇÜßÞÜÝÖÑÑÛÝÒÞãäääÙåÕ°M-¿ëîäÞÙ½›†¸ÉÄ»º½½¶¨´ÊÊÉÌʈŒ{nšœ•§·¬½Ä¿ÂÀ½ÄÈÔÓÒÊÕÔÊ¡‹tŽ€}¯¨™—š“„pr•˜¶ŸI=u”±ºÂʹÂÓÉÄÈÑú²¹ÖÎÕ¶ªz†zz|Ž˜ÁÔâÝÙØÕØÐÏØÚ×ØÕÖäàÝÞæåá¨SAhãíãÞŸt±Â¿¹´¼¿»°¶ÅÁÁÃÅoxyŠ–¦¦¡§±¹¿Ä¿¿ÁÃÈÄÍÇÌËÎѹ|T8j£ž§’ƒte]WM]zlR`bp{¡±±Â¾Â̸ղ²ÓÉ£«±±ÖÙŽa^~m‰«ÈääßØÛáÞÝÍÑÑÂÏÎÍØØÞçàÝáêÙÈf>)5_VŠ„r¯¸º·¸·¿ÁÁ¸·ÃÊÖÓÎyXJ/A@N~²¼ÑÐÉÄ»¸º¾Â¹Íʽº±€>aŽ˜º¼¸³®–˜¨¢‘²¶²´¹À³«–’r“¿ÀÁËÅÊÀ©³¾¾Óß¿ÉÒ©Ñ·w_swyÄÕéàÝ×ÑÔÔÓÌÕÝÒÙ×Íß×ÔÜàÖáåÑÎÇr9 5b¬½Â¹¹¸À½Á¹±ÃÐÕлŽsXVLET8Ly±¼ÁÁ¼»¹¼Á¹ÅÃÀ¸…ÂÒÔÍö¾¬¢³ÌÍÁ¯ºº¶»ÇÎÍÇ ‡Š«ÉÕȼÏǽ½²ÎÔ¹ÎÇÉÑ°®¨msn˜ÚÛÛÓÖÌ¿ÊÒÕÑÐÝÙÔØÎÞáÙÚâÞåÞÏÏâçÚZ*E[®Å͹³Â»Áƺ»Ê¾‰Š~kaV‰ÔÅškAYsœ¥²·¿ËÇï~€†ÍØÉÍǼ¶¦¡¨ÁÒǹÀ»´°¼¼º¶¶”)V˜Æ›µ¯È¾ÀÃÄÍѺÀ¿ËÐÍ´©‹ž—Š¦ÝÞØÐÙÎÎÑÌÒÓÖÛàÞØÖÒÜØÕÕÜÞÖÓÚáΗXB59Ua¦Éɵ·½ÁÃÄÄ¿»É´qxute{ÌÖÚÑ¥…œ§¼¼ÃÎÉlK<Du‹°ÌÍÊÇ»º²¾ÃÎÊÊǾ³¬³ºÀÀ¹¬»±umsm<v}r~›¡áÕÛÅ«¯ÍÜäÀ©–¯¨¼àéØÕÙÔÓËËÜÝÛÛåáàâÖÕÖÑÄÔÑÒÓÙÚ¥D 0LfnŽ®×À¾´³·¾½º»ÁÃÈ €ƒu}p‹¬ÅÎÛåáÐÂÅÊÒÐËÁ•*h‰¥ÅÈŶ¿Æ¼ÈÐÄÄ¿¿±£•’²ÅÄÁ½ÄÌζS¡3)-?0Hr©ÒØØÁлºž¦²§ÏÞäÍÛÕÕÓÂÑÎÐÝÑßàÝÞÑÔÓÊÑÎÔÚáÎ{a‡¡fPkÁÕǼ¨©µÁÅÄÆËÌÂŒ€gt‹’¸ÖÏÑÌÑÈÉÌÒÑÕ·nN'¢¹˜C'J¢Á¶»ÂÀ¿ÙÚÒÄÒ̤_ÂÃÍÁ¾¼½ÃÍÒËØ”kf;:1k„Ž©µÓÆÆ®¨¸ª¨ÉÙÚÕ×ÒÏÍÕÕÕÕÚØÜÑÕÙíèÔÌÏÔÔÎȵ³½®ŸŸ¦¤uY'‰±Ã¼¹°ª±µ¸¾¾¿‰‹lŽ£ºÇÔÈÎÊÔÔÌÆÏʺ–GLÜßæ¦@'#F|¬ÌÁ²ÂÛÉÇÁ´‰gÄÏÄÿĻ¸À¾ÂÏʽ·¤‘‡f*!‰…§ÊĘ°¤ÄŸxØæÞÙÊÀÙÐÕßÖ×××ØâîìæÑÒÕÔÐѪ”¯´–Œž Xhci()z±Æµ¼¹µ¹Áø†|‹}™´´ËÊÌÊÓÌÐÓ¿‘_ÓààãåÛÝç¶LN ²¸¸®¼£›ˆPB¯ÌÒ×ÒÅÌ»»»¶³¬º{Š£º¹®–q`T;Bm“°‘¬›’aØÚÝÐÌÖ×ÜÙÙÛÖàÝÖßâæåàÕɱ£|vzn~›lryƒvO/2_™¸·³¶Àðwx’¢ÁûÅÇÈÏÑÕÀ›—…¾ÓÙÙÝÚÜäÔßÙ°[}•w“—yOir„«ÒÖØÑÎÌÇƵ¨”xg\oOšÁÐÓƸ¿²¨eV*4fr’|kh¼ÜãÚØÑØÝÎÕÑÍÓÛÎÚÞàèÖ´˜{`GQs•„lWƒ—«C94r ÂÀ½Ñ´rz™³ÈÒÑÎÑÓÍÓÓÍrY¬ÝÛÎÑÓ×ÐÔÖÚÜÉ×Ô¶‚|‹ÉÚ¶{UxÁÈÓàäÙП¢}];(5ÂÌÍÌÏÌÃÉÈɾ¹{C&5oqgf¸ÎÓØÛÜÖÓÝáÛß×äêå´¦®{CWG/)Dl†¥§±ÏÓÊÆ¿ª€fR%.J¦ÊÔŸV~ÔÙÕÑÍÖÖÕÈQŠ½ÜáßÕÈÇÈÔÔÝÊÅÓÖÔ±7€ÚçâëͯÇØØÚ×ÓÉÇ®ŽxbIXr|‹µÑÊÇËËÍÐÕÕÓÊ÷°ÉÇvn}|#2ÍÊÇÔÞÝÛ×ÕåÕÕäïìʸqYGD?w£·ÃÎÐÒÍÈÆÐË×ÌÖ×ʧ›†S'(¢‹|„¦ÖÔÑÊØ×±v=RºáÚÕÙÚÔÏÏÓËÎÎÐØÙÔžŸäãØ×ÔßÞÓãÓÒÚÙ×Ŷ§¢œ› ²²¹Ò¾ÄÅÌÐÔ×ÔÏÑÇŽªÁй’‚‡sQg»¿É×ÓÍØÎÃÖßȸ¯žXRCLFm®ÄÌÐÒÐÏɼÀÄÁËÉÖÑÐÈÀ¸…\;Ve›´Í·ÍÕèwRWÅäãÙÙÝÛÕÒÑÖÆÃÇÅË·¨–ÇâÈÓÑÒØãÙÎÙÛÞÜØÍȳ¤Ÿ•¨°¨²¿Å¼½»ËÓÉÐÎËй½½¼ÅÎÍ´–€„`.eÚÏÕÚÖÝФ¹W7$ @Uc~¡ÇÍÎËÊƾ»À³·±¾ÅÇÏÉÄÁ¹¥•’„i/Vx‘·æ½ ³Œ{”ÙæéßßÝßÛÙØÐÒÂÅÑÒŠmÝóäÕÎÉÊËÛäÞ°½Ê»Êà •„u‘®¾½¹¯¶¹¼·ÄÀÓÏÂÄÎÁÐÎÄɸ¥¨« ‘‹}4)ÞÉÅØÞÒ¿ªÂ›gG1E^wšž·ÍËÉÅÄÈÇÁÀÇÄÀ©²¼ÈÄÇż€`‡¼xbmtm~µÅÊ”UYl¥ÚäèßÝÝáÜÝßÒÏÎÚ²f|®îÚÓÎÈÌËÌÝàצgo‹ «¢¦—…ŸžÁÀ²´µÈ·ºÃ¾ÂÅÓÔÃÌĸ¹«§³Âº¢’‡9$ÏÝÕÒÖ²ªÓÖ],LMiŸ¹ËÁÊËÆÇÈËÏÍżºÇ¾®±º³ªÐªƒX‘«ªVaŒzz£¦ßÜY Tƒ³ÝééæÛÜ×ÝçáàжaqßíÞÉÇÌÔÌÍÕßàÕ•RLš²ÊÍÇ«˜˜ª´¿Ä¿µ§¼®¼ÆÊÞÞÔʨÁÂÁ·ÉÁ¨¼ÈÎÍƱ{YËÈ”Dß×¥_bq™ÇÊÏÏÏоÝÌÃÇÆɹ²»¯°·¸¶ÈŽ+oÉÆ…g^dbdm~›¤¢¬µªÈ¾C<rœºÜÝÝÕØÜÛÑÇzeÑæØÚÚÐÇÕÙÙ×ÚâãâÅ—ÀÉÊ¿Ë̤Ž‡ª¿Â;«À»¾ÇÓÓÔÎÅį¿¹½¾Ã¸¶ºÀÑÉÅÄ‘\‚µÁÏÌ©…‚ƒ€—²ËÄÉÏÉÈÆÍÉŸ½¸µ®»µ²®šu=U¤Ù•teV]ojc~œ®´¸¸ªºÀ¦lK]ˆÌÛçäáÄ ”uq‚ìÐÐÙÒÓÔÕÓÙÝãäðÜ¿²ÂÅÅ¿¾Ä±‹«¶¼È´±ÁÌÍÀÁ¾ÑǾż½¶ÁÀµ§ÂÅ·»ÉÌDz‘bìãÔ¢’¦{ŒÐÏÌÏÐÅÈÏÃÁ¾¶´®¸¹¼º©¹¨qBd˜Á½–lig]cwngƒŠŸ»Àµ¥¼µ©¦=.ŠÍäâÓ¡pw?9¡ëÎÇÕÑÒÛØÛÞáêâܯ~—±ÇÄÀ»Â±ˆoÊÊŵºÇÄÁµ½ÁÊÁ¾ÆÄÃÁǼ¸µ¿œ…¦Ÿ|fWilQd‘™d„¬m<Fg«ÉËÀÄÊÄ¿Á´¯ª¼Á¼¸£h{r|–…|iYdgjotqq€¡°·¼³®¸Âȼ¡~Rb¨Âž›‚’…C6“ÖÞ××ÛàÜááÝ«†ŸhN_’Øʶ»º ’p–ÐÈÐƸ¸¿ÀÀÀ¸ÑÎÍÌÉÇÇżÁ¸«“u^1,9IvP5&@m|²f.L˜ÃÂÂÂÄÈ¿¬¹¿¹²±•[Y•‚tvXVOcagpsmuy|“§±·Àº²Á±·ÆÏΉIaƒPe‰–p§h¥âîäßæÜ×ƉG… ~L8BÛÑ¿Ç´‡’\qÔÐÈÀ·¸ÁÇÎÑÓÄÇËËÎÏ쫧‘gh\7T›ÉÛÃÆÁÁÏÜàȳ˜enE@) 4m£³ÁÁ˹¸°¨^U•Æ®˜„jRXupks|vnttux‰¤®¿¿»ÉÊË»Óügi¸™†²©¦k@$2U_”Œv¦¾¼È¸»ž–ÁÉʼ—x‡Y,Ji§´±ÁºÎÉÆÅÌÏÒÑÏË»{: %,Hh™¸¥ŸŸ£ÊÕÔØæÝÈÀÏÒÓ¢ˆl-*„±¡‡r=0Ty¾ÇÂÂ[5i\x~Š“ujwvmwowˆŸÂ¼¸³ÈÁÐÃËÃk¸¢‘¿Ä»´¸’T/0l®¶¶»ª«‰ ÁËÈ—p{‰]"NjV[q°²·Ÿ³¼®‰kT'"AKoxŠ©Â—–£¡ÂÃÇÈÏÏ;ÄÔÝØÔÏÔ«†nKPxœsRET^sª¾´º°ƒWNUyˆ›“‰v{uƒ|oiy‘–†ž ’‰“¢±½š…²´¸µ¿Ä½®¨¯§‰|ffx™®¡ŽÃÒÔÙÕØÍ™{‚†mX@8T=19`|†…‹‚X(">Uo€¡¡¥º¾›‰¬Ì¨©±¨°ªÂ½ØØÙÛÓûÙáÑʪyhyUJT^e{ Ȫ¿Ä’œ[5„›•~…~†ƒhxŠŒVZlpD=>IKJ…:žÍÊÑÏÊÅ´š¤µ°¾¶¬‰˜£T‘ÔÒÆÅÁ±™„ƒ…ŽvmWJ&(3T3$Kpv~}’¬²®–«·¬—œ—µ¡ž™“¼ÁË´·ááÝʽÅÅͳϽƜq\WiœÄÚ´´—¯¡©}2<¨…ty…q|~Ž‹x’“9c”||bWBD;s»¼¼¹«°²œ—¥©±¿Æw5yÈÔØÏÓÀœ{¨ÁþÍÇ¢]WV:8:(0)$.A_‰±¿µ™yšÂ¦ž «¬±©¤“©šš¤¾›½¥¨¶¥ËÎÆÏÜÓ×ÖÉ«·Ë›uiuˆ—¬Çʸ¹—–›™hKsœ‰puxƒ™¥”~b†™O}¼Ã½ÁÀ¿ ®“±¹·¯ª«ª¬¹¹¼ ŠRÝâÖÔ×Ѧ’É×ʯ¸Ãµ¥•zcY©¾Ã¬ ÉØÜØÙÞØ®aX¯¦Ÿ£ššž¬œ¬®µÂž®—ŒªŽ«µÀ¨ÂÂÉ¿ÑÜÒ´njr®Ô¥¥¦¶´´ˆ“¤³|Glq—¤£«Ÿ{wkhAr°»ÊÀ¶·¼²¶»º¢°µ¯§¡£«¢¸{€ÎêßÓ×ÉÚݧ¢¹Ä̪´¸ÄÑ×ŷ̳dz®¶ÎÑÐÒÖÓÌÄ—?lŒ£¯¸ ¥§¦žµ¨²¼›Ÿ’Ÿ–œ£§§¼´ºÁÐØÑŸlŠ{€ µÀ¥²«¤¯°ŒŸ›¤¬²TCa‘©¡Ÿ›w[`yuWgŠ˜©³¾·Â¶¬À½ª¬±··³¯²¾·›³ÅÒÔËÊÐÏÔˆ”¸¿¹¸ÄÆ¿±´µ¾ÙÆÑ°—±ÉÊÂÔÛ˽½Õm3ƒÈ¦ «·Ž›ÄÀ¨´¨—™—›©œŒ” ¨ª¦¬¼ÇÃã|‘u“¢°·¥´©®½«œ¤°¦Ôˈ8+dœ¢±{FU_t‚m[_u†š¤¼¼Â´©·¹³§²¼¸·ÂͶ®°·©¸Ãª‰„žÊƼɳ»¿®¥§¶Çø¤£ª¤¿·ªÃÌÇÐÏÛÏf%2‰¯™ ›¯±·¨«¤²³ž¦Ä¯¡š¸«¢Àµ¬©’…¡ª©£¯›¨¤¡š›²©¦©´ÅÚɨ2"TŽs'Tnz|ywxiZw†xkƒ²±¥¤©«‰…|u{kWF?mŒ”œ²¥—‚FºÇÉÆÆ·««¬¿Ã´½œ
\ No newline at end of file diff --git a/plug-ins/gimpressionist/Paper/struc.pgm b/plug-ins/gimpressionist/Paper/struc.pgm Binary files differnew file mode 100644 index 0000000..3d6fe74 --- /dev/null +++ b/plug-ins/gimpressionist/Paper/struc.pgm diff --git a/plug-ins/gimpressionist/Presets/ApplyCanvas b/plug-ins/gimpressionist/Presets/ApplyCanvas new file mode 100644 index 0000000..839bc3e --- /dev/null +++ b/plug-ins/gimpressionist/Presets/ApplyCanvas @@ -0,0 +1,43 @@ +Preset +desc=Simulates the Apply Canvas plugin, by just adding a paper relief to the image. +orientnum=1 +orientfirst=0.000000 +orientlast=0.000000 +orienttype=0 +sizenum=1 +sizefirst=0.000000 +sizelast=0.000000 +sizetype=0 +brushrelief=12.000000 +brushdensity=1.000000 +brushgamma=1.000000 +brushaspect=0.000000 +generalbgtype=1 +generaldarkedge=0.000000 +generalpaintedges=0 +generaltileable=0 +generaldropshadow=0 +generalshadowdarkness=20.000000 +generalshadowdepth=10 +generalshadowblur=4 +devthresh=0.100000 +paperrelief=25.0 +paperscale=100.0 +paperinvert=0 +paperoverlay=0 +selectedbrush=Brushes/defaultbrush.pgm +selectedpaper=Paper/struc.pgm +color=000000 +placetype=0 +placecenter=0 +numorientvector=1 +orientvector=0,0.500000,0.500000,0.000000,0.000000,1.000000,1.000000,0 +orientangoff=0.000000 +orientstrexp=1.000000 +orientvoronoi=0 +numsizevector=1 +sizevector=0,0.500000,0.500000,50.000000,1.000000 +sizestrexp=1.000000 +sizevoronoi=0 +colortype=0 +colornoise=0.000000 diff --git a/plug-ins/gimpressionist/Presets/Ballpark b/plug-ins/gimpressionist/Presets/Ballpark new file mode 100644 index 0000000..e6205a8 --- /dev/null +++ b/plug-ins/gimpressionist/Presets/Ballpark @@ -0,0 +1,40 @@ +Preset +desc=Huge spheres! Tileable. Might be suitable as a background somewhere. +orientnum=1 +orientfirst=0.000000 +orientlast=60.000000 +orienttype=0 +sizenum=6 +sizefirst=28.670000 +sizelast=50.439999 +sizetype=2 +brushrelief=100.000000 +brushdensity=7.070000 +brushgamma=1.000000 +brushaspect=0.000000 +generalbgtype=0 +generaldarkedge=0.020000 +generalpaintedges=1 +generaltileable=1 +generaldropshadow=1 +generalshadowdarkness=20.000000 +devthresh=0.100000 +paperrelief=0.000000 +paperscale=30.000000 +paperinvert=0 +paperoverlay=0 +selectedbrush=Brushes/sphere.ppm +selectedpaper=Paper/defaultpaper.pgm +color=ffffff +placetype=0 +placecenter=1 +numorientvector=1 +orientvector=0,0.500000,0.500000,0.000000,0.000000,1.000000,1.000000,0 +orientangoff=0.000000 +orientstrexp=1.000000 +orientvoronoi=0 +numsizevector=1 +sizevector=0,0.500000,0.500000,0.000000,0.000000,0 +sizeangoff=0.000000 +sizestrexp=0.000000 +sizevoronoi=0 diff --git a/plug-ins/gimpressionist/Presets/Canvas b/plug-ins/gimpressionist/Presets/Canvas new file mode 100644 index 0000000..f0a0e21 --- /dev/null +++ b/plug-ins/gimpressionist/Presets/Canvas @@ -0,0 +1,28 @@ +Preset +orientnum=1 +orientfirst=0.000000 +orientlast=360.000000 +orienttype=2 +brushrelief=12.000000 +brushscale=15.930000 +brushdensity=7.940000 +brushgamma=1.310000 +brushaspect=0.000000 +generalbgtype=0 +generaldarkedge=0.100000 +generalpaintedges=1 +generaltileable=0 +paperrelief=0.000000 +paperscale=30.000000 +paperinvert=0 +paperoverlay=0 +selectedbrush=Brushes/weave.pgm +selectedpaper=Paper/defaultpaper.pgm +color=000000 +placetype=1 +placecenter=0 +numorientvector=1 +orientvector=0,0.500000,0.500000,0.000000,0.000000,1.000000,1.000000,0 +orientangoff=0.000000 +orientstrexp=1.000000 +orientvoronoi=0 diff --git a/plug-ins/gimpressionist/Presets/Crosshatch b/plug-ins/gimpressionist/Presets/Crosshatch new file mode 100644 index 0000000..1d64a80 --- /dev/null +++ b/plug-ins/gimpressionist/Presets/Crosshatch @@ -0,0 +1,28 @@ +Preset +orientnum=4 +orientfirst=44.599998 +orientlast=360.000000 +orienttype=2 +brushrelief=0.000000 +brushscale=10.630000 +brushdensity=21.000000 +brushgamma=1.000000 +brushaspect=0.000000 +generalbgtype=0 +generaldarkedge=0.000000 +generalpaintedges=1 +generaltileable=0 +paperrelief=0.000000 +paperscale=100.570000 +paperinvert=0 +paperoverlay=0 +selectedbrush=Brushes/chalk01.pgm +selectedpaper=Paper/canvas2.pgm +color=010101 +placetype=0 +placecenter=0 +numorientvector=1 +orientvector=0,0.500000,0.500000,0.000000,0.000000,1.000000,1.000000,0 +orientangoff=0.000000 +orientstrexp=1.000000 +orientvoronoi=0 diff --git a/plug-ins/gimpressionist/Presets/Cubism b/plug-ins/gimpressionist/Presets/Cubism new file mode 100644 index 0000000..3644e80 --- /dev/null +++ b/plug-ins/gimpressionist/Presets/Cubism @@ -0,0 +1,40 @@ +Preset +desc=Simulates a cubistic painting. +orientnum=30 +orientfirst=0.000000 +orientlast=360.000000 +orienttype=2 +sizenum=1 +sizefirst=17.080000 +sizelast=17.080000 +sizetype=0 +brushrelief=0.000000 +brushdensity=18.600000 +brushgamma=0.500000 +brushaspect=0.000000 +generalbgtype=1 +generaldarkedge=0.000000 +generalpaintedges=1 +generaltileable=0 +generaldropshadow=0 +generalshadowdarkness=20.000000 +devthresh=0.100000 +paperrelief=0.000000 +paperscale=100.570000 +paperinvert=0 +paperoverlay=0 +selectedbrush=Brushes/grad01.pgm +selectedpaper=Paper/canvas2.pgm +color=646566 +placetype=0 +placecenter=0 +numorientvector=1 +orientvector=0,0.500000,0.500000,0.000000,0.000000,1.000000,1.000000,0 +orientangoff=0.000000 +orientstrexp=1.000000 +orientvoronoi=0 +numsizevector=1 +sizevector=0,0.500000,0.500000,0.000000,0.000000,0 +sizeangoff=0.000000 +sizestrexp=0.000000 +sizevoronoi=0 diff --git a/plug-ins/gimpressionist/Presets/Dotify b/plug-ins/gimpressionist/Presets/Dotify new file mode 100644 index 0000000..38e9749 --- /dev/null +++ b/plug-ins/gimpressionist/Presets/Dotify @@ -0,0 +1,40 @@ +Preset +desc=Turns the image into a layer of small pebbles. +orientnum=1 +orientfirst=47.790001 +orientlast=0.000000 +orienttype=0 +sizenum=1 +sizefirst=5.000000 +sizelast=5.000000 +sizetype=0 +brushrelief=0.000000 +brushdensity=20.000000 +brushgamma=1.000000 +brushaspect=0.000000 +generalbgtype=0 +generaldarkedge=0.300000 +generalpaintedges=1 +generaltileable=0 +generaldropshadow=0 +generalshadowdarkness=20.000000 +devthresh=0.100000 +paperrelief=0.000000 +paperscale=30.000000 +paperinvert=0 +paperoverlay=0 +selectedbrush=Brushes/shape02.pgm +selectedpaper=Paper/defaultpaper.pgm +color=000000 +placetype=0 +placecenter=0 +numorientvector=1 +orientvector=0,0.500000,0.500000,0.000000,0.000000,1.000000,1.000000,0 +orientangoff=0.000000 +orientstrexp=1.000000 +orientvoronoi=0 +numsizevector=1 +sizevector=0,0.500000,0.500000,0.000000,0.000000,0 +sizeangoff=0.000000 +sizestrexp=0.000000 +sizevoronoi=0 diff --git a/plug-ins/gimpressionist/Presets/Embroidery b/plug-ins/gimpressionist/Presets/Embroidery new file mode 100644 index 0000000..e854fb3 --- /dev/null +++ b/plug-ins/gimpressionist/Presets/Embroidery @@ -0,0 +1,28 @@ +Preset +orientnum=4 +orientfirst=44.599998 +orientlast=360.000000 +orienttype=2 +brushrelief=0.000000 +brushscale=10.750000 +brushdensity=11.040000 +brushgamma=0.500000 +brushaspect=0.000000 +generalbgtype=0 +generaldarkedge=0.000000 +generalpaintedges=1 +generaltileable=0 +paperrelief=0.000000 +paperscale=100.570000 +paperinvert=0 +paperoverlay=0 +selectedbrush=Brushes/fabric02.pgm +selectedpaper=Paper/canvas2.pgm +color=010101 +placetype=1 +placecenter=0 +numorientvector=1 +orientvector=0,0.500000,0.500000,0.000000,0.000000,1.000000,1.000000,0 +orientangoff=0.000000 +orientstrexp=1.000000 +orientvoronoi=0 diff --git a/plug-ins/gimpressionist/Presets/Feathers b/plug-ins/gimpressionist/Presets/Feathers new file mode 100644 index 0000000..31f3369 --- /dev/null +++ b/plug-ins/gimpressionist/Presets/Feathers @@ -0,0 +1,28 @@ +Preset +orientnum=10 +orientfirst=38.230000 +orientlast=360.000000 +orienttype=6 +brushrelief=12.000000 +brushscale=20.000000 +brushdensity=50.000000 +brushgamma=2.000000 +brushaspect=0.000000 +generalbgtype=0 +generaldarkedge=0.300000 +generalpaintedges=1 +generaltileable=0 +paperrelief=0.000000 +paperscale=30.000000 +paperinvert=0 +paperoverlay=0 +selectedbrush=Brushes/dribble.pgm +selectedpaper=Paper/defaultpaper.pgm +color=000000 +placetype=0 +placecenter=0 +numorientvector=1 +orientvector=0,0.500000,0.500000,0.000000,0.000000,1.000000,1.000000,0 +orientangoff=0.000000 +orientstrexp=1.000000 +orientvoronoi=0 diff --git a/plug-ins/gimpressionist/Presets/Felt-marker b/plug-ins/gimpressionist/Presets/Felt-marker new file mode 100644 index 0000000..fc3e09f --- /dev/null +++ b/plug-ins/gimpressionist/Presets/Felt-marker @@ -0,0 +1,28 @@ +Preset +orientnum=14 +orientfirst=66.900002 +orientlast=360.000000 +orienttype=6 +brushrelief=0.000000 +brushscale=13.730000 +brushdensity=20.000000 +brushgamma=1.000000 +brushaspect=-0.450000 +generalbgtype=0 +generaldarkedge=0.100000 +generalpaintedges=1 +generaltileable=0 +paperrelief=0.000000 +paperscale=30.000000 +paperinvert=0 +paperoverlay=0 +selectedbrush=Brushes/shape04.pgm +selectedpaper=Paper/defaultpaper.pgm +color=000000 +placetype=0 +placecenter=0 +numorientvector=1 +orientvector=0,0.500000,0.500000,0.000000,0.000000,1.000000,1.000000,0 +orientangoff=0.000000 +orientstrexp=1.000000 +orientvoronoi=0 diff --git a/plug-ins/gimpressionist/Presets/Flowerbed b/plug-ins/gimpressionist/Presets/Flowerbed new file mode 100644 index 0000000..32baef1 --- /dev/null +++ b/plug-ins/gimpressionist/Presets/Flowerbed @@ -0,0 +1,40 @@ +Preset +desc=Flower power, man! +orientnum=7 +orientfirst=11.489998 +orientlast=45.599998 +orienttype=2 +sizenum=1 +sizefirst=15.930000 +sizelast=15.930000 +sizetype=0 +brushrelief=12.390000 +brushdensity=21.709999 +brushgamma=1.000000 +brushaspect=0.000000 +generalbgtype=1 +generaldarkedge=0.150000 +generalpaintedges=1 +generaltileable=0 +generaldropshadow=0 +generalshadowdarkness=20.000000 +devthresh=0.100000 +paperrelief=0.000000 +paperscale=100.570000 +paperinvert=0 +paperoverlay=0 +selectedbrush=Brushes/flower01.pgm +selectedpaper=Paper/canvas2.pgm +color=646566 +placetype=0 +placecenter=0 +numorientvector=1 +orientvector=0,0.500000,0.500000,0.000000,0.000000,1.000000,1.000000,0 +orientangoff=0.000000 +orientstrexp=1.000000 +orientvoronoi=0 +numsizevector=1 +sizevector=0,0.500000,0.500000,0.000000,0.000000,0 +sizeangoff=0.000000 +sizestrexp=0.000000 +sizevoronoi=0 diff --git a/plug-ins/gimpressionist/Presets/Furry b/plug-ins/gimpressionist/Presets/Furry new file mode 100644 index 0000000..0bbdce0 --- /dev/null +++ b/plug-ins/gimpressionist/Presets/Furry @@ -0,0 +1,40 @@ +Preset +desc=Woof! +orientnum=30 +orientfirst=89.199997 +orientlast=203.889999 +orienttype=4 +sizenum=1 +sizefirst=14.200000 +sizelast=14.200000 +sizetype=0 +brushrelief=0.000000 +brushdensity=28.320000 +brushgamma=1.000000 +brushaspect=0.000000 +generalbgtype=0 +generaldarkedge=0.100000 +generalpaintedges=1 +generaltileable=0 +generaldropshadow=0 +generalshadowdarkness=20.000000 +devthresh=0.100000 +paperrelief=0.000000 +paperscale=103.169998 +paperinvert=1 +paperoverlay=0 +selectedbrush=Brushes/chalk01.pgm +selectedpaper=Paper/marble.pgm +color=000000 +placetype=0 +placecenter=0 +numorientvector=1 +orientvector=0,0.500000,0.500000,0.000000,0.000000,1.000000,1.000000,0 +orientangoff=0.000000 +orientstrexp=1.000000 +orientvoronoi=0 +numsizevector=1 +sizevector=0,0.500000,0.500000,0.000000,0.000000,0 +sizeangoff=0.000000 +sizestrexp=0.000000 +sizevoronoi=0 diff --git a/plug-ins/gimpressionist/Presets/Line-art b/plug-ins/gimpressionist/Presets/Line-art new file mode 100644 index 0000000..274ca86 --- /dev/null +++ b/plug-ins/gimpressionist/Presets/Line-art @@ -0,0 +1,28 @@ +Preset +orientnum=15 +orientfirst=44.599998 +orientlast=180.220001 +orienttype=6 +brushrelief=12.000000 +brushscale=14.200000 +brushdensity=20.000000 +brushgamma=1.000000 +brushaspect=0.000000 +generalbgtype=0 +generaldarkedge=0.100000 +generalpaintedges=1 +generaltileable=0 +paperrelief=0.000000 +paperscale=30.000000 +paperinvert=0 +paperoverlay=0 +selectedbrush=Brushes/chalk01.pgm +selectedpaper=Paper/defaultpaper.pgm +color=000000 +placetype=1 +placecenter=0 +numorientvector=1 +orientvector=0,0.500000,0.500000,0.000000,0.000000,1.000000,1.000000,0 +orientangoff=0.000000 +orientstrexp=1.000000 +orientvoronoi=0 diff --git a/plug-ins/gimpressionist/Presets/Line-art-2 b/plug-ins/gimpressionist/Presets/Line-art-2 new file mode 100644 index 0000000..5ec301b --- /dev/null +++ b/plug-ins/gimpressionist/Presets/Line-art-2 @@ -0,0 +1,28 @@ +Preset +orientnum=15 +orientfirst=31.860001 +orientlast=180.220001 +orienttype=6 +brushrelief=41.590000 +brushscale=15.350000 +brushdensity=26.580000 +brushgamma=1.000000 +brushaspect=0.000000 +generalbgtype=0 +generaldarkedge=0.100000 +generalpaintedges=1 +generaltileable=0 +paperrelief=0.000000 +paperscale=30.000000 +paperinvert=0 +paperoverlay=0 +selectedbrush=Brushes/chalk01.pgm +selectedpaper=Paper/defaultpaper.pgm +color=000000 +placetype=1 +placecenter=0 +numorientvector=1 +orientvector=0,0.500000,0.500000,0.000000,0.000000,1.000000,1.000000,0 +orientangoff=0.000000 +orientstrexp=1.000000 +orientvoronoi=0 diff --git a/plug-ins/gimpressionist/Presets/Maggot-invasion b/plug-ins/gimpressionist/Presets/Maggot-invasion new file mode 100644 index 0000000..93b4477 --- /dev/null +++ b/plug-ins/gimpressionist/Presets/Maggot-invasion @@ -0,0 +1,40 @@ +Preset +desc=Sends a horde of maggots to gnaw at your image. +orientnum=30 +orientfirst=0.000000 +orientlast=360.000000 +orienttype=6 +sizenum=1 +sizefirst=13.150000 +sizelast=13.150000 +sizetype=0 +brushrelief=16.000000 +brushdensity=20.000000 +brushgamma=1.000000 +brushaspect=0.000000 +generalbgtype=0 +generaldarkedge=0.100000 +generalpaintedges=0 +generaltileable=0 +generaldropshadow=0 +generalshadowdarkness=20.000000 +devthresh=0.100000 +paperrelief=0.000000 +paperscale=30.000000 +paperinvert=0 +paperoverlay=0 +selectedbrush=Brushes/worm.pgm +selectedpaper=Paper/defaultpaper.pgm +color=000000 +placetype=0 +placecenter=1 +numorientvector=1 +orientvector=0,0.633333,0.466667,282.000000,-0.978148,0.207912,1.000000,-1603454457 +orientangoff=0.000000 +orientstrexp=1.000000 +orientvoronoi=0 +numsizevector=1 +sizevector=0,0.500000,0.500000,0.000000,0.000000,0 +sizeangoff=0.000000 +sizestrexp=0.000000 +sizevoronoi=0 diff --git a/plug-ins/gimpressionist/Presets/Makefile.am b/plug-ins/gimpressionist/Presets/Makefile.am new file mode 100644 index 0000000..8cfdc88 --- /dev/null +++ b/plug-ins/gimpressionist/Presets/Makefile.am @@ -0,0 +1,32 @@ +## Process this file with automake to produce Makefile.in + +presetsdatadir = $(gimpdatadir)/gimpressionist/Presets + +presetsdata_DATA = \ + ApplyCanvas \ + Ballpark \ + Canvas \ + Crosshatch \ + Cubism \ + Dotify \ + Embroidery \ + Feathers \ + Felt-marker \ + Flowerbed \ + Furry \ + Line-art \ + Line-art-2 \ + Maggot-invasion \ + MarbleMadness \ + Mossy \ + Painted_Rock \ + Parquette \ + Patchwork \ + Ringworks \ + Sample \ + Smash \ + Straws \ + Weave \ + Wormcan + +EXTRA_DIST = $(presetsdata_DATA) diff --git a/plug-ins/gimpressionist/Presets/Makefile.in b/plug-ins/gimpressionist/Presets/Makefile.in new file mode 100644 index 0000000..61790ca --- /dev/null +++ b/plug-ins/gimpressionist/Presets/Makefile.in @@ -0,0 +1,830 @@ +# Makefile.in generated by automake 1.16.3 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994-2020 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@ + +VPATH = @srcdir@ +am__is_gnu_make = { \ + if test -z '$(MAKELEVEL)'; then \ + false; \ + elif test -n '$(MAKE_HOST)'; then \ + true; \ + elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ + true; \ + else \ + false; \ + fi; \ +} +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +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 = : +build_triplet = @build@ +host_triplet = @host@ +subdir = plug-ins/gimpressionist/Presets +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ + $(top_srcdir)/m4macros/alsa.m4 \ + $(top_srcdir)/m4macros/ax_compare_version.m4 \ + $(top_srcdir)/m4macros/ax_cxx_compile_stdcxx.m4 \ + $(top_srcdir)/m4macros/ax_gcc_func_attribute.m4 \ + $(top_srcdir)/m4macros/ax_prog_cc_for_build.m4 \ + $(top_srcdir)/m4macros/ax_prog_perl_version.m4 \ + $(top_srcdir)/m4macros/detectcflags.m4 \ + $(top_srcdir)/m4macros/pythondev.m4 $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = +SOURCES = +DIST_SOURCES = +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__uninstall_files_from_dir = { \ + test -z "$$files" \ + || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ + || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ + $(am__cd) "$$dir" && rm -f $$files; }; \ + } +am__installdirs = "$(DESTDIR)$(presetsdatadir)" +DATA = $(presetsdata_DATA) +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +am__DIST_COMMON = $(srcdir)/Makefile.in +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +AA_LIBS = @AA_LIBS@ +ACLOCAL = @ACLOCAL@ +ALLOCA = @ALLOCA@ +ALL_LINGUAS = @ALL_LINGUAS@ +ALSA_CFLAGS = @ALSA_CFLAGS@ +ALSA_LIBS = @ALSA_LIBS@ +ALTIVEC_EXTRA_CFLAGS = @ALTIVEC_EXTRA_CFLAGS@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +APPSTREAM_UTIL = @APPSTREAM_UTIL@ +AR = @AR@ +AS = @AS@ +ATK_CFLAGS = @ATK_CFLAGS@ +ATK_LIBS = @ATK_LIBS@ +ATK_REQUIRED_VERSION = @ATK_REQUIRED_VERSION@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BABL_CFLAGS = @BABL_CFLAGS@ +BABL_LIBS = @BABL_LIBS@ +BABL_REQUIRED_VERSION = @BABL_REQUIRED_VERSION@ +BUG_REPORT_URL = @BUG_REPORT_URL@ +BUILD_EXEEXT = @BUILD_EXEEXT@ +BUILD_OBJEXT = @BUILD_OBJEXT@ +BZIP2_LIBS = @BZIP2_LIBS@ +CAIRO_CFLAGS = @CAIRO_CFLAGS@ +CAIRO_LIBS = @CAIRO_LIBS@ +CAIRO_PDF_CFLAGS = @CAIRO_PDF_CFLAGS@ +CAIRO_PDF_LIBS = @CAIRO_PDF_LIBS@ +CAIRO_PDF_REQUIRED_VERSION = @CAIRO_PDF_REQUIRED_VERSION@ +CAIRO_REQUIRED_VERSION = @CAIRO_REQUIRED_VERSION@ +CATALOGS = @CATALOGS@ +CATOBJEXT = @CATOBJEXT@ +CC = @CC@ +CCAS = @CCAS@ +CCASDEPMODE = @CCASDEPMODE@ +CCASFLAGS = @CCASFLAGS@ +CCDEPMODE = @CCDEPMODE@ +CC_FOR_BUILD = @CC_FOR_BUILD@ +CC_VERSION = @CC_VERSION@ +CFLAGS = @CFLAGS@ +CFLAGS_FOR_BUILD = @CFLAGS_FOR_BUILD@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CPPFLAGS_FOR_BUILD = @CPPFLAGS_FOR_BUILD@ +CPP_FOR_BUILD = @CPP_FOR_BUILD@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DATADIRNAME = @DATADIRNAME@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DESKTOP_DATADIR = @DESKTOP_DATADIR@ +DESKTOP_FILE_VALIDATE = @DESKTOP_FILE_VALIDATE@ +DLLTOOL = @DLLTOOL@ +DOC_SHOOTER = @DOC_SHOOTER@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +FILE_AA = @FILE_AA@ +FILE_EXR = @FILE_EXR@ +FILE_HEIF = @FILE_HEIF@ +FILE_JP2_LOAD = @FILE_JP2_LOAD@ +FILE_JPEGXL = @FILE_JPEGXL@ +FILE_MNG = @FILE_MNG@ +FILE_PDF_SAVE = @FILE_PDF_SAVE@ +FILE_PS = @FILE_PS@ +FILE_WMF = @FILE_WMF@ +FILE_XMC = @FILE_XMC@ +FILE_XPM = @FILE_XPM@ +FONTCONFIG_CFLAGS = @FONTCONFIG_CFLAGS@ +FONTCONFIG_LIBS = @FONTCONFIG_LIBS@ +FONTCONFIG_REQUIRED_VERSION = @FONTCONFIG_REQUIRED_VERSION@ +FREETYPE2_REQUIRED_VERSION = @FREETYPE2_REQUIRED_VERSION@ +FREETYPE_CFLAGS = @FREETYPE_CFLAGS@ +FREETYPE_LIBS = @FREETYPE_LIBS@ +GDBUS_CODEGEN = @GDBUS_CODEGEN@ +GDK_PIXBUF_CFLAGS = @GDK_PIXBUF_CFLAGS@ +GDK_PIXBUF_CSOURCE = @GDK_PIXBUF_CSOURCE@ +GDK_PIXBUF_LIBS = @GDK_PIXBUF_LIBS@ +GDK_PIXBUF_REQUIRED_VERSION = @GDK_PIXBUF_REQUIRED_VERSION@ +GEGL = @GEGL@ +GEGL_CFLAGS = @GEGL_CFLAGS@ +GEGL_LIBS = @GEGL_LIBS@ +GEGL_MAJOR_MINOR_VERSION = @GEGL_MAJOR_MINOR_VERSION@ +GEGL_REQUIRED_VERSION = @GEGL_REQUIRED_VERSION@ +GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ +GEXIV2_CFLAGS = @GEXIV2_CFLAGS@ +GEXIV2_LIBS = @GEXIV2_LIBS@ +GEXIV2_REQUIRED_VERSION = @GEXIV2_REQUIRED_VERSION@ +GIMP_API_VERSION = @GIMP_API_VERSION@ +GIMP_APP_VERSION = @GIMP_APP_VERSION@ +GIMP_BINARY_AGE = @GIMP_BINARY_AGE@ +GIMP_COMMAND = @GIMP_COMMAND@ +GIMP_DATA_VERSION = @GIMP_DATA_VERSION@ +GIMP_FULL_NAME = @GIMP_FULL_NAME@ +GIMP_INTERFACE_AGE = @GIMP_INTERFACE_AGE@ +GIMP_MAJOR_VERSION = @GIMP_MAJOR_VERSION@ +GIMP_MICRO_VERSION = @GIMP_MICRO_VERSION@ +GIMP_MINOR_VERSION = @GIMP_MINOR_VERSION@ +GIMP_MKENUMS = @GIMP_MKENUMS@ +GIMP_MODULES = @GIMP_MODULES@ +GIMP_PACKAGE_REVISION = @GIMP_PACKAGE_REVISION@ +GIMP_PKGCONFIG_VERSION = @GIMP_PKGCONFIG_VERSION@ +GIMP_PLUGINS = @GIMP_PLUGINS@ +GIMP_PLUGIN_VERSION = @GIMP_PLUGIN_VERSION@ +GIMP_REAL_VERSION = @GIMP_REAL_VERSION@ +GIMP_RELEASE = @GIMP_RELEASE@ +GIMP_SYSCONF_VERSION = @GIMP_SYSCONF_VERSION@ +GIMP_TOOL_VERSION = @GIMP_TOOL_VERSION@ +GIMP_UNSTABLE = @GIMP_UNSTABLE@ +GIMP_USER_VERSION = @GIMP_USER_VERSION@ +GIMP_VERSION = @GIMP_VERSION@ +GIO_CFLAGS = @GIO_CFLAGS@ +GIO_LIBS = @GIO_LIBS@ +GIO_UNIX_CFLAGS = @GIO_UNIX_CFLAGS@ +GIO_UNIX_LIBS = @GIO_UNIX_LIBS@ +GIO_WINDOWS_CFLAGS = @GIO_WINDOWS_CFLAGS@ +GIO_WINDOWS_LIBS = @GIO_WINDOWS_LIBS@ +GLIB_CFLAGS = @GLIB_CFLAGS@ +GLIB_COMPILE_RESOURCES = @GLIB_COMPILE_RESOURCES@ +GLIB_GENMARSHAL = @GLIB_GENMARSHAL@ +GLIB_LIBS = @GLIB_LIBS@ +GLIB_MKENUMS = @GLIB_MKENUMS@ +GLIB_REQUIRED_VERSION = @GLIB_REQUIRED_VERSION@ +GMODULE_NO_EXPORT_CFLAGS = @GMODULE_NO_EXPORT_CFLAGS@ +GMODULE_NO_EXPORT_LIBS = @GMODULE_NO_EXPORT_LIBS@ +GMOFILES = @GMOFILES@ +GMSGFMT = @GMSGFMT@ +GOBJECT_QUERY = @GOBJECT_QUERY@ +GREP = @GREP@ +GS_LIBS = @GS_LIBS@ +GTKDOC_CHECK = @GTKDOC_CHECK@ +GTKDOC_CHECK_PATH = @GTKDOC_CHECK_PATH@ +GTKDOC_DEPS_CFLAGS = @GTKDOC_DEPS_CFLAGS@ +GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@ +GTKDOC_MKPDF = @GTKDOC_MKPDF@ +GTKDOC_REBASE = @GTKDOC_REBASE@ +GTK_CFLAGS = @GTK_CFLAGS@ +GTK_LIBS = @GTK_LIBS@ +GTK_MAC_INTEGRATION_CFLAGS = @GTK_MAC_INTEGRATION_CFLAGS@ +GTK_MAC_INTEGRATION_LIBS = @GTK_MAC_INTEGRATION_LIBS@ +GTK_REQUIRED_VERSION = @GTK_REQUIRED_VERSION@ +GTK_UPDATE_ICON_CACHE = @GTK_UPDATE_ICON_CACHE@ +GUDEV_CFLAGS = @GUDEV_CFLAGS@ +GUDEV_LIBS = @GUDEV_LIBS@ +HARFBUZZ_CFLAGS = @HARFBUZZ_CFLAGS@ +HARFBUZZ_LIBS = @HARFBUZZ_LIBS@ +HARFBUZZ_REQUIRED_VERSION = @HARFBUZZ_REQUIRED_VERSION@ +HAVE_CXX14 = @HAVE_CXX14@ +HAVE_FINITE = @HAVE_FINITE@ +HAVE_ISFINITE = @HAVE_ISFINITE@ +HAVE_VFORK = @HAVE_VFORK@ +HOST_GLIB_COMPILE_RESOURCES = @HOST_GLIB_COMPILE_RESOURCES@ +HTML_DIR = @HTML_DIR@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INSTOBJEXT = @INSTOBJEXT@ +INTLLIBS = @INTLLIBS@ +INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@ +INTLTOOL_MERGE = @INTLTOOL_MERGE@ +INTLTOOL_PERL = @INTLTOOL_PERL@ +INTLTOOL_REQUIRED_VERSION = @INTLTOOL_REQUIRED_VERSION@ +INTLTOOL_UPDATE = @INTLTOOL_UPDATE@ +INTLTOOL_V_MERGE = @INTLTOOL_V_MERGE@ +INTLTOOL_V_MERGE_OPTIONS = @INTLTOOL_V_MERGE_OPTIONS@ +INTLTOOL__v_MERGE_ = @INTLTOOL__v_MERGE_@ +INTLTOOL__v_MERGE_0 = @INTLTOOL__v_MERGE_0@ +INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ +ISO_CODES_LOCALEDIR = @ISO_CODES_LOCALEDIR@ +ISO_CODES_LOCATION = @ISO_CODES_LOCATION@ +JPEG_LIBS = @JPEG_LIBS@ +JSON_GLIB_CFLAGS = @JSON_GLIB_CFLAGS@ +JSON_GLIB_LIBS = @JSON_GLIB_LIBS@ +JXL_CFLAGS = @JXL_CFLAGS@ +JXL_LIBS = @JXL_LIBS@ +JXL_THREADS_CFLAGS = @JXL_THREADS_CFLAGS@ +JXL_THREADS_LIBS = @JXL_THREADS_LIBS@ +LCMS_CFLAGS = @LCMS_CFLAGS@ +LCMS_LIBS = @LCMS_LIBS@ +LCMS_REQUIRED_VERSION = @LCMS_REQUIRED_VERSION@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LDFLAGS_FOR_BUILD = @LDFLAGS_FOR_BUILD@ +LIBBACKTRACE_LIBS = @LIBBACKTRACE_LIBS@ +LIBHEIF_CFLAGS = @LIBHEIF_CFLAGS@ +LIBHEIF_LIBS = @LIBHEIF_LIBS@ +LIBHEIF_REQUIRED_VERSION = @LIBHEIF_REQUIRED_VERSION@ +LIBJXL_REQUIRED_VERSION = @LIBJXL_REQUIRED_VERSION@ +LIBLZMA_REQUIRED_VERSION = @LIBLZMA_REQUIRED_VERSION@ +LIBMYPAINT_CFLAGS = @LIBMYPAINT_CFLAGS@ +LIBMYPAINT_LIBS = @LIBMYPAINT_LIBS@ +LIBMYPAINT_REQUIRED_VERSION = @LIBMYPAINT_REQUIRED_VERSION@ +LIBOBJS = @LIBOBJS@ +LIBPNG_REQUIRED_VERSION = @LIBPNG_REQUIRED_VERSION@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIBUNWIND_CFLAGS = @LIBUNWIND_CFLAGS@ +LIBUNWIND_LIBS = @LIBUNWIND_LIBS@ +LIBUNWIND_REQUIRED_VERSION = @LIBUNWIND_REQUIRED_VERSION@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +LT_CURRENT_MINUS_AGE = @LT_CURRENT_MINUS_AGE@ +LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ +LT_VERSION_INFO = @LT_VERSION_INFO@ +LZMA_CFLAGS = @LZMA_CFLAGS@ +LZMA_LIBS = @LZMA_LIBS@ +MAIL = @MAIL@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MIME_INFO_CFLAGS = @MIME_INFO_CFLAGS@ +MIME_INFO_LIBS = @MIME_INFO_LIBS@ +MIME_TYPES = @MIME_TYPES@ +MKDIR_P = @MKDIR_P@ +MKINSTALLDIRS = @MKINSTALLDIRS@ +MMX_EXTRA_CFLAGS = @MMX_EXTRA_CFLAGS@ +MNG_CFLAGS = @MNG_CFLAGS@ +MNG_LIBS = @MNG_LIBS@ +MSGFMT = @MSGFMT@ +MSGFMT_OPTS = @MSGFMT_OPTS@ +MSGMERGE = @MSGMERGE@ +MYPAINT_BRUSHES_CFLAGS = @MYPAINT_BRUSHES_CFLAGS@ +MYPAINT_BRUSHES_LIBS = @MYPAINT_BRUSHES_LIBS@ +NATIVE_GLIB_CFLAGS = @NATIVE_GLIB_CFLAGS@ +NATIVE_GLIB_LIBS = @NATIVE_GLIB_LIBS@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OPENEXR_CFLAGS = @OPENEXR_CFLAGS@ +OPENEXR_LIBS = @OPENEXR_LIBS@ +OPENEXR_REQUIRED_VERSION = @OPENEXR_REQUIRED_VERSION@ +OPENJPEG_CFLAGS = @OPENJPEG_CFLAGS@ +OPENJPEG_LIBS = @OPENJPEG_LIBS@ +OPENJPEG_REQUIRED_VERSION = @OPENJPEG_REQUIRED_VERSION@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PANGOCAIRO_CFLAGS = @PANGOCAIRO_CFLAGS@ +PANGOCAIRO_LIBS = @PANGOCAIRO_LIBS@ +PANGOCAIRO_REQUIRED_VERSION = @PANGOCAIRO_REQUIRED_VERSION@ +PATHSEP = @PATHSEP@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PERL = @PERL@ +PERL_REQUIRED_VERSION = @PERL_REQUIRED_VERSION@ +PERL_VERSION = @PERL_VERSION@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +PNG_CFLAGS = @PNG_CFLAGS@ +PNG_LIBS = @PNG_LIBS@ +POFILES = @POFILES@ +POPPLER_CFLAGS = @POPPLER_CFLAGS@ +POPPLER_DATA_CFLAGS = @POPPLER_DATA_CFLAGS@ +POPPLER_DATA_LIBS = @POPPLER_DATA_LIBS@ +POPPLER_DATA_REQUIRED_VERSION = @POPPLER_DATA_REQUIRED_VERSION@ +POPPLER_LIBS = @POPPLER_LIBS@ +POPPLER_REQUIRED_VERSION = @POPPLER_REQUIRED_VERSION@ +POSUB = @POSUB@ +PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@ +PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@ +PYBIN_PATH = @PYBIN_PATH@ +PYCAIRO_CFLAGS = @PYCAIRO_CFLAGS@ +PYCAIRO_LIBS = @PYCAIRO_LIBS@ +PYGIMP_EXTRA_CFLAGS = @PYGIMP_EXTRA_CFLAGS@ +PYGTK_CFLAGS = @PYGTK_CFLAGS@ +PYGTK_CODEGEN = @PYGTK_CODEGEN@ +PYGTK_DEFSDIR = @PYGTK_DEFSDIR@ +PYGTK_LIBS = @PYGTK_LIBS@ +PYLINK_LIBS = @PYLINK_LIBS@ +PYTHON = @PYTHON@ +PYTHON2_REQUIRED_VERSION = @PYTHON2_REQUIRED_VERSION@ +PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ +PYTHON_INCLUDES = @PYTHON_INCLUDES@ +PYTHON_PLATFORM = @PYTHON_PLATFORM@ +PYTHON_PREFIX = @PYTHON_PREFIX@ +PYTHON_VERSION = @PYTHON_VERSION@ +RANLIB = @RANLIB@ +RSVG_REQUIRED_VERSION = @RSVG_REQUIRED_VERSION@ +RT_LIBS = @RT_LIBS@ +SCREENSHOT_LIBS = @SCREENSHOT_LIBS@ +SED = @SED@ +SENDMAIL = @SENDMAIL@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SOCKET_LIBS = @SOCKET_LIBS@ +SSE2_EXTRA_CFLAGS = @SSE2_EXTRA_CFLAGS@ +SSE4_1_EXTRA_CFLAGS = @SSE4_1_EXTRA_CFLAGS@ +SSE_EXTRA_CFLAGS = @SSE_EXTRA_CFLAGS@ +STRIP = @STRIP@ +SVG_CFLAGS = @SVG_CFLAGS@ +SVG_LIBS = @SVG_LIBS@ +SYMPREFIX = @SYMPREFIX@ +TIFF_LIBS = @TIFF_LIBS@ +USE_NLS = @USE_NLS@ +VERSION = @VERSION@ +WEBKIT_CFLAGS = @WEBKIT_CFLAGS@ +WEBKIT_LIBS = @WEBKIT_LIBS@ +WEBKIT_REQUIRED_VERSION = @WEBKIT_REQUIRED_VERSION@ +WEBPDEMUX_CFLAGS = @WEBPDEMUX_CFLAGS@ +WEBPDEMUX_LIBS = @WEBPDEMUX_LIBS@ +WEBPMUX_CFLAGS = @WEBPMUX_CFLAGS@ +WEBPMUX_LIBS = @WEBPMUX_LIBS@ +WEBP_CFLAGS = @WEBP_CFLAGS@ +WEBP_LIBS = @WEBP_LIBS@ +WEBP_REQUIRED_VERSION = @WEBP_REQUIRED_VERSION@ +WEB_PAGE = @WEB_PAGE@ +WIN32_LARGE_ADDRESS_AWARE = @WIN32_LARGE_ADDRESS_AWARE@ +WINDRES = @WINDRES@ +WMF_CFLAGS = @WMF_CFLAGS@ +WMF_CONFIG = @WMF_CONFIG@ +WMF_LIBS = @WMF_LIBS@ +WMF_REQUIRED_VERSION = @WMF_REQUIRED_VERSION@ +XDG_EMAIL = @XDG_EMAIL@ +XFIXES_CFLAGS = @XFIXES_CFLAGS@ +XFIXES_LIBS = @XFIXES_LIBS@ +XGETTEXT = @XGETTEXT@ +XGETTEXT_REQUIRED_VERSION = @XGETTEXT_REQUIRED_VERSION@ +XMC_CFLAGS = @XMC_CFLAGS@ +XMC_LIBS = @XMC_LIBS@ +XMKMF = @XMKMF@ +XMLLINT = @XMLLINT@ +XMU_LIBS = @XMU_LIBS@ +XPM_LIBS = @XPM_LIBS@ +XSLTPROC = @XSLTPROC@ +XVFB_RUN = @XVFB_RUN@ +X_CFLAGS = @X_CFLAGS@ +X_EXTRA_LIBS = @X_EXTRA_LIBS@ +X_LIBS = @X_LIBS@ +X_PRE_LIBS = @X_PRE_LIBS@ +Z_LIBS = @Z_LIBS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CC_FOR_BUILD = @ac_ct_CC_FOR_BUILD@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +gimpdatadir = @gimpdatadir@ +gimpdir = @gimpdir@ +gimplocaledir = @gimplocaledir@ +gimpplugindir = @gimpplugindir@ +gimpsysconfdir = @gimpsysconfdir@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +intltool__v_merge_options_ = @intltool__v_merge_options_@ +intltool__v_merge_options_0 = @intltool__v_merge_options_0@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +manpage_gimpdir = @manpage_gimpdir@ +mkdir_p = @mkdir_p@ +ms_librarian = @ms_librarian@ +mypaint_brushes_dir = @mypaint_brushes_dir@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +pkgpyexecdir = @pkgpyexecdir@ +pkgpythondir = @pkgpythondir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +pyexecdir = @pyexecdir@ +pythondir = @pythondir@ +runstatedir = @runstatedir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +presetsdatadir = $(gimpdatadir)/gimpressionist/Presets +presetsdata_DATA = \ + ApplyCanvas \ + Ballpark \ + Canvas \ + Crosshatch \ + Cubism \ + Dotify \ + Embroidery \ + Feathers \ + Felt-marker \ + Flowerbed \ + Furry \ + Line-art \ + Line-art-2 \ + Maggot-invasion \ + MarbleMadness \ + Mossy \ + Painted_Rock \ + Parquette \ + Patchwork \ + Ringworks \ + Sample \ + Smash \ + Straws \ + Weave \ + Wormcan + +EXTRA_DIST = $(presetsdata_DATA) +all: all-am + +.SUFFIXES: +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu plug-ins/gimpressionist/Presets/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu plug-ins/gimpressionist/Presets/Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs +install-presetsdataDATA: $(presetsdata_DATA) + @$(NORMAL_INSTALL) + @list='$(presetsdata_DATA)'; test -n "$(presetsdatadir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(presetsdatadir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(presetsdatadir)" || exit 1; \ + fi; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(presetsdatadir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(presetsdatadir)" || exit $$?; \ + done + +uninstall-presetsdataDATA: + @$(NORMAL_UNINSTALL) + @list='$(presetsdata_DATA)'; test -n "$(presetsdatadir)" || list=; \ + files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ + dir='$(DESTDIR)$(presetsdatadir)'; $(am__uninstall_files_from_dir) +tags TAGS: + +ctags CTAGS: + +cscope cscopelist: + + +distdir: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) distdir-am + +distdir-am: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$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 $(DATA) +installdirs: + for dir in "$(DESTDIR)$(presetsdatadir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +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: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_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-generic clean-libtool mostlyclean-am + +distclean: distclean-am + -rm -f Makefile +distclean-am: clean-am distclean-generic + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: install-presetsdataDATA + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-generic mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-presetsdataDATA + +.MAKE: install-am install-strip + +.PHONY: all all-am check check-am clean clean-generic clean-libtool \ + cscopelist-am ctags-am distclean distclean-generic \ + distclean-libtool distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-presetsdataDATA install-ps \ + install-ps-am install-strip installcheck installcheck-am \ + installdirs maintainer-clean maintainer-clean-generic \ + mostlyclean mostlyclean-generic mostlyclean-libtool pdf pdf-am \ + ps ps-am tags-am uninstall uninstall-am \ + uninstall-presetsdataDATA + +.PRECIOUS: Makefile + + +# 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/plug-ins/gimpressionist/Presets/MarbleMadness b/plug-ins/gimpressionist/Presets/MarbleMadness new file mode 100644 index 0000000..4db9fba --- /dev/null +++ b/plug-ins/gimpressionist/Presets/MarbleMadness @@ -0,0 +1,39 @@ +Preset +desc=Quite close to the original Cryptiq-plugins effect. +orientnum=1 +orientfirst=0.000000 +orientlast=0.000000 +orienttype=0 +sizenum=10 +sizefirst=6.000000 +sizelast=25.000000 +sizetype=6 +brushrelief=100.000000 +brushdensity=50.000000 +brushgamma=1.000000 +brushaspect=0.000000 +generalbgtype=0 +generaldarkedge=0.100000 +generalpaintedges=1 +generaltileable=0 +generaldropshadow=0 +generalshadowdarkness=3.500000 +devthresh=0.100000 +paperrelief=0.000000 +paperscale=30.000000 +paperinvert=0 +paperoverlay=0 +selectedbrush=Brushes/ball.ppm +selectedpaper=Paper/defaultpaper.pgm +color=000000 +placetype=0 +placecenter=0 +numorientvector=1 +orientvector=0,0.500000,0.500000,0.000000,0.000000,1.000000,1.000000,0 +orientangoff=0.000000 +orientstrexp=1.000000 +orientvoronoi=0 +numsizevector=0 +sizeangoff=0.000000 +sizestrexp=0.000000 +sizevoronoi=0 diff --git a/plug-ins/gimpressionist/Presets/Mossy b/plug-ins/gimpressionist/Presets/Mossy new file mode 100644 index 0000000..679ef76 --- /dev/null +++ b/plug-ins/gimpressionist/Presets/Mossy @@ -0,0 +1,40 @@ +Preset +desc=Very rough moss-like texture. Works quite well for tileable backgrounds and other textures. +orientnum=21 +orientfirst=31.860001 +orientlast=180.220001 +orienttype=6 +sizenum=1 +sizefirst=30.570000 +sizelast=30.570000 +sizetype=0 +brushrelief=41.590000 +brushdensity=26.580000 +brushgamma=0.500000 +brushaspect=0.000000 +generalbgtype=0 +generaldarkedge=0.100000 +generalpaintedges=1 +generaltileable=0 +generaldropshadow=0 +generalshadowdarkness=20.000000 +devthresh=0.100000 +paperrelief=0.000000 +paperscale=30.000000 +paperinvert=0 +paperoverlay=0 +selectedbrush=Brushes/strange01.pgm +selectedpaper=Paper/defaultpaper.pgm +color=000000 +placetype=0 +placecenter=0 +numorientvector=1 +orientvector=0,0.500000,0.500000,0.000000,0.000000,1.000000,1.000000,0 +orientangoff=0.000000 +orientstrexp=1.000000 +orientvoronoi=0 +numsizevector=1 +sizevector=0,0.500000,0.500000,0.000000,0.000000,0 +sizeangoff=0.000000 +sizestrexp=0.000000 +sizevoronoi=0 diff --git a/plug-ins/gimpressionist/Presets/Painted_Rock b/plug-ins/gimpressionist/Presets/Painted_Rock new file mode 100644 index 0000000..622ba4b --- /dev/null +++ b/plug-ins/gimpressionist/Presets/Painted_Rock @@ -0,0 +1,40 @@ +Preset +desc=Rough paint-on-rock sort of texture. Good for tileable backgrounds. +orientnum=30 +orientfirst=0.000000 +orientlast=360.000000 +orienttype=2 +sizenum=1 +sizefirst=35.369999 +sizelast=35.369999 +sizetype=0 +brushrelief=100.000000 +brushdensity=20.000000 +brushgamma=2.000000 +brushaspect=0.000000 +generalbgtype=0 +generaldarkedge=0.100000 +generalpaintedges=1 +generaltileable=0 +generaldropshadow=0 +generalshadowdarkness=20.000000 +devthresh=0.100000 +paperrelief=0.000000 +paperscale=30.000000 +paperinvert=0 +paperoverlay=0 +selectedbrush=Brushes/splat3.pgm +selectedpaper=Paper/defaultpaper.pgm +color=000000 +placetype=0 +placecenter=0 +numorientvector=1 +orientvector=0,0.500000,0.500000,0.000000,0.000000,1.000000,1.000000,0 +orientangoff=0.000000 +orientstrexp=1.000000 +orientvoronoi=0 +numsizevector=1 +sizevector=0,0.500000,0.500000,0.000000,0.000000,0 +sizeangoff=0.000000 +sizestrexp=0.000000 +sizevoronoi=0 diff --git a/plug-ins/gimpressionist/Presets/Parquette b/plug-ins/gimpressionist/Presets/Parquette new file mode 100644 index 0000000..9ea0b14 --- /dev/null +++ b/plug-ins/gimpressionist/Presets/Parquette @@ -0,0 +1,30 @@ +Preset +orientnum=4 +orientfirst=31.860001 +orientlast=360.000000 +orienttype=7 +brushrelief=12.000000 +brushscale=20.000000 +brushdensity=20.000000 +brushgamma=1.000000 +brushaspect=0.630000 +generalbgtype=0 +generaldarkedge=0.400000 +generalpaintedges=1 +generaltileable=0 +paperrelief=0.000000 +paperscale=30.000000 +paperinvert=0 +paperoverlay=0 +selectedbrush=Brushes/crayon04.pgm +selectedpaper=Paper/defaultpaper.pgm +color=000000 +placetype=0 +placecenter=0 +numorientvector=3 +orientvector=0,0.240000,0.333333,0.000000,0.000000,1.000000,1.000000,3 +orientvector=1,0.780000,0.293333,0.000000,0.000000,1.000000,1.000000,3 +orientvector=2,0.533333,0.813333,0.000000,0.000000,1.000000,1.000000,3 +orientangoff=0.000000 +orientstrexp=1.000000 +orientvoronoi=1 diff --git a/plug-ins/gimpressionist/Presets/Patchwork b/plug-ins/gimpressionist/Presets/Patchwork new file mode 100644 index 0000000..68fbc25 --- /dev/null +++ b/plug-ins/gimpressionist/Presets/Patchwork @@ -0,0 +1,28 @@ +Preset +orientnum=8 +orientfirst=22.299999 +orientlast=360.000000 +orienttype=2 +brushrelief=15.040000 +brushscale=13.630000 +brushdensity=15.500000 +brushgamma=0.860000 +brushaspect=0.000000 +generalbgtype=0 +generaldarkedge=0.100000 +generalpaintedges=0 +generaltileable=0 +paperrelief=0.000000 +paperscale=30.000000 +paperinvert=0 +paperoverlay=0 +selectedbrush=Brushes/spunge02.pgm +selectedpaper=Paper/defaultpaper.pgm +color=000000 +placetype=1 +placecenter=0 +numorientvector=1 +orientvector=0,0.500000,0.500000,0.000000,0.000000,1.000000,1.000000,0 +orientangoff=0.000000 +orientstrexp=1.000000 +orientvoronoi=0 diff --git a/plug-ins/gimpressionist/Presets/Ringworks b/plug-ins/gimpressionist/Presets/Ringworks new file mode 100644 index 0000000..a0de14c --- /dev/null +++ b/plug-ins/gimpressionist/Presets/Ringworks @@ -0,0 +1,28 @@ +Preset +orientnum=1 +orientfirst=0.000000 +orientlast=0.000000 +orienttype=2 +brushrelief=0.000000 +brushscale=11.330000 +brushdensity=12.390000 +brushgamma=1.000000 +brushaspect=0.000000 +generalbgtype=0 +generaldarkedge=0.000000 +generalpaintedges=1 +generaltileable=0 +paperrelief=0.000000 +paperscale=100.570000 +paperinvert=0 +paperoverlay=0 +selectedbrush=Brushes/shape03.pgm +selectedpaper=Paper/canvas2.pgm +color=646566 +placetype=1 +placecenter=0 +numorientvector=1 +orientvector=0,0.500000,0.500000,0.000000,0.000000,1.000000,1.000000,0 +orientangoff=0.000000 +orientstrexp=1.000000 +orientvoronoi=0 diff --git a/plug-ins/gimpressionist/Presets/Sample b/plug-ins/gimpressionist/Presets/Sample new file mode 100644 index 0000000..9607029 --- /dev/null +++ b/plug-ins/gimpressionist/Presets/Sample @@ -0,0 +1,40 @@ +Preset +desc=Plain oil-painting. Good for big pictures, as much of the details are lost. +orientnum=30 +orientfirst=70.089996 +orientlast=360.000000 +orienttype=5 +sizenum=1 +sizefirst=15.350000 +sizelast=15.350000 +sizetype=0 +brushrelief=12.000000 +brushdensity=40.000000 +brushgamma=1.310000 +brushaspect=0.000000 +generalbgtype=0 +generaldarkedge=0.050000 +generalpaintedges=1 +generaltileable=0 +generaldropshadow=0 +generalshadowdarkness=20.000000 +devthresh=0.100000 +paperrelief=0.000000 +paperscale=30.000000 +paperinvert=0 +paperoverlay=0 +selectedbrush=Brushes/defaultbrush.pgm +selectedpaper=Paper/defaultpaper.pgm +color=000000 +placetype=0 +placecenter=0 +numorientvector=1 +orientvector=0,0.500000,0.500000,0.000000,0.000000,1.000000,1.000000,0 +orientangoff=0.000000 +orientstrexp=1.000000 +orientvoronoi=0 +numsizevector=1 +sizevector=0,0.500000,0.500000,0.000000,0.000000,0 +sizeangoff=0.000000 +sizestrexp=0.000000 +sizevoronoi=0 diff --git a/plug-ins/gimpressionist/Presets/Smash b/plug-ins/gimpressionist/Presets/Smash new file mode 100644 index 0000000..92f29f0 --- /dev/null +++ b/plug-ins/gimpressionist/Presets/Smash @@ -0,0 +1,40 @@ +Preset +desc=Looks like a mixture between a spiderweb and a smashed window. +orientnum=17 +orientfirst=15.930000 +orientlast=360.000000 +orienttype=3 +sizenum=1 +sizefirst=25.780001 +sizelast=25.780001 +sizetype=0 +brushrelief=0.000000 +brushdensity=20.950001 +brushgamma=0.500000 +brushaspect=0.000000 +generalbgtype=0 +generaldarkedge=0.100000 +generalpaintedges=1 +generaltileable=0 +generaldropshadow=0 +generalshadowdarkness=20.000000 +devthresh=0.100000 +paperrelief=0.000000 +paperscale=30.000000 +paperinvert=0 +paperoverlay=0 +selectedbrush=Brushes/strange01.pgm +selectedpaper=Paper/defaultpaper.pgm +color=000000 +placetype=0 +placecenter=0 +numorientvector=1 +orientvector=0,0.500000,0.500000,0.000000,0.000000,1.000000,1.000000,0 +orientangoff=0.000000 +orientstrexp=1.000000 +orientvoronoi=0 +numsizevector=1 +sizevector=0,0.500000,0.500000,0.000000,0.000000,0 +sizeangoff=0.000000 +sizestrexp=0.000000 +sizevoronoi=0 diff --git a/plug-ins/gimpressionist/Presets/Straws b/plug-ins/gimpressionist/Presets/Straws new file mode 100644 index 0000000..82b703a --- /dev/null +++ b/plug-ins/gimpressionist/Presets/Straws @@ -0,0 +1,41 @@ +Preset +desc=The image looks like it is made up of small pieces of straw or chips of wood. Tileable. +orientnum=30 +orientfirst=41.419998 +orientlast=360.000000 +orienttype=6 +sizenum=1 +sizefirst=29.730000 +sizelast=29.730000 +sizetype=0 +brushrelief=0.000000 +brushdensity=32.650002 +brushgamma=1.000000 +brushaspect=-0.400000 +generalbgtype=0 +generaldarkedge=0.350000 +generalpaintedges=1 +generaltileable=1 +generaldropshadow=0 +generalshadowdarkness=20.000000 +devthresh=0.100000 +paperrelief=0.000000 +paperscale=30.000000 +paperinvert=0 +paperoverlay=0 +selectedbrush=Brushes/defaultbrush.pgm +selectedpaper=Paper/defaultpaper.pgm +color=000000 +placetype=0 +placecenter=0 +numorientvector=2 +orientvector=0,0.500000,0.500000,90.000000,1.000000,0.000000,1.000000,3 +orientvector=1,0.500000,0.500000,270.000000,-1.000000,0.000000,1.000000,3 +orientangoff=0.000000 +orientstrexp=1.400000 +orientvoronoi=0 +numsizevector=1 +sizevector=0,0.500000,0.500000,0.000000,0.000000,0 +sizeangoff=0.000000 +sizestrexp=0.000000 +sizevoronoi=0 diff --git a/plug-ins/gimpressionist/Presets/Weave b/plug-ins/gimpressionist/Presets/Weave new file mode 100644 index 0000000..63a3edb --- /dev/null +++ b/plug-ins/gimpressionist/Presets/Weave @@ -0,0 +1,40 @@ +Preset +desc=Makes the image look like some sort of woven quilt or rug, or something in that direction. +orientnum=4 +orientfirst=9.560000 +orientlast=360.000000 +orienttype=2 +sizenum=1 +sizefirst=20.530001 +sizelast=20.530001 +sizetype=0 +brushrelief=12.000000 +brushdensity=13.080000 +brushgamma=1.000000 +brushaspect=0.000000 +generalbgtype=1 +generaldarkedge=0.050000 +generalpaintedges=1 +generaltileable=0 +generaldropshadow=0 +generalshadowdarkness=20.000000 +devthresh=0.100000 +paperrelief=30.969999 +paperscale=100.570000 +paperinvert=0 +paperoverlay=0 +selectedbrush=Brushes/fabric01.pgm +selectedpaper=Paper/canvas2.pgm +color=646566 +placetype=0 +placecenter=0 +numorientvector=1 +orientvector=0,0.500000,0.500000,0.000000,0.000000,1.000000,1.000000,0 +orientangoff=0.000000 +orientstrexp=1.000000 +orientvoronoi=0 +numsizevector=1 +sizevector=0,0.500000,0.500000,0.000000,0.000000,0 +sizeangoff=0.000000 +sizestrexp=0.000000 +sizevoronoi=0 diff --git a/plug-ins/gimpressionist/Presets/Wormcan b/plug-ins/gimpressionist/Presets/Wormcan new file mode 100644 index 0000000..9880db7 --- /dev/null +++ b/plug-ins/gimpressionist/Presets/Wormcan @@ -0,0 +1,28 @@ +Preset +orientnum=16 +orientfirst=0.000000 +orientlast=360.000000 +orienttype=2 +brushrelief=30.969999 +brushscale=20.000000 +brushdensity=25.160000 +brushgamma=1.000000 +brushaspect=0.000000 +generalbgtype=0 +generaldarkedge=0.050000 +generalpaintedges=1 +generaltileable=0 +paperrelief=0.000000 +paperscale=30.000000 +paperinvert=0 +paperoverlay=0 +selectedbrush=Brushes/wavy.pgm +selectedpaper=Paper/defaultpaper.pgm +color=010101 +placetype=0 +placecenter=0 +numorientvector=1 +orientvector=0,0.500000,0.500000,0.000000,0.000000,1.000000,1.000000,0 +orientangoff=0.000000 +orientstrexp=1.000000 +orientvoronoi=0 diff --git a/plug-ins/gimpressionist/README b/plug-ins/gimpressionist/README new file mode 100644 index 0000000..42d90a4 --- /dev/null +++ b/plug-ins/gimpressionist/README @@ -0,0 +1,102 @@ + This is the README for The GIMPressionist + (c) 1998, 1999 Vidar Madsen - vidar@prosalg.no + + The GIMPressionist is free software, and may be distributed + freely, provided this file is included! + + This program comes with no warranty, whatsoever. The author + can not be held liable for any damage caused by proper or + improper use of this program. + + +--- Introduction + +The GIMPressionist is a plug-in for the GNU Image Manipulation Program, +a.k.a. GIMP. It can be used to create natural looking painting effects +and similar. It can also be run in a primitive "standalone" mode. + +The current version is still a bit shaky, and is to be considered beta +software. I'll do some serious testing, hopefully across a few more +platforms, as soon as I can. + +The official Web-page is http://www.prosalg.no/~vidar/gimpressionist/ and +will always contain a link to the latest released version. + + +--- Compiling / Installing + +To compile (hopefully): + make + +If you want to compile for GTK-1.1 and GIMP-1.1 instead, you will have +to change the two variable at the top of Makefile. Possibly you would +want to edit DEFAULTPATH as well, but that's not critical. + +To install plug-in and accompanying files: + make install + +The plug-in installs itself under $HOME/.gimp/plug-ins/ and copies a +couple of files into the directory $HOME/.gimp/gimpressionist/. The +subdirectories 'Brushes', 'Paper' and 'Presets' will be created during +"make install", and a few files will be added; As a minimum, +'defaultbrush.pgm' and 'defaultpaper.pgm' under their respective +directories. These are vanilla .PGM files, which could be edited (and +created) with any decent program - like GIMP! :-) + + +--- Standalone + +As of version 0.99 and later, the GIMPressionist can also be run +separately from GIMP. This is primarily intended for debugging +purposes, though, as it still needs GIMP libraries to compile. In your +shell, type: + gimpressionist somefile.ppm + +The image specified must be a valid PPM file. No other formats are +supported, and probably never will. + +If you click "OK", the PPM will be replaced with the "repainted" version. +If you "Cancel", nothing will be done to the file. + + +--- File Formats + +The "normal" brushes are simply grayscale PGM files, which can be created +with almost any program, including xv and of course GIMP. A number of +brushes is included, so I guess a more in-depth explanation is not +necessary. And, for those who might want to try it, GIMPressionist can +also read GBR files, which is GIMP's native brush format. (You still +need to copy them to the GIMPressionist's brush-directory, though. This +will probably be fixed sometimes.) + +Version 0.99.4 introduced the concept of using "colored" brushes (although +"pre-rendered" usually is more correct). The brushes' file format is a +plain PPM file, but the layout is somewhat special (and kinda hard to +explain); + +- The Red channel contains a shading map of the brush in question. Often + it resembles the overall image more or less completely. + +- The Green channel contains a high-light map. This is a pre-defined + image of the shiny parts of the brush. (Ordinary grayscale brushes + have this calculated automatically with a rough emboss-ish algorithm.) + +- The Blue channel functions as a brush mask. When applying a brush + stroke to the image, all areas colored blue in the file are first + "blacked out" of the image. + + +--- Feedback + +If you have any comments, criticism, ideas for improvement or new +features, or if you run into problems of any sort, let me know, so that I +can (try to) fix it for the next release! (And, if you find platform- +dependent bugs, please try to fix them and send me a patch!) + +I'm also welcoming contributions in the form of brushes or textures! For +this program to be valuable, it needs them... Bad! All contributions will +be properly credited, of course. + +Good luck and happy painting! + +Vidar Madsen <vidar@prosalg.no> diff --git a/plug-ins/gimpressionist/brush.c b/plug-ins/gimpressionist/brush.c new file mode 100644 index 0000000..a5d1e59 --- /dev/null +++ b/plug-ins/gimpressionist/brush.c @@ -0,0 +1,660 @@ +/* GIMP - The GNU Image Manipulation Program + * Copyright (C) 1995 Spencer Kimball and Peter Mattis + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <https://www.gnu.org/licenses/>. + */ + +#include "config.h" + +#include <string.h> + +#include <libgimp/gimp.h> +#include <libgimp/gimpui.h> + +#include <libgimpmath/gimpmath.h> + +#include <gtk/gtklist.h> +#include <gtk/gtkpreview.h> + +#include "gimpressionist.h" +#include "ppmtool.h" +#include "brush.h" +#include "presets.h" + +#include <libgimp/stdplugins-intl.h> + + +static void update_brush_preview (const char *fn); + + +static GtkWidget *brush_preview = NULL; +static GtkListStore *brush_list_store = NULL; + +static GtkWidget *brush_list = NULL; +static GtkAdjustment *brush_relief_adjust = NULL; +static GtkAdjustment *brush_aspect_adjust = NULL; +static GtkAdjustment *brush_gamma_adjust = NULL; +static gboolean brush_dont_update = FALSE; + +static gchar *last_selected_brush = NULL; + +static gint brush_from_file = 2; + +static ppm_t brushppm = {0, 0, NULL}; + +void +brush_restore (void) +{ + reselect (brush_list, pcvals.selected_brush); + gtk_adjustment_set_value (brush_gamma_adjust, pcvals.brushgamma); + gtk_adjustment_set_value (brush_relief_adjust, pcvals.brush_relief); + gtk_adjustment_set_value (brush_aspect_adjust, pcvals.brush_aspect); +} + +void +brush_store (void) +{ + pcvals.brushgamma = gtk_adjustment_get_value (brush_gamma_adjust); +} + +void +brush_free (void) +{ + g_free (last_selected_brush); +} + +void brush_get_selected (ppm_t *p) +{ + if (brush_from_file) + brush_reload (pcvals.selected_brush, p); + else + ppm_copy (&brushppm, p); +} + + +static gboolean +file_is_color (const char *fn) +{ + return fn && strstr (fn, ".ppm"); +} + +void +set_colorbrushes (const gchar *fn) +{ + pcvals.color_brushes = file_is_color (fn); +} + +static const Babl * +get_u8_format (gint32 drawable_id) +{ + if (gimp_drawable_is_rgb (drawable_id)) + { + if (gimp_drawable_has_alpha (drawable_id)) + return babl_format ("R'G'B'A u8"); + else + return babl_format ("R'G'B' u8"); + } + else + { + if (gimp_drawable_has_alpha (drawable_id)) + return babl_format ("Y'A u8"); + else + return babl_format ("Y' u8"); + } +} + +static void +brushdmenuselect (GtkWidget *widget, + gpointer data) +{ + GeglBuffer *src_buffer; + const Babl *format; + guchar *src_row; + guchar *src; + gint bpp; + gint x, y; + ppm_t *p; + gint x1, y1, w, h; + gint row; + gint32 drawable_id; + gint rowstride; + + gimp_int_combo_box_get_active (GIMP_INT_COMBO_BOX (widget), &drawable_id); + + if (drawable_id == -1) + return; + + if (brush_from_file == 2) + return; /* Not finished GUI-building yet */ + + if (brush_from_file) + { +#if 0 + unselectall (brush_list); +#endif + preset_save_button_set_sensitive (FALSE); + } + + gtk_adjustment_set_value (brush_gamma_adjust, 1.0); + gtk_adjustment_set_value (brush_aspect_adjust, 0.0); + + if (! gimp_drawable_mask_intersect (drawable_id, &x1, &y1, &w, &h)) + return; + + format = get_u8_format (drawable_id); + bpp = babl_format_get_bytes_per_pixel (format); + + ppm_kill (&brushppm); + ppm_new (&brushppm, w, h); + p = &brushppm; + + rowstride = p->width * 3; + + src_row = g_new (guchar, w * bpp); + + src_buffer = gimp_drawable_get_buffer (drawable_id); + + if (bpp == 3) + { /* RGB */ + gint bpr = w * 3; + gint y2 = y1 + h; + + for (row = 0, y = y1; y < y2; row++, y++) + { + gegl_buffer_get (src_buffer, GEGL_RECTANGLE (x1, y, w, 1), 1.0, + format, src_row, + GEGL_AUTO_ROWSTRIDE, GEGL_ABYSS_NONE); + + memcpy (p->col + row*rowstride, src_row, bpr); + } + } + else + { /* RGBA (bpp > 3) GrayA (bpp == 2) or Gray */ + gboolean is_gray = ((bpp > 3) ? TRUE : FALSE); + gint y2 = y1 + h; + + for (row = 0, y = y1; y < y2; row++, y++) + { + guchar *tmprow = p->col + row * rowstride; + guchar *tmprow_ptr; + gint x2 = x1 + w; + + gegl_buffer_get (src_buffer, GEGL_RECTANGLE (x1, y, w, 1), 1.0, + format, src_row, + GEGL_AUTO_ROWSTRIDE, GEGL_ABYSS_NONE); + + src = src_row; + tmprow_ptr = tmprow; + /* Possible micro-optimization here: + * src_end = src + src_rgn.bpp * w); + * for ( ; src < src_end ; src += src_rgn.bpp) + */ + for (x = x1; x < x2; x++) + { + *(tmprow_ptr++) = src[0]; + *(tmprow_ptr++) = src[is_gray ? 1 : 0]; + *(tmprow_ptr++) = src[is_gray ? 2 : 0]; + src += bpp; + } + } + } + + g_object_unref (src_buffer); + + g_free (src_row); + + if (bpp >= 3) + pcvals.color_brushes = 1; + else + pcvals.color_brushes = 0; + + brush_from_file = 0; + update_brush_preview (NULL); +} + +#if 0 +void +dummybrushdmenuselect (GtkWidget *w, gpointer data) +{ + ppm_kill (&brushppm); + ppm_new (&brushppm, 10,10); + brush_from_file = 0; + update_brush_preview (NULL); +} +#endif + +static void +brushlistrefresh (void) +{ + gtk_list_store_clear (brush_list_store); + readdirintolist ("Brushes", brush_list, NULL); +} + +static void +savebrush_response (GtkWidget *dialog, + gint response_id, + gpointer data) +{ + if (response_id == GTK_RESPONSE_OK) + { + gchar *name = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (dialog)); + + ppm_save (&brushppm, name); + brushlistrefresh (); + + g_free (name); + } + + gtk_widget_destroy (dialog); +} + +static void +savebrush (GtkWidget *wg, + gpointer data) +{ + GtkWidget *dialog = NULL; + GList *thispath = parsepath (); + gchar *path; + + if (! PPM_IS_INITED (&brushppm)) + { + g_message ( _("Can only save drawables!")); + return; + } + + dialog = + gtk_file_chooser_dialog_new (_("Save Brush"), + GTK_WINDOW (gtk_widget_get_toplevel (wg)), + GTK_FILE_CHOOSER_ACTION_SAVE, + + _("_Cancel"), GTK_RESPONSE_CANCEL, + _("_Save"), GTK_RESPONSE_OK, + + NULL); + + gtk_dialog_set_default_response (GTK_DIALOG (dialog), GTK_RESPONSE_OK); + gtk_dialog_set_alternative_button_order (GTK_DIALOG (dialog), + GTK_RESPONSE_OK, + GTK_RESPONSE_CANCEL, + -1); + + gtk_file_chooser_set_do_overwrite_confirmation (GTK_FILE_CHOOSER (dialog), + TRUE); + + path = g_build_filename ((gchar *)thispath->data, "Brushes", NULL); + + gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER (dialog), path); + + g_free (path); + + g_signal_connect (dialog, "destroy", + G_CALLBACK (gtk_widget_destroyed), + &dialog); + g_signal_connect (dialog, "response", + G_CALLBACK (savebrush_response), + NULL); + + gtk_widget_show (dialog); +} + +static gboolean +validdrawable (gint32 imageid, + gint32 drawableid, + gpointer data) +{ + return (gimp_drawable_is_rgb (drawableid) || + gimp_drawable_is_gray (drawableid)); +} + +/* + * This function caches the last result. Call it with fn as NULL, to + * free the arguments. + * */ +void +brush_reload (const gchar *fn, + ppm_t *p) +{ + static char lastfn[256] = ""; + static ppm_t cache = {0, 0, NULL}; + + if (fn == NULL) + { + ppm_kill (&cache); + lastfn[0] = '\0'; + return; + } + + if (strcmp (fn, lastfn)) + { + g_strlcpy (lastfn, fn, sizeof (lastfn)); + ppm_kill (&cache); + ppm_load (fn, &cache); + } + ppm_copy (&cache, p); + set_colorbrushes (fn); +} + +static void +padbrush (ppm_t *p, + gint width, + gint height) +{ + guchar black[3] = {0, 0, 0}; + + int left = (width - p->width) / 2; + int right = (width - p->width) - left; + int top = (height - p->height) / 2; + int bottom = (height - p->height) - top; + + ppm_pad (p, left, right, top, bottom, black); +} + +static void +update_brush_preview (const gchar *fn) +{ + gint i, j; + guchar *preview_image; + + if (fn) + brush_from_file = 1; + + preview_image = g_new0 (guchar, 100*100); + + if (!fn && brush_from_file) + { + /* preview_image is already initialized to our liking. */ + } + else + { + double sc; + ppm_t p = {0, 0, NULL}; + guchar gammatable[256]; + int newheight; + + if (brush_from_file) + brush_reload (fn, &p); + else if (PPM_IS_INITED (&brushppm)) + ppm_copy (&brushppm, &p); + + set_colorbrushes (fn); + + sc = gtk_adjustment_get_value (brush_gamma_adjust); + if (sc != 1.0) + for (i = 0; i < 256; i++) + gammatable[i] = pow (i / 255.0, sc) * 255; + else + for (i = 0; i < 256; i++) + gammatable[i] = i; + + newheight = p.height * + pow (10, gtk_adjustment_get_value (brush_aspect_adjust)); + + sc = p.width > newheight ? p.width : newheight; + sc = 100.0 / sc; + resize_fast (&p, p.width*sc,newheight*sc); + padbrush (&p, 100, 100); + for (i = 0; i < 100; i++) + { + int k = i * p.width * 3; + if (i < p.height) + for (j = 0; j < p.width; j++) + preview_image[i*100+j] = gammatable[p.col[k + j * 3]]; + } + ppm_kill (&p); + } + gimp_preview_area_draw (GIMP_PREVIEW_AREA (brush_preview), + 0, 0, 100, 100, + GIMP_GRAY_IMAGE, + preview_image, + 100); + + g_free (preview_image); +} + + +/* + * "force" implies here to change the brush even if it was the same. + * It is used for the initialization of the preview. + * */ +static void +brush_select (GtkTreeSelection *selection, gboolean force) +{ + GtkTreeIter iter; + GtkTreeModel *model; + gchar *fname = NULL; + gchar *brush = NULL; + + if (brush_dont_update) + goto cleanup; + + if (brush_from_file == 0) + { + update_brush_preview (NULL); + goto cleanup; + } + + if (gtk_tree_selection_get_selected (selection, &model, &iter)) + { + gtk_tree_model_get (model, &iter, 0, &brush, -1); + + /* Check if the same brush was selected twice, and if so + * break. Otherwise, the brush gamma and stuff would have been + * reset. + * */ + if (last_selected_brush == NULL) + { + last_selected_brush = g_strdup (brush); + } + else + { + if (!strcmp (last_selected_brush, brush)) + { + if (!force) + { + goto cleanup; + } + } + else + { + g_free (last_selected_brush); + last_selected_brush = g_strdup (brush); + } + } + + brush_dont_update = TRUE; + gtk_adjustment_set_value (brush_gamma_adjust, 1.0); + gtk_adjustment_set_value (brush_aspect_adjust, 0.0); + brush_dont_update = FALSE; + + if (brush) + { + fname = g_build_filename ("Brushes", brush, NULL); + + g_strlcpy (pcvals.selected_brush, + fname, sizeof (pcvals.selected_brush)); + + update_brush_preview (fname); + + } + } +cleanup: + g_free (fname); + g_free (brush); +} + +static void +brush_select_file (GtkTreeSelection *selection, gpointer data) +{ + brush_from_file = 1; + preset_save_button_set_sensitive (TRUE); + brush_select (selection, FALSE); +} + +static void +brush_preview_size_allocate (GtkWidget *preview) +{ + GtkTreeSelection *selection; + + selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (brush_list)); + brush_select (selection, TRUE); +} + +static void +brush_asepct_adjust_cb (GtkWidget *w, gpointer data) +{ + gimp_double_adjustment_update (GTK_ADJUSTMENT (w), data); + update_brush_preview (pcvals.selected_brush); +} + +void +create_brushpage (GtkNotebook *notebook) +{ + GtkWidget *box1, *box2, *box3, *thispage; + GtkWidget *view; + GtkWidget *tmpw, *table; + GtkWidget *frame; + GtkWidget *combo; + GtkWidget *label; + GtkSizeGroup *group; + GtkTreeSelection *selection; + + label = gtk_label_new_with_mnemonic (_("_Brush")); + + thispage = gtk_box_new (GTK_ORIENTATION_VERTICAL, 12); + gtk_container_set_border_width (GTK_CONTAINER (thispage), 12); + gtk_widget_show (thispage); + + box1 = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 12); + gtk_box_pack_start (GTK_BOX (thispage), box1, TRUE,TRUE,0); + gtk_widget_show (box1); + + view = create_one_column_list (box1, brush_select_file); + brush_list = view; + brush_list_store = + GTK_LIST_STORE (gtk_tree_view_get_model (GTK_TREE_VIEW (view))); + + selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (view)); + + box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 12); + gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, FALSE, 0); + gtk_widget_show (box2); + + frame = gtk_frame_new (NULL); + gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_IN); + gtk_box_pack_start (GTK_BOX (box2), frame, FALSE, FALSE, 0); + gtk_widget_show (frame); + + brush_preview = tmpw = gimp_preview_area_new (); + gtk_widget_set_size_request (brush_preview, 100, 100); + gtk_container_add (GTK_CONTAINER (frame), tmpw); + gtk_widget_show (tmpw); + g_signal_connect (brush_preview, "size-allocate", + G_CALLBACK (brush_preview_size_allocate), NULL); + + box3 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 2); + gtk_box_pack_end (GTK_BOX (box2), box3, FALSE, FALSE,0); + gtk_widget_show (box3); + + tmpw = gtk_label_new (_("Gamma:")); + gtk_label_set_xalign (GTK_LABEL (tmpw), 0.0); + gtk_box_pack_start (GTK_BOX (box3), tmpw, FALSE, FALSE,0); + gtk_widget_show (tmpw); + + brush_gamma_adjust = GTK_ADJUSTMENT (gtk_adjustment_new (pcvals.brushgamma, + 0.5, 3.0, 0.1, 0.1, 1.0)); + tmpw = gtk_scale_new (GTK_ORIENTATION_HORIZONTAL, brush_gamma_adjust); + gtk_widget_set_size_request (GTK_WIDGET (tmpw), 100, 30); + gtk_scale_set_draw_value (GTK_SCALE (tmpw), FALSE); + gtk_scale_set_digits (GTK_SCALE (tmpw), 2); + gtk_box_pack_start (GTK_BOX (box3), tmpw, FALSE, FALSE, 0); + gtk_widget_show (tmpw); + g_signal_connect_swapped (brush_gamma_adjust, "value-changed", + G_CALLBACK (update_brush_preview), + pcvals.selected_brush); + + gimp_help_set_help_data + (tmpw, _("Changes the gamma (brightness) of the selected brush"), NULL); + + box3 = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 6); + gtk_box_pack_start (GTK_BOX (thispage), box3, FALSE, FALSE,0); + gtk_widget_show (box3); + + group = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL); + + tmpw = gtk_label_new (_("Select:")); + gtk_label_set_xalign (GTK_LABEL (tmpw), 0.0); + gtk_box_pack_start (GTK_BOX (box3), tmpw, FALSE, FALSE, 0); + gtk_widget_show (tmpw); + + gtk_size_group_add_widget (group, tmpw); + g_object_unref (group); + + combo = gimp_drawable_combo_box_new (validdrawable, NULL); + gimp_int_combo_box_connect (GIMP_INT_COMBO_BOX (combo), -1, + G_CALLBACK (brushdmenuselect), + NULL); + + gtk_box_pack_start (GTK_BOX (box3), combo, TRUE, TRUE, 0); + gtk_widget_show (combo); + + tmpw = gtk_button_new_with_mnemonic (_("Save _as")); + gtk_box_pack_start (GTK_BOX (box3),tmpw, FALSE, FALSE, 0); + g_signal_connect (tmpw, "clicked", G_CALLBACK (savebrush), NULL); + gtk_widget_show (tmpw); + + table = gtk_table_new (2, 3, FALSE); + gtk_table_set_col_spacings (GTK_TABLE (table), 6); + gtk_table_set_row_spacings (GTK_TABLE (table), 6); + gtk_box_pack_start (GTK_BOX (thispage), table, FALSE, FALSE, 0); + gtk_widget_show (table); + + brush_aspect_adjust = (GtkAdjustment *) + gimp_scale_entry_new (GTK_TABLE (table), 0, 0, + _("Aspect ratio:"), + 150, -1, pcvals.brush_aspect, + -1.0, 1.0, 0.1, 0.1, 2, + TRUE, 0, 0, + _("Specifies the aspect ratio of the brush"), + NULL); + gtk_size_group_add_widget (group, + GIMP_SCALE_ENTRY_LABEL (brush_aspect_adjust)); + g_signal_connect (brush_aspect_adjust, "value-changed", + G_CALLBACK (brush_asepct_adjust_cb), &pcvals.brush_aspect); + + brush_relief_adjust = (GtkAdjustment *) + gimp_scale_entry_new (GTK_TABLE (table), 0, 1, + _("Relief:"), + 150, -1, pcvals.brush_relief, + 0.0, 100.0, 1.0, 10.0, 1, + TRUE, 0, 0, + _("Specifies the amount of embossing to apply to the image (in percent)"), + NULL); + gtk_size_group_add_widget (group, + GIMP_SCALE_ENTRY_LABEL (brush_relief_adjust)); + g_signal_connect (brush_relief_adjust, "value-changed", + G_CALLBACK (gimp_double_adjustment_update), + &pcvals.brush_relief); + + brush_select (selection, FALSE); + readdirintolist ("Brushes", view, pcvals.selected_brush); + + /* + * This is so the "changed signal won't get sent to the brushes' list + * and reset the gamma and stuff. + * */ + gtk_widget_grab_focus (brush_list); + + gtk_notebook_append_page_menu (notebook, thispage, label, NULL); +} + diff --git a/plug-ins/gimpressionist/brush.h b/plug-ins/gimpressionist/brush.h new file mode 100644 index 0000000..65296f8 --- /dev/null +++ b/plug-ins/gimpressionist/brush.h @@ -0,0 +1,29 @@ +/* GIMP - The GNU Image Manipulation Program + * Copyright (C) 1995 Spencer Kimball and Peter Mattis + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <https://www.gnu.org/licenses/>. + */ + +#ifndef __BRUSH_H +#define __BRUSH_H + +#include "ppmtool.h" + +void brush_store(void); +void brush_restore(void); +void brush_free(void); +void create_brushpage(GtkNotebook *); +void brush_get_selected (ppm_t *p); + +#endif /* #ifndef __BRUSH_H */ diff --git a/plug-ins/gimpressionist/color.c b/plug-ins/gimpressionist/color.c new file mode 100644 index 0000000..9dc18d7 --- /dev/null +++ b/plug-ins/gimpressionist/color.c @@ -0,0 +1,106 @@ +/* GIMP - The GNU Image Manipulation Program + * Copyright (C) 1995 Spencer Kimball and Peter Mattis + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <https://www.gnu.org/licenses/>. + */ + +#include "config.h" + +#include <gtk/gtk.h> + +#include <libgimp/gimp.h> +#include <libgimp/gimpui.h> + +#include "gimpressionist.h" +#include "color.h" + +#include "libgimp/stdplugins-intl.h" + + +#define NUMCOLORRADIO 2 + +static GtkWidget *colorradio[NUMCOLORRADIO]; +static GtkObject *colornoiseadjust = NULL; + +void +color_restore (void) +{ + gtk_toggle_button_set_active + (GTK_TOGGLE_BUTTON (colorradio[pcvals.color_type]), TRUE); + + gtk_adjustment_set_value (GTK_ADJUSTMENT (colornoiseadjust), + pcvals.color_noise); +} + +int +color_type_input (int in) +{ + return CLAMP_UP_TO (in, NUMCOLORRADIO); +} + +void +create_colorpage (GtkNotebook *notebook) +{ + GtkWidget *vbox; + GtkWidget *label, *table; + GtkWidget *frame; + + label = gtk_label_new_with_mnemonic (_("Co_lor")); + + vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 12); + gtk_container_set_border_width (GTK_CONTAINER (vbox), 12); + gtk_widget_show (vbox); + + frame = gimp_int_radio_group_new (TRUE, _("Color"), + G_CALLBACK (gimp_radio_button_update), + &pcvals.color_type, 0, + + _("A_verage under brush"), + COLOR_TYPE_AVERAGE, &colorradio[COLOR_TYPE_AVERAGE], + _("C_enter of brush"), + COLOR_TYPE_CENTER, &colorradio[COLOR_TYPE_CENTER], + + NULL); + + gimp_help_set_help_data + (colorradio[COLOR_TYPE_AVERAGE], + _("Color is computed from the average of all pixels under the brush"), + NULL); + gimp_help_set_help_data + (colorradio[COLOR_TYPE_CENTER], + _("Samples the color from the pixel in the center of the brush"), NULL); + gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0); + gtk_widget_show (frame); + + table = gtk_table_new (1, 3, FALSE); + gtk_table_set_col_spacings (GTK_TABLE (table), 6); + gtk_box_pack_start (GTK_BOX (vbox), table, FALSE, FALSE, 0); + gtk_widget_show (table); + + colornoiseadjust = + gimp_scale_entry_new (GTK_TABLE (table), 0, 0, + _("Color _noise:"), + 100, -1, pcvals.color_noise, + 0.0, 100.0, 1.0, 5.0, 0, + TRUE, 0, 0, + _("Adds random noise to the color"), + NULL); + g_signal_connect (colornoiseadjust, "value-changed", + G_CALLBACK (gimp_double_adjustment_update), + &pcvals.color_noise); + + color_restore (); + + gtk_notebook_append_page_menu (notebook, vbox, label, NULL); +} diff --git a/plug-ins/gimpressionist/color.h b/plug-ins/gimpressionist/color.h new file mode 100644 index 0000000..51ebdfa --- /dev/null +++ b/plug-ins/gimpressionist/color.h @@ -0,0 +1,32 @@ +/* GIMP - The GNU Image Manipulation Program + * Copyright (C) 1995 Spencer Kimball and Peter Mattis + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <https://www.gnu.org/licenses/>. + */ + +#ifndef __COLOR_H +#define __COLOR_H + +enum COLOR_TYPE_ENUM +{ + COLOR_TYPE_AVERAGE = 0, + COLOR_TYPE_CENTER = 1, +}; + +void create_colorpage (GtkNotebook *); +void color_restore (void); +int color_type_input (int in); + +#endif /* #ifndef __COLOR_H */ + diff --git a/plug-ins/gimpressionist/general.c b/plug-ins/gimpressionist/general.c new file mode 100644 index 0000000..5f58056 --- /dev/null +++ b/plug-ins/gimpressionist/general.c @@ -0,0 +1,283 @@ +/* GIMP - The GNU Image Manipulation Program + * Copyright (C) 1995 Spencer Kimball and Peter Mattis + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <https://www.gnu.org/licenses/>. + */ + +#include "config.h" + +#include <gtk/gtk.h> + +#include <libgimp/gimp.h> +#include <libgimp/gimpui.h> + +#include "gimpressionist.h" +#include "infile.h" +#include "general.h" + +#include "libgimp/stdplugins-intl.h" + + +#define COLORBUTTONWIDTH 30 +#define COLORBUTTONHEIGHT 20 + + +#define NUMGENERALBGRADIO 4 + +static GtkWidget *general_bg_radio[NUMGENERALBGRADIO]; +static GtkWidget *general_paint_edges = NULL; +static GtkObject *general_dark_edge_adjust = NULL; +static GtkWidget *general_tileable; +static GtkWidget *general_drop_shadow = NULL; +static GtkWidget *general_color_button; +static GtkObject *general_shadow_adjust = NULL; +static GtkObject *general_shadow_depth = NULL; +static GtkObject *general_shadow_blur = NULL; +static GtkObject *dev_thresh_adjust = NULL; + +static int +normalize_bg (int n) +{ + return (!img_has_alpha && (n == 3)) ? 1 : n; +} + +static void +general_bg_callback (GtkWidget *wg, void *d) +{ + pcvals.general_background_type = normalize_bg (GPOINTER_TO_INT (d)); +} + +void +general_store (void) +{ + pcvals.general_paint_edges = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (general_paint_edges)); + pcvals.general_dark_edge = gtk_adjustment_get_value (GTK_ADJUSTMENT (general_dark_edge_adjust)); + pcvals.general_tileable = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (general_tileable)); + pcvals.general_drop_shadow = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (general_drop_shadow)); + pcvals.general_shadow_darkness = gtk_adjustment_get_value (GTK_ADJUSTMENT (general_shadow_adjust)); + pcvals.general_shadow_depth = gtk_adjustment_get_value (GTK_ADJUSTMENT (general_shadow_depth)); + pcvals.general_shadow_blur = gtk_adjustment_get_value (GTK_ADJUSTMENT (general_shadow_blur)); + pcvals.devthresh = gtk_adjustment_get_value (GTK_ADJUSTMENT (dev_thresh_adjust)); +} + +int +general_bg_type_input (int in) +{ + return CLAMP_UP_TO (in, NUMGENERALBGRADIO); +} + +void +general_restore (void) +{ + gtk_toggle_button_set_active + (GTK_TOGGLE_BUTTON (general_bg_radio[normalize_bg (pcvals.general_background_type)]), + TRUE); + + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (general_paint_edges), + pcvals.general_paint_edges); + gtk_adjustment_set_value (GTK_ADJUSTMENT (general_dark_edge_adjust), + pcvals.general_dark_edge); + gtk_adjustment_set_value (GTK_ADJUSTMENT (general_shadow_adjust), + pcvals.general_shadow_darkness); + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (general_drop_shadow), + pcvals.general_drop_shadow); + gtk_adjustment_set_value (GTK_ADJUSTMENT (general_shadow_depth), + pcvals.general_shadow_depth); + gtk_adjustment_set_value (GTK_ADJUSTMENT (general_shadow_blur), + pcvals.general_shadow_blur); + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (general_tileable), + pcvals.general_tileable); + gimp_color_button_set_color (GIMP_COLOR_BUTTON (general_color_button), + &pcvals.color); + gtk_adjustment_set_value (GTK_ADJUSTMENT (dev_thresh_adjust), + pcvals.devthresh); +} + +static void +select_color (GtkWidget *widget, gpointer data) +{ + gtk_toggle_button_set_active + (GTK_TOGGLE_BUTTON (general_bg_radio[BG_TYPE_SOLID]), + TRUE); +} + +static GtkWidget * +create_general_button (GtkWidget *box, + int idx, + const gchar *label, + const gchar *help_string, + GSList **radio_group) +{ + return create_radio_button (box, idx, general_bg_callback, label, + help_string, radio_group, general_bg_radio); +} + +void +create_generalpage (GtkNotebook *notebook) +{ + GtkWidget *box1, *box2, *box3, *box4, *thispage; + GtkWidget *label, *tmpw, *frame, *table; + GSList * radio_group = NULL; + + label = gtk_label_new_with_mnemonic (_("_General")); + + thispage = gtk_box_new (GTK_ORIENTATION_VERTICAL, 12); + gtk_container_set_border_width (GTK_CONTAINER (thispage), 12); + gtk_widget_show (thispage); + + frame = gimp_frame_new (_("Background")); + gtk_box_pack_start (GTK_BOX (thispage), frame, FALSE, FALSE, 0); + gtk_widget_show (frame); + + box3 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 6); + gtk_container_add (GTK_CONTAINER (frame), box3); + gtk_widget_show (box3); + + create_general_button (box3, + BG_TYPE_KEEP_ORIGINAL, + _("Keep original"), + _("Preserve the original image as a background"), + &radio_group); + + create_general_button (box3, + BG_TYPE_FROM_PAPER, + _("From paper"), + _("Copy the texture of the selected paper as a background"), + &radio_group); + + box4 = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 6); + gtk_box_pack_start (GTK_BOX (box3), box4, FALSE, FALSE, 0); + gtk_widget_show (box4); + + create_general_button (box4, + BG_TYPE_SOLID, + _("Solid"), + _("Solid colored background"), + &radio_group); + + general_color_button = gimp_color_button_new (_("Color"), + COLORBUTTONWIDTH, + COLORBUTTONHEIGHT, + &pcvals.color, + GIMP_COLOR_AREA_FLAT); + g_signal_connect (general_color_button, "clicked", + G_CALLBACK (select_color), NULL); + g_signal_connect (general_color_button, "color-changed", + G_CALLBACK (gimp_color_button_get_color), + &pcvals.color); + gtk_box_pack_start (GTK_BOX (box4), general_color_button, FALSE, FALSE, 0); + gtk_widget_show (general_color_button); + + tmpw = create_general_button (box3, + BG_TYPE_TRANSPARENT, + _("Transparent"), + _("Use a transparent background; Only the strokes painted will be visible"), + &radio_group); + + if (!img_has_alpha) + gtk_widget_set_sensitive (tmpw, FALSE); + + gtk_toggle_button_set_active + (GTK_TOGGLE_BUTTON (general_bg_radio[pcvals.general_background_type]), TRUE); + + box1 = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 12); + gtk_box_pack_start (GTK_BOX (thispage), box1, FALSE, FALSE, 0); + gtk_widget_show (box1); + + box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 6); + gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, FALSE, 0); + gtk_widget_show (box2); + + tmpw = gtk_check_button_new_with_label ( _("Paint edges")); + general_paint_edges = tmpw; + gtk_box_pack_start (GTK_BOX (box2), tmpw, FALSE, FALSE, 0); + gtk_widget_show (tmpw); + gimp_help_set_help_data (tmpw, + _("Selects if to place strokes all the way out to the edges of the image"), + NULL); + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (tmpw), + pcvals.general_paint_edges); + + general_tileable = tmpw = gtk_check_button_new_with_label ( _("Tileable")); + gtk_box_pack_start (GTK_BOX (box2), tmpw, FALSE, FALSE, 0); + gtk_widget_show (tmpw); + gimp_help_set_help_data (tmpw, + _("Selects if the resulting image should be seamlessly tileable"), + NULL); + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (tmpw), + pcvals.general_tileable); + + tmpw = gtk_check_button_new_with_label ( _("Drop shadow")); + general_drop_shadow = tmpw; + gtk_box_pack_start (GTK_BOX (box2), tmpw, FALSE, FALSE, 0); + gtk_widget_show (tmpw); + gimp_help_set_help_data (tmpw, + _("Adds a shadow effect to each brush stroke"), + NULL); + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (tmpw), + pcvals.general_drop_shadow); + + table = gtk_table_new (5, 3, FALSE); + gtk_table_set_col_spacings (GTK_TABLE (table), 6); + gtk_table_set_row_spacings (GTK_TABLE (table), 6); + gtk_box_pack_start (GTK_BOX (box1), table, FALSE, FALSE, 0); + gtk_widget_show (table); + + general_dark_edge_adjust = + gimp_scale_entry_new (GTK_TABLE (table), 0, 0, + _("Edge darken:"), + 150, 6, pcvals.general_dark_edge, + 0.0, 1.0, 0.01, 0.1, 2, + TRUE, 0, 0, + _("How much to \"darken\" the edges of each brush stroke"), + NULL); + + general_shadow_adjust = + gimp_scale_entry_new (GTK_TABLE (table), 0, 1, + _("Shadow darken:"), + 150, 6, pcvals.general_shadow_darkness, + 0.0, 99.0, 0.1, 1, 2, + TRUE, 0, 0, + _("How much to \"darken\" the drop shadow"), + NULL); + + general_shadow_depth = + gimp_scale_entry_new (GTK_TABLE (table), 0, 2, + _("Shadow depth:"), + 150, 6, pcvals.general_shadow_depth, + 0, 99, 1, 5, 0, + TRUE, 0, 0, + _("The depth of the drop shadow, i.e. how far apart from the object it should be"), + NULL); + + general_shadow_blur = + gimp_scale_entry_new (GTK_TABLE (table), 0, 3, + _("Shadow blur:"), + 150, 6, pcvals.general_shadow_blur, + 0, 99, 1, 5, 0, + TRUE, 0, 0, + _("How much to blur the drop shadow"), + NULL); + + dev_thresh_adjust = + gimp_scale_entry_new (GTK_TABLE (table), 0, 4, + _("Deviation threshold:"), + 150, 6, pcvals.devthresh, + 0.0, 1.0, 0.01, 0.01, 2, + TRUE, 0, 0, + _("A bailout-value for adaptive selections"), + NULL); + + gtk_notebook_append_page_menu (notebook, thispage, label, NULL); +} diff --git a/plug-ins/gimpressionist/general.h b/plug-ins/gimpressionist/general.h new file mode 100644 index 0000000..a706c7e --- /dev/null +++ b/plug-ins/gimpressionist/general.h @@ -0,0 +1,26 @@ +/* GIMP - The GNU Image Manipulation Program + * Copyright (C) 1995 Spencer Kimball and Peter Mattis + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <https://www.gnu.org/licenses/>. + */ + +#ifndef __GENERAL_H +#define __GENERAL_H + +void general_restore(void); +void general_store(void); +void create_generalpage(GtkNotebook *); +int general_bg_type_input (int in); + +#endif /* #ifndef __GENERAL_H */ diff --git a/plug-ins/gimpressionist/gimp.c b/plug-ins/gimpressionist/gimp.c new file mode 100644 index 0000000..fea302d --- /dev/null +++ b/plug-ins/gimpressionist/gimp.c @@ -0,0 +1,535 @@ +/* GIMP - The GNU Image Manipulation Program + * Copyright (C) 1995 Spencer Kimball and Peter Mattis + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <https://www.gnu.org/licenses/>. + */ + +#include "config.h" + +#include <string.h> + +#include <gtk/gtk.h> + +#include <libgimp/gimp.h> + +#include "ppmtool.h" +#include "infile.h" +#include "gimpressionist.h" +#include "preview.h" +#include "brush.h" +#include "presets.h" +#include "random.h" +#include "orientmap.h" +#include "size.h" + + +#include "libgimp/stdplugins-intl.h" + +static void query (void); +static void run (const gchar *name, + gint nparams, + const GimpParam *param, + gint *nreturn_vals, + GimpParam **return_vals); +static void gimpressionist_main (void); + + +const GimpPlugInInfo PLUG_IN_INFO = { + NULL, /* init_proc */ + NULL, /* quit_proc */ + query, /* query_proc */ + run /* run_proc */ +}; /* PLUG_IN_INFO */ + +static gint32 drawable_id; +static ppm_t infile = {0, 0, NULL}; +static ppm_t inalpha = {0, 0, NULL}; + + +void +infile_copy_to_ppm (ppm_t * p) +{ + if (!PPM_IS_INITED (&infile)) + grabarea (); + + ppm_copy (&infile, p); +} + +void +infile_copy_alpha_to_ppm (ppm_t * p) +{ + ppm_copy (&inalpha, p); +} + +MAIN () + +static void +query (void) +{ + static const GimpParamDef args[] = + { + { GIMP_PDB_INT32, "run-mode", "The run mode { RUN-INTERACTIVE (0) }" }, + { GIMP_PDB_IMAGE, "image", "Input image" }, + { GIMP_PDB_DRAWABLE, "drawable", "Input drawable" }, + { GIMP_PDB_STRING, "preset", "Preset Name" }, + }; + + gimp_install_procedure (PLUG_IN_PROC, + N_("Performs various artistic operations"), + "Performs various artistic operations on an image", + "Vidar Madsen <vidar@prosalg.no>", + "Vidar Madsen", + PLUG_IN_VERSION, + N_("_GIMPressionist..."), + "RGB*, GRAY*", + GIMP_PLUGIN, + G_N_ELEMENTS (args), 0, + args, NULL); + + gimp_plugin_menu_register (PLUG_IN_PROC, "<Image>/Filters/Artistic"); +} + +static void +gimpressionist_get_data (void) +{ + restore_default_values (); + gimp_get_data (PLUG_IN_PROC, &pcvals); +} + +static void +run (const gchar *name, + gint nparams, + const GimpParam *param, + gint *nreturn_vals, + GimpParam **return_vals) +{ + static GimpParam values[2]; + GimpRunMode run_mode; + GimpPDBStatusType status; + gboolean with_specified_preset; + gchar *preset_name = NULL; + + status = GIMP_PDB_SUCCESS; + run_mode = param[0].data.d_int32; + with_specified_preset = FALSE; + + if (nparams > 3) + { + preset_name = param[3].data.d_string; + if (strcmp (preset_name, "")) + { + with_specified_preset = TRUE; + } + } + + values[0].type = GIMP_PDB_STATUS; + values[0].data.d_status = status; + + *nreturn_vals = 1; + *return_vals = values; + + INIT_I18N (); + gegl_init (NULL, NULL); + + /* Get the active drawable info */ + + drawable_id = param[2].data.d_drawable; + img_has_alpha = gimp_drawable_has_alpha (drawable_id); + + random_generator = g_rand_new (); + + /* + * Check precondition before we open a dialog: Is there a selection + * that intersects, OR is there no selection (use entire drawable.) + */ + { + gint x1, y1, width, height; /* Not used. */ + + if (! gimp_drawable_mask_intersect (drawable_id, + &x1, &y1, &width, &height)) + { + values[0].data.d_status = GIMP_PDB_EXECUTION_ERROR; + *nreturn_vals = 2; + values[1].type = GIMP_PDB_STRING; + values[1].data.d_string = _("The selection does not intersect " + "the active layer or mask."); + + return; + } + } + + + switch (run_mode) + { + /* + * Note: there's a limitation here. Running this plug-in before the + * interactive plug-in was run will cause it to crash, because the + * data is uninitialized. + * */ + case GIMP_RUN_INTERACTIVE: + case GIMP_RUN_NONINTERACTIVE: + case GIMP_RUN_WITH_LAST_VALS: + gimpressionist_get_data (); + if (run_mode == GIMP_RUN_INTERACTIVE) + { + if (!create_gimpressionist ()) + return; + } + break; + default: + status = GIMP_PDB_EXECUTION_ERROR; + break; + } + if ((status == GIMP_PDB_SUCCESS) && + (gimp_drawable_is_rgb (drawable_id) || + gimp_drawable_is_gray (drawable_id))) + { + + if (with_specified_preset) + { + /* If select_preset fails - set to an error */ + if (select_preset (preset_name)) + { + status = GIMP_PDB_EXECUTION_ERROR; + } + } + /* It seems that the value of the run variable is stored in + * the preset. I don't know if it's a bug or a feature, but + * I just work here and am anxious to get a working version. + * So I'm setting it to the correct value here. + * + * It also seems that defaultpcvals have this erroneous + * value as well, so it gets set to FALSE as well. Thus it + * is always set to TRUE upon a non-interactive run. + * -- Shlomi Fish + * */ + if (run_mode == GIMP_RUN_NONINTERACTIVE) + { + pcvals.run = TRUE; + } + + if (status == GIMP_PDB_SUCCESS) + { + gimpressionist_main (); + gimp_displays_flush (); + + if (run_mode == GIMP_RUN_INTERACTIVE) + gimp_set_data (PLUG_IN_PROC, + &pcvals, + sizeof (gimpressionist_vals_t)); + } + } + else if (status == GIMP_PDB_SUCCESS) + { + status = GIMP_PDB_EXECUTION_ERROR; + } + + /* Resources Cleanup */ + g_rand_free (random_generator); + free_parsepath_cache (); + brush_reload (NULL, NULL); + preview_free_resources (); + brush_free (); + preset_free (); + orientation_map_free_resources (); + size_map_free_resources (); + + values[0].data.d_status = status; +} + +static const Babl * +get_u8_format (gint32 drawable_id) +{ + if (gimp_drawable_is_rgb (drawable_id)) + { + if (gimp_drawable_has_alpha (drawable_id)) + return babl_format ("R'G'B'A u8"); + else + return babl_format ("R'G'B' u8"); + } + else + { + if (gimp_drawable_has_alpha (drawable_id)) + return babl_format ("Y'A u8"); + else + return babl_format ("Y' u8"); + } +} + +void +grabarea (void) +{ + GeglBuffer *src_buffer; + GeglBufferIterator *iter; + const Babl *format; + gint bpp; + ppm_t *p; + gint x1, y1; + gint x, y; + gint width, height; + gint row, col; + gint rowstride; + + if (! gimp_drawable_mask_intersect (drawable_id, + &x1, &y1, &width, &height)) + return; + + ppm_new (&infile, width, height); + p = &infile; + + format = get_u8_format (drawable_id); + bpp = babl_format_get_bytes_per_pixel (format); + + if (gimp_drawable_has_alpha (drawable_id)) + ppm_new (&inalpha, width, height); + + rowstride = p->width * 3; + + src_buffer = gimp_drawable_get_buffer (drawable_id); + + iter = gegl_buffer_iterator_new (src_buffer, + GEGL_RECTANGLE (x1, y1, width, height), 0, + format, + GEGL_ACCESS_READ, GEGL_ABYSS_NONE, 1); + + while (gegl_buffer_iterator_next (iter)) + { + GeglRectangle roi = iter->items[0].roi; + const guchar *src = iter->items[0].data; + + switch (bpp) + { + case 1: + for (y = 0, row = roi.y - y1; y < roi.height; y++, row++) + { + const guchar *s = src; + guchar *tmprow = p->col + row * rowstride; + + for (x = 0, col = roi.x - x1; x < roi.width; x++, col++) + { + gint k = col * 3; + + tmprow[k + 0] = s[0]; + tmprow[k + 1] = s[0]; + tmprow[k + 2] = s[0]; + + s++; + } + + src += bpp * roi.width; + } + break; + + case 2: + for (y = 0, row = roi.y - y1; y < roi.height; y++, row++) + { + const guchar *s = src; + guchar *tmprow = p->col + row * rowstride; + guchar *tmparow = inalpha.col + row * rowstride; + + for (x = 0, col = roi.x - x1; x < roi.width; x++, col++) + { + gint k = col * 3; + + tmprow[k + 0] = s[0]; + tmprow[k + 1] = s[0]; + tmprow[k + 2] = s[0]; + tmparow[k] = 255 - s[1]; + + s += 2; + } + + src += bpp * roi.width; + } + break; + + case 3: + col = roi.x - x1; + + for (y = 0, row = roi.y - y1; y < roi.height; y++, row++) + { + memcpy (p->col + row * rowstride + col * 3, src, roi.width * 3); + + src += bpp * roi.width; + } + break; + + case 4: + for (y = 0, row = roi.y - y1; y < roi.height; y++, row++) + { + const guchar *s = src; + guchar *tmprow = p->col + row * rowstride; + guchar *tmparow = inalpha.col + row * rowstride; + + for (x = 0, col = roi.x - x1; x < roi.width; x++, col++) + { + gint k = col * 3; + + tmprow[k + 0] = s[0]; + tmprow[k + 1] = s[1]; + tmprow[k + 2] = s[2]; + tmparow[k] = 255 - s[3]; + + s += 4; + } + + src += bpp * roi.width; + } + break; + } + } + + g_object_unref (src_buffer); +} + +static void +gimpressionist_main (void) +{ + GeglBuffer *dest_buffer; + GeglBufferIterator *iter; + const Babl *format; + gint bpp; + ppm_t *p; + gint x1, y1; + gint x, y; + gint width, height; + gint row, col; + gint rowstride; + glong done = 0; + glong total; + + if (! gimp_drawable_mask_intersect (drawable_id, + &x1, &y1, &width, &height)) + return; + + total = width * height; + + format = get_u8_format (drawable_id); + bpp = babl_format_get_bytes_per_pixel (format); + + gimp_progress_init (_("Painting")); + + if (! PPM_IS_INITED (&infile)) + grabarea (); + + repaint (&infile, (img_has_alpha) ? &inalpha : NULL); + + p = &infile; + + rowstride = p->width * 3; + + dest_buffer = gimp_drawable_get_shadow_buffer (drawable_id); + + iter = gegl_buffer_iterator_new (dest_buffer, + GEGL_RECTANGLE (x1, y1, width, height), 0, + format, + GEGL_ACCESS_WRITE, GEGL_ABYSS_NONE, 1); + + while (gegl_buffer_iterator_next (iter)) + { + GeglRectangle roi = iter->items[0].roi; + guchar *dest = iter->items[0].data; + + switch (bpp) + { + case 1: + for (y = 0, row = roi.y - y1; y < roi.height; y++, row++) + { + guchar *d = dest; + const guchar *tmprow = p->col + row * rowstride; + + for (x = 0, col = roi.x - x1; x < roi.width; x++, col++) + { + gint k = col * 3; + + *d++ = GIMP_RGB_LUMINANCE (tmprow[k + 0], + tmprow[k + 1], + tmprow[k + 2]); + } + + dest += bpp * roi.width; + } + break; + + case 2: + for (y = 0, row = roi.y - y1; y < roi.height; y++, row++) + { + guchar *d = dest; + const guchar *tmprow = p->col + row * rowstride; + const guchar *tmparow = inalpha.col + row * rowstride; + + for (x = 0, col = roi.x - x1; x < roi.width; x++, col++) + { + gint k = col * 3; + gint value = GIMP_RGB_LUMINANCE (tmprow[k + 0], + tmprow[k + 1], + tmprow[k + 2]); + + d[0] = value; + d[1] = 255 - tmparow[k]; + + d += 2; + } + + dest += bpp * roi.width; + } + break; + + case 3: + col = roi.x - x1; + + for (y = 0, row = roi.y - y1; y < roi.height; y++, row++) + { + memcpy (dest, p->col + row * rowstride + col * 3, roi.width * 3); + + dest += bpp * roi.width; + } + break; + + case 4: + for (y = 0, row = roi.y - y1; y < roi.height; y++, row++) + { + guchar *d = dest; + const guchar *tmprow = p->col + row * rowstride; + const guchar *tmparow = inalpha.col + row * rowstride; + + for (x = 0, col = roi.x - x1; x < roi.width; x++, col++) + { + gint k = col * 3; + + d[0] = tmprow[k + 0]; + d[1] = tmprow[k + 1]; + d[2] = tmprow[k + 2]; + d[3] = 255 - tmparow[k]; + + d += 4; + } + + dest += bpp * roi.width; + } + break; + } + + done += roi.width * roi.height; + + gimp_progress_update (0.8 + 0.2 * done / total); + } + + g_object_unref (dest_buffer); + + gimp_progress_update (1.0); + + gimp_drawable_merge_shadow (drawable_id, TRUE); + gimp_drawable_update (drawable_id, x1, y1, width, height); +} diff --git a/plug-ins/gimpressionist/gimpressionist.c b/plug-ins/gimpressionist/gimpressionist.c new file mode 100644 index 0000000..905149b --- /dev/null +++ b/plug-ins/gimpressionist/gimpressionist.c @@ -0,0 +1,207 @@ +/* GIMP - The GNU Image Manipulation Program + * Copyright (C) 1995 Spencer Kimball and Peter Mattis + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <https://www.gnu.org/licenses/>. + */ + +#include "config.h" + +#include <libgimp/gimp.h> +#include <libgimp/gimpui.h> + +#include "gimpressionist.h" +/* + * The Page Specific Imports + * */ +#include "brush.h" +#include "color.h" +#include "general.h" +#include "orientation.h" +#include "orientmap.h" +#include "placement.h" +#include "preview.h" +#include "size.h" +#include "paper.h" +#include "presets.h" + +#include "ppmtool.h" + +#include "libgimp/stdplugins-intl.h" + + +static GtkWidget *dialog = NULL; + +void +store_values (void) +{ + paper_store (); + brush_store (); + general_store (); +} + +void +restore_values (void) +{ + brush_restore (); + paper_restore (); + orientation_restore (); + size_restore (); + place_restore (); + general_restore (); + color_restore (); + + update_orientmap_dialog (); +} + +GtkWidget * +create_one_column_list (GtkWidget *parent, + void (*changed_cb) (GtkTreeSelection *selection, + gpointer data)) +{ + GtkListStore *store; + GtkTreeSelection *selection; + GtkCellRenderer *renderer; + GtkTreeViewColumn *column; + GtkWidget *swin, *view; + + swin = gtk_scrolled_window_new (NULL, NULL); + gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (swin), + GTK_POLICY_AUTOMATIC, + GTK_POLICY_AUTOMATIC); + gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (swin), + GTK_SHADOW_IN); + gtk_box_pack_start (GTK_BOX (parent), swin, FALSE, FALSE, 0); + gtk_widget_show (swin); + gtk_widget_set_size_request (swin, 150,-1); + + store = gtk_list_store_new (1, G_TYPE_STRING); + view = gtk_tree_view_new_with_model (GTK_TREE_MODEL (store)); + + gtk_tree_view_set_headers_visible (GTK_TREE_VIEW (view), FALSE); + g_object_unref (store); + gtk_widget_show (view); + + renderer = gtk_cell_renderer_text_new (); + column = gtk_tree_view_column_new_with_attributes ("Preset", renderer, + "text", 0, + NULL); + gtk_tree_view_append_column (GTK_TREE_VIEW (view), column); + + gtk_container_add (GTK_CONTAINER (swin), view); + + selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (view)); + gtk_tree_selection_set_mode (selection, GTK_SELECTION_BROWSE); + g_signal_connect (selection, "changed", G_CALLBACK (changed_cb), NULL); + + return view; +} + +static void +dialog_response (GtkWidget *widget, + gint response_id, + gpointer data) +{ + switch (response_id) + { + case GTK_RESPONSE_OK: + store_values (); + pcvals.run = TRUE; + gtk_widget_destroy (widget); + break; + + default: + gtk_widget_destroy (widget); + break; + } +} + +static GtkWidget * +create_dialog (void) +{ + GtkWidget *notebook; + GtkWidget *hbox; + GtkWidget *preview_box; + + gimp_ui_init (PLUG_IN_BINARY, TRUE); + + dialog = gimp_dialog_new (_("GIMPressionist"), PLUG_IN_ROLE, + NULL, 0, + gimp_standard_help_func, PLUG_IN_PROC, + + _("_Cancel"), GTK_RESPONSE_CANCEL, + _("_OK"), GTK_RESPONSE_OK, + + NULL); + + gtk_dialog_set_alternative_button_order (GTK_DIALOG (dialog), + GTK_RESPONSE_OK, + GTK_RESPONSE_CANCEL, + -1); + + gimp_window_set_transient (GTK_WINDOW (dialog)); + + g_signal_connect (dialog, "response", + G_CALLBACK (dialog_response), + NULL); + g_signal_connect (dialog, "destroy", + G_CALLBACK (gtk_main_quit), + NULL); + + hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 12); + gtk_container_set_border_width (GTK_CONTAINER (hbox), 12); + gtk_box_pack_start (GTK_BOX (gtk_dialog_get_content_area (GTK_DIALOG (dialog))), + hbox, TRUE, TRUE, 0); + gtk_widget_show (hbox); + + preview_box = create_preview (); + gtk_box_pack_start (GTK_BOX (hbox), preview_box, FALSE, FALSE, 0); + gtk_widget_show (preview_box); + + notebook = gtk_notebook_new (); + gtk_box_pack_start (GTK_BOX (hbox), notebook, TRUE, TRUE, 5); + gtk_widget_show (notebook); + + create_presetpage (GTK_NOTEBOOK (notebook)); + create_paperpage (GTK_NOTEBOOK (notebook)); + create_brushpage (GTK_NOTEBOOK (notebook)); + create_orientationpage (GTK_NOTEBOOK (notebook)); + create_sizepage (GTK_NOTEBOOK (notebook)); + create_placementpage (GTK_NOTEBOOK (notebook)); + create_colorpage (GTK_NOTEBOOK (notebook)); + create_generalpage (GTK_NOTEBOOK (notebook)); + + updatepreview (NULL, NULL); + + /* + * This is to make sure the values from the pcvals will be reflected + * in the GUI here. Otherwise they will be set to the defaults. + * */ + restore_values (); + + gtk_widget_show (dialog); + + return dialog; +} + +gint +create_gimpressionist (void) +{ + pcvals.run = FALSE; + + create_dialog (); + + gtk_main (); + + return pcvals.run; +} diff --git a/plug-ins/gimpressionist/gimpressionist.h b/plug-ins/gimpressionist/gimpressionist.h new file mode 100644 index 0000000..ba944e0 --- /dev/null +++ b/plug-ins/gimpressionist/gimpressionist.h @@ -0,0 +1,181 @@ +/* GIMP - The GNU Image Manipulation Program + * Copyright (C) 1995 Spencer Kimball and Peter Mattis + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <https://www.gnu.org/licenses/>. + */ + +#ifndef __GIMPRESSIONIST_H +#define __GIMPRESSIONIST_H + +/* Includes necessary for the correct processing of this file. */ +#include <libgimp/gimp.h> +#include <libgimp/gimpui.h> + +#include "ppmtool.h" +/* Defines */ + +#define PLUG_IN_PROC "plug-in-gimpressionist" +#define PLUG_IN_VERSION "v1.0, November 2003" +#define PLUG_IN_BINARY "gimpressionist" +#define PLUG_IN_ROLE "gimp-gimpressionist" + +#define PREVIEWSIZE 150 +#define MAXORIENTVECT 50 +#define MAXSIZEVECT 50 + +/* Type declaration and definitions */ + +typedef struct vector +{ + double x, y; + double dir; + double dx, dy; + double str; + int type; +} vector_t; + +typedef struct smvector +{ + double x, y; + double siz; + double str; +} smvector_t; + +typedef struct +{ + int orient_num; + double orient_first; + double orient_last; + int orient_type; + double brush_relief; + double brush_scale; + double brush_density; + double brushgamma; + int general_background_type; + double general_dark_edge; + double paper_relief; + double paper_scale; + int paper_invert; + int run; + char selected_brush[200]; + char selected_paper[200]; + GimpRGB color; + int general_paint_edges; + int place_type; + vector_t orient_vectors[MAXORIENTVECT]; + int num_orient_vectors; + int placement_center; + double brush_aspect; + double orient_angle_offset; + double orient_strength_exponent; + int general_tileable; + int paper_overlay; + int orient_voronoi; + int color_brushes; + int general_drop_shadow; + double general_shadow_darkness; + int size_num; + double size_first; + double size_last; + int size_type; + double devthresh; + + smvector_t size_vectors[MAXSIZEVECT]; + int num_size_vectors; + double size_strength_exponent; + int size_voronoi; + + int general_shadow_depth; + int general_shadow_blur; + + int color_type; + double color_noise; +} gimpressionist_vals_t; + +/* Enumerations */ + +enum GENERAL_BG_TYPE_ENUM +{ + BG_TYPE_SOLID = 0, + BG_TYPE_KEEP_ORIGINAL = 1, + BG_TYPE_FROM_PAPER = 2, + BG_TYPE_TRANSPARENT = 3, +}; + +enum PRESETS_LIST_COLUMN_ENUM +{ + PRESETS_LIST_COLUMN_FILENAME = 0, + PRESETS_LIST_COLUMN_OBJECT_NAME = 1, +}; + +/* Globals */ + +extern gimpressionist_vals_t pcvals; + + +/* Prototypes */ + +GList *parsepath (void); +void free_parsepath_cache (void); + +void grabarea (void); +void store_values (void); +void restore_values (void); +gchar *findfile (const gchar *); + +void unselectall (GtkWidget *list); +void reselect (GtkWidget *list, char *fname); +void readdirintolist (const char *subdir, GtkWidget *view, char *selected); +void readdirintolist_extended (const char *subdir, + GtkWidget *view, char *selected, + gboolean with_filename_column, + gchar *(*get_object_name_cb) (const gchar *dir, + gchar *filename, + void *context), + void * context); + +GtkWidget *create_one_column_list (GtkWidget *parent, + void (*changed_cb) + (GtkTreeSelection *selection, + gpointer data)); + +void brush_reload (const gchar *fn, struct ppm *p); + +double get_direction (double x, double y, int from); + +void create_sizemap_dialog (GtkWidget *parent); +double getsiz_proto (double x, double y, int n, smvector_t *vec, + double smstrexp, int voronoi); + + +void set_colorbrushes (const gchar *fn); +int create_gimpressionist (void); + +double dist (double x, double y, double dx, double dy); + +void restore_default_values (void); + +GtkWidget *create_radio_button (GtkWidget *box, int orient_type, + void (*callback)(GtkWidget *wg, void *d), + const gchar *label, + const gchar *help_string, + GSList **radio_group, + GtkWidget **buttons_array + ); + +#define CLAMP_UP_TO(x, max) (CLAMP((x),(0),(max-1))) + +#endif /* #ifndef __GIMPRESSIONIST_H */ + + diff --git a/plug-ins/gimpressionist/globals.c b/plug-ins/gimpressionist/globals.c new file mode 100644 index 0000000..8b4bf5e --- /dev/null +++ b/plug-ins/gimpressionist/globals.c @@ -0,0 +1,86 @@ +/* GIMP - The GNU Image Manipulation Program + * Copyright (C) 1995 Spencer Kimball and Peter Mattis + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <https://www.gnu.org/licenses/>. + */ + +#include "config.h" + +#include <libgimp/gimp.h> +#include <libgimp/gimpui.h> + +#include "gimpressionist.h" +#include "ppmtool.h" + +gboolean img_has_alpha = FALSE; +GRand *random_generator; +gimpressionist_vals_t pcvals; + +/* + * The default values for the application, to be initialized at startup. + * */ +static const gimpressionist_vals_t defaultpcvals = { + 4, + 0.0, + 60.0, + 0, + 12.0, + 20.0, + 20.0, + 1.0, + 1, + 0.1, + 0.0, + 30.0, + 0, + 0, + "defaultbrush.pgm", + "defaultpaper.pgm", + {0,0,0,1.0}, + 1, + 0, + { { 0.5, 0.5, 0.0, 0.0, 1.0, 1.0, 0 } }, + 1, + 0, + 0.0, + 0.0, + 1.0, + 0, + 0, + 0, + 0, + 0, + 20.0, + 1, + 10.0, + 20.0, + 0, + 0.1, + + { { 0.5, 0.5, 50.0, 1.0 } }, + 1, + 1.0, + 0, + + 10, + 4, + + 0, 0.0 +}; + +void +restore_default_values (void) +{ + pcvals = defaultpcvals; +} diff --git a/plug-ins/gimpressionist/infile.h b/plug-ins/gimpressionist/infile.h new file mode 100644 index 0000000..b263428 --- /dev/null +++ b/plug-ins/gimpressionist/infile.h @@ -0,0 +1,32 @@ +/* GIMP - The GNU Image Manipulation Program + * Copyright (C) 1995 Spencer Kimball and Peter Mattis + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <https://www.gnu.org/licenses/>. + */ + +#ifndef __INFILE_H +#define __INFILE_H + +#include "ppmtool.h" + +/* Globals */ + +extern gboolean img_has_alpha; + +/* Prototypes */ + +void infile_copy_to_ppm(ppm_t * p); +void infile_copy_alpha_to_ppm(ppm_t * p); + +#endif diff --git a/plug-ins/gimpressionist/orientation.c b/plug-ins/gimpressionist/orientation.c new file mode 100644 index 0000000..1a5183d --- /dev/null +++ b/plug-ins/gimpressionist/orientation.c @@ -0,0 +1,206 @@ +/* GIMP - The GNU Image Manipulation Program + * Copyright (C) 1995 Spencer Kimball and Peter Mattis + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <https://www.gnu.org/licenses/>. + */ + +#include "config.h" + +#include <gtk/gtk.h> + +#include <libgimp/gimp.h> +#include <libgimp/gimpui.h> + +#include "gimpressionist.h" +#include "orientation.h" +#include "orientmap.h" + +#include "libgimp/stdplugins-intl.h" + +static GtkWidget *orient_radio[NUMORIENTRADIO]; +static GtkObject *orient_num_adjust = NULL; +static GtkObject *orient_first_adjust = NULL; +static GtkObject *orient_last_adjust = NULL; + + +static void +orientation_store (GtkWidget *wg, void *d) +{ + pcvals.orient_type = GPOINTER_TO_INT (d); +} + +int orientation_type_input (int in) +{ + return CLAMP_UP_TO (in, NUMORIENTRADIO); +} + +void orientation_restore (void) +{ + gtk_toggle_button_set_active ( + GTK_TOGGLE_BUTTON (orient_radio[pcvals.orient_type]), + TRUE); + gtk_adjustment_set_value ( + GTK_ADJUSTMENT (orient_num_adjust), + pcvals.orient_num); + gtk_adjustment_set_value ( + GTK_ADJUSTMENT (orient_first_adjust), + pcvals.orient_first); + gtk_adjustment_set_value ( + GTK_ADJUSTMENT (orient_last_adjust), + pcvals.orient_last); +} + +static void +create_orientmap_dialog_helper (GtkWidget *widget) +{ + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (orient_radio[7]), TRUE); + + create_orientmap_dialog (widget); +} + + +static void +create_orientradio_button (GtkWidget *box, + int orient_type, + const gchar *label, + const gchar *help_string, + GSList **radio_group) +{ + create_radio_button (box, orient_type, orientation_store, label, + help_string, radio_group, orient_radio); +} + +void +create_orientationpage (GtkNotebook *notebook) +{ + GtkWidget *box2, *box3, *box4, *thispage; + GtkWidget *label, *tmpw, *table; + GSList *radio_group = NULL; + + label = gtk_label_new_with_mnemonic (_("Or_ientation")); + + thispage = gtk_box_new (GTK_ORIENTATION_VERTICAL, 12); + gtk_container_set_border_width (GTK_CONTAINER (thispage), 12); + gtk_widget_show (thispage); + + table = gtk_table_new (3, 3, FALSE); + gtk_table_set_col_spacings (GTK_TABLE (table), 6); + gtk_table_set_row_spacings (GTK_TABLE (table), 6); + gtk_box_pack_start (GTK_BOX (thispage), table, FALSE, FALSE, 0); + gtk_widget_show (table); + + orient_num_adjust = + gimp_scale_entry_new (GTK_TABLE (table), 0, 0, + _("Directions:"), + 150, -1, pcvals.orient_num, + 1.0, 30.0, 1.0, 1.0, 0, + TRUE, 0, 0, + _("The number of directions (i.e. brushes) to use"), + NULL); + g_signal_connect (orient_num_adjust, "value-changed", + G_CALLBACK (gimp_int_adjustment_update), + &pcvals.orient_num); + + orient_first_adjust = + gimp_scale_entry_new (GTK_TABLE (table), 0, 1, + _("Start angle:"), + 150, -1, pcvals.orient_first, + 0.0, 360.0, 1.0, 10.0, 0, + TRUE, 0, 0, + _("The starting angle of the first brush to create"), + NULL); + g_signal_connect (orient_first_adjust, "value-changed", + G_CALLBACK (gimp_double_adjustment_update), + &pcvals.orient_first); + + orient_last_adjust = + gimp_scale_entry_new (GTK_TABLE (table), 0, 2, + _("Angle span:"), + 150, -1, pcvals.orient_last, + 0.0, 360.0, 1.0, 10.0, 0, + TRUE, 0, 0, + _("The angle span of the first brush to create"), + NULL); + g_signal_connect (orient_last_adjust, "value-changed", + G_CALLBACK (gimp_double_adjustment_update), + &pcvals.orient_last); + + box2 = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 12); + gtk_box_pack_start (GTK_BOX (thispage), box2, FALSE, FALSE, 0); + gtk_widget_show (box2); + + box3 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 6); + gtk_box_pack_start (GTK_BOX (box2), box3, FALSE, FALSE, 0); + gtk_widget_show (box3); + + tmpw = gtk_label_new (_("Orientation:")); + gtk_box_pack_start (GTK_BOX (box3), tmpw, FALSE, FALSE, 0); + gtk_widget_show (tmpw); + + box3 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 6); + gtk_box_pack_start (GTK_BOX (box2), box3, FALSE, FALSE, 0); + gtk_widget_show (box3); + + create_orientradio_button (box3, ORIENTATION_VALUE, _("Value"), + _("Let the value (brightness) of the region determine the direction of the stroke"), + &radio_group); + + create_orientradio_button (box3, ORIENTATION_RADIUS, _("Radius"), + _("The distance from the center of the image determines the direction of the stroke"), + &radio_group); + + create_orientradio_button (box3, ORIENTATION_RANDOM, _("Random"), + _("Selects a random direction of each stroke"), + &radio_group); + + create_orientradio_button (box3, ORIENTATION_RADIAL, _("Radial"), + _("Let the direction from the center determine the direction of the stroke"), + &radio_group); + + box3 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 6); + gtk_box_pack_start (GTK_BOX (box2), box3, FALSE, FALSE, 0); + gtk_widget_show (box3); + + create_orientradio_button (box3, ORIENTATION_FLOWING, _("Flowing"), + _("The strokes follow a \"flowing\" pattern"), + &radio_group); + + create_orientradio_button (box3, ORIENTATION_HUE, _("Hue"), + _("The hue of the region determines the direction of the stroke"), + &radio_group); + + create_orientradio_button (box3, ORIENTATION_ADAPTIVE, _("Adaptive"), + _("The direction that matches the original image the closest is selected"), + &radio_group); + + box4 = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 6); + gtk_box_pack_start (GTK_BOX (box3), box4, FALSE, FALSE, 0); + gtk_widget_show (box4); + + create_orientradio_button (box4, ORIENTATION_MANUAL, _("Manual"), + _("Manually specify the stroke orientation"), + &radio_group); + + orientation_restore (); + + tmpw = gtk_button_new_with_mnemonic (_("_Edit")); + gtk_box_pack_start (GTK_BOX (box4), tmpw, FALSE, FALSE, 0); + gtk_widget_show (tmpw); + g_signal_connect (tmpw, "clicked", + G_CALLBACK (create_orientmap_dialog_helper), NULL); + gimp_help_set_help_data + (tmpw, _("Opens up the Orientation Map Editor"), NULL); + + gtk_notebook_append_page_menu (notebook, thispage, label, NULL); +} diff --git a/plug-ins/gimpressionist/orientation.h b/plug-ins/gimpressionist/orientation.h new file mode 100644 index 0000000..6355f59 --- /dev/null +++ b/plug-ins/gimpressionist/orientation.h @@ -0,0 +1,39 @@ +/* GIMP - The GNU Image Manipulation Program + * Copyright (C) 1995 Spencer Kimball and Peter Mattis + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <https://www.gnu.org/licenses/>. + */ + +#ifndef __ORIENTATION_H +#define __ORIENTATION_H + +#define NUMORIENTRADIO 8 + +enum ORIENTATION_ENUM +{ + ORIENTATION_VALUE = 0, + ORIENTATION_RADIUS = 1, + ORIENTATION_RANDOM = 2, + ORIENTATION_RADIAL = 3, + ORIENTATION_FLOWING = 4, + ORIENTATION_HUE = 5, + ORIENTATION_ADAPTIVE = 6, + ORIENTATION_MANUAL = 7, +}; + +void create_orientationpage (GtkNotebook *); +void orientation_restore (void); +int orientation_type_input (int in); + +#endif /* #ifndef __ORIENTATION_H */ diff --git a/plug-ins/gimpressionist/orientmap.c b/plug-ins/gimpressionist/orientmap.c new file mode 100644 index 0000000..1b8b765 --- /dev/null +++ b/plug-ins/gimpressionist/orientmap.c @@ -0,0 +1,717 @@ +/* GIMP - The GNU Image Manipulation Program + * Copyright (C) 1995 Spencer Kimball and Peter Mattis + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <https://www.gnu.org/licenses/>. + */ + +#include "config.h" + +#include <gtk/gtk.h> + +#include <libgimp/gimp.h> +#include <libgimp/gimpui.h> + +#include "gimpressionist.h" +#include "ppmtool.h" +#include "infile.h" + +#include "preview.h" + +#include "orientmap.h" + +#include "libgimp/stdplugins-intl.h" + +#define NUMVECTYPES 4 + +static GtkWidget *orient_map_window; + +static GtkWidget *vector_preview; +static GtkWidget *orient_map_preview_prev; +static GtkWidget *prev_button; +static GtkWidget *next_button; +static GtkWidget *add_button; +static GtkWidget *kill_button; +static GtkAdjustment *vector_preview_brightness_adjust = NULL; + +static GtkAdjustment *angle_adjust = NULL; +static GtkAdjustment *strength_adjust = NULL; +static GtkAdjustment *orient_map_str_exp_adjust = NULL; +static GtkAdjustment *angle_offset_adjust = NULL; +static GtkWidget *vector_types[NUMVECTYPES]; +static GtkWidget *orient_voronoi = NULL; + +#define OMWIDTH 150 +#define OMHEIGHT 150 + +static vector_t vector[MAXORIENTVECT]; +static gint num_vectors = 0; +static gint vector_type; + +static ppm_t update_om_preview_nbuffer = {0, 0, NULL}; + +static gint selectedvector = 0; +static ppm_t update_vector_preview_backup = {0, 0, NULL}; +static ppm_t update_vector_preview_buffer = {0, 0, NULL}; + +static gboolean adjignore = FALSE; + +double get_direction (double x, double y, int from) +{ + gint i; + gint n; + gint voronoi; + gdouble sum, dx, dy, dst; + vector_t *vec; + gdouble angoff, strexp; + gint first = 0, last; + + if (from == 0) + { + n = num_vectors; + vec = vector; + angoff = gtk_adjustment_get_value (angle_offset_adjust); + strexp = gtk_adjustment_get_value (orient_map_str_exp_adjust); + voronoi = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (orient_voronoi)); + } + else + { + n = pcvals.num_orient_vectors; + vec = pcvals.orient_vectors; + angoff = pcvals.orient_angle_offset; + strexp = pcvals.orient_strength_exponent; + voronoi = pcvals.orient_voronoi; + } + + if (voronoi) + { + gdouble bestdist = -1.0; + + for (i = 0; i < n; i++) + { + dst = dist (x,y,vec[i].x,vec[i].y); + + if ((bestdist < 0.0) || (dst < bestdist)) + { + bestdist = dst; + first = i; + } + } + last = first+1; + } + else + { + first = 0; + last = n; + } + + dx = dy = 0.0; + sum = 0.0; + for (i = first; i < last; i++) + { + gdouble s = vec[i].str; + gdouble tx = 0.0, ty = 0.0; + + if (vec[i].type == 0) + { + tx = vec[i].dx; + ty = vec[i].dy; + } + else if (vec[i].type == 1) + { + gdouble a = atan2 (vec[i].dy, vec[i].dx); + + a -= atan2 (y-vec[i].y, x-vec[i].x); + tx = sin (a + G_PI_2); + ty = cos (a + G_PI_2); + } + else if (vec[i].type == 2) + { + gdouble a = atan2 (vec[i].dy, vec[i].dx); + + a += atan2 (y-vec[i].y, x-vec[i].x); + tx = sin (a + G_PI_2); + ty = cos (a + G_PI_2); + } + else if (vec[i].type == 3) + { + gdouble a = atan2 (vec[i].dy, vec[i].dx); + + a -= atan2 (y-vec[i].y, x-vec[i].x)*2; + tx = sin (a + G_PI_2); + ty = cos (a + G_PI_2); + } + + dst = dist (x,y,vec[i].x,vec[i].y); + dst = pow (dst, strexp); + + if (dst < 0.0001) + dst = 0.0001; + s = s / dst; + + dx += tx * s; + dy += ty * s; + sum += s; + } + dx = dx / sum; + dy = dy / sum; + + return 90 - (gimp_rad_to_deg (atan2 (dy, dx)) + angoff); +} + +static void +update_orient_map_preview_prev (void) +{ + int x, y; + guchar black[3] = {0, 0, 0}; + guchar gray[3] = {120, 120, 120}; + guchar white[3] = {255, 255, 255}; + + if (!PPM_IS_INITED (&update_om_preview_nbuffer)) + ppm_new (&update_om_preview_nbuffer,OMWIDTH,OMHEIGHT); + + fill (&update_om_preview_nbuffer, black); + + for (y = 6; y < OMHEIGHT-4; y += 10) + for (x = 6; x < OMWIDTH-4; x += 10) + { + double dir = + gimp_deg_to_rad (get_direction (x / (double)OMWIDTH, + y / (double)OMHEIGHT,0)); + double xo = sin (dir) * 4.0; + double yo = cos (dir) * 4.0; + ppm_drawline (&update_om_preview_nbuffer, + x - xo, y - yo, x + xo, y + yo, + gray); + ppm_put_rgb (&update_om_preview_nbuffer, + x - xo, y - yo, + white); + } + + gimp_preview_area_draw (GIMP_PREVIEW_AREA (orient_map_preview_prev), + 0, 0, OMWIDTH, OMHEIGHT, + GIMP_RGB_IMAGE, + (guchar *)update_om_preview_nbuffer.col, + OMWIDTH * 3); + + gtk_widget_queue_draw (orient_map_preview_prev); + + gtk_widget_set_sensitive (prev_button, (num_vectors > 1)); + gtk_widget_set_sensitive (next_button, (num_vectors > 1)); + gtk_widget_set_sensitive (add_button, (num_vectors < MAXORIENTVECT)); + gtk_widget_set_sensitive (kill_button, (num_vectors > 1)); +} + +static void +update_vector_prev (void) +{ + static gint ok = 0; + gint i, x, y; + gdouble dir, xo, yo; + gdouble val; + static gdouble last_val = 0.0; + guchar gray[3] = {120, 120, 120}; + guchar red[3] = {255, 0, 0}; + guchar white[3] = {255, 255, 255}; + + if (vector_preview_brightness_adjust) + val = 1.0 - gtk_adjustment_get_value (vector_preview_brightness_adjust) / 100.0; + else + val = 0.5; + + if (!ok || (val != last_val)) + { + infile_copy_to_ppm (&update_vector_preview_backup); + ppm_apply_brightness (&update_vector_preview_backup, val, 1,1,1); + + if ((update_vector_preview_backup.width != OMWIDTH) || + (update_vector_preview_backup.height != OMHEIGHT)) + resize_fast (&update_vector_preview_backup, OMWIDTH, OMHEIGHT); + ok = 1; + } + ppm_copy (&update_vector_preview_backup, &update_vector_preview_buffer); + + for (i = 0; i < num_vectors; i++) + { + gdouble s; + + x = vector[i].x * OMWIDTH; + y = vector[i].y * OMHEIGHT; + dir = gimp_deg_to_rad (vector[i].dir); + s = gimp_deg_to_rad (vector[i].str); + xo = sin (dir) * (6.0+100*s); + yo = cos (dir) * (6.0+100*s); + + if (i == selectedvector) + { + ppm_drawline (&update_vector_preview_buffer, + x - xo, y - yo, x + xo, y + yo, red); + } + else + { + ppm_drawline (&update_vector_preview_buffer, + x - xo, y - yo, x + xo, y + yo, gray); + } + ppm_put_rgb (&update_vector_preview_buffer, x - xo, y - yo, white); + } + + gimp_preview_area_draw (GIMP_PREVIEW_AREA (vector_preview), + 0, 0, OMWIDTH, OMHEIGHT, + GIMP_RGB_IMAGE, + (guchar *)update_vector_preview_buffer.col, + OMWIDTH * 3); +} + +void +orientation_map_free_resources (void) +{ + ppm_kill (&update_om_preview_nbuffer); + ppm_kill (&update_vector_preview_backup); + ppm_kill (&update_vector_preview_buffer); +} + +static void +update_slides (void) +{ + gint type; + + adjignore = TRUE; + gtk_adjustment_set_value (angle_adjust, vector[selectedvector].dir); + gtk_adjustment_set_value (strength_adjust, vector[selectedvector].str); + type = vector[selectedvector].type; + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (vector_types[type]), TRUE); + adjignore = FALSE; +} + +static void +prev_click_callback (GtkWidget *w, gpointer data) +{ + selectedvector--; + if (selectedvector < 0) + selectedvector = num_vectors-1; + update_slides (); + update_vector_prev (); +} + +static void +next_click_callback (GtkWidget *w, gpointer data) +{ + selectedvector++; + if (selectedvector == num_vectors) selectedvector = 0; + update_slides (); + update_vector_prev (); +} + +static void +add_new_vector (gdouble x, gdouble y) +{ + vector[num_vectors].x = x; + vector[num_vectors].y = y; + vector[num_vectors].dir = 0.0; + vector[num_vectors].dx = sin (gimp_deg_to_rad (0.0)); + vector[num_vectors].dy = cos (gimp_deg_to_rad (0.0)); + vector[num_vectors].str = 1.0; + vector[num_vectors].type = 0; + selectedvector = num_vectors; + num_vectors++; +} + +static void +add_click_callback (GtkWidget *w, gpointer data) +{ + add_new_vector (0.5, 0.5); + update_slides (); + update_vector_prev (); + update_orient_map_preview_prev (); +} + +static void +delete_click_callback (GtkWidget *w, gpointer data) +{ + int i; + + for (i = selectedvector; i < num_vectors-1; i++) + vector[i] = vector[i + 1]; + + num_vectors--; + + if (selectedvector >= num_vectors) selectedvector = 0; + update_slides (); + update_vector_prev (); + update_orient_map_preview_prev (); +} + +static void +map_click_callback (GtkWidget *w, GdkEventButton *event) +{ + if (event->button == 1) + { + vector[selectedvector].x = event->x / (double)OMWIDTH; + vector[selectedvector].y = event->y / (double)OMHEIGHT; + } + else if (event->button == 2) + { + if (num_vectors + 1 == MAXORIENTVECT) + return; + add_new_vector (event->x / (double)OMWIDTH, + event->y / (double)OMHEIGHT); + update_slides (); + + } + else if (event->button == 3) + { + gdouble d; + + d = atan2 (OMWIDTH * vector[selectedvector].x - event->x, + OMHEIGHT * vector[selectedvector].y - event->y); + vector[selectedvector].dir = gimp_rad_to_deg (d); + vector[selectedvector].dx = sin (d); + vector[selectedvector].dy = cos (d); + update_slides (); + } + update_vector_prev (); + update_orient_map_preview_prev (); +} + +static void +angle_adjust_move_callback (GtkWidget *w, gpointer data) +{ + if (adjignore) + return; + vector[selectedvector].dir = gtk_adjustment_get_value (angle_adjust); + vector[selectedvector].dx = + sin (gimp_deg_to_rad (vector[selectedvector].dir)); + vector[selectedvector].dy = + cos (gimp_deg_to_rad (vector[selectedvector].dir)); + update_vector_prev (); + update_orient_map_preview_prev (); +} + +static void +strength_adjust_move_callback (GtkWidget *w, gpointer data) +{ + if (adjignore) + return; + vector[selectedvector].str = gtk_adjustment_get_value (strength_adjust); + update_vector_prev (); + update_orient_map_preview_prev (); +} + +static void +strength_exponent_adjust_move_callback (GtkWidget *w, gpointer data) +{ + if (adjignore) + return; + update_vector_prev (); + update_orient_map_preview_prev (); +} + +static void +angle_offset_adjust_move_callback (GtkWidget *w, gpointer data) +{ + if (adjignore) + return; + update_vector_prev (); + update_orient_map_preview_prev (); +} + +static void +vector_type_click_callback (GtkWidget *w, gpointer data) +{ + if (adjignore) + return; + + gimp_radio_button_update (w, data); + vector[selectedvector].type = vector_type; + update_vector_prev (); + update_orient_map_preview_prev (); +} + +static void +orient_map_response (GtkWidget *widget, + gint response_id, + gpointer data) +{ + switch (response_id) + { + case GTK_RESPONSE_APPLY: + case GTK_RESPONSE_OK: + { + gint i; + + for (i = 0; i < num_vectors; i++) + pcvals.orient_vectors[i] = vector[i]; + + pcvals.num_orient_vectors = num_vectors; + pcvals.orient_strength_exponent = gtk_adjustment_get_value (orient_map_str_exp_adjust); + pcvals.orient_angle_offset = gtk_adjustment_get_value (angle_offset_adjust); + pcvals.orient_voronoi = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (orient_voronoi)); + } + }; + + if (response_id != GTK_RESPONSE_APPLY) + gtk_widget_hide (widget); +} + +static void +init_vectors (void) +{ + if (pcvals.num_orient_vectors) + { + gint i; + + num_vectors = pcvals.num_orient_vectors; + for (i = 0; i < num_vectors; i++) + vector[i] = pcvals.orient_vectors[i]; + } + else + {/* Shouldn't happen */ + num_vectors = 0; + add_new_vector (0.5, 0.5); + } + if (selectedvector >= num_vectors) + selectedvector = num_vectors-1; +} + +void +update_orientmap_dialog (void) +{ + if (!orient_map_window) return; + + init_vectors (); + + gtk_adjustment_set_value (orient_map_str_exp_adjust, + pcvals.orient_strength_exponent); + gtk_adjustment_set_value (angle_offset_adjust, + pcvals.orient_angle_offset); + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (orient_voronoi), + pcvals.orient_voronoi); + + update_vector_prev (); + update_orient_map_preview_prev (); +} + +void +create_orientmap_dialog (GtkWidget *parent) +{ + GtkWidget *tmpw, *tmpw2; + GtkWidget *table1, *table2; + GtkWidget *frame; + GtkWidget *ebox, *hbox, *vbox; + + init_vectors (); + + if (orient_map_window) + { + update_vector_prev (); + update_orient_map_preview_prev (); + gtk_widget_show (orient_map_window); + return; + } + + orient_map_window = + gimp_dialog_new (_("Orientation Map Editor"), PLUG_IN_ROLE, + gtk_widget_get_toplevel (parent), 0, + gimp_standard_help_func, PLUG_IN_PROC, + + _("_Apply"), GTK_RESPONSE_APPLY, + _("_Cancel"), GTK_RESPONSE_CANCEL, + _("_OK"), GTK_RESPONSE_OK, + + NULL); + + gtk_dialog_set_alternative_button_order (GTK_DIALOG (orient_map_window), + GTK_RESPONSE_OK, + GTK_RESPONSE_APPLY, + GTK_RESPONSE_CANCEL, + -1); + + g_signal_connect (orient_map_window, "response", + G_CALLBACK (orient_map_response), + orient_map_window); + g_signal_connect (orient_map_window, "destroy", + G_CALLBACK (gtk_widget_destroyed), + &orient_map_window); + + table1 = gtk_table_new (2, 5, FALSE); + gtk_container_set_border_width (GTK_CONTAINER (table1), 6); + gtk_box_pack_start (GTK_BOX (gtk_dialog_get_content_area (GTK_DIALOG (orient_map_window))), + table1, TRUE, TRUE, 0); + gtk_widget_show (table1); + + frame = gtk_frame_new (_("Vectors")); + gtk_container_set_border_width (GTK_CONTAINER (frame), 2); + gtk_table_attach (GTK_TABLE (table1), frame, 0, 1, 0, 1, + GTK_EXPAND, GTK_EXPAND, 0, 0); + gtk_widget_show (frame); + + hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0); + gtk_container_add (GTK_CONTAINER (frame), hbox); + gtk_widget_show (hbox); + + ebox = gtk_event_box_new (); + gimp_help_set_help_data (ebox, + _("The vector-field. " + "Left-click to move selected vector, " + "Right-click to point it towards mouse, " + "Middle-click to add a new vector."), NULL); + gtk_box_pack_start (GTK_BOX (hbox), ebox, FALSE, FALSE, 0); + + tmpw = vector_preview = gimp_preview_area_new (); + gtk_widget_set_size_request (tmpw, OMWIDTH, OMHEIGHT); + gtk_container_add (GTK_CONTAINER (ebox), tmpw); + gtk_widget_show (tmpw); + gtk_widget_add_events (ebox, GDK_BUTTON_PRESS_MASK); + g_signal_connect (ebox, "button-press-event", + G_CALLBACK (map_click_callback), NULL); + gtk_widget_show (ebox); + + vector_preview_brightness_adjust = (GtkAdjustment *) + gtk_adjustment_new (50.0, 0.0, 100.0, 1.0, 1.0, 1.0); + tmpw = gtk_scale_new (GTK_ORIENTATION_VERTICAL, + vector_preview_brightness_adjust); + gtk_scale_set_draw_value (GTK_SCALE (tmpw), FALSE); + gtk_box_pack_start (GTK_BOX (hbox), tmpw, FALSE, FALSE,0); + gtk_widget_show (tmpw); + g_signal_connect (vector_preview_brightness_adjust, "value-changed", + G_CALLBACK (update_vector_prev), NULL); + gimp_help_set_help_data (tmpw, _("Adjust the preview's brightness"), NULL); + + tmpw2 = tmpw = gtk_frame_new (_("Preview")); + gtk_container_set_border_width (GTK_CONTAINER (tmpw), 2); + gtk_table_attach (GTK_TABLE (table1), tmpw, 1,2, 0,1, + GTK_EXPAND, GTK_EXPAND, 0, 0); + gtk_widget_show (tmpw); + + tmpw = orient_map_preview_prev = gimp_preview_area_new (); + gtk_widget_set_size_request (tmpw, OMWIDTH, OMHEIGHT); + gtk_container_add (GTK_CONTAINER (tmpw2), tmpw); + gtk_widget_show (tmpw); + + hbox = tmpw = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0); + gtk_box_set_homogeneous (GTK_BOX (hbox), TRUE); + gtk_container_set_border_width (GTK_CONTAINER (tmpw), 2); + gtk_table_attach_defaults (GTK_TABLE (table1), tmpw, 0,1, 1,2); + gtk_widget_show (tmpw); + + prev_button = tmpw = gtk_button_new_with_mnemonic ("_<<"); + gtk_box_pack_start (GTK_BOX (hbox), tmpw, FALSE, TRUE, 0); + gtk_widget_show (tmpw); + g_signal_connect (tmpw, "clicked", G_CALLBACK (prev_click_callback), NULL); + gimp_help_set_help_data (tmpw, _("Select previous vector"), NULL); + + next_button = tmpw = gtk_button_new_with_mnemonic ("_>>"); + gtk_box_pack_start (GTK_BOX (hbox),tmpw,FALSE,TRUE,0); + gtk_widget_show (tmpw); + g_signal_connect (tmpw, "clicked", G_CALLBACK (next_click_callback), NULL); + gimp_help_set_help_data (tmpw, _("Select next vector"), NULL); + + add_button = tmpw = gtk_button_new_with_mnemonic ( _("A_dd")); + gtk_box_pack_start (GTK_BOX (hbox), tmpw, FALSE, TRUE, 0); + gtk_widget_show (tmpw); + g_signal_connect (tmpw, "clicked", G_CALLBACK (add_click_callback), NULL); + gimp_help_set_help_data (tmpw, _("Add new vector"), NULL); + + kill_button = tmpw = gtk_button_new_with_mnemonic ( _("_Kill")); + gtk_box_pack_start (GTK_BOX (hbox), tmpw, FALSE, TRUE, 0); + gtk_widget_show (tmpw); + g_signal_connect (tmpw, "clicked", G_CALLBACK (delete_click_callback), NULL); + gimp_help_set_help_data (tmpw, _("Delete selected vector"), NULL); + + hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0); + gtk_box_set_spacing (GTK_BOX (hbox), 12); + gtk_table_attach_defaults (GTK_TABLE (table1), hbox, 0, 2, 2, 3); + gtk_widget_show (hbox); + + vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0); + gtk_box_pack_start (GTK_BOX (hbox), vbox, TRUE, TRUE, 0); + gtk_widget_show (vbox); + + frame = gimp_int_radio_group_new (TRUE, _("Type"), + G_CALLBACK (vector_type_click_callback), + &vector_type, 0, + + _("_Normal"), 0, &vector_types[0], + _("Vorte_x"), 1, &vector_types[1], + _("Vortex_2"), 2, &vector_types[2], + _("Vortex_3"), 3, &vector_types[3], + + NULL); + gtk_box_pack_start (GTK_BOX (vbox), frame, TRUE, TRUE, 0); + gtk_widget_show (frame); + + orient_voronoi = tmpw = gtk_check_button_new_with_mnemonic ( _("_Voronoi")); + gtk_box_pack_start (GTK_BOX (vbox), tmpw, TRUE, TRUE, 0); + gtk_widget_show (tmpw); + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (tmpw), + pcvals.orient_voronoi); + g_signal_connect (tmpw, "clicked", + G_CALLBACK (angle_offset_adjust_move_callback), NULL); + gimp_help_set_help_data (tmpw, + _("Voronoi-mode makes only the vector closest to the given point have any influence"), + NULL); + + table2 = gtk_table_new (4, 3, FALSE); + gtk_table_set_col_spacings (GTK_TABLE (table2), 4); + gtk_box_pack_start (GTK_BOX (hbox), table2, TRUE, TRUE, 0); + gtk_widget_show (table2); + + angle_adjust = (GtkAdjustment *) + gimp_scale_entry_new (GTK_TABLE (table2), 0, 0, + _("A_ngle:"), + 150, 6, 0.0, + 0.0, 360.0, 1.0, 10.0, 1, + TRUE, 0, 0, + _("Change the angle of the selected vector"), + NULL); + g_signal_connect (angle_adjust, "value-changed", + G_CALLBACK (angle_adjust_move_callback), NULL); + + angle_offset_adjust = (GtkAdjustment *) + gimp_scale_entry_new (GTK_TABLE (table2), 0, 1, + _("Ang_le offset:"), + 150, 6, 0.0, + 0.0, 360.0, 1.0, 10.0, 1, + TRUE, 0, 0, + _("Offset all vectors with a given angle"), + NULL); + g_signal_connect (angle_offset_adjust, "value-changed", + G_CALLBACK (angle_offset_adjust_move_callback), NULL); + + strength_adjust = (GtkAdjustment *) + gimp_scale_entry_new (GTK_TABLE (table2), 0, 2, + _("_Strength:"), + 150, 6, 1.0, + 0.1, 5.0, 0.1, 1.0, 1, + TRUE, 0, 0, + _("Change the strength of the selected vector"), + NULL); + g_signal_connect (strength_adjust, "value-changed", + G_CALLBACK (strength_adjust_move_callback), NULL); + + orient_map_str_exp_adjust = (GtkAdjustment *) + gimp_scale_entry_new (GTK_TABLE (table2), 0, 3, + _("S_trength exp.:"), + 150, 6, 1.0, + 0.1, 10.9, 0.1, 1.0, 1, + TRUE, 0, 0, + _("Change the exponent of the strength"), + NULL); + g_signal_connect (orient_map_str_exp_adjust, "value-changed", + G_CALLBACK (strength_exponent_adjust_move_callback), NULL); + + gtk_widget_show (orient_map_window); + + update_vector_prev (); + update_orient_map_preview_prev (); +} diff --git a/plug-ins/gimpressionist/orientmap.h b/plug-ins/gimpressionist/orientmap.h new file mode 100644 index 0000000..480908d --- /dev/null +++ b/plug-ins/gimpressionist/orientmap.h @@ -0,0 +1,25 @@ +/* GIMP - The GNU Image Manipulation Program + * Copyright (C) 1995 Spencer Kimball and Peter Mattis + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <https://www.gnu.org/licenses/>. + */ + +#ifndef __ORIENTMAP_H +#define __ORIENTMAP_H + +void create_orientmap_dialog (GtkWidget *parent); +void update_orientmap_dialog (void); +void orientation_map_free_resources(void); + +#endif diff --git a/plug-ins/gimpressionist/paper.c b/plug-ins/gimpressionist/paper.c new file mode 100644 index 0000000..562b0e4 --- /dev/null +++ b/plug-ins/gimpressionist/paper.c @@ -0,0 +1,221 @@ +/* GIMP - The GNU Image Manipulation Program + * Copyright (C) 1995 Spencer Kimball and Peter Mattis + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <https://www.gnu.org/licenses/>. + */ + +#include "config.h" + +#include <string.h> + +#include <gtk/gtk.h> + +#include <libgimp/gimp.h> +#include <libgimp/gimpui.h> + +#include "gimpressionist.h" +#include "ppmtool.h" +#include "paper.h" + +#include "libgimp/stdplugins-intl.h" + + +static GtkWidget *paper_preview = NULL; +static GtkWidget *paper_invert = NULL; +static GtkWidget *paper_list = NULL; +static GtkObject *paper_relief_adjust = NULL; +static GtkObject *paper_scale_adjust = NULL; +static GtkWidget *paper_overlay = NULL; + +static void paper_update_preview (void) +{ + gint i, j; + guchar *buf, *paper_preview_buffer; + gdouble sc; + ppm_t p = {0, 0, NULL}; + + ppm_load (pcvals.selected_paper, &p); + sc = p.width > p.height ? p.width : p.height; + sc = 100.0 / sc; + resize (&p, p.width*sc,p.height*sc); + + paper_preview_buffer = g_new0 (guchar, 100*100); + + for (i = 0, buf = paper_preview_buffer; i < 100; i++, buf += 100) + { + gint k = i * p.width * 3; + + if (i < p.height) + { + for (j = 0; j < p.width; j++) + buf[j] = p.col[k + j * 3]; + if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (paper_invert))) + for (j = 0; j < p.width; j++) + buf[j] = 255 - buf[j]; + } + } + gimp_preview_area_draw (GIMP_PREVIEW_AREA (paper_preview), + 0, 0, 100, 100, + GIMP_GRAY_IMAGE, + paper_preview_buffer, + 100); + + ppm_kill (&p); + g_free (paper_preview_buffer); + + gtk_widget_queue_draw (paper_preview); +} + +static void +paper_select (GtkTreeSelection *selection, + gpointer data) +{ + GtkTreeIter iter; + GtkTreeModel *model; + + if (gtk_tree_selection_get_selected (selection, &model, &iter)) + { + gchar *paper; + + gtk_tree_model_get (model, &iter, 0, &paper, -1); + + if (paper) + { + gchar *fname = g_build_filename ("Paper", paper, NULL); + + g_strlcpy (pcvals.selected_paper, + fname, sizeof (pcvals.selected_paper)); + + paper_update_preview (); + + g_free (fname); + g_free (paper); + } + } +} + +void +paper_restore (void) +{ + reselect (paper_list, pcvals.selected_paper); + gtk_adjustment_set_value (GTK_ADJUSTMENT (paper_relief_adjust), pcvals.paper_relief); + gtk_adjustment_set_value (GTK_ADJUSTMENT (paper_scale_adjust), pcvals.paper_scale); + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (paper_invert), pcvals.paper_invert); + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (paper_overlay), pcvals.paper_overlay); +} + +void +paper_store (void) +{ + pcvals.paper_invert = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (paper_invert)); + pcvals.paper_overlay = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (paper_overlay)); +} + +void +create_paperpage (GtkNotebook *notebook) +{ + GtkWidget *box1, *thispage, *box2; + GtkWidget *label, *tmpw, *table; + GtkWidget *view; + GtkWidget *frame; + GtkTreeSelection *selection; + GtkTreeIter iter; + GtkListStore *paper_store_list; + + label = gtk_label_new_with_mnemonic (_("P_aper")); + + thispage = gtk_box_new (GTK_ORIENTATION_VERTICAL, 12); + gtk_container_set_border_width (GTK_CONTAINER (thispage), 12); + gtk_widget_show (thispage); + + box1 = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 12); + gtk_box_pack_start (GTK_BOX (thispage), box1, TRUE, TRUE, 0); + gtk_widget_show (box1); + + paper_list = view = create_one_column_list (box1, paper_select); + paper_store_list = + GTK_LIST_STORE (gtk_tree_view_get_model (GTK_TREE_VIEW (view))); + selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (view)); + + box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 12); + gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, FALSE, 0); + gtk_widget_show (box2); + + frame = gtk_frame_new (NULL); + gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_IN); + gtk_box_pack_start (GTK_BOX (box2), frame, FALSE, FALSE, 0); + gtk_widget_show (frame); + + paper_preview = tmpw = gimp_preview_area_new (); + gtk_widget_set_size_request (tmpw, 100, 100); + gtk_container_add (GTK_CONTAINER (frame), tmpw); + gtk_widget_show (tmpw); + + paper_invert = tmpw = gtk_check_button_new_with_mnemonic ( _("_Invert")); + gtk_box_pack_start (GTK_BOX (box2), tmpw, FALSE, FALSE, 0); + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (tmpw), FALSE); + gtk_widget_show (tmpw); + g_signal_connect_swapped (tmpw, "clicked", + G_CALLBACK (paper_select), selection); + gimp_help_set_help_data (tmpw, _("Inverts the Papers texture"), NULL); + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (tmpw), + pcvals.paper_invert); + + paper_overlay = tmpw = gtk_check_button_new_with_mnemonic ( _("O_verlay")); + gtk_box_pack_start (GTK_BOX (box2), tmpw, FALSE, FALSE, 0); + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (tmpw), FALSE); + gtk_widget_show (tmpw); + gimp_help_set_help_data + (tmpw, _("Applies the paper as it is (without embossing it)"), NULL); + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (tmpw), + pcvals.paper_overlay); + + table = gtk_table_new (2, 3, FALSE); + gtk_table_set_col_spacings (GTK_TABLE (table), 6); + gtk_table_set_row_spacings (GTK_TABLE (table), 6); + gtk_box_pack_start (GTK_BOX (thispage), table, FALSE, FALSE, 0); + gtk_widget_show (table); + + paper_scale_adjust = + gimp_scale_entry_new (GTK_TABLE (table), 0, 0, + _("Scale:"), + 150, -1, pcvals.paper_scale, + 3.0, 150.0, 1.0, 10.0, 1, + TRUE, 0, 0, + _("Specifies the scale of the texture (in percent of original file)"), + NULL); + g_signal_connect (paper_scale_adjust, "value-changed", + G_CALLBACK (gimp_double_adjustment_update), + &pcvals.paper_scale); + + paper_relief_adjust = + gimp_scale_entry_new (GTK_TABLE (table), 0, 1, + _("Relief:"), + 150, -1, pcvals.paper_relief, + 0.0, 100.0, 1.0, 10.0, 1, + TRUE, 0, 0, + _("Specifies the amount of embossing to apply to the image (in percent)"), + NULL); + g_signal_connect (paper_relief_adjust, "value-changed", + G_CALLBACK (gimp_double_adjustment_update), + &pcvals.paper_relief); + + + if (gtk_tree_model_get_iter_first (GTK_TREE_MODEL (paper_store_list), &iter)) + gtk_tree_selection_select_iter (selection, &iter); + + paper_select (selection, NULL); + readdirintolist ("Paper", view, pcvals.selected_paper); + gtk_notebook_append_page_menu (notebook, thispage, label, NULL); +} diff --git a/plug-ins/gimpressionist/paper.h b/plug-ins/gimpressionist/paper.h new file mode 100644 index 0000000..ee7b45c --- /dev/null +++ b/plug-ins/gimpressionist/paper.h @@ -0,0 +1,25 @@ +/* GIMP - The GNU Image Manipulation Program + * Copyright (C) 1995 Spencer Kimball and Peter Mattis + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <https://www.gnu.org/licenses/>. + */ + +#ifndef __PAPER_H +#define __PAPER_H + +void create_paperpage(GtkNotebook *); +void paper_store(void); +void paper_restore(void); + +#endif diff --git a/plug-ins/gimpressionist/placement.c b/plug-ins/gimpressionist/placement.c new file mode 100644 index 0000000..1c4ce59 --- /dev/null +++ b/plug-ins/gimpressionist/placement.c @@ -0,0 +1,130 @@ +/* GIMP - The GNU Image Manipulation Program + * Copyright (C) 1995 Spencer Kimball and Peter Mattis + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <https://www.gnu.org/licenses/>. + */ + +#include "config.h" + +#include <gtk/gtk.h> + +#include <libgimp/gimp.h> +#include <libgimp/gimpui.h> + +#include "gimpressionist.h" +#include "placement.h" + +#include "libgimp/stdplugins-intl.h" + + +#define NUM_PLACE_RADIO 2 + +static GtkWidget *placement_radio[NUM_PLACE_RADIO]; +static GtkWidget *placement_center = NULL; +static GtkObject *brush_density_adjust = NULL; + +void +place_restore (void) +{ + gtk_toggle_button_set_active + (GTK_TOGGLE_BUTTON (placement_radio[pcvals.place_type]), TRUE); + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (placement_center), + pcvals.placement_center); + gtk_adjustment_set_value (GTK_ADJUSTMENT (brush_density_adjust), + pcvals.brush_density); +} + +int +place_type_input (int in) +{ + return CLAMP_UP_TO (in, NUM_PLACE_RADIO); +} + +void +place_store (void) +{ + pcvals.placement_center = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (placement_center)); +} + +void +create_placementpage (GtkNotebook *notebook) +{ + GtkWidget *vbox; + GtkWidget *label, *tmpw, *table, *frame; + + label = gtk_label_new_with_mnemonic (_("Pl_acement")); + + vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 12); + gtk_container_set_border_width (GTK_CONTAINER (vbox), 12); + gtk_widget_show (vbox); + + frame = gimp_int_radio_group_new (TRUE, _("Placement"), + G_CALLBACK (gimp_radio_button_update), + &pcvals.place_type, 0, + + _("Randomly"), + PLACEMENT_TYPE_RANDOM, + &placement_radio[PLACEMENT_TYPE_RANDOM], + + _("Evenly distributed"), + PLACEMENT_TYPE_EVEN_DIST, + &placement_radio[PLACEMENT_TYPE_EVEN_DIST], + + NULL); + + gimp_help_set_help_data + (placement_radio[PLACEMENT_TYPE_RANDOM], + _("Place strokes randomly around the image"), + NULL); + gimp_help_set_help_data + (placement_radio[PLACEMENT_TYPE_EVEN_DIST], + _("The strokes are evenly distributed across the image"), + NULL); + + gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0); + gtk_widget_show (frame); + + gtk_toggle_button_set_active + (GTK_TOGGLE_BUTTON (placement_radio[pcvals.place_type]), TRUE); + + placement_center = gtk_check_button_new_with_mnemonic ( _("Centered")); + tmpw = placement_center; + + gtk_box_pack_start (GTK_BOX (vbox), tmpw, FALSE, FALSE, 0); + gtk_widget_show (tmpw); + gimp_help_set_help_data + (tmpw, _("Focus the brush strokes around the center of the image"), NULL); + + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (tmpw), + pcvals.placement_center); + + table = gtk_table_new (1, 3, FALSE); + gtk_table_set_col_spacings (GTK_TABLE (table), 6); + gtk_box_pack_start (GTK_BOX (vbox), table, FALSE, FALSE, 0); + gtk_widget_show (table); + + brush_density_adjust = + gimp_scale_entry_new (GTK_TABLE (table), 0, 0, + _("Stroke _density:"), + 100, -1, pcvals.brush_density, + 1.0, 50.0, 1.0, 5.0, 0, + TRUE, 0, 0, + _("The relative density of the brush strokes"), + NULL); + g_signal_connect (brush_density_adjust, "value-changed", + G_CALLBACK (gimp_double_adjustment_update), + &pcvals.brush_density); + + gtk_notebook_append_page_menu (notebook, vbox, label, NULL); +} diff --git a/plug-ins/gimpressionist/placement.h b/plug-ins/gimpressionist/placement.h new file mode 100644 index 0000000..f308731 --- /dev/null +++ b/plug-ins/gimpressionist/placement.h @@ -0,0 +1,32 @@ +/* GIMP - The GNU Image Manipulation Program + * Copyright (C) 1995 Spencer Kimball and Peter Mattis + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <https://www.gnu.org/licenses/>. + */ + +#ifndef __PLACEMENT_H +#define __PLACEMENT_H + +enum PLACEMENT_TYPE_ENUM +{ + PLACEMENT_TYPE_RANDOM = 0, + PLACEMENT_TYPE_EVEN_DIST = 1, +}; + +void place_store (void); +void place_restore (void); +void create_placementpage (GtkNotebook *); +int place_type_input (int in); + +#endif diff --git a/plug-ins/gimpressionist/plasma.c b/plug-ins/gimpressionist/plasma.c new file mode 100644 index 0000000..82f9212 --- /dev/null +++ b/plug-ins/gimpressionist/plasma.c @@ -0,0 +1,122 @@ +/* GIMP - The GNU Image Manipulation Program + * Copyright (C) 1995 Spencer Kimball and Peter Mattis + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <https://www.gnu.org/licenses/>. + */ + +#include "config.h" + +#include <stdlib.h> + +#include <gtk/gtk.h> + +#include <libgimpmath/gimpmath.h> +#include <libgimp/gimp.h> + +#include "gimpressionist.h" +#include "ppmtool.h" +#include "random.h" + +static int +pfix (int n) +{ + if (n < 1) return 1; + if (n > 255) return 255; + return n; +} + +#define PIXEL(y,x,z) p->col[(y) * rowstride + (x) * 3 + z] + +static void +mkplasma_sub (ppm_t *p, int x1, int x2, int y1, int y2, float turb) +{ + int rowstride = p->width * 3; + int r=0; + int xr, yr, nx, ny; + + xr = abs (x1 - x2); + yr = abs (y1 - y2); + + if ((xr == 0) && (yr == 0)) + return; + + nx = (x1 + x2)/2; + ny = (y1 + y2)/2; + if (!PIXEL (y1,nx,r)) + PIXEL (y1, nx, r) = pfix ((PIXEL (y1, x1, r) + PIXEL (y1, x2, r)) / 2.0 + + turb * g_rand_double_range (random_generator, + -xr / 2.0, + xr / 2.0)); + if (!PIXEL (y2, nx, r)) + PIXEL (y2, nx, r) = pfix ((PIXEL (y2, x1, r) + PIXEL (y2, x2, r)) / 2.0 + + turb * g_rand_double_range (random_generator, + -xr / 2.0, + xr / 2.0)); + if (!PIXEL (ny, x1, r)) + PIXEL (ny, x1, r) = pfix ((PIXEL (y1, x1, r)+PIXEL (y2, x1, r)) / 2.0 + + turb * g_rand_double_range (random_generator, + -yr / 2.0, + yr / 2.0)); + if (!PIXEL (ny, x2, r)) + PIXEL (ny, x2, r) = pfix ((PIXEL (y1, x2, r) + PIXEL (y2, x2, r)) / 2.0 + + turb * g_rand_double_range (random_generator, + -yr / 2.0, + yr / 2.0)); + if (!PIXEL (ny, nx, r)) + PIXEL (ny, nx, r) = + pfix ((PIXEL (y1, x1, r) + PIXEL (y1, x2, r) + + PIXEL (y2, x1, r) + PIXEL( y2, x2, r)) / 4.0 + + turb * g_rand_double_range (random_generator, + -(xr + yr)/4.0, + (xr + yr)/4.0)); + + if (xr>1) + { + mkplasma_sub (p, x1, nx, y1, ny, turb); + mkplasma_sub (p, nx, x2, y1, ny, turb); + } + if (yr>1) + { + mkplasma_sub (p, x1, nx, ny, y2, turb); + mkplasma_sub (p, nx, x2, ny, y2, turb); + } +} + +static void +mkplasma_red (ppm_t *p, float turb) +{ + int x = 0, y = 0; + int rowstride = p->width * 3; + + for (x = 0; x < p->width; x++) + for (y = 0; y < p->height; y++) + PIXEL (y, x, 0) = 0; + x--; y--; + PIXEL (0, 0, 0) = g_rand_int_range (random_generator, 1, 256); + PIXEL (y, 0, 0) = g_rand_int_range (random_generator, 1, 256); + PIXEL (0, x, 0) = g_rand_int_range (random_generator, 1, 256); + PIXEL (y, x, 0) = g_rand_int_range (random_generator, 1, 256); + mkplasma_sub (p, 0, x, 0, y, turb); +} + +void +mkgrayplasma (ppm_t *p, float turb) +{ + int y, l; + + mkplasma_red (p, turb); + l = p->width * 3 * p->height; + for (y = 0; y < l; y += 3) + p->col[y+1] = p->col[y+2] = p->col[y]; +} diff --git a/plug-ins/gimpressionist/ppmtool.c b/plug-ins/gimpressionist/ppmtool.c new file mode 100644 index 0000000..307779e --- /dev/null +++ b/plug-ins/gimpressionist/ppmtool.c @@ -0,0 +1,904 @@ +/* GIMP - The GNU Image Manipulation Program + * Copyright (C) 1995 Spencer Kimball and Peter Mattis + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <https://www.gnu.org/licenses/>. + */ + +#include "config.h" + +#include <string.h> +#include <stdlib.h> +#include <errno.h> + +#include <glib/gstdio.h> + +#include <libgimp/gimp.h> +#include <libgimpmath/gimpmath.h> + +#include "ppmtool.h" +#include "gimpressionist.h" + +#include "libgimp/stdplugins-intl.h" + +static int +readline (FILE *f, char *buffer, int len) +{ + do + { + if (!fgets (buffer, len, f)) + return -1; + } + while (buffer[0] == '#'); + + g_strchomp (buffer); + return 0; +} + +void +ppm_kill (ppm_t *p) +{ + g_free (p->col); + p->col = NULL; + p->height = p->width = 0; +} + +void ppm_new (ppm_t *p, int xs, int ys) +{ + int x; + guchar bgcol[3] = {0,0,0}; + + if (xs < 1) + xs = 1; + if (ys < 1) + ys = 1; + + p->width = xs; + p->height = ys; + p->col = g_malloc (xs * 3 * ys); + for (x = 0; x < xs * 3 * ys; x += 3) + { + p->col[x+0] = bgcol[0]; + p->col[x+1] = bgcol[1]; + p->col[x+2] = bgcol[2]; + } +} + +void +get_rgb (ppm_t *s, float xo, float yo, guchar *d) +{ + float ix, iy; + int x1, x2, y1, y2; + float x1y1, x2y1, x1y2, x2y2; + float r, g, b; + int bail = 0; + int rowstride = s->width * 3; + + if (xo < 0.0) + bail=1; + else if (xo >= s->width-1) + { + xo = s->width-1; +#if 0 + bail=1; +#endif + } + + if (yo < 0.0) + bail=1; + else if (yo >= s->height-1) + { + yo= s->height-1; +#if 0 + bail=1; +#endif + } + + if (bail) + { + d[0] = d[1] = d[2] = 0; + return; + } + + ix = (int)xo; + iy = (int)yo; + +#if 0 + x1 = wrap(ix, s->width); + x2 = wrap(ix+1, s->width); + y1 = wrap(iy, s->height); + y2 = wrap(iy+1, s->height); +#endif + x1 = ix; x2 = ix + 1; + y1 = iy; y2 = iy + 1; + +#if 0 + printf("x1=%d y1=%d x2=%d y2=%d\n",x1,y1,x2,y2); +#endif + + x1y1 = (1.0 - xo + ix) * (1.0 - yo + iy); + x2y1 = (xo - ix) * (1.0 - yo + iy); + x1y2 = (1.0 - xo + ix) * (yo - iy); + x2y2 = (xo - ix) * (yo - iy); + + r = s->col[y1 * rowstride + x1 * 3 + 0] * x1y1; + g = s->col[y1 * rowstride + x1 * 3 + 1] * x1y1; + b = s->col[y1 * rowstride + x1 * 3 + 2] * x1y1; + + if (x2y1 > 0.0) + r += s->col[y1 * rowstride + x2 * 3 + 0] * x2y1; + if (x2y1 > 0.0) + g += s->col[y1 * rowstride + x2 * 3 + 1] * x2y1; + if (x2y1 > 0.0) + b += s->col[y1 * rowstride + x2 * 3 + 2] * x2y1; + + if (x1y2 > 0.0) + r += s->col[y2 * rowstride + x1 * 3 + 0] * x1y2; + if (x1y2 > 0.0) + g += s->col[y2 * rowstride + x1 * 3 + 1] * x1y2; + if (x1y2 > 0.0) + b += s->col[y2 * rowstride + x1 * 3 + 2] * x1y2; + + if (x2y2 > 0.0) + r += s->col[y2 * rowstride + x2 * 3 + 0] * x2y2; + if (x2y2 > 0.0) + g += s->col[y2 * rowstride + x2 * 3 + 1] * x2y2; + if (x2y2 > 0.0) + b += s->col[y2 * rowstride + x2 * 3 + 2] * x2y2; + + d[0] = r; + d[1] = g; + d[2] = b; +} + + +void +resize (ppm_t *p, int nx, int ny) +{ + int x, y; + float xs = p->width / (float)nx; + float ys = p->height / (float)ny; + ppm_t tmp = {0, 0, NULL}; + + ppm_new (&tmp, nx, ny); + for (y = 0; y < ny; y++) + { + guchar *row = tmp.col + y * tmp.width * 3; + + for (x = 0; x < nx; x++) + { + get_rgb (p, x * xs, y * ys, &row[x * 3]); + } + } + ppm_kill (p); + p->width = tmp.width; + p->height = tmp.height; + p->col = tmp.col; +} + +void +rescale (ppm_t *p, double sc) +{ + resize (p, p->width * sc, p->height * sc); +} + +void resize_fast (ppm_t *p, int nx, int ny) +{ + int x, y; + float xs = p->width / (float)nx; + float ys = p->height / (float)ny; + ppm_t tmp = {0, 0, NULL}; + + ppm_new (&tmp, nx, ny); + for (y = 0; y < ny; y++) + { + for (x = 0; x < nx; x++) + { + gint rx = x * xs, ry = y * ys; + + memcpy (&tmp.col[y * tmp.width * 3 + x * 3], + &p->col[ry * p->width * 3 + rx * 3], + 3); + } + } + ppm_kill (p); + p->width = tmp.width; + p->height = tmp.height; + p->col = tmp.col; +} + + +struct _BrushHeader +{ + unsigned int header_size; /* header_size = sz_BrushHeader + brush name */ + unsigned int version; /* brush file version # */ + unsigned int width; /* width of brush */ + unsigned int height; /* height of brush */ + unsigned int bytes; /* depth of brush in bytes--always 1 */ + unsigned int magic_number;/* GIMP brush magic number */ + unsigned int spacing; /* brush spacing */ +}; + +static void +msb2lsb (unsigned int *i) +{ + guchar *p = (guchar *)i, c; + + c = p[1]; p[1] = p[2]; p[2] = c; + c = p[0]; p[0] = p[3]; p[3] = c; +} + +static FILE * +fopen_from_search_path (const gchar * fn, const char * mode) +{ + FILE * f; + gchar * full_filename; + + f = g_fopen (fn, mode); + if (!f) + { + full_filename = findfile (fn); + f = g_fopen (full_filename, mode); + g_free (full_filename); + } + return f; +} + +static void +load_gimp_brush (const gchar *fn, ppm_t *p) +{ + FILE *f; + struct _BrushHeader hdr; + gchar *ptr; + gint x, y; + + f = fopen_from_search_path (fn, "rb"); + ppm_kill (p); + + if (!f) + { + g_printerr ("load_gimp_brush: Unable to open file \"%s\"!\n", + gimp_filename_to_utf8 (fn)); + ppm_new (p, 10,10); + return; + } + + fread (&hdr, 1, sizeof (struct _BrushHeader), f); + + for (x = 0; x < 7; x++) + msb2lsb (&((unsigned int *)&hdr)[x]); + + ppm_new (p, hdr.width, hdr.height); + + ptr = g_malloc (hdr.width); + fseek (f, hdr.header_size, SEEK_SET); + for (y = 0; y < p->height; y++) + { + fread (ptr, p->width, 1, f); + for (x = 0; x < p->width; x++) + { + int k = y * p->width * 3 + x * 3; + p->col[k+0] = p->col[k+1] = p->col[k+2] = ptr[x]; + } + } + fclose (f); + g_free (ptr); +} + +void +ppm_load (const char *fn, ppm_t *p) +{ + char line[200]; + int y, pgm = 0; + FILE *f; + + if (!strcmp (&fn[strlen (fn)-4], ".gbr")) + { + load_gimp_brush(fn, p); + return; + } + + f = fopen_from_search_path (fn, "rb"); + + ppm_kill (p); + + if (!f) + { + g_printerr ("ppm_load: Unable to open file \"%s\"!\n", + gimp_filename_to_utf8 (fn)); + ppm_new (p, 10,10); + return; + } + + readline (f, line, 200); + if (strcmp (line, "P6")) + { + if (strcmp (line, "P5")) + { + fclose (f); + g_printerr ("ppm_load: File \"%s\" not PPM/PGM? (line=\"%s\")%c\n", + gimp_filename_to_utf8 (fn), line, 7); + ppm_new (p, 10,10); + return; + } + pgm = 1; + } + readline (f, line, 200); + p->width = atoi (line); + p->height = atoi (strchr (line, ' ')+1); + readline (f, line, 200); + if (strcmp (line, "255")) + { + fclose (f); + g_printerr ("ppm_load: File \"%s\" not valid PPM/PGM? (line=\"%s\")%c\n", + gimp_filename_to_utf8 (fn), line, 7); + ppm_new (p, 10,10); + return; + } + p->col = g_malloc (p->height * p->width * 3); + + if (!pgm) + { + fread (p->col, p->height * 3 * p->width, 1, f); + } + else + { + guchar *tmpcol = g_malloc (p->width * p->height); + + fread (tmpcol, p->height * p->width, 1, f); + for (y = 0; y < p->width * p->height * 3; y++) { + p->col[y] = tmpcol[y / 3]; + } + + g_free (tmpcol); + } + fclose (f); +} + +void +fill (ppm_t *p, guchar *c) +{ + int x, y; + + if ((c[0] == c[1]) && (c[0] == c[2])) + { + guchar col = c[0]; + for (y = 0; y < p->height; y++) + { + memset(p->col + y*p->width*3, col, p->width*3); + } + } + else + { + for (y = 0; y < p->height; y++) + { + guchar *row = p->col + y * p->width * 3; + + for (x = 0; x < p->width; x++) + { + int k = x * 3; + + row[k+0] = c[0]; + row[k+1] = c[1]; + row[k+2] = c[2]; + } + } + } +} + +void +ppm_copy (ppm_t *s, ppm_t *p) +{ + ppm_kill (p); + p->width = s->width; + p->height = s->height; + p->col = g_memdup (s->col, p->width * 3 * p->height); +} + +void +free_rotate (ppm_t *p, double amount) +{ + int x, y; + double nx, ny; + ppm_t tmp = {0, 0, NULL}; + double f = amount * G_PI * 2 / 360.0; + int rowstride = p->width * 3; + + ppm_new (&tmp, p->width, p->height); + for (y = 0; y < p->height; y++) + { + for (x = 0; x < p->width; x++) + { + double r, d; + + nx = fabs (x - p->width / 2.0); + ny = fabs (y - p->height / 2.0); + r = sqrt (nx * nx + ny * ny); + + d = atan2 ((y - p->height / 2.0), (x - p->width / 2.0)); + + nx = (p->width / 2.0 + cos (d - f) * r); + ny = (p->height / 2.0 + sin (d - f) * r); + get_rgb (p, nx, ny, tmp.col + y * rowstride + x * 3); + } + } + ppm_kill (p); + p->width = tmp.width; + p->height = tmp.height; + p->col = tmp.col; +} + +void +crop (ppm_t *p, int lx, int ly, int hx, int hy) +{ + ppm_t tmp = {0,0,NULL}; + int x, y; + int srowstride = p->width * 3; + int drowstride; + + ppm_new (&tmp, hx - lx, hy - ly); + drowstride = tmp.width * 3; + for (y = ly; y < hy; y++) + for (x = lx; x < hx; x++) + memcpy (&tmp.col[(y - ly) * drowstride + (x - lx) * 3], + &p->col[y * srowstride + x * 3], + 3); + ppm_kill (p); + p->col = tmp.col; + p->width = tmp.width; + p->height = tmp.height; +} + +void +autocrop (ppm_t *p, int room) +{ + int lx = 0, hx = p->width, ly = 0, hy = p->height; + int x, y, n = 0; + guchar tc[3]; + ppm_t tmp = {0,0,NULL}; + int rowstride = p->width * 3; + int drowstride; + + /* upper */ + memcpy (&tc, p->col, 3); + for (y = 0; y < p->height; y++) + { + n = 0; + for (x = 0; x < p->width; x++) + { + if (memcmp (&tc, &p->col[y*rowstride+x*3], 3)) + { + n++; + break; + } + } + if (n) + break; + } + if (n) + ly = y; +#if 0 + printf("ly = %d\n", ly); +#endif + + /* lower */ + memcpy (&tc, &p->col[(p->height - 1) * rowstride], 3); + for (y = p->height-1; y >= 0; y--) + { + n = 0; + for (x = 0; x < p->width; x++) + { + if (memcmp (&tc, &p->col[y*rowstride+x*3], 3)) + { + n++; + break; + } + } + if (n) + break; + } + if (n) + hy = y+1; + if (hy >= p->height) + hy = p->height - 1; +#if 0 + printf("hy = %d\n", hy); +#endif + + /* left */ + memcpy (&tc, &p->col[ly * rowstride], 3); + for (x = 0; x < p->width; x++) + { + n = 0; + for (y = ly; y <= hy && y < p->height; y++) + { + if (memcmp (&tc, &p->col[y * rowstride + x * 3], 3)) + { + n++; + break; + } + } + if (n) + break; + } + if (n) + lx = x; +#if 0 + printf("lx = %d\n", lx); +#endif + + /* right */ + memcpy + (&tc, &p->col[ly * rowstride + (p->width - 1) * 3], 3); + for (x = p->width-1; x >= 0; x--) + { + n = 0; + for (y = ly; y <= hy; y++) + { + if (memcmp (&tc, &p->col[y * rowstride + x * 3], 3)) + { + n++; + break; + } + } + if (n) + break; + } + if (n) + hx = x + 1; +#if 0 + printf("hx = %d\n", hx); +#endif + + lx -= room; if (lx < 0) lx = 0; + ly -= room; if (ly < 0) ly = 0; + hx += room; if (hx >= p->width) hx = p->width - 1; + hy += room; if (hy >= p->height) hy = p->height - 1; + + ppm_new (&tmp, hx - lx, hy - ly); + drowstride = tmp.width * 3; + for (y = ly; y < hy; y++) + for (x = lx; x < hx; x++) + memcpy (&tmp.col[(y - ly) * drowstride + (x - lx) * 3], + &p->col[y * rowstride + x * 3], + 3); + ppm_kill (p); + p->col = tmp.col; + p->width = tmp.width; + p->height = tmp.height; +} + +void +ppm_pad (ppm_t *p, int left,int right, int top, int bottom, guchar *bg) +{ + int x, y; + ppm_t tmp = {0, 0, NULL}; + + ppm_new (&tmp, p->width + left + right, p->height + top + bottom); + for (y = 0; y < tmp.height; y++) + { + guchar *row, *srcrow; + + row = tmp.col + y * tmp.width * 3; + if ((y < top) || (y >= tmp.height-bottom)) + { + for (x = 0; x < tmp.width; x++) + { + int k = x * 3; + + row[k+0] = bg[0]; + row[k+1] = bg[1]; + row[k+2] = bg[2]; + } + continue; + } + srcrow = p->col + (y-top) * p->width * 3; + for (x = 0; x < left; x++) + { + int k = x * 3; + + row[k+0] = bg[0]; + row[k+1] = bg[1]; + row[k+2] = bg[2]; + } + for (; x < tmp.width-right; x++) + { + int k = y * tmp.width * 3 + x * 3; + + tmp.col[k+0] = srcrow[(x - left) * 3 + 0]; + tmp.col[k+1] = srcrow[(x - left) * 3 + 1]; + tmp.col[k+2] = srcrow[(x - left) * 3 + 2]; + } + for (; x < tmp.width; x++) + { + int k = x * 3; + + row[k+0] = bg[0]; + row[k+1] = bg[1]; + row[k+2] = bg[2]; + } + } + ppm_kill (p); + p->width = tmp.width; + p->height = tmp.height; + p->col = tmp.col; +} + +void +ppm_save (ppm_t *p, const char *fn) +{ + FILE *f = g_fopen (fn, "wb"); + + if (!f) + { + /* + * gimp_filename_to_utf8 () and g_strerror () return temporary strings + * that need not and should not be freed. So this call is OK. + * */ + g_message (_("Failed to save PPM file '%s': %s"), + gimp_filename_to_utf8 (fn), g_strerror (errno)); + return; + } + + fprintf (f, "P6\n%d %d\n255\n", p->width, p->height); + fwrite (p->col, p->width * 3 * p->height, 1, f); + fclose (f); +} + +void +edgepad (ppm_t *p, int left,int right, int top, int bottom) +{ + int x, y; + ppm_t tmp = {0, 0, NULL}; + guchar testcol[3] = {0, 255, 0}; + int srowstride, drowstride; + + ppm_new (&tmp, p->width+left+right, p->height+top+bottom); + fill (&tmp, testcol); + + srowstride = p->width * 3; + drowstride = tmp.width * 3; + + for (y = 0; y < top; y++) + { + memcpy (&tmp.col[y * drowstride + left * 3], p->col, srowstride); + } + for (; y-top < p->height; y++) + { + memcpy (&tmp.col[y * drowstride + left * 3], + p->col + (y - top) * srowstride, + srowstride); + } + for (; y < tmp.height ; y++) + { + memcpy (&tmp.col[y * drowstride + left * 3], + p->col + (p->height - 1) * srowstride, + srowstride); + } + for (y = 0; y < tmp.height; y++) + { + guchar *col, *tmprow; + + tmprow = tmp.col + y*drowstride; + col = tmp.col + y*drowstride + left*3; + + for (x = 0; x < left; x++) + { + memcpy (&tmprow[x * 3], col, 3); + } + col = tmp.col + y * drowstride + (tmp.width-right - 1) * 3; + for (x = 0; x < right; x++) + { + memcpy (&tmprow[(x + tmp.width - right - 1) * 3], col, 3); + } + } + ppm_kill (p); + p->width = tmp.width; + p->height = tmp.height; + p->col = tmp.col; +} + +void +ppm_apply_gamma (ppm_t *p, float e, int r, int g, int b) +{ + int x, l = p->width * 3 * p->height; + guchar xlat[256], *pix; + + if (e > 0.0) + for (x = 0; x < 256; x++) + { + xlat[x] = pow ((x / 255.0), (1.0 / e)) * 255.0; + } + else if (e < 0.0) + for (x = 0; x < 256; x++) + { + xlat[255-x] = pow ((x / 255.0), (-1.0 / e)) * 255.0; + } + else + for (x = 0; x < 256; x++) + { + xlat[x] = 0; + } + + pix = p->col; + if (r) + for (x = 0; x < l; x += 3) + pix[x] = xlat[pix[x]]; + if (g) + for (x = 1; x < l; x += 3) + pix[x] = xlat[pix[x]]; + if (b) + for (x = 2; x < l; x += 3) + pix[x] = xlat[pix[x]]; +} + +void +ppm_apply_brightness (ppm_t *p, float e, int r, int g, int b) +{ + int x, l = p->width * 3 * p->height; + guchar xlat[256], *pix; + for (x = 0; x < 256; x++) + xlat[x] = x * e; + + pix = p->col; + if (r) + for (x = 0; x < l; x += 3) + pix[x] = xlat[pix[x]]; + if (g) + for (x = 1; x < l; x += 3) + pix[x] = xlat[pix[x]]; + if (b) + for (x = 2; x < l; x += 3) + pix[x] = xlat[pix[x]]; +} + +void +blur (ppm_t *p, int xrad, int yrad) +{ + int x, y, k; + int tx, ty; + ppm_t tmp = {0,0,NULL}; + int r, g, b, n; + int rowstride = p->width * 3; + + ppm_new (&tmp, p->width, p->height); + for (y = 0; y < p->height; y++) + { + for (x = 0; x < p->width; x++) + { + r = g = b = n = 0; + + for (ty = y-yrad; ty <= y+yrad; ty++) + { + for (tx = x-xrad; tx <= x+xrad; tx++) + { + if (ty<0) continue; + if (ty>=p->height) continue; + if (tx<0) continue; + if (tx>=p->width) continue; + k = ty * rowstride + tx * 3; + r += p->col[k+0]; + g += p->col[k+1]; + b += p->col[k+2]; + n++; + } + } + k = y * rowstride + x * 3; + tmp.col[k+0] = r / n; + tmp.col[k+1] = g / n; + tmp.col[k+2] = b / n; + } + } + ppm_kill (p); + p->width = tmp.width; + p->height = tmp.height; + p->col = tmp.col; +} + +void +ppm_put_rgb_fast (ppm_t *s, float xo, float yo, guchar *d) +{ + guchar *tp; + tp = s->col + s->width * 3 * (int)(yo + 0.5) + 3 * (int)(xo + 0.5); + tp[0] = d[0]; + tp[1] = d[1]; + tp[2] = d[2]; +} + +void +ppm_put_rgb (ppm_t *s, float xo, float yo, guchar *d) +{ + int x, y; + float aa, ab, ba, bb; + int k, rowstride = s->width * 3; + + x = xo; + y = yo; + + if ((x < 0) || (y < 0) || (x >= s->width-1) || (y >= s->height-1)) + return; + + xo -= x; + yo -= y; + + aa = (1.0 - xo) * (1.0 - yo); + ab = xo * (1.0 - yo); + ba = (1.0 - xo) * yo; + bb = xo * yo; + + k = y * rowstride + x * 3; + s->col[k+0] *= (1.0 - aa); + s->col[k+1] *= (1.0 - aa); + s->col[k+2] *= (1.0 - aa); + + s->col[k+3] *= (1.0 - ab); + s->col[k+4] *= (1.0 - ab); + s->col[k+5] *= (1.0 - ab); + + s->col[k+rowstride+0] *= (1.0 - ba); + s->col[k+rowstride+1] *= (1.0 - ba); + s->col[k+rowstride+2] *= (1.0 - ba); + + s->col[k+rowstride+3] *= (1.0 - bb); + s->col[k+rowstride+4] *= (1.0 - bb); + s->col[k+rowstride+5] *= (1.0 - bb); + + s->col[k+0] += aa * d[0]; + s->col[k+1] += aa * d[1]; + s->col[k+2] += aa * d[2]; + s->col[k+3] += ab * d[0]; + s->col[k+4] += ab * d[1]; + s->col[k+5] += ab * d[2]; + s->col[k+rowstride+0] += ba * d[0]; + s->col[k+rowstride+1] += ba * d[1]; + s->col[k+rowstride+2] += ba * d[2]; + s->col[k+rowstride+3] += bb * d[0]; + s->col[k+rowstride+4] += bb * d[1]; + s->col[k+rowstride+5] += bb * d[2]; +} + +void +ppm_drawline (ppm_t *p, float fx, float fy, float tx, float ty, guchar *col) +{ + float i; + float d, x, y; + + if (fabs (fx - tx) > fabs ( fy - ty)) + { + if (fx > tx) + { + i = tx; tx = fx; fx = i; i = ty; ty = fy; fy = i; + } + d = (ty - fy) / (tx - fx); + y = fy; + for (x = fx; x <= tx; x += 1.0) + { + ppm_put_rgb (p, x, y, col); + y += d; + } + } + else + { + if (fy > ty) + { + i = tx; tx = fx; fx = i; i = ty; ty = fy; fy = i; + } + d = (tx - fx) / (ty - fy); + x = fx; + for (y = fy; y <= ty; y += 1.0) + { + ppm_put_rgb (p, x, y, col); + x += d; + } + } +} diff --git a/plug-ins/gimpressionist/ppmtool.h b/plug-ins/gimpressionist/ppmtool.h new file mode 100644 index 0000000..cf464e4 --- /dev/null +++ b/plug-ins/gimpressionist/ppmtool.h @@ -0,0 +1,60 @@ +/* GIMP - The GNU Image Manipulation Program + * Copyright (C) 1995 Spencer Kimball and Peter Mattis + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <https://www.gnu.org/licenses/>. + */ + +#ifndef __PPM_TOOL_H +#define __PPM_TOOL_H + +#include <glib.h> + +typedef struct ppm { + int width; + int height; + unsigned char *col; +} ppm_t; + +void fatal(char *s); +void ppm_kill(ppm_t *p); +void ppm_new(ppm_t *p, int xs, int ys); +void get_rgb(ppm_t *s, float xo, float yo, unsigned char *d); +void resize(ppm_t *p, int nx, int ny); +void rescale(ppm_t *p, double scale); +void resize_fast(ppm_t *p, int nx, int ny); +void ppm_load(const char *fn, ppm_t *p); +void ppm_save(ppm_t *p, const char *fn); +void ppm_copy(ppm_t *s, ppm_t *p); +void fill(ppm_t *p, guchar *c); +void free_rotate(ppm_t *p, double amount); +void ppm_pad(ppm_t *p, int left,int right, int top, int bottom, guchar *); +void edgepad(ppm_t *p, int left,int right, int top, int bottom); +void autocrop(ppm_t *p, int room); +void crop(ppm_t *p, int lx, int ly, int hx, int hy); +void ppm_apply_gamma(ppm_t *p, float e, int r, int g, int b); +void ppm_apply_brightness(ppm_t *p, float e, int r, int g, int b); +void ppm_put_rgb_fast(ppm_t *s, float xo, float yo, guchar *d); +void ppm_put_rgb(ppm_t *s, float xo, float yo, guchar *d); +void ppm_drawline(ppm_t *p, float fx, float fy, float tx, float ty, guchar *col); + +void repaint(ppm_t *p, ppm_t *a); + +void blur(ppm_t *p, int xrad, int yrad); + +void mkgrayplasma(ppm_t *p, float turb); + +#define PPM_IS_INITED(ppm_ptr) ((ppm_ptr)->col != NULL) + +#endif /* #ifndef __PPM_TOOL_H */ + diff --git a/plug-ins/gimpressionist/presets.c b/plug-ins/gimpressionist/presets.c new file mode 100644 index 0000000..3db9715 --- /dev/null +++ b/plug-ins/gimpressionist/presets.c @@ -0,0 +1,1098 @@ +/* GIMP - The GNU Image Manipulation Program + * Copyright (C) 1995 Spencer Kimball and Peter Mattis + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <https://www.gnu.org/licenses/>. + */ + +#include "config.h" + +#include <string.h> +#include <stdlib.h> + +#include <sys/stat.h> +#include <sys/types.h> + +#ifdef HAVE_UNISTD_H +#include <unistd.h> +#endif + +#include <glib/gstdio.h> + +#include <libgimp/gimp.h> +#include <libgimp/gimpui.h> + +#include "gimpressionist.h" +#include "presets.h" + +#include "color.h" +#include "general.h" +#include "orientation.h" +#include "placement.h" +#include "size.h" + + +#include "libgimp/stdplugins-intl.h" + +#ifdef G_OS_WIN32 +#include "libgimpbase/gimpwin32-io.h" +#endif + +#define PRESETMAGIC "Preset" + +static GtkWidget *presetnameentry = NULL; +static GtkWidget *presetlist = NULL; +static GtkWidget *presetdesclabel = NULL; +static GtkWidget *presetsavebutton = NULL; +static GtkWidget *delete_button = NULL; +static GtkListStore *store = NULL; +static gchar *selected_preset_orig_name = NULL; +static gchar *selected_preset_filename = NULL; + +static gboolean +can_delete_preset (const gchar *abs) +{ + gchar *user_data_dir; + gboolean ret; + + user_data_dir = g_strconcat (gimp_directory (), + G_DIR_SEPARATOR_S, + NULL); + + + ret = (!strncmp (abs, user_data_dir, strlen (user_data_dir))); + + g_free (user_data_dir); + + return ret; +} + +void +preset_save_button_set_sensitive (gboolean s) +{ + if (GTK_IS_WIDGET (presetsavebutton)) + gtk_widget_set_sensitive (GTK_WIDGET (presetsavebutton), s); +} + +void +preset_free (void) +{ + g_free (selected_preset_orig_name); + g_free (selected_preset_filename); +} + +static void set_preset_description_text (const gchar *text) +{ + gtk_label_set_text (GTK_LABEL (presetdesclabel), text); +} + +static char presetdesc[4096] = ""; + +static const char *factory_defaults = "<Factory defaults>"; + +static gchar * +get_early_line_from_preset (gchar *full_path, const gchar *prefix) +{ + FILE *f; + gchar line[4096]; + gint prefix_len, line_idx; + + prefix_len = strlen (prefix); + f = g_fopen (full_path, "rt"); + if (f) + { + /* Skip the preset magic. */ + fgets (line, 10, f); + if (!strncmp (line, PRESETMAGIC, 4)) + { + for (line_idx = 0; line_idx < 5; line_idx++) + { + if (!fgets (line, sizeof (line), f)) + break; + g_strchomp (line); + if (!strncmp (line, prefix, prefix_len)) + { + fclose(f); + return g_strdup (line+prefix_len); + } + } + } + fclose (f); + } + return NULL; +} + +static gchar * +get_object_name (const gchar *dir, + gchar *filename, + void *context) +{ + gchar *ret = NULL, *unprocessed_line = NULL; + gchar *full_path = NULL; + + /* First try to extract the object's name (= user-friendly description) + * from the preset file + * */ + + full_path = g_build_filename (dir, filename, NULL); + + unprocessed_line = get_early_line_from_preset (full_path, "name="); + if (unprocessed_line) + { + ret = g_strcompress (unprocessed_line); + g_free (unprocessed_line); + } + else + { + /* The object name defaults to a filename-derived description */ + ret = g_filename_display_basename (full_path); + } + + g_free (full_path); + + return ret; +} + + +static void +preset_read_dir_into_list (void) +{ + readdirintolist_extended ("Presets", presetlist, NULL, TRUE, + get_object_name, NULL); +} + +static gchar * +preset_create_filename (const gchar *basename, + const gchar *dest_dir) +{ + gchar *fullpath; + gchar *safe_name; + gint i; + gint unum = 1; + + g_return_val_if_fail (basename != NULL, NULL); + g_return_val_if_fail (dest_dir != NULL, NULL); + g_return_val_if_fail (g_path_is_absolute (dest_dir), NULL); + + safe_name = g_filename_from_utf8 (basename, -1, NULL, NULL, NULL); + + if (safe_name[0] == '.') + safe_name[0] = '-'; + + for (i = 0; safe_name[i]; i++) + if (safe_name[i] == G_DIR_SEPARATOR || g_ascii_isspace (safe_name[i])) + safe_name[i] = '-'; + + fullpath = g_build_filename (dest_dir, safe_name, NULL); + + while (g_file_test (fullpath, G_FILE_TEST_EXISTS)) + { + gchar *filename; + + g_free (fullpath); + + filename = g_strdup_printf ("%s-%d", safe_name, unum++); + + fullpath = g_build_filename (dest_dir, filename, NULL); + + g_free (filename); + } + + g_free (safe_name); + + return fullpath; +} + + +static void +add_factory_defaults (void) +{ + GtkTreeIter iter; + + gtk_list_store_append (store, &iter); + /* Set the filename. */ + gtk_list_store_set (store, &iter, PRESETS_LIST_COLUMN_FILENAME, + factory_defaults, -1); + /* Set the object name. */ + gtk_list_store_set (store, &iter, PRESETS_LIST_COLUMN_OBJECT_NAME, + factory_defaults, -1); + +} + +static void +preset_refresh_presets (void) +{ + gtk_list_store_clear (store); + add_factory_defaults (); + preset_read_dir_into_list (); +} + +static int +load_old_preset (const gchar *fname) +{ + FILE *f; + int len; + + f = g_fopen (fname, "rb"); + if (!f) + { + g_printerr ("Error opening file \"%s\" for reading!\n", + gimp_filename_to_utf8 (fname)); + return -1; + } + len = fread (&pcvals, 1, sizeof (pcvals), f); + fclose (f); + + return (len != sizeof (pcvals)) ? -1 : 0; +} + +static unsigned int +hexval (char c) +{ + c = g_ascii_tolower (c); + if ((c >= 'a') && (c <= 'f')) + return c - 'a' + 10; + if ((c >= '0') && (c <= '9')) + return c - '0'; + return 0; +} + +static char * +parse_rgb_string (const gchar *s) +{ + static char col[3]; + col[0] = (hexval (s[0]) << 4) | hexval (s[1]); + col[1] = (hexval (s[2]) << 4) | hexval (s[3]); + col[2] = (hexval (s[4]) << 4) | hexval (s[5]); + return col; +} + +static void +set_orient_vector (const gchar *str) +{ + const gchar *tmps = str; + int n; + + n = atoi (tmps); + + if (!(tmps = strchr (tmps, ','))) + return; + pcvals.orient_vectors[n].x = g_ascii_strtod (++tmps, NULL); + + if (!(tmps = strchr (tmps, ','))) + return; + pcvals.orient_vectors[n].y = g_ascii_strtod (++tmps, NULL); + + if (!(tmps = strchr (tmps, ','))) + return; + pcvals.orient_vectors[n].dir = g_ascii_strtod (++tmps, NULL); + + if (!(tmps = strchr (tmps, ','))) + return; + pcvals.orient_vectors[n].dx = g_ascii_strtod (++tmps, NULL); + + if (!(tmps = strchr (tmps, ','))) + return; + pcvals.orient_vectors[n].dy = g_ascii_strtod (++tmps, NULL); + + if (!(tmps = strchr (tmps, ','))) + return; + pcvals.orient_vectors[n].str = g_ascii_strtod (++tmps, NULL); + + if (!(tmps = strchr (tmps, ','))) + return; + pcvals.orient_vectors[n].type = atoi (++tmps); + +} + +static void set_size_vector (const gchar *str) +{ + const gchar *tmps = str; + int n; + + n = atoi (tmps); + + if (!(tmps = strchr (tmps, ','))) + return; + pcvals.size_vectors[n].x = g_ascii_strtod (++tmps, NULL); + + if (!(tmps = strchr (tmps, ','))) + return; + pcvals.size_vectors[n].y = g_ascii_strtod (++tmps, NULL); + + if (!(tmps = strchr (tmps, ','))) + return; + pcvals.size_vectors[n].siz = g_ascii_strtod (++tmps, NULL); + + if (!(tmps = strchr (tmps, ','))) + return; + pcvals.size_vectors[n].str = g_ascii_strtod (++tmps, NULL); + +} + +static void +parse_desc (const gchar *str, gchar *d, gssize d_len) +{ + gchar *dest = g_strcompress (str); + + g_strlcpy (d, dest, d_len); + + g_free (dest); +} + +static void +set_values (const gchar *key, const gchar *val) +{ + if (!strcmp (key, "desc")) + parse_desc (val, presetdesc, sizeof (presetdesc)); + else if (!strcmp (key, "orientnum")) + pcvals.orient_num = atoi (val); + else if (!strcmp (key, "orientfirst")) + pcvals.orient_first = g_ascii_strtod (val, NULL); + else if (!strcmp (key, "orientlast")) + pcvals.orient_last = g_ascii_strtod (val, NULL); + else if (!strcmp (key, "orienttype")) + pcvals.orient_type = orientation_type_input (atoi (val)); + + else if (!strcmp (key, "sizenum")) + pcvals.size_num = atoi (val); + else if (!strcmp (key, "sizefirst")) + pcvals.size_first = g_ascii_strtod (val, NULL); + else if (!strcmp (key, "sizelast")) + pcvals.size_last = g_ascii_strtod (val, NULL); + else if (!strcmp (key, "sizetype")) + pcvals.size_type = size_type_input (atoi (val)); + + else if (!strcmp (key, "brushrelief")) + pcvals.brush_relief = g_ascii_strtod (val, NULL); + else if (!strcmp (key, "brushscale")) + { + /* For compatibility */ + pcvals.size_num = 1; + pcvals.size_first = pcvals.size_last = g_ascii_strtod (val, NULL); + } + else if (!strcmp (key, "brushdensity")) + pcvals.brush_density = g_ascii_strtod (val, NULL); + else if (!strcmp (key, "brushgamma")) + pcvals.brushgamma = g_ascii_strtod (val, NULL); + else if (!strcmp (key, "brushaspect")) + pcvals.brush_aspect = g_ascii_strtod (val, NULL); + + else if (!strcmp (key, "generalbgtype")) + pcvals.general_background_type = general_bg_type_input (atoi (val)); + else if (!strcmp (key, "generaldarkedge")) + pcvals.general_dark_edge = g_ascii_strtod (val, NULL); + else if (!strcmp (key, "generalpaintedges")) + pcvals.general_paint_edges = atoi (val); + else if (!strcmp (key, "generaltileable")) + pcvals.general_tileable = atoi (val); + else if (!strcmp (key, "generaldropshadow")) + pcvals.general_drop_shadow = atoi (val); + else if (!strcmp (key, "generalshadowdarkness")) + pcvals.general_shadow_darkness = g_ascii_strtod (val, NULL); + else if (!strcmp (key, "generalshadowdepth")) + pcvals.general_shadow_depth = atoi (val); + else if (!strcmp (key, "generalshadowblur")) + pcvals.general_shadow_blur = atoi (val); + else if (!strcmp (key, "devthresh")) + pcvals.devthresh = g_ascii_strtod (val, NULL); + + else if (!strcmp (key, "paperrelief")) + pcvals.paper_relief = g_ascii_strtod (val, NULL); + else if (!strcmp (key, "paperscale")) + pcvals.paper_scale = g_ascii_strtod (val, NULL); + else if (!strcmp (key, "paperinvert")) + pcvals.paper_invert = atoi (val); + else if (!strcmp (key, "paperoverlay")) + pcvals.paper_overlay = atoi (val); + + else if (!strcmp (key, "placetype")) + pcvals.place_type = place_type_input (atoi (val)); + else if (!strcmp (key, "placecenter")) + pcvals.placement_center = atoi (val); + + else if (!strcmp (key, "selectedbrush")) + g_strlcpy (pcvals.selected_brush, val, sizeof (pcvals.selected_brush)); + else if (!strcmp (key, "selectedpaper")) + g_strlcpy (pcvals.selected_paper, val, sizeof (pcvals.selected_paper)); + + else if (!strcmp (key, "color")) + { + char *c = parse_rgb_string (val); + gimp_rgba_set_uchar (&pcvals.color, c[0], c[1], c[2], 255); + } + + else if (!strcmp (key, "numorientvector")) + pcvals.num_orient_vectors = atoi (val); + else if (!strcmp (key, "orientvector")) + set_orient_vector (val); + else if (!strcmp (key, "orientangoff")) + pcvals.orient_angle_offset = g_ascii_strtod (val, NULL); + else if (!strcmp (key, "orientstrexp")) + pcvals.orient_strength_exponent = g_ascii_strtod (val, NULL); + else if (!strcmp (key, "orientvoronoi")) + pcvals.orient_voronoi = atoi (val); + + else if (!strcmp (key, "numsizevector")) + pcvals.num_size_vectors = atoi (val); + else if (!strcmp (key, "sizevector")) + set_size_vector (val); + else if (!strcmp (key, "sizestrexp")) + pcvals.size_strength_exponent = g_ascii_strtod (val, NULL); + else if (!strcmp (key, "sizevoronoi")) + pcvals.size_voronoi = atoi (val); + + else if (!strcmp (key, "colortype")) + pcvals.color_type = color_type_input (atoi (val)); + else if (!strcmp (key, "colornoise")) + pcvals.color_noise = g_ascii_strtod (val, NULL); +} + +static int +load_preset (const gchar *fn) +{ + char line[1024] = ""; + FILE *f; + + f = g_fopen (fn, "rt"); + if (!f) + { + g_printerr ("Error opening file \"%s\" for reading!\n", + gimp_filename_to_utf8 (fn)); + return -1; + } + fgets (line, 10, f); + if (strncmp (line, PRESETMAGIC, 4)) + { + fclose (f); + return load_old_preset (fn); + } + + restore_default_values (); + + while (!feof (f)) + { + char *tmps; + + if (!fgets (line, 1024, f)) + break; + g_strchomp (line); + tmps = strchr (line, '='); + if (!tmps) + continue; + *tmps = '\0'; + tmps++; + set_values (line, tmps); + } + fclose (f); + return 0; +} + +int +select_preset (const gchar *preset) +{ + int ret = SELECT_PRESET_OK; + /* I'm copying this behavior as is. As it seems applying the + * factory_defaults preset does nothing, which I'm not sure + * if that was what the author intended. + * -- Shlomi Fish + */ + if (strcmp (preset, factory_defaults)) + { + gchar *rel = g_build_filename ("Presets", preset, NULL); + gchar *abs = findfile (rel); + + g_free (rel); + + if (abs) + { + if (load_preset (abs)) + ret = SELECT_PRESET_LOAD_FAILED; + + g_free (abs); + } + else + { + ret = SELECT_PRESET_FILE_NOT_FOUND; + } + } + if (ret == SELECT_PRESET_OK) + { + /* This is so the colorbrushes param (that is not stored in the + * preset will be set correctly upon the preset loading. + * */ + set_colorbrushes (pcvals.selected_brush); + } + + return ret; +} + +static void +apply_preset (GtkWidget *w, GtkTreeSelection *selection) +{ + GtkTreeIter iter; + GtkTreeModel *model; + + if (gtk_tree_selection_get_selected (selection, &model, &iter)) + { + gchar *preset; + + gtk_tree_model_get (model, &iter, PRESETS_LIST_COLUMN_FILENAME, + &preset, -1); + + select_preset (preset); + + restore_values (); + + /* g_free (preset); */ + g_free (selected_preset_filename); + selected_preset_filename = preset; + } +} + +static void +delete_preset (GtkWidget *w, GtkTreeSelection *selection) +{ + GtkTreeIter iter; + GtkTreeModel *model; + + if (gtk_tree_selection_get_selected (selection, &model, &iter)) + { + gchar *preset; + + gtk_tree_model_get (model, &iter, PRESETS_LIST_COLUMN_FILENAME, + &preset, -1); + + if (preset) + { + gchar *rel = g_build_filename ("Presets", preset, NULL); + gchar *abs = findfile (rel); + + g_free (rel); + + if (abs) + { + /* Don't delete global presets - bug # 147483 */ + if (can_delete_preset (abs)) + g_unlink (abs); + + g_free (abs); + } + + preset_refresh_presets (); + + g_free (preset); + } + } +} + +static void save_preset (void); + +static void +preset_desc_callback (GtkTextBuffer *buffer, gpointer data) +{ + char *str; + GtkTextIter start, end; + + gtk_text_buffer_get_bounds (buffer, &start, &end); + str = gtk_text_buffer_get_text (buffer, &start, &end, FALSE); + g_strlcpy (presetdesc, str, sizeof (presetdesc)); + g_free (str); +} + +static void +save_preset_response (GtkWidget *widget, + gint response_id, + gpointer data) +{ + gtk_widget_destroy (widget); + + if (response_id == GTK_RESPONSE_OK) + save_preset (); +} + +static void +create_save_preset (GtkWidget *parent) +{ + static GtkWidget *window = NULL; + GtkWidget *box, *label; + GtkWidget *swin, *text; + GtkTextBuffer *buffer; + + if (window) + { + gtk_window_present (GTK_WINDOW (window)); + return; + } + + window = gimp_dialog_new (_("Save Current"), PLUG_IN_ROLE, + gtk_widget_get_toplevel (parent), 0, + gimp_standard_help_func, PLUG_IN_PROC, + + _("_Cancel"), GTK_RESPONSE_CANCEL, + _("_OK"), GTK_RESPONSE_OK, + + NULL); + + gtk_dialog_set_alternative_button_order (GTK_DIALOG (window), + GTK_RESPONSE_OK, + GTK_RESPONSE_CANCEL, + -1); + + g_signal_connect (window, "response", + G_CALLBACK (save_preset_response), + NULL); + g_signal_connect (window, "destroy", + G_CALLBACK (gtk_widget_destroyed), + &window); + + box = gtk_box_new (GTK_ORIENTATION_VERTICAL, 6); + gtk_container_set_border_width (GTK_CONTAINER (box), 12); + gtk_box_pack_start (GTK_BOX (gtk_dialog_get_content_area (GTK_DIALOG (window))), + box, TRUE, TRUE, 0); + gtk_widget_show (box); + + label = gtk_label_new (_("Description:")); + gtk_label_set_xalign (GTK_LABEL (label), 0.0); + gtk_box_pack_start (GTK_BOX (box), label, FALSE, FALSE, 0); + gtk_widget_show (label); + + swin = gtk_scrolled_window_new (NULL, NULL); + gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (swin), + GTK_SHADOW_IN); + gtk_box_pack_start (GTK_BOX (box), swin, TRUE, TRUE, 0); + gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (swin), + GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); + gtk_widget_show (swin); + + buffer = gtk_text_buffer_new (NULL); + g_signal_connect (buffer, "changed", + G_CALLBACK (preset_desc_callback), NULL); + gtk_text_buffer_set_text (buffer, presetdesc, -1); + + text = gtk_text_view_new_with_buffer (buffer); + gtk_widget_set_size_request (text, -1, 192); + gtk_container_add (GTK_CONTAINER (swin), text); + gtk_widget_show (text); + + gtk_widget_show (window); +} + +static void +save_preset (void) +{ + const gchar *preset_name; + + gchar *fname, *presets_dir_path; + FILE *f; + GList *thispath; + gchar buf[G_ASCII_DTOSTR_BUF_SIZE]; + gchar vbuf[6][G_ASCII_DTOSTR_BUF_SIZE]; + guchar color[3]; + gint i; + gchar *desc_escaped, *preset_name_escaped; + + preset_name = gtk_entry_get_text (GTK_ENTRY (presetnameentry)); + thispath = parsepath (); + store_values (); + + if (!thispath) + { + g_printerr ("Internal error: (save_preset) thispath == NULL\n"); + return; + } + + /* Create the ~/.gimp-$VER/gimpressionist/Presets directory if + * it doesn't already exists. + * + */ + presets_dir_path = g_build_filename ((const gchar *) thispath->data, + "Presets", + NULL); + + if (! g_file_test (presets_dir_path, G_FILE_TEST_IS_DIR)) + { + if (g_mkdir (presets_dir_path, + S_IRUSR | S_IWUSR | S_IXUSR | + S_IRGRP | S_IXGRP | + S_IROTH | S_IXOTH) == -1) + { + g_printerr ("Error creating folder \"%s\"!\n", + gimp_filename_to_utf8 (presets_dir_path)); + g_free (presets_dir_path); + return; + } + } + + /* Check if the user-friendly name has changed. If so, then save it + * under a new file. If not - use the same file name. + */ + if (selected_preset_orig_name && + strcmp (preset_name, selected_preset_orig_name) == 0) + { + fname = g_build_filename (presets_dir_path, + selected_preset_filename, + NULL); + } + else + { + fname = preset_create_filename (preset_name, presets_dir_path); + } + + g_free (presets_dir_path); + + if (!fname) + { + g_printerr ("Error building a filename for preset \"%s\"!\n", + preset_name); + return; + } + + f = g_fopen (fname, "wt"); + if (!f) + { + g_printerr ("Error opening file \"%s\" for writing!\n", + gimp_filename_to_utf8 (fname)); + g_free (fname); + return; + } + + fprintf (f, "%s\n", PRESETMAGIC); + desc_escaped = g_strescape (presetdesc, NULL); + fprintf (f, "desc=%s\n", desc_escaped); + g_free (desc_escaped); + preset_name_escaped = g_strescape (preset_name, NULL); + fprintf (f, "name=%s\n", preset_name_escaped); + g_free (preset_name_escaped); + fprintf (f, "orientnum=%d\n", pcvals.orient_num); + fprintf (f, "orientfirst=%s\n", + g_ascii_dtostr (buf, G_ASCII_DTOSTR_BUF_SIZE, pcvals.orient_first)); + fprintf (f, "orientlast=%s\n", + g_ascii_dtostr (buf, G_ASCII_DTOSTR_BUF_SIZE, pcvals.orient_last)); + fprintf (f, "orienttype=%d\n", pcvals.orient_type); + + fprintf (f, "sizenum=%d\n", pcvals.size_num); + fprintf (f, "sizefirst=%s\n", + g_ascii_dtostr (buf, G_ASCII_DTOSTR_BUF_SIZE, pcvals.size_first)); + fprintf (f, "sizelast=%s\n", + g_ascii_dtostr (buf, G_ASCII_DTOSTR_BUF_SIZE, pcvals.size_last)); + fprintf (f, "sizetype=%d\n", pcvals.size_type); + + fprintf (f, "brushrelief=%s\n", + g_ascii_dtostr (buf, G_ASCII_DTOSTR_BUF_SIZE, pcvals.brush_relief)); + fprintf (f, "brushdensity=%s\n", + g_ascii_dtostr (buf, G_ASCII_DTOSTR_BUF_SIZE, pcvals.brush_density)); + fprintf (f, "brushgamma=%s\n", + g_ascii_dtostr (buf, G_ASCII_DTOSTR_BUF_SIZE, pcvals.brushgamma)); + fprintf (f, "brushaspect=%s\n", + g_ascii_dtostr (buf, G_ASCII_DTOSTR_BUF_SIZE, pcvals.brush_aspect)); + + fprintf (f, "generalbgtype=%d\n", pcvals.general_background_type); + fprintf (f, "generaldarkedge=%s\n", + g_ascii_dtostr (buf, G_ASCII_DTOSTR_BUF_SIZE, pcvals.general_dark_edge)); + fprintf (f, "generalpaintedges=%d\n", pcvals.general_paint_edges); + fprintf (f, "generaltileable=%d\n", pcvals.general_tileable); + fprintf (f, "generaldropshadow=%d\n", pcvals.general_drop_shadow); + fprintf (f, "generalshadowdarkness=%s\n", + g_ascii_dtostr (buf, G_ASCII_DTOSTR_BUF_SIZE, pcvals.general_shadow_darkness)); + fprintf (f, "generalshadowdepth=%d\n", pcvals.general_shadow_depth); + fprintf (f, "generalshadowblur=%d\n", pcvals.general_shadow_blur); + fprintf (f, "devthresh=%s\n", + g_ascii_dtostr (buf, G_ASCII_DTOSTR_BUF_SIZE, pcvals.devthresh)); + + fprintf (f, "paperrelief=%s\n", + g_ascii_dtostr (buf, G_ASCII_DTOSTR_BUF_SIZE, pcvals.paper_relief)); + fprintf (f, "paperscale=%s\n", + g_ascii_dtostr (buf, G_ASCII_DTOSTR_BUF_SIZE, pcvals.paper_scale)); + fprintf (f, "paperinvert=%d\n", pcvals.paper_invert); + fprintf (f, "paperoverlay=%d\n", pcvals.paper_overlay); + + fprintf (f, "selectedbrush=%s\n", pcvals.selected_brush); + fprintf (f, "selectedpaper=%s\n", pcvals.selected_paper); + + gimp_rgb_get_uchar (&pcvals.color, &color[0], &color[1], &color[2]); + fprintf (f, "color=%02x%02x%02x\n", color[0], color[1], color[2]); + + fprintf (f, "placetype=%d\n", pcvals.place_type); + fprintf (f, "placecenter=%d\n", pcvals.placement_center); + + fprintf (f, "numorientvector=%d\n", pcvals.num_orient_vectors); + for (i = 0; i < pcvals.num_orient_vectors; i++) + { + g_ascii_dtostr (vbuf[0], G_ASCII_DTOSTR_BUF_SIZE, pcvals.orient_vectors[i].x); + g_ascii_dtostr (vbuf[1], G_ASCII_DTOSTR_BUF_SIZE, pcvals.orient_vectors[i].y); + g_ascii_dtostr (vbuf[2], G_ASCII_DTOSTR_BUF_SIZE, pcvals.orient_vectors[i].dir); + g_ascii_dtostr (vbuf[3], G_ASCII_DTOSTR_BUF_SIZE, pcvals.orient_vectors[i].dx); + g_ascii_dtostr (vbuf[4], G_ASCII_DTOSTR_BUF_SIZE, pcvals.orient_vectors[i].dy); + g_ascii_dtostr (vbuf[5], G_ASCII_DTOSTR_BUF_SIZE, pcvals.orient_vectors[i].str); + + fprintf (f, "orientvector=%d,%s,%s,%s,%s,%s,%s,%d\n", i, + vbuf[0], vbuf[1], vbuf[2], vbuf[3], vbuf[4], vbuf[5], + pcvals.orient_vectors[i].type); + } + + fprintf (f, "orientangoff=%s\n", + g_ascii_dtostr (buf, G_ASCII_DTOSTR_BUF_SIZE, + pcvals.orient_angle_offset)); + fprintf (f, "orientstrexp=%s\n", + g_ascii_dtostr (buf, G_ASCII_DTOSTR_BUF_SIZE, + pcvals.orient_strength_exponent)); + fprintf (f, "orientvoronoi=%d\n", pcvals.orient_voronoi); + + fprintf (f, "numsizevector=%d\n", pcvals.num_size_vectors); + for (i = 0; i < pcvals.num_size_vectors; i++) + { + g_ascii_dtostr (vbuf[0], G_ASCII_DTOSTR_BUF_SIZE, pcvals.size_vectors[i].x); + g_ascii_dtostr (vbuf[1], G_ASCII_DTOSTR_BUF_SIZE, pcvals.size_vectors[i].y); + g_ascii_dtostr (vbuf[2], G_ASCII_DTOSTR_BUF_SIZE, pcvals.size_vectors[i].siz); + g_ascii_dtostr (vbuf[3], G_ASCII_DTOSTR_BUF_SIZE, pcvals.size_vectors[i].str); + fprintf (f, "sizevector=%d,%s,%s,%s,%s\n", i, + vbuf[0], vbuf[1], vbuf[2], vbuf[3]); + } + fprintf (f, "sizestrexp=%s\n", + g_ascii_dtostr (buf, G_ASCII_DTOSTR_BUF_SIZE, pcvals.size_strength_exponent)); + fprintf (f, "sizevoronoi=%d\n", pcvals.size_voronoi); + + fprintf (f, "colortype=%d\n", pcvals.color_type); + fprintf (f, "colornoise=%s\n", + g_ascii_dtostr (buf, G_ASCII_DTOSTR_BUF_SIZE, pcvals.color_noise)); + + fclose (f); + preset_refresh_presets (); + reselect (presetlist, fname); + + g_free (fname); +} + +static void +read_description (const char *fn) +{ + char *rel_fname; + char *fname; + gchar *unprocessed_line; + + rel_fname = g_build_filename ("Presets", fn, NULL); + fname = findfile (rel_fname); + g_free (rel_fname); + + if (!fname) + { + if (!strcmp (fn, factory_defaults)) + { + gtk_widget_set_sensitive (delete_button, FALSE); + set_preset_description_text (_("Gimpressionist Defaults")); + } + else + { + set_preset_description_text (""); + } + return; + } + + /* Don't delete global presets - bug # 147483 */ + gtk_widget_set_sensitive (delete_button, can_delete_preset (fname)); + + unprocessed_line = get_early_line_from_preset (fname, "desc="); + g_free (fname); + + if (unprocessed_line) + { + char tmplabel[4096]; + parse_desc (unprocessed_line, tmplabel, sizeof (tmplabel)); + g_free (unprocessed_line); + set_preset_description_text (tmplabel); + } + else + { + set_preset_description_text (""); + } +} + +static void +presets_list_select_preset (GtkTreeSelection *selection, + gpointer data) +{ + GtkTreeIter iter; + GtkTreeModel *model; + + if (gtk_tree_selection_get_selected (selection, &model, &iter)) + { + gchar *preset_name; + gchar *preset_filename; + + gtk_tree_model_get (model, &iter, PRESETS_LIST_COLUMN_OBJECT_NAME, + &preset_name, -1); + gtk_tree_model_get (model, &iter, PRESETS_LIST_COLUMN_FILENAME, + &preset_filename, -1); + + /* TODO : Maybe make the factory defaults behavior in regards + * to the preset's object name and filename more robust? + * + */ + if (strcmp (preset_filename, factory_defaults)) + { + gtk_entry_set_text (GTK_ENTRY (presetnameentry), preset_name); + g_free (selected_preset_orig_name); + g_free (selected_preset_filename); + selected_preset_orig_name = g_strdup (preset_name); + selected_preset_filename = g_strdup (selected_preset_filename); + } + + read_description (preset_filename); + + g_free (preset_name); + g_free (preset_filename); + } +} + +static GtkWidget * +create_presets_list (GtkWidget *parent) +{ + GtkListStore *store; + GtkTreeSelection *selection; + GtkCellRenderer *renderer; + GtkTreeViewColumn *column; + GtkWidget *swin, *view; + + swin = gtk_scrolled_window_new (NULL, NULL); + gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (swin), + GTK_POLICY_AUTOMATIC, + GTK_POLICY_AUTOMATIC); + gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (swin), + GTK_SHADOW_IN); + gtk_box_pack_start (GTK_BOX (parent), swin, FALSE, FALSE, 0); + gtk_widget_show (swin); + gtk_widget_set_size_request (swin, 200, -1); + + store = gtk_list_store_new (2, G_TYPE_STRING, G_TYPE_STRING); + view = gtk_tree_view_new_with_model (GTK_TREE_MODEL (store)); + + gtk_tree_view_set_headers_visible (GTK_TREE_VIEW (view), FALSE); + g_object_unref (store); + gtk_widget_show (view); + + renderer = gtk_cell_renderer_text_new (); + + column = + gtk_tree_view_column_new_with_attributes ("Preset", renderer, + "text", + PRESETS_LIST_COLUMN_OBJECT_NAME, + NULL); + gtk_tree_view_append_column (GTK_TREE_VIEW (view), column); + + + gtk_container_add (GTK_CONTAINER (swin), view); + + selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (view)); + gtk_tree_selection_set_mode (selection, GTK_SELECTION_BROWSE); + g_signal_connect (selection, "changed", + G_CALLBACK (presets_list_select_preset), + NULL); + + return view; +} + +void +create_presetpage (GtkNotebook *notebook) +{ + GtkWidget *vbox, *hbox, *box1, *box2, *thispage; + GtkWidget *view; + GtkWidget *tmpw; + GtkWidget *label; + GtkTreeSelection *selection; + + label = gtk_label_new_with_mnemonic (_("_Presets")); + + thispage = gtk_box_new (GTK_ORIENTATION_VERTICAL, 12); + gtk_container_set_border_width (GTK_CONTAINER (thispage), 12); + gtk_widget_show (thispage); + + box1 = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 12); + gtk_box_pack_start (GTK_BOX (thispage), box1, FALSE, FALSE, 0); + gtk_widget_show (box1); + + presetnameentry = tmpw = gtk_entry_new (); + gtk_box_pack_start (GTK_BOX (box1), tmpw, FALSE, FALSE, 0); + gtk_widget_set_size_request (tmpw, 200, -1); + gtk_widget_show (tmpw); + + presetsavebutton = tmpw = gtk_button_new_with_label ( _("Save Current...")); + gtk_button_set_image (GTK_BUTTON (presetsavebutton), + gtk_image_new_from_icon_name (GIMP_ICON_DOCUMENT_SAVE, + GTK_ICON_SIZE_BUTTON)); + gtk_box_pack_start (GTK_BOX (box1), tmpw, FALSE, FALSE, 0); + gtk_widget_show (tmpw); + g_signal_connect (tmpw, "clicked", G_CALLBACK (create_save_preset), NULL); + gimp_help_set_help_data + (tmpw, _("Save the current settings to the specified file"), NULL); + + box1 = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 12); + gtk_box_pack_start (GTK_BOX (thispage), box1, TRUE, TRUE, 0); + gtk_widget_show (box1); + + presetlist = view = create_presets_list (box1); + store = GTK_LIST_STORE (gtk_tree_view_get_model (GTK_TREE_VIEW (view))); + selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (view)); + add_factory_defaults (); + + vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 12); + gtk_box_pack_start (GTK_BOX (box1), vbox, FALSE, FALSE, 0); + gtk_widget_show (vbox); + + hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0); + gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0); + gtk_widget_show (hbox); + + box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 6); + gtk_box_pack_start (GTK_BOX (hbox), box2, FALSE, FALSE, 0); + gtk_widget_show (box2); + + tmpw = gtk_button_new_with_mnemonic (_("_Apply")); + gtk_box_pack_start (GTK_BOX (box2), tmpw, FALSE, FALSE, 0); + gtk_widget_show (tmpw); + g_signal_connect (tmpw, "clicked", G_CALLBACK (apply_preset), selection); + gimp_help_set_help_data + (tmpw, _("Reads the selected Preset into memory"), NULL); + + tmpw = delete_button = gtk_button_new_with_mnemonic (_("_Delete")); + gtk_box_pack_start (GTK_BOX (box2), tmpw, FALSE, FALSE,0); + gtk_widget_show (tmpw); + g_signal_connect (tmpw, "clicked", G_CALLBACK (delete_preset), selection); + gimp_help_set_help_data (tmpw, _("Deletes the selected Preset"), NULL); + + tmpw = gtk_button_new_with_mnemonic (_("_Refresh")); + gtk_box_pack_start (GTK_BOX (box2), tmpw, FALSE, FALSE,0); + gtk_widget_show (tmpw); + g_signal_connect (tmpw, "clicked", G_CALLBACK (preset_refresh_presets), NULL); + gimp_help_set_help_data (tmpw, _("Reread the folder of Presets"), NULL); + + presetdesclabel = tmpw = gtk_label_new (NULL); + gimp_label_set_attributes (GTK_LABEL (tmpw), + PANGO_ATTR_STYLE, PANGO_STYLE_ITALIC, + -1); + gtk_label_set_line_wrap (GTK_LABEL (tmpw), TRUE); + /* + * Make sure the label's width is reasonable and it won't stretch + * the dialog more than its width. + * */ + gtk_widget_set_size_request (tmpw, 240, -1); + + gtk_label_set_xalign (GTK_LABEL (tmpw), 0.0); + gtk_label_set_yalign (GTK_LABEL (tmpw), 0.0); + gtk_box_pack_start (GTK_BOX (vbox), tmpw, TRUE, TRUE, 0); + gtk_widget_show (tmpw); + + preset_read_dir_into_list (); + + gtk_notebook_append_page_menu (notebook, thispage, label, NULL); +} diff --git a/plug-ins/gimpressionist/presets.h b/plug-ins/gimpressionist/presets.h new file mode 100644 index 0000000..ba67bdc --- /dev/null +++ b/plug-ins/gimpressionist/presets.h @@ -0,0 +1,34 @@ +/* GIMP - The GNU Image Manipulation Program + * Copyright (C) 1995 Spencer Kimball and Peter Mattis + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <https://www.gnu.org/licenses/>. + */ + +#ifndef __PRESETS_H +#define __PRESETS_H + +enum SELECT_PRESET_RETURN_VALUES +{ + SELECT_PRESET_OK = 0, + SELECT_PRESET_FILE_NOT_FOUND = -1, + SELECT_PRESET_LOAD_FAILED = -2, +}; + +void create_presetpage (GtkNotebook *); +int select_preset (const gchar *preset); +void preset_free (void); +void preset_save_button_set_sensitive (gboolean s); + +#endif + diff --git a/plug-ins/gimpressionist/preview.c b/plug-ins/gimpressionist/preview.c new file mode 100644 index 0000000..3619782 --- /dev/null +++ b/plug-ins/gimpressionist/preview.c @@ -0,0 +1,191 @@ +/* GIMP - The GNU Image Manipulation Program + * Copyright (C) 1995 Spencer Kimball and Peter Mattis + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <https://www.gnu.org/licenses/>. + */ + +#include "config.h" + +#include <string.h> + +#include <gtk/gtk.h> + +#include <libgimp/gimp.h> +#include <libgimp/gimpui.h> + +#include "gimpressionist.h" +#include "ppmtool.h" +#include "infile.h" +#include "preview.h" + +#include "libgimp/stdplugins-intl.h" + + +static GtkWidget *preview = NULL; +static GtkWidget *previewbutton = NULL; + +void +preview_set_button_label (const gchar *text) +{ + g_object_set (previewbutton, + "label", text, + "use-underline", TRUE, + NULL); +} + +static void +drawalpha (ppm_t *p, ppm_t *a) +{ + int x, y, g; + double v; + int gridsize = 16; + int rowstride = p->width * 3; + + for (y = 0; y < p->height; y++) + { + for (x = 0; x < p->width; x++) + { + int k = y * rowstride + x * 3; + + if (!a->col[k]) + continue; + + v = 1.0 - a->col[k] / 255.0; + g = ((x / gridsize + y / gridsize) % 2) * 60 + 100; + p->col[k+0] *= v; + p->col[k+1] *= v; + p->col[k+2] *= v; + v = 1.0 - v; + p->col[k+0] += g*v; + p->col[k+1] += g*v; + p->col[k+2] += g*v; + } + } +} + +static ppm_t preview_ppm = {0, 0, NULL}; +static ppm_t alpha_ppm = {0, 0, NULL}; +static ppm_t backup_ppm = {0, 0, NULL}; +static ppm_t alpha_backup_ppm = {0, 0, NULL}; + +void +preview_free_resources (void) +{ + ppm_kill (&preview_ppm); + ppm_kill (&alpha_ppm); + ppm_kill (&backup_ppm); + ppm_kill (&alpha_backup_ppm); +} + +void +updatepreview (GtkWidget *wg, gpointer d) +{ + if (!PPM_IS_INITED (&backup_ppm)) + { + infile_copy_to_ppm (&backup_ppm); + if ((backup_ppm.width != PREVIEWSIZE) || + (backup_ppm.height != PREVIEWSIZE)) + resize_fast (&backup_ppm, PREVIEWSIZE, PREVIEWSIZE); + if (img_has_alpha) + { + infile_copy_alpha_to_ppm (&alpha_backup_ppm); + if ((alpha_backup_ppm.width != PREVIEWSIZE) || + (alpha_backup_ppm.height != PREVIEWSIZE)) + resize_fast (&alpha_backup_ppm, PREVIEWSIZE, PREVIEWSIZE); + } + } + + if (!PPM_IS_INITED (&preview_ppm)) + { + ppm_copy (&backup_ppm, &preview_ppm); + + if (img_has_alpha) + ppm_copy (&alpha_backup_ppm, &alpha_ppm); + } + + if (d) + { + store_values (); + + if (GPOINTER_TO_INT (d) != 2) + repaint (&preview_ppm, &alpha_ppm); + } + + if (img_has_alpha) + drawalpha (&preview_ppm, &alpha_ppm); + + gimp_preview_area_draw (GIMP_PREVIEW_AREA (preview), + 0, 0, PREVIEWSIZE, PREVIEWSIZE, + GIMP_RGB_IMAGE, + preview_ppm.col, + PREVIEWSIZE * 3); + + ppm_kill (&preview_ppm); + if (img_has_alpha) + ppm_kill (&alpha_ppm); +} + +static void +preview_size_allocate (GtkWidget *preview) +{ + updatepreview (preview, GINT_TO_POINTER (0)); +} + +GtkWidget * +create_preview (void) +{ + GtkWidget *hbox; + GtkWidget *vbox; + GtkWidget *frame; + GtkWidget *button; + + vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 6); + + frame = gtk_frame_new (NULL); + gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_IN); + gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 5); + gtk_widget_show (frame); + + preview = gimp_preview_area_new (); + gtk_widget_set_size_request (preview, PREVIEWSIZE, PREVIEWSIZE); + + gtk_container_add (GTK_CONTAINER (frame), preview); + gtk_widget_show (preview); + /* This is so the preview will be displayed when the dialog is invoked. */ + g_signal_connect (preview, "size-allocate", + G_CALLBACK (preview_size_allocate), NULL); + + hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 6); + gtk_box_set_homogeneous (GTK_BOX (hbox), TRUE); + gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0); + gtk_widget_show (hbox); + + previewbutton = button = gtk_button_new_with_mnemonic (_("_Update")); + g_signal_connect (button, "clicked", + G_CALLBACK (updatepreview), (gpointer) 1); + gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 0); + gtk_widget_show (button); + gimp_help_set_help_data (button, + _("Refresh the Preview window"), NULL); + + button = gtk_button_new_with_mnemonic (_("_Reset")); + g_signal_connect (button, "clicked", + G_CALLBACK (updatepreview), (gpointer) 2); + gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 0); + gtk_widget_show (button); + gimp_help_set_help_data (button, + _("Revert to the original image"), NULL); + + return vbox; +} diff --git a/plug-ins/gimpressionist/preview.h b/plug-ins/gimpressionist/preview.h new file mode 100644 index 0000000..1e3d456 --- /dev/null +++ b/plug-ins/gimpressionist/preview.h @@ -0,0 +1,26 @@ +/* GIMP - The GNU Image Manipulation Program + * Copyright (C) 1995 Spencer Kimball and Peter Mattis + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <https://www.gnu.org/licenses/>. + */ + +#ifndef __PREVIEW_H +#define __PREVIEW_H + +GtkWidget* create_preview (void); +void updatepreview (GtkWidget *wg, gpointer d); +void preview_free_resources(void); +void preview_set_button_label(const gchar * text); + +#endif /* #ifndef __PREVIEW_H */ diff --git a/plug-ins/gimpressionist/random.h b/plug-ins/gimpressionist/random.h new file mode 100644 index 0000000..f52cb13 --- /dev/null +++ b/plug-ins/gimpressionist/random.h @@ -0,0 +1,24 @@ +/* GIMP - The GNU Image Manipulation Program + * Copyright (C) 1995 Spencer Kimball and Peter Mattis + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <https://www.gnu.org/licenses/>. + */ + +#ifndef __RAND_H +#define __RAND_H + +extern GRand *random_generator; + +#endif + diff --git a/plug-ins/gimpressionist/repaint.c b/plug-ins/gimpressionist/repaint.c new file mode 100644 index 0000000..9948068 --- /dev/null +++ b/plug-ins/gimpressionist/repaint.c @@ -0,0 +1,1201 @@ +/* GIMP - The GNU Image Manipulation Program + * Copyright (C) 1995 Spencer Kimball and Peter Mattis + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <https://www.gnu.org/licenses/>. + */ + +#include "config.h" + +#include <stdlib.h> +#include <string.h> + +#include <gtk/gtk.h> + +#include <libgimp/gimp.h> + +#include "gimpressionist.h" +#include "brush.h" +#include "orientation.h" +#include "placement.h" +#include "ppmtool.h" +#include "preview.h" +#include "random.h" +#include "size.h" +#include "infile.h" + +#include <libgimp/stdplugins-intl.h> + +static gimpressionist_vals_t runningvals; + +static double +get_siz_from_pcvals (double x, double y) +{ + return getsiz_proto (x, y, pcvals.num_size_vectors, pcvals.size_vectors, + pcvals.size_strength_exponent, pcvals.size_voronoi); +} + +static int +get_pixel_value (double dir) +{ + while (dir < 0.0) + dir += 360.0; + while (dir >= 360.0) + dir -= 360.0; + return dir * 255.0 / 360.0; +} + +static void +prepare_brush (ppm_t *p) +{ + int x, y; + int rowstride = p->width * 3; + + for (y = 0; y< p->height; y++) + { + for (x = 0; x < p->width; x++) + { + p->col[y * rowstride + x * 3 + 1] = 0; + } + } + + for (y = 1; y< p->height; y++) + { + for (x = 1; x < p->width; x++) + { + int v = p->col[y * rowstride + x * 3] - + p->col[(y - 1) * rowstride + (x - 1) * 3]; + if (v < 0) + v = 0; + p->col[y * rowstride + x * 3 + 1] = v; + } + } +} + +static double +sum_brush (ppm_t *p) +{ + double sum = 0; + int i; + + for (i = 0; i < p->width*3*p->height; i += 3) + sum += p->col[i]; + return sum; +} + +/* TODO : Use r = rgb[0]; g = rgb[1] ; b = rgb[2]; instead of + * the direct references here. + * */ +static int +get_hue (guchar *rgb) +{ + double h, v, temp, diff; + /* TODO : There seems to be some typos in the comments here. + * Ask vidar what he meant. + * */ + if ((rgb[0] == rgb[1]) && (rgb[0] == rgb[2])) /* Gray */ + return 0; + v = (rgb[0] > rgb[1] ? rgb[0] : rgb[1]); /* v = st<F8>rste verdi */ + if (rgb[2] > v) + v = rgb[2]; + temp = (rgb[0] > rgb[1] ? rgb[1] : rgb[0] ); /* temp = minste */ + if (rgb[2] < temp) + temp = rgb[2]; + diff = v - temp; + + if (v == rgb[0]) + h = ((double)rgb[1] - rgb[2]) / diff; + else if(v == rgb[1]) + h = ((double)rgb[2] - rgb[0]) / diff + 2; + else /* v == rgb[2] */ + h = ((double)rgb[0] - rgb[1]) / diff + 4; + if(h < 0) h += 6; + return h * 255.0 / 6.0; +} + +static int +choose_best_brush (ppm_t *p, ppm_t *a, int tx, int ty, + ppm_t *brushes, int num_brushes, + double *brushes_sum, int start, int step) +{ + double dev, thissum; + double bestdev = 0.0; + double r, g, b; + int best = -1; + int x, y, h; + long i; + GList *brlist = NULL; + + for (i = start; i < num_brushes; i += step) + { + ppm_t *brush = &brushes[i]; +#if 0 + thissum = 0.0; +#endif + thissum = brushes_sum[i]; + +/* TODO: Pointer-arithmeticize this code */ + r = g = b = 0.0; + for (y = 0; y < brush->height; y++) + { + guchar *row = p->col + (ty + y) * p->width * 3; + + for (x = 0; x < brush->width; x++) + { + int k = (tx + x) * 3; + double v; + + if ((h = brush->col[(y * brush->width * 3) + x * 3])) + { +#if 0 + thissum += h; +#endif + v = h / 255.0; + r += row[k+0] * v; + g += row[k+1] * v; + b += row[k+2] * v; + } + } + } + r = r * 255.0 / thissum; + g = g * 255.0 / thissum; + b = b * 255.0 / thissum; + + dev = 0.0; + for (y = 0; y < brush->height; y++) + { + guchar *row = p->col + (ty + y) * p->width * 3; + + for (x = 0; x < brush->width; x++) + { + int k = (tx + x) * 3; + double v; + + if ((h = brush->col[(y * brush->width * 3) + x * 3])) + { + v = h / 255.0; + dev += abs (row[k+0] - r) * v; + dev += abs (row[k+1] - g) * v; + dev += abs (row[k+2] - b) * v; + if (img_has_alpha) + dev += a->col[(ty + y) * a->width * 3 + (tx + x) * 3] * v; + } + } + } + dev /= thissum; + + if ((best == -1) || (dev < bestdev)) + { + if (brlist) + g_list_free (brlist); + brlist = NULL; + } + + if (dev <= bestdev || best < 0) + { + best = i; + bestdev = dev; + brlist = g_list_append (brlist, (void *)i); + } + if (dev < runningvals.devthresh) + break; + } + + if (!brlist) + { + g_printerr("What!? No brushes?!\n"); + return 0; + } + + i = g_rand_int_range (random_generator, 0, g_list_length (brlist)); + best = (long)((g_list_nth (brlist,i))->data); + g_list_free (brlist); + + return best; +} + +static void +apply_brush (ppm_t *brush, + ppm_t *shadow, + ppm_t *p, ppm_t *a, + int tx, int ty, int r, int g, int b) +{ + ppm_t tmp; + ppm_t atmp; + double v, h; + int x, y; + double edgedarken = 1.0 - runningvals.general_dark_edge; + double relief = runningvals.brush_relief / 100.0; + int shadowdepth = pcvals.general_shadow_depth; + int shadowblur = pcvals.general_shadow_blur; + + atmp.col = 0; + atmp.width = 0; + + tmp = *p; + if (img_has_alpha) + atmp = *a; + + if (shadow) + { + int sx = tx + shadowdepth - shadowblur * 2; + int sy = ty + shadowdepth - shadowblur * 2; + + for (y = 0; y < shadow->height; y++) + { + guchar *row, *arow = NULL; + + if ((sy + y) < 0) + continue; + if ((sy + y) >= tmp.height) + break; + row = tmp.col + (sy + y) * tmp.width * 3; + + if (img_has_alpha) + arow = atmp.col + (sy + y) * atmp.width * 3; + + for (x = 0; x < shadow->width; x++) + { + int k = (sx + x) * 3; + + if ((sx + x) < 0) + continue; + if ((sx + x) >= tmp.width) + break; + + h = shadow->col[y * shadow->width * 3 + x * 3 + 2]; + + if (!h) + continue; + v = 1.0 - (h / 255.0 * runningvals.general_shadow_darkness / 100.0); + + row[k+0] *= v; + row[k+1] *= v; + row[k+2] *= v; + if (img_has_alpha) + arow[k] *= v; + } + } + } + + for (y = 0; y < brush->height; y++) + { + guchar *row = tmp.col + (ty + y) * tmp.width * 3; + guchar *arow = NULL; + + if (img_has_alpha) + arow = atmp.col + (ty + y) * atmp.width * 3; + + for (x = 0; x < brush->width; x++) + { + int k = (tx + x) * 3; + h = brush->col[y * brush->width * 3 + x * 3]; + + if (!h) continue; + + if (runningvals.color_brushes) + { + v = 1.0 - brush->col[y * brush->width * 3 + x * 3 + 2] / 255.0; + row[k+0] *= v; + row[k+1] *= v; + row[k+2] *= v; + if (img_has_alpha) + arow[(tx + x) * 3] *= v; + } + v = (1.0 - h / 255.0) * edgedarken; + row[k+0] *= v; + row[k+1] *= v; + row[k+2] *= v; + if(img_has_alpha) arow[k] *= v; + + v = h / 255.0; + row[k+0] += r * v; + row[k+1] += g * v; + row[k+2] += b * v; + } + } + + if (relief > 0.001) + { + for (y = 1; y < brush->height; y++) + { + guchar *row = tmp.col + (ty + y) * tmp.width * 3; + + for (x = 1; x < brush->width; x++) + { + int k = (tx + x) * 3; + h = brush->col[y * brush->width * 3 + x * 3 + 1] * relief; + if (h < 0.001) + continue; + if (h > 255) h = 255; + row[k+0] = (row[k+0] * (255-h) + 255 * h) / 255; + row[k+1] = (row[k+1] * (255-h) + 255 * h) / 255; + row[k+2] = (row[k+2] * (255-h) + 255 * h) / 255; + } + } + } +} + +void +repaint (ppm_t *p, ppm_t *a) +{ + int x, y; + int tx = 0, ty = 0; + ppm_t tmp = {0, 0, NULL}; + ppm_t atmp = {0, 0, NULL}; + int r, g, b, h, i, j, on, sn; + int num_brushes, maxbrushwidth, maxbrushheight; + guchar back[3] = {0, 0, 0}; + ppm_t *brushes, *shadows; + ppm_t *brush, *shadow = NULL; + double *brushes_sum; + int cx, cy, maxdist; + double scale, relief, startangle, anglespan, density, bgamma; + int max_progress; + ppm_t paper_ppm = {0, 0, NULL}; + ppm_t dirmap = {0, 0, NULL}; + ppm_t sizmap = {0, 0, NULL}; + int *xpos = NULL, *ypos = NULL; + int progstep; + static int running = 0; + + int dropshadow = pcvals.general_drop_shadow; + int shadowblur = pcvals.general_shadow_blur; + + if (running) + return; + running++; + + runningvals = pcvals; + + /* Shouldn't be necessary, but... */ + if (img_has_alpha) + if ((p->width != a->width) || (p->height != a->height)) + { + g_printerr ("Huh? Image size != alpha size?\n"); + return; + } + + num_brushes = runningvals.orient_num * runningvals.size_num; + startangle = runningvals.orient_first; + anglespan = runningvals.orient_last; + + density = runningvals.brush_density; + + if (runningvals.place_type == PLACEMENT_TYPE_EVEN_DIST) + density /= 3.0; + + bgamma = runningvals.brushgamma; + + brushes = g_malloc (num_brushes * sizeof (ppm_t)); + brushes_sum = g_malloc (num_brushes * sizeof (double)); + + if (dropshadow) + shadows = g_malloc (num_brushes * sizeof (ppm_t)); + else + shadows = NULL; + + brushes[0].col = NULL; + brush_get_selected (&brushes[0]); + + resize (&brushes[0], + brushes[0].width, + brushes[0].height * pow (10, runningvals.brush_aspect)); + scale = runningvals.size_last / MAX (brushes[0].width, brushes[0].height); + + if (bgamma != 1.0) + ppm_apply_gamma (&brushes[0], 1.0 / bgamma, 1,1,1); + + resize (&brushes[0], brushes[0].width * scale, brushes[0].height * scale); + i = 1 + sqrt (brushes[0].width * brushes[0].width + + brushes[0].height * brushes[0].height); + ppm_pad (&brushes[0], i-brushes[0].width, i-brushes[0].width, + i - brushes[0].height, i - brushes[0].height, back); + + for (i = 1; i < num_brushes; i++) + { + brushes[i].col = NULL; + ppm_copy (&brushes[0], &brushes[i]); + } + + for (i = 0; i < runningvals.size_num; i++) + { + double sv; + if (runningvals.size_num > 1) + sv = i / (runningvals.size_num - 1.0); + else sv = 1.0; + for (j = 0; j < runningvals.orient_num; j++) + { + h = j + i * runningvals.orient_num; + free_rotate (&brushes[h], + startangle + j * anglespan / runningvals.orient_num); + rescale (&brushes[h], + ( sv * runningvals.size_first + + (1.0-sv) * runningvals.size_last ) / runningvals.size_last); + autocrop (&brushes[h],1); + } + } + + /* Brush-debugging */ +#if 0 + for (i = 0; i < num_brushes; i++) + { + char tmp[1000]; + g_snprintf (tmp, sizeof (tmp), "/tmp/_brush%03d.ppm", i); + ppm_save (&brushes[i], tmp); + } +#endif + + for (i = 0; i < num_brushes; i++) + { + if (!runningvals.color_brushes) + prepare_brush (&brushes[i]); + brushes_sum[i] = sum_brush (&brushes[i]); + } + + brush = &brushes[0]; + + maxbrushwidth = maxbrushheight = 0; + for (i = 0; i < num_brushes; i++) + { + if (brushes[i].width > maxbrushwidth) + maxbrushwidth = brushes[i].width; + if (brushes[i].height > maxbrushheight) + maxbrushheight = brushes[i].height; + } + + for (i = 0; i < num_brushes; i++) + { + int xp, yp; + guchar blk[3] = {0, 0, 0}; + + xp = maxbrushwidth - brushes[i].width; + yp = maxbrushheight - brushes[i].height; + if (xp || yp) + ppm_pad (&brushes[i], xp / 2, xp - xp / 2, yp / 2, yp - yp / 2, blk); + } + + if (dropshadow) + { + for (i = 0; i < num_brushes; i++) + { + shadows[i].col = NULL; + ppm_copy (&brushes[i], &shadows[i]); + ppm_apply_gamma (&shadows[i], 0, 1,1,0); + ppm_pad (&shadows[i], shadowblur*2, shadowblur*2, + shadowblur*2, shadowblur*2, back); + for (j = 0; j < shadowblur; j++) + blur (&shadows[i], 2, 2); +#if 0 + autocrop (&shadows[i],1); +#endif + } +#if 0 + maxbrushwidth += shadowdepth*3; + maxbrushheight += shadowdepth*3; +#endif + } + + /* For extra annoying debugging :-) */ +#if 0 + ppm_save (brushes, "/tmp/__brush.ppm"); + if (shadows) ppm_save (shadows, "/tmp/__shadow.ppm"); + system ("xv /tmp/__brush.ppm & xv /tmp/__shadow.ppm & "); +#endif + + if (runningvals.general_paint_edges) + { + edgepad (p, maxbrushwidth, maxbrushwidth, + maxbrushheight, maxbrushheight); + if (img_has_alpha) + edgepad (a, maxbrushwidth, maxbrushwidth, + maxbrushheight, maxbrushheight); + } + + if (img_has_alpha) + { + /* Initially fully transparent */ + if (runningvals.general_background_type == BG_TYPE_TRANSPARENT) + { + guchar tmpcol[3] = {255, 255, 255}; + + ppm_new (&atmp, a->width, a->height); + fill (&atmp, tmpcol); + } + else + { + ppm_copy (a, &atmp); + } + } + + if (runningvals.general_background_type == BG_TYPE_SOLID) + { + guchar tmpcol[3]; + + ppm_new (&tmp, p->width, p->height); + gimp_rgb_get_uchar (&runningvals.color, + &tmpcol[0], &tmpcol[1], &tmpcol[2]); + fill (&tmp, tmpcol); + } + else if (runningvals.general_background_type == BG_TYPE_KEEP_ORIGINAL) + { + ppm_copy (p, &tmp); + } + else + { + int dx, dy; + + ppm_new (&tmp, p->width, p->height); + ppm_load (runningvals.selected_paper, &paper_ppm); + + if (runningvals.paper_scale != 100.0) + { + scale = runningvals.paper_scale / 100.0; + resize (&paper_ppm, paper_ppm.width * scale, paper_ppm.height * scale); + } + + if (runningvals.paper_invert) + ppm_apply_gamma (&paper_ppm, -1.0, 1, 1, 1); + + dx = runningvals.general_paint_edges ? paper_ppm.width - maxbrushwidth : 0; + dy = runningvals.general_paint_edges ? paper_ppm.height - maxbrushheight : 0; + + for (y = 0; y < tmp.height; y++) + { + int lx; + int ry = (y + dy) % paper_ppm.height; + + for (x = 0; x < tmp.width; x+=lx) + { + int rx = (x + dx) % paper_ppm.width; + + lx = MIN (tmp.width - x, paper_ppm.width - rx); + + memcpy (&tmp.col[y * tmp.width * 3 + x * 3], + &paper_ppm.col[ry * paper_ppm.width * 3 + rx * 3], + 3 * lx); + } + } + } + + cx = p->width / 2; + cy = p->height / 2; + maxdist = sqrt (cx * cx + cy * cy); + + switch (runningvals.orient_type) + { + case ORIENTATION_VALUE: + ppm_new (&dirmap, p->width, p->height); + for (y = 0; y < dirmap.height; y++) + { + guchar *dstrow = &dirmap.col[y * dirmap.width * 3]; + guchar *srcrow = &p->col[y * p->width * 3]; + for (x = 0; x < dirmap.width; x++) + { + dstrow[x * 3] = + (srcrow[x * 3] + srcrow[x * 3 + 1] + srcrow[x * 3 + 2]) / 3; + } + } + break; + + case ORIENTATION_RADIUS: + ppm_new (&dirmap, p->width, p->height); + for (y = 0; y < dirmap.height; y++) + { + guchar *dstrow = &dirmap.col[y * dirmap.width * 3]; + double ysqr = (cy - y) * (cy - y); + + for (x = 0; x < dirmap.width; x++) + { + dstrow[x*3] = sqrt ((cx - x) * (cx - x) + ysqr) * 255 / maxdist; + } + } + break; + + case ORIENTATION_RADIAL: + ppm_new (&dirmap, p->width, p->height); + for (y = 0; y < dirmap.height; y++) + { + guchar *dstrow = &dirmap.col[y * dirmap.width * 3]; + + for (x = 0; x < dirmap.width; x++) + { + dstrow[x * 3] = (G_PI + atan2 (cy - y, cx - x)) * + 255.0 / (G_PI * 2); + } + } + break; + + case ORIENTATION_FLOWING: + ppm_new (&dirmap, p->width / 6 + 5, p->height / 6 + 5); + mkgrayplasma (&dirmap, 15); + blur (&dirmap, 2, 2); + blur (&dirmap, 2, 2); + resize (&dirmap, p->width, p->height); + blur (&dirmap, 2, 2); + if (runningvals.general_paint_edges) + edgepad (&dirmap, maxbrushwidth, maxbrushheight, + maxbrushwidth, maxbrushheight); + break; + + case ORIENTATION_HUE: + ppm_new (&dirmap, p->width, p->height); + for (y = 0; y < dirmap.height; y++) + { + guchar *dstrow = &dirmap.col[y * dirmap.width * 3]; + guchar *srcrow = &p->col[y * p->width * 3]; + + for (x = 0; x < dirmap.width; x++) + { + dstrow[x * 3] = get_hue (&srcrow[x * 3]); + } + } + break; + + case ORIENTATION_ADAPTIVE: + { + guchar tmpcol[3] = {0, 0, 0}; + + ppm_new (&dirmap, p->width, p->height); + fill (&dirmap, tmpcol); + } + break; + + case ORIENTATION_MANUAL: + ppm_new (&dirmap, p->width-maxbrushwidth*2, p->height-maxbrushheight*2); + for (y = 0; y < dirmap.height; y++) + { + guchar *dstrow = &dirmap.col[y * dirmap.width * 3]; + double tmpy = y / (double)dirmap.height; + for (x = 0; x < dirmap.width; x++) + { + dstrow[x * 3] = get_pixel_value(90 - + get_direction(x / + (double)dirmap.width, + tmpy, 1)); + } + } + edgepad (&dirmap, + maxbrushwidth, maxbrushwidth, + maxbrushheight, maxbrushheight); + break; + } + + if (runningvals.size_type == SIZE_TYPE_VALUE) + { + ppm_new (&sizmap, p->width, p->height); + for (y = 0; y < sizmap.height; y++) + { + guchar *dstrow = &sizmap.col[y * sizmap.width * 3]; + guchar *srcrow = &p->col[y * p->width * 3]; + + for (x = 0; x < sizmap.width; x++) + { + dstrow[x * 3] = + (srcrow[x * 3] + srcrow[x * 3 + 1] + srcrow[x * 3 + 2]) / 3; + } + } + } + else if (runningvals.size_type == SIZE_TYPE_RADIUS) + { + ppm_new (&sizmap, p->width, p->height); + for (y = 0; y < sizmap.height; y++) + { + guchar *dstrow = &sizmap.col[y * sizmap.width * 3]; + double ysqr = (cy - y) * (cy - y); + + for (x = 0; x < sizmap.width; x++) + { + dstrow[x * 3] = + sqrt ((cx - x) * (cx - x) + ysqr) * 255 / maxdist; + } + } + } + else if (runningvals.size_type == SIZE_TYPE_RADIAL) + { + ppm_new (&sizmap, p->width, p->height); + for (y = 0; y < sizmap.height; y++) + { + guchar *dstrow = &sizmap.col[y * sizmap.width * 3]; + + for (x = 0; x < sizmap.width; x++) + { + dstrow[x * 3] = (G_PI + atan2 (cy - y, cx - x)) * + 255.0 / (G_PI * 2); + } + } + } + else if (runningvals.size_type == SIZE_TYPE_FLOWING) + { + ppm_new (&sizmap, p->width / 6 + 5, p->height / 6 + 5); + mkgrayplasma (&sizmap, 15); + blur (&sizmap, 2, 2); + blur (&sizmap, 2, 2); + resize (&sizmap, p->width, p->height); + blur (&sizmap, 2, 2); + if (runningvals.general_paint_edges) + edgepad (&sizmap, + maxbrushwidth, maxbrushheight, + maxbrushwidth, maxbrushheight); + } + else if (runningvals.size_type == SIZE_TYPE_HUE) + { + ppm_new (&sizmap, p->width, p->height); + for (y = 0; y < sizmap.height; y++) + { + guchar *dstrow = &sizmap.col[y * sizmap.width * 3]; + guchar *srcrow = &p->col[y * p->width * 3]; + + for (x = 0; x < sizmap.width; x++) + { + dstrow[ x * 3] = get_hue (&srcrow[x * 3]); + } + } + } + else if (runningvals.size_type == SIZE_TYPE_ADAPTIVE) + { + guchar tmpcol[3] = {0, 0, 0}; + + ppm_new (&sizmap, p->width, p->height); + fill (&sizmap, tmpcol); + } + else if (runningvals.size_type == SIZE_TYPE_MANUAL) + { + ppm_new (&sizmap, + p->width-maxbrushwidth * 2, + p->height-maxbrushheight * 2); + + for (y = 0; y < sizmap.height; y++) + { + guchar *dstrow = &sizmap.col[y * sizmap.width * 3]; + double tmpy = y / (double)sizmap.height; + + for (x = 0; x < sizmap.width; x++) + { + dstrow[x * 3] = 255 * (1.0 - get_siz_from_pcvals (x / (double)sizmap.width, tmpy)); + } + } + edgepad (&sizmap, + maxbrushwidth, maxbrushwidth, + maxbrushheight, maxbrushheight); + } +#if 0 + ppm_save(&sizmap, "/tmp/_sizmap.ppm"); +#endif + if (runningvals.place_type == PLACEMENT_TYPE_RANDOM) + { + i = tmp.width * tmp.height / (maxbrushwidth * maxbrushheight); + i *= density; + } + else if (runningvals.place_type == PLACEMENT_TYPE_EVEN_DIST) + { + i = (int)(tmp.width * density / maxbrushwidth) * + (int)(tmp.height * density / maxbrushheight); +#if 0 + g_printerr("i=%d\n", i); +#endif + } + + if (i < 1) + i = 1; + + max_progress = i; + progstep = max_progress / 30; + if (progstep < 10) + progstep = 10; + + if (runningvals.place_type == PLACEMENT_TYPE_EVEN_DIST) + { + int j; + + xpos = g_new (int, i); + ypos = g_new (int, i); + for (j = 0; j < i; j++) + { + int factor = (int)(tmp.width * density / maxbrushwidth + 0.5); + + if (factor < 1) + factor = 1; + xpos[j] = maxbrushwidth/2 + (j % factor) * maxbrushwidth / density; + ypos[j] = maxbrushheight/2 + (j / factor) * maxbrushheight / density; + } + for (j = 0; j < i; j++) + { + int a, b; + + a = g_rand_int_range (random_generator, 0, i); + b = xpos[j]; xpos[j] = xpos[a]; xpos[a] = b; + b = ypos[j]; ypos[j] = ypos[a]; ypos[a] = b; + } + } + + for (; i; i--) + { + int n; + double thissum; + + if (i % progstep == 0) + { + if(runningvals.run) + { + gimp_progress_update (0.8 - 0.8 * ((double)i / max_progress)); + } + else + { + char tmps[40]; + + g_snprintf (tmps, sizeof (tmps), + "%.1f %%", 100 * (1.0 - ((double)i / max_progress))); + preview_set_button_label (tmps); + + while(gtk_events_pending()) + gtk_main_iteration(); + } + } + + if (runningvals.place_type == PLACEMENT_TYPE_RANDOM) + { + tx = g_rand_int_range (random_generator, maxbrushwidth / 2, + tmp.width - maxbrushwidth / 2); + ty = g_rand_int_range (random_generator, maxbrushheight / 2, + tmp.height - maxbrushheight / 2); + } + else if (runningvals.place_type == PLACEMENT_TYPE_EVEN_DIST) + { + tx = xpos[i - 1]; + ty = ypos[i - 1]; + } + if (runningvals.placement_center) + { + double z = g_rand_double_range (random_generator, 0, 0.75); + tx = tx * (1.0 - z) + tmp.width / 2 * z; + ty = ty * (1.0 - z) + tmp.height / 2 * z; + } + + if ((tx < maxbrushwidth / 2) || + (ty < maxbrushwidth / 2) || + (tx + maxbrushwidth / 2 >= p->width) || + (ty + maxbrushheight / 2 >= p->height)) + { +#if 0 + g_printerr("Internal Error; invalid coords: (%d,%d) i=%d\n", tx, ty, i); +#endif + continue; + } + + if (img_has_alpha) + { + if (a->col[ty * a->width * 3 + tx * 3] > 128) + continue; + } + + sn = on = 0; + + switch (runningvals.orient_type) + { + case ORIENTATION_RANDOM: + on = g_rand_int_range (random_generator, 0, runningvals.orient_num); + break; + + case ORIENTATION_VALUE: + case ORIENTATION_RADIUS: + case ORIENTATION_RADIAL: + case ORIENTATION_FLOWING: + case ORIENTATION_HUE: + case ORIENTATION_MANUAL: + on = runningvals.orient_num * + dirmap.col[ty * dirmap.width * 3 + tx * 3] / 256; + break; + + case ORIENTATION_ADAPTIVE: + break; /* Handled below */ + + default: + g_printerr ("Internal error; Unknown orientationtype\n"); + on = 0; + break; + } + + switch (runningvals.size_type) + { + case SIZE_TYPE_RANDOM: + sn = g_rand_int_range (random_generator, 0, runningvals.size_num); + break; + + case SIZE_TYPE_VALUE: + case SIZE_TYPE_RADIUS: + case SIZE_TYPE_RADIAL: + case SIZE_TYPE_FLOWING: + case SIZE_TYPE_HUE: + case SIZE_TYPE_MANUAL: + sn = runningvals.size_num * sizmap.col[ty*sizmap.width*3+tx*3] / 256; + break; + + case SIZE_TYPE_ADAPTIVE: + break; /* Handled below */ + + default: + g_printerr ("Internal error; Unknown size_type\n"); + sn = 0; + break; + } + + /* Handle Adaptive selections */ + if (runningvals.orient_type == ORIENTATION_ADAPTIVE) + { + if (runningvals.size_type == SIZE_TYPE_ADAPTIVE) + n = choose_best_brush (p, a, tx-maxbrushwidth/2, + ty-maxbrushheight/2, brushes, + num_brushes, brushes_sum, 0, 1); + else + { + int st = sn * runningvals.orient_num; + n = choose_best_brush (p, a, tx-maxbrushwidth/2, + ty-maxbrushheight/2, brushes, + st+runningvals.orient_num, brushes_sum, + st, 1); + } + } + else + { + if (runningvals.size_type == SIZE_TYPE_ADAPTIVE) + n = choose_best_brush (p, a, tx-maxbrushwidth/2, + ty-maxbrushheight/2, brushes, + num_brushes, brushes_sum, + on, runningvals.orient_num); + else + n = sn * runningvals.orient_num + on; + } + /* Should never happen, but hey... */ + if (n < 0) + n = 0; + else if (n >= num_brushes) + n = num_brushes - 1; + + tx -= maxbrushwidth/2; + ty -= maxbrushheight/2; + + brush = &brushes[n]; + if (dropshadow) + shadow = &shadows[n]; + thissum = brushes_sum[n]; + + /* Calculate color - avg. of in-brush pixels */ + if (runningvals.color_type == 0) + { + r = g = b = 0; + for (y = 0; y < brush->height; y++) + { + guchar *row = &p->col[(ty + y) * p->width * 3]; + + for (x = 0; x < brush->width; x++) + { + int k = (tx + x) * 3; + double v; + + if ((h = brush->col[y * brush->width * 3 + x * 3])) + { + v = h / 255.0; + r += row[k+0] * v; + g += row[k+1] * v; + b += row[k+2] * v; + } + } + } + r = r * 255.0 / thissum; + g = g * 255.0 / thissum; + b = b * 255.0 / thissum; + } + else if (runningvals.color_type == 1) + { + guchar *pixel; + + y = ty + (brush->height / 2); + x = tx + (brush->width / 2); + pixel = &p->col[y*p->width * 3 + x * 3]; + r = pixel[0]; + g = pixel[1]; + b = pixel[2]; + } + else + { + /* No such color_type! */ + r = g = b = 0; + } + if (runningvals.color_noise > 0.0) + { + double v = runningvals.color_noise; +#define BOUNDS(a) (((a) < 0) ? (0) : ((a) > 255) ? 255 : (a)) +#define MYASSIGN(a) \ + { \ + a = a + g_rand_double_range (random_generator, -v/2.0, v/2.0); \ + a = BOUNDS(a) ; \ + } + MYASSIGN (r); + MYASSIGN (g); + MYASSIGN (b); +#undef BOUNDS +#undef MYASSIGN + } + + apply_brush (brush, shadow, &tmp, &atmp, tx,ty, r,g,b); + + if (runningvals.general_tileable && runningvals.general_paint_edges) + { + int orig_width = tmp.width - 2 * maxbrushwidth; + int orig_height = tmp.height - 2 * maxbrushheight; + int dox = 0, doy = 0; + + if (tx < maxbrushwidth) + { + apply_brush (brush, shadow, &tmp, &atmp, tx+orig_width,ty, r,g,b); + dox = -1; + } + else if (tx > orig_width) + { + apply_brush (brush, shadow, &tmp, &atmp, tx-orig_width,ty, r,g,b); + dox = 1; + } + if (ty < maxbrushheight) + { + apply_brush (brush, shadow, &tmp, &atmp, tx,ty+orig_height, r,g,b); + doy = 1; + } + else if (ty > orig_height) + { + apply_brush (brush, shadow, &tmp, &atmp, tx,ty-orig_height, r,g,b); + doy = -1; + } + if (doy) + { + if (dox < 0) + apply_brush (brush, shadow, &tmp, &atmp, + tx+orig_width, ty + doy * orig_height, r, g, b); + if (dox > 0) + apply_brush (brush, shadow, &tmp, &atmp, + tx-orig_width, ty + doy * orig_height, r, g, b); + } + } + } + for (i = 0; i < num_brushes; i++) + { + ppm_kill (&brushes[i]); + } + g_free (brushes); + g_free (shadows); + g_free (brushes_sum); + + g_free (xpos); + g_free (ypos); + + if (runningvals.general_paint_edges) + { + crop (&tmp, + maxbrushwidth, maxbrushheight, + tmp.width - maxbrushwidth, tmp.height - maxbrushheight); + if (img_has_alpha) + crop (&atmp, + maxbrushwidth, maxbrushheight, + atmp.width - maxbrushwidth, atmp.height - maxbrushheight); + } + + ppm_kill (p); + p->width = tmp.width; + p->height = tmp.height; + p->col = tmp.col; + + if (img_has_alpha) + { + ppm_kill (a); + a->width = atmp.width; + a->height = atmp.height; + a->col = atmp.col; + } + + relief = runningvals.paper_relief / 100.0; + if (relief > 0.001) + { + scale = runningvals.paper_scale / 100.0; + + if (PPM_IS_INITED (&paper_ppm)) + { + tmp = paper_ppm; + paper_ppm.col = NULL; + } + else + { + tmp.col = NULL; + ppm_load (runningvals.selected_paper, &tmp); + resize (&tmp, tmp.width * scale, tmp.height * scale); + if (runningvals.paper_invert) + ppm_apply_gamma (&tmp, -1.0, 1,1,1); + } + for (x = 0; x < p->width; x++) + { + double h, v; + int px = x % tmp.width, py; + + for (y = 0; y < p->height; y++) + { + int k = y * p->width * 3 + x * 3; + + py = y % tmp.height; + if (runningvals.paper_overlay) + h = (tmp.col[py * tmp.width * 3 + px * 3]-128) * relief; + else + h = (tmp.col[py * tmp.width * 3 + px * 3] - + (int)tmp.col[((py + 1) % tmp.height) * tmp.width * 3 + + ((px + 1) % tmp.width) * 3]) / + -2.0 * relief; + if (h <= 0.0) + { + v = 1.0 + h/128.0; + if (v < 0.0) + v = 0.0; + else if (v > 1.0) + v = 1.0; + p->col[k+0] *= v; + p->col[k+1] *= v; + p->col[k+2] *= v; + } + else + { + v = h/128.0; + if (v < 0.0) + v = 0.0; + else if (v > 1.0) + v = 1.0; + p->col[k+0] = p->col[k+0] * (1.0-v) + 255 * v; + p->col[k+1] = p->col[k+1] * (1.0-v) + 255 * v; + p->col[k+2] = p->col[k+2] * (1.0-v) + 255 * v; + } + } + } + ppm_kill (&tmp); + } + + ppm_kill (&paper_ppm); + ppm_kill (&dirmap); + ppm_kill (&sizmap); + + if (runningvals.run) + { + gimp_progress_update (0.8); + } + else + { + preview_set_button_label (_("_Update")); + } + + running = 0; +} diff --git a/plug-ins/gimpressionist/size.c b/plug-ins/gimpressionist/size.c new file mode 100644 index 0000000..007e09e --- /dev/null +++ b/plug-ins/gimpressionist/size.c @@ -0,0 +1,210 @@ +/* GIMP - The GNU Image Manipulation Program + * Copyright (C) 1995 Spencer Kimball and Peter Mattis + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <https://www.gnu.org/licenses/>. + */ + +#include "config.h" + +#include <gtk/gtk.h> + +#include <libgimp/gimp.h> +#include <libgimp/gimpui.h> + +#include "gimpressionist.h" +#include "ppmtool.h" +#include "size.h" + +#include "libgimp/stdplugins-intl.h" + +#define NUMSIZERADIO 8 + +static GtkObject *sizenumadjust = NULL; +static GtkObject *sizefirstadjust = NULL; +static GtkObject *sizelastadjust = NULL; +static GtkWidget *sizeradio[NUMSIZERADIO]; + +static void +size_store (GtkWidget *wg, void *d) +{ + pcvals.size_type = GPOINTER_TO_INT (d); +} + +int size_type_input (int in) +{ + return CLAMP_UP_TO (in, NUMSIZERADIO); +} + +static void +size_type_restore (void) +{ + gtk_toggle_button_set_active ( + GTK_TOGGLE_BUTTON (sizeradio[pcvals.size_type]), + TRUE); +} + +void +size_restore (void) +{ + size_type_restore (); + gtk_adjustment_set_value (GTK_ADJUSTMENT (sizenumadjust), + pcvals.size_num); + gtk_adjustment_set_value (GTK_ADJUSTMENT (sizefirstadjust), + pcvals.size_first); + gtk_adjustment_set_value (GTK_ADJUSTMENT (sizelastadjust), + pcvals.size_last); +} + +static void +create_sizemap_dialog_helper (GtkWidget *widget) +{ + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (sizeradio[7]), TRUE); + create_sizemap_dialog (widget); +} + +static void +create_size_radio_button (GtkWidget *box, + int orient_type, + const gchar *label, + const gchar *help_string, + GSList **radio_group) +{ + create_radio_button (box, orient_type, size_store, label, + help_string, radio_group, sizeradio); +} + +void +create_sizepage (GtkNotebook *notebook) +{ + GtkWidget *box2, *box3, *box4, *thispage; + GtkWidget *label, *tmpw, *table; + GSList *radio_group = NULL; + + label = gtk_label_new_with_mnemonic (_("_Size")); + + thispage = gtk_box_new (GTK_ORIENTATION_VERTICAL, 12); + gtk_container_set_border_width (GTK_CONTAINER (thispage), 12); + gtk_widget_show (thispage); + + table = gtk_table_new (3, 3, FALSE); + gtk_table_set_col_spacings (GTK_TABLE (table), 6); + gtk_table_set_row_spacings (GTK_TABLE (table), 6); + gtk_box_pack_start (GTK_BOX (thispage), table, FALSE, FALSE, 0); + gtk_widget_show (table); + + sizenumadjust = + gimp_scale_entry_new (GTK_TABLE (table), 0, 0, + _("Size variants:"), + 150, -1, pcvals.size_num, + 1.0, 30.0, 1.0, 1.0, 0, + TRUE, 0, 0, + _("The number of sizes of brushes to use"), + NULL); + g_signal_connect (sizenumadjust, "value-changed", + G_CALLBACK (gimp_int_adjustment_update), + &pcvals.size_num); + + sizefirstadjust = + gimp_scale_entry_new (GTK_TABLE (table), 0, 1, + _("Minimum size:"), + 150, -1, pcvals.size_first, + 0.0, 360.0, 1.0, 10.0, 0, + TRUE, 0, 0, + _("The smallest brush to create"), + NULL); + g_signal_connect (sizefirstadjust, "value-changed", + G_CALLBACK (gimp_double_adjustment_update), + &pcvals.size_first); + + sizelastadjust = + gimp_scale_entry_new (GTK_TABLE (table), 0, 2, + _("Maximum size:"), + 150, -1, pcvals.size_last, + 0.0, 360.0, 1.0, 10.0, 0, + TRUE, 0, 0, + _("The largest brush to create"), + NULL); + g_signal_connect (sizelastadjust, "value-changed", + G_CALLBACK (gimp_double_adjustment_update), + &pcvals.size_last); + + box2 = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 12); + gtk_box_pack_start (GTK_BOX (thispage), box2,FALSE,FALSE,0); + gtk_widget_show (box2); + + box3 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 6); + gtk_box_pack_start (GTK_BOX (box2), box3, FALSE, FALSE, 0); + gtk_widget_show (box3); + + tmpw = gtk_label_new (_("Size depends on:")); + gtk_box_pack_start (GTK_BOX (box3), tmpw,FALSE,FALSE,0); + gtk_widget_show (tmpw); + + box3 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 6); + gtk_box_pack_start (GTK_BOX( box2), box3, FALSE, FALSE, 0); + gtk_widget_show (box3); + + create_size_radio_button (box3, SIZE_TYPE_VALUE, _("Value"), + _("Let the value (brightness) of the region determine the size of the stroke"), + &radio_group); + + create_size_radio_button (box3, SIZE_TYPE_RADIUS, _("Radius"), + _("The distance from the center of the image determines the size of the stroke"), + &radio_group); + + create_size_radio_button (box3, SIZE_TYPE_RANDOM, _("Random"), + _("Selects a random size for each stroke"), + &radio_group); + + create_size_radio_button (box3, SIZE_TYPE_RADIAL, _("Radial"), + _("Let the direction from the center determine the size of the stroke"), + &radio_group); + + box3 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 6); + gtk_box_pack_start (GTK_BOX (box2), box3,FALSE,FALSE, 0); + gtk_widget_show (box3); + + create_size_radio_button (box3, SIZE_TYPE_FLOWING, _("Flowing"), + _("The strokes follow a \"flowing\" pattern"), + &radio_group); + + create_size_radio_button (box3, SIZE_TYPE_HUE, _("Hue"), + _("The hue of the region determines the size of the stroke"), + &radio_group); + + create_size_radio_button (box3, SIZE_TYPE_ADAPTIVE, _("Adaptive"), + _("The brush-size that matches the original image the closest is selected"), + &radio_group); + + + box4 = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 6); + gtk_box_pack_start (GTK_BOX (box3), box4, FALSE, FALSE, 0); + gtk_widget_show (box4); + + create_size_radio_button (box4, SIZE_TYPE_MANUAL, _("Manual"), + _("Manually specify the stroke size"), + &radio_group + ); + + size_type_restore (); + + tmpw = gtk_button_new_with_mnemonic (_("_Edit")); + gtk_box_pack_start (GTK_BOX (box4), tmpw, FALSE, FALSE, 0); + gtk_widget_show (tmpw); + g_signal_connect (tmpw, "clicked", + G_CALLBACK (create_sizemap_dialog_helper), NULL); + gimp_help_set_help_data (tmpw, _("Opens up the Size Map Editor"), NULL); + + gtk_notebook_append_page_menu (notebook, thispage, label, NULL); +} diff --git a/plug-ins/gimpressionist/size.h b/plug-ins/gimpressionist/size.h new file mode 100644 index 0000000..b2891f0 --- /dev/null +++ b/plug-ins/gimpressionist/size.h @@ -0,0 +1,40 @@ +/* GIMP - The GNU Image Manipulation Program + * Copyright (C) 1995 Spencer Kimball and Peter Mattis + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <https://www.gnu.org/licenses/>. + */ + +#ifndef __SIZE_H +#define __SIZE_H + +enum SIZE_TYPE_ENUM +{ + SIZE_TYPE_VALUE = 0, + SIZE_TYPE_RADIUS = 1, + SIZE_TYPE_RANDOM = 2, + SIZE_TYPE_RADIAL = 3, + SIZE_TYPE_FLOWING = 4, + SIZE_TYPE_HUE = 5, + SIZE_TYPE_ADAPTIVE = 6, + SIZE_TYPE_MANUAL = 7, +}; + +void size_restore (void); + +void create_sizepage (GtkNotebook *); + +int size_type_input (int in); +void size_map_free_resources (void); + +#endif /* #ifndef __SIZE_H */ diff --git a/plug-ins/gimpressionist/sizemap.c b/plug-ins/gimpressionist/sizemap.c new file mode 100644 index 0000000..591c299 --- /dev/null +++ b/plug-ins/gimpressionist/sizemap.c @@ -0,0 +1,553 @@ +/* GIMP - The GNU Image Manipulation Program + * Copyright (C) 1995 Spencer Kimball and Peter Mattis + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <https://www.gnu.org/licenses/>. + */ + +#include "config.h" + +#include <gtk/gtk.h> + +#include <libgimp/gimp.h> +#include <libgimp/gimpui.h> + +#include "gimpressionist.h" +#include "ppmtool.h" +#include "size.h" +#include "infile.h" + +#include "preview.h" + +#include "libgimp/stdplugins-intl.h" + + +#define RESPONSE_APPLY 1 + +#define MAPFILE "data.out" + +static GtkWidget *smwindow; +static GtkWidget *smvectorprev; +static GtkWidget *smpreviewprev; +static GtkWidget *prev_button; +static GtkWidget *next_button; +static GtkWidget *add_button; +static GtkWidget *kill_button; + +static GtkAdjustment *smvectprevbrightadjust = NULL; + +static GtkAdjustment *sizadjust = NULL; +static GtkAdjustment *smstradjust = NULL; +static GtkAdjustment *smstrexpadjust = NULL; +static GtkWidget *size_voronoi = NULL; + +#define OMWIDTH 150 +#define OMHEIGHT 150 + +static smvector_t smvector[MAXSIZEVECT]; +static int numsmvect = 0; + +static double +getsiz_from_gui (double x, double y) +{ + return getsiz_proto (x,y, numsmvect, smvector, + gtk_adjustment_get_value (smstrexpadjust), + gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (size_voronoi))); +} + +static void +updatesmpreviewprev (void) +{ + gint x, y; + static ppm_t nsbuffer; + guchar black[3] = {0, 0, 0}; + guchar gray[3] = {120, 120, 120}; + + if (! PPM_IS_INITED (&nsbuffer)) + { + ppm_new (&nsbuffer, OMWIDTH, OMHEIGHT); + } + fill (&nsbuffer, black); + + for (y = 6; y < OMHEIGHT-4; y += 10) + { + for (x = 6; x < OMWIDTH-4; x += 10) + { + gdouble siz = 5 * getsiz_from_gui (x / (double)OMWIDTH, + y / (double)OMHEIGHT); + ppm_drawline (&nsbuffer, x-siz, y-siz, x+siz, y-siz, gray); + ppm_drawline (&nsbuffer, x+siz, y-siz, x+siz, y+siz, gray); + ppm_drawline (&nsbuffer, x+siz, y+siz, x-siz, y+siz, gray); + ppm_drawline (&nsbuffer, x-siz, y+siz, x-siz, y-siz, gray); + } + } + + + gimp_preview_area_draw (GIMP_PREVIEW_AREA (smpreviewprev), + 0, 0, OMWIDTH, OMHEIGHT, + GIMP_RGB_IMAGE, + nsbuffer.col, + OMWIDTH * 3); +} + +static gint selectedsmvector = 0; +static ppm_t update_vector_preview_backup = {0,0,NULL}; +static ppm_t update_vector_preview_sbuffer = {0,0,NULL}; + +static void +updatesmvectorprev (void) +{ + static int ok = 0; + gint i, x, y; + gdouble val; + static gdouble last_val = 0.0; + guchar gray[3] = {120, 120, 120}; + guchar red[3] = {255, 0, 0}; + guchar white[3] = {255, 255, 255}; + + if (smvectprevbrightadjust) + val = 1.0 - gtk_adjustment_get_value (smvectprevbrightadjust) / 100.0; + else + val = 0.5; + + if (!ok || (val != last_val)) + { +#if 0 + if (!PPM_IS_INITED (&infile)) + updatepreview (NULL, (void *)2); /* Force grabarea () */ + ppm_copy (&infile, &update_vector_preview_backup); +#else + infile_copy_to_ppm (&update_vector_preview_backup); +#endif + ppm_apply_brightness (&update_vector_preview_backup, val, 1,1,1); + + if (update_vector_preview_backup.width != OMWIDTH || + update_vector_preview_backup.height != OMHEIGHT) + resize_fast (&update_vector_preview_backup, OMWIDTH, OMHEIGHT); + + ok = 1; + } + ppm_copy (&update_vector_preview_backup, &update_vector_preview_sbuffer); + + for (i = 0; i < numsmvect; i++) + { + x = smvector[i].x * OMWIDTH; + y = smvector[i].y * OMHEIGHT; + if (i == selectedsmvector) + { + ppm_drawline (&update_vector_preview_sbuffer, x-5, y, x+5, y, red); + ppm_drawline (&update_vector_preview_sbuffer, x, y-5, x, y+5, red); + } + else + { + ppm_drawline (&update_vector_preview_sbuffer, x-5, y, x+5, y, gray); + ppm_drawline (&update_vector_preview_sbuffer, x, y-5, x, y+5, gray); + } + ppm_put_rgb (&update_vector_preview_sbuffer, x, y, white); + } + + gimp_preview_area_draw (GIMP_PREVIEW_AREA (smvectorprev), + 0, 0, OMWIDTH, OMHEIGHT, + GIMP_RGB_IMAGE, + update_vector_preview_sbuffer.col, + OMWIDTH * 3); + + gtk_widget_set_sensitive (prev_button, (numsmvect > 1)); + gtk_widget_set_sensitive (next_button, (numsmvect > 1)); + gtk_widget_set_sensitive (add_button, (numsmvect < MAXORIENTVECT)); + gtk_widget_set_sensitive (kill_button, (numsmvect > 1)); +} + +void +size_map_free_resources (void) +{ + ppm_kill (&update_vector_preview_backup); + ppm_kill (&update_vector_preview_sbuffer); +} + +static gboolean smadjignore = FALSE; + +static void +updatesmsliders (void) +{ + smadjignore = TRUE; + gtk_adjustment_set_value (sizadjust, smvector[selectedsmvector].siz); + gtk_adjustment_set_value (smstradjust, smvector[selectedsmvector].str); + smadjignore = FALSE; +} + +static void +smprevclick (GtkWidget *w, gpointer data) +{ + selectedsmvector--; + if (selectedsmvector < 0) + selectedsmvector = numsmvect-1; + updatesmsliders (); + updatesmvectorprev (); +} + +static void +smnextclick (GtkWidget *w, gpointer data) +{ + selectedsmvector++; + + if (selectedsmvector == numsmvect) + selectedsmvector = 0; + updatesmsliders (); + updatesmvectorprev (); +} + +static void +smaddclick (GtkWidget *w, gpointer data) +{ + smvector[numsmvect].x = 0.5; + smvector[numsmvect].y = 0.5; + smvector[numsmvect].siz = 50.0; + smvector[numsmvect].str = 1.0; + selectedsmvector = numsmvect; + numsmvect++; + updatesmsliders (); + updatesmvectorprev (); + updatesmpreviewprev (); +} + +static void +smdeleteclick (GtkWidget *w, gpointer data) +{ + int i; + + for (i = selectedsmvector; i < numsmvect-1; i++) + { + smvector[i] = smvector[i+1]; + } + numsmvect--; + if (selectedsmvector >= numsmvect) + selectedsmvector = 0; + updatesmsliders (); + updatesmvectorprev (); + updatesmpreviewprev (); +} + +static void +smmapclick (GtkWidget *w, GdkEventButton *event) +{ + if (event->button == 1) + { + smvector[selectedsmvector].x = event->x / (double)OMWIDTH; + smvector[selectedsmvector].y = event->y / (double)OMHEIGHT; + } + else if (event->button == 2) + { + if (numsmvect + 1 == MAXSIZEVECT) + return; + smvector[numsmvect].x = event->x / (double)OMWIDTH; + smvector[numsmvect].y = event->y / (double)OMHEIGHT; + smvector[numsmvect].siz = 0.0; + smvector[numsmvect].str = 1.0; + selectedsmvector = numsmvect; + numsmvect++; + updatesmsliders (); + } +#if 0 + else if (event->button == 3) + { + double d; + d = atan2 (OMWIDTH * smvector[selectedsmvector].x - event->x, + OMHEIGHT * smvector[selectedsmvector].y - event->y); + smvector[selectedsmvector].dir = radtodeg (d); + updatesmsliders (); + */ + } +#endif + updatesmvectorprev (); + updatesmpreviewprev (); +} + +static void +angsmadjmove (GtkWidget *w, gpointer data) +{ + if (!smadjignore) + { + smvector[selectedsmvector].siz = gtk_adjustment_get_value (sizadjust); + updatesmvectorprev (); + updatesmpreviewprev (); + } +} + +static void +strsmadjmove (GtkWidget *w, gpointer data) +{ + if (!smadjignore) + { + smvector[selectedsmvector].str = gtk_adjustment_get_value (smstradjust); + updatesmvectorprev (); + updatesmpreviewprev (); + } +} + +static void +smstrexpsmadjmove (GtkWidget *w, gpointer data) +{ + if (!smadjignore) + { + updatesmvectorprev (); + updatesmpreviewprev (); + } +} + +static void +smresponse (GtkWidget *widget, + gint response_id, + gpointer data) +{ + switch (response_id) + { + case RESPONSE_APPLY: + case GTK_RESPONSE_OK: + { + gint i; + + for (i = 0; i < numsmvect; i++) + pcvals.size_vectors[i] = smvector[i]; + + pcvals.num_size_vectors = numsmvect; + pcvals.size_strength_exponent = gtk_adjustment_get_value (smstrexpadjust); + pcvals.size_voronoi = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (size_voronoi)); + } + break; + } + + if (response_id != RESPONSE_APPLY) + gtk_widget_hide (widget); +} + +static void +initsmvectors (void) +{ + if (pcvals.num_size_vectors) + { + gint i; + + numsmvect = pcvals.num_size_vectors; + for (i = 0; i < numsmvect; i++) + { + smvector[i] = pcvals.size_vectors[i]; + } + } + else + { + /* Shouldn't happen */ + numsmvect = 1; + smvector[0].x = 0.5; + smvector[0].y = 0.5; + smvector[0].siz = 0.0; + smvector[0].str = 1.0; + } + if (selectedsmvector >= numsmvect) + selectedsmvector = numsmvect-1; +} + +#if 0 +static void +update_sizemap_dialog (void) +{ + if (smwindow) + { + initsmvectors (); + + gtk_adjustment_set_value (smstrexpadjust, pcvals.size_strength_exponent); + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (size_voronoi), + pcvals.size_voronoi); + + updatesmvectorprev (); + updatesmpreviewprev (); + } +} +#endif + +void +create_sizemap_dialog (GtkWidget *parent) +{ + GtkWidget *tmpw, *tmpw2; + GtkWidget *table1; + GtkWidget *table2; + GtkWidget *hbox; + + initsmvectors (); + + if (smwindow) + { + updatesmvectorprev (); + updatesmpreviewprev (); + gtk_window_present (GTK_WINDOW (smwindow)); + return; + } + + smwindow = gimp_dialog_new (_("Size Map Editor"), PLUG_IN_ROLE, + gtk_widget_get_toplevel (parent), 0, + gimp_standard_help_func, PLUG_IN_PROC, + + _("_Apply"), RESPONSE_APPLY, + _("_Cancel"), GTK_RESPONSE_CANCEL, + _("_OK"), GTK_RESPONSE_OK, + + NULL); + + gtk_dialog_set_alternative_button_order (GTK_DIALOG (smwindow), + GTK_RESPONSE_OK, + RESPONSE_APPLY, + GTK_RESPONSE_CANCEL, + -1); + + g_signal_connect (smwindow, "response", + G_CALLBACK (smresponse), + NULL); + g_signal_connect (smwindow, "destroy", + G_CALLBACK (gtk_widget_destroyed), + &smwindow); + + table1 = gtk_table_new (2, 5, FALSE); + gtk_container_set_border_width (GTK_CONTAINER (table1), 6); + gtk_box_pack_start (GTK_BOX (gtk_dialog_get_content_area (GTK_DIALOG (smwindow))), + table1, TRUE, TRUE, 0); + gtk_widget_show (table1); + + tmpw2 = tmpw = gtk_frame_new (_("Smvectors")); + gtk_container_set_border_width (GTK_CONTAINER (tmpw), 2); + gtk_table_attach (GTK_TABLE (table1), tmpw, 0,1,0,1,GTK_EXPAND,GTK_EXPAND,0,0); + gtk_widget_show (tmpw); + + tmpw = hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL,0); + gtk_container_add (GTK_CONTAINER (tmpw2), tmpw); + gtk_widget_show (tmpw); + + tmpw = gtk_event_box_new (); + gimp_help_set_help_data (tmpw, _("The smvector-field. Left-click to move selected smvector, Right-click to point it towards mouse, Middle-click to add a new smvector."), NULL); + gtk_box_pack_start (GTK_BOX (hbox), tmpw, FALSE, FALSE, 0); + tmpw2 = tmpw; + + tmpw = smvectorprev = gimp_preview_area_new (); + gtk_widget_set_size_request (tmpw, OMWIDTH, OMHEIGHT); + gtk_container_add (GTK_CONTAINER (tmpw2), tmpw); + gtk_widget_show (tmpw); + gtk_widget_add_events (tmpw2, GDK_BUTTON_PRESS_MASK); + g_signal_connect (tmpw2, "button-press-event", + G_CALLBACK (smmapclick), NULL); + gtk_widget_show (tmpw2); + + smvectprevbrightadjust = (GtkAdjustment *) + gtk_adjustment_new (50.0, 0.0, 100.0, 1.0, 1.0, 1.0); + tmpw = gtk_scale_new (GTK_ORIENTATION_VERTICAL, smvectprevbrightadjust); + gtk_scale_set_draw_value (GTK_SCALE (tmpw), FALSE); + gtk_box_pack_start (GTK_BOX (hbox), tmpw,FALSE,FALSE,0); + gtk_widget_show (tmpw); + g_signal_connect (smvectprevbrightadjust, "value-changed", + G_CALLBACK (updatesmvectorprev), NULL); + gimp_help_set_help_data (tmpw, _("Adjust the preview's brightness"), NULL); + + tmpw2 = tmpw = gtk_frame_new (_("Preview")); + gtk_container_set_border_width (GTK_CONTAINER (tmpw), 2); + gtk_table_attach (GTK_TABLE (table1), tmpw, 1,2,0,1,GTK_EXPAND,GTK_EXPAND,0,0); + gtk_widget_show (tmpw); + + tmpw = smpreviewprev = gimp_preview_area_new (); + gtk_widget_set_size_request (tmpw, OMWIDTH, OMHEIGHT); + gtk_container_add (GTK_CONTAINER (tmpw2), tmpw); + gtk_widget_show (tmpw); + + hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0); + gtk_box_set_homogeneous (GTK_BOX (hbox), TRUE); + gtk_container_set_border_width (GTK_CONTAINER (hbox), 2); + gtk_table_attach_defaults (GTK_TABLE (table1), hbox, 0, 1, 1, 2); + gtk_widget_show (hbox); + + prev_button = tmpw = gtk_button_new_with_mnemonic ("_<<"); + gtk_box_pack_start (GTK_BOX (hbox), tmpw, FALSE, TRUE, 0); + gtk_widget_show (tmpw); + g_signal_connect (tmpw, "clicked", + G_CALLBACK (smprevclick), NULL); + gimp_help_set_help_data (tmpw, _("Select previous smvector"), NULL); + + next_button = tmpw = gtk_button_new_with_mnemonic ("_>>"); + gtk_box_pack_start (GTK_BOX (hbox),tmpw,FALSE,TRUE,0); + gtk_widget_show (tmpw); + g_signal_connect (tmpw, "clicked", + G_CALLBACK (smnextclick), NULL); + gimp_help_set_help_data (tmpw, _("Select next smvector"), NULL); + + add_button = tmpw = gtk_button_new_with_mnemonic ( _("A_dd")); + gtk_box_pack_start (GTK_BOX (hbox),tmpw,FALSE,TRUE,0); + gtk_widget_show (tmpw); + g_signal_connect (tmpw, "clicked", + G_CALLBACK (smaddclick), NULL); + gimp_help_set_help_data (tmpw, _("Add new smvector"), NULL); + + kill_button = tmpw = gtk_button_new_with_mnemonic (_("_Kill")); + gtk_box_pack_start (GTK_BOX (hbox),tmpw,FALSE,TRUE,0); + gtk_widget_show (tmpw); + g_signal_connect (tmpw, "clicked", + G_CALLBACK (smdeleteclick), NULL); + gimp_help_set_help_data (tmpw, _("Delete selected smvector"), NULL); + + table2 = gtk_table_new (3, 4, FALSE); + gtk_table_set_col_spacings (GTK_TABLE (table2), 4); + gtk_table_attach_defaults (GTK_TABLE (table1), table2, 0, 2, 2, 3); + gtk_widget_show (table2); + + sizadjust = (GtkAdjustment *) + gimp_scale_entry_new (GTK_TABLE (table2), 0, 0, + _("_Size:"), + 150, 6, 50.0, + 0.0, 100.0, 1.0, 10.0, 1, + TRUE, 0, 0, + _("Change the angle of the selected smvector"), + NULL); + g_signal_connect (sizadjust, "value-changed", + G_CALLBACK (angsmadjmove), NULL); + + smstradjust = (GtkAdjustment *) + gimp_scale_entry_new (GTK_TABLE (table2), 0, 1, + _("S_trength:"), + 150, 6, 1.0, + 0.1, 5.0, 0.1, 0.5, 1, + TRUE, 0, 0, + _("Change the strength of the selected smvector"), + NULL); + g_signal_connect (smstradjust, "value-changed", + G_CALLBACK (strsmadjmove), NULL); + + smstrexpadjust = (GtkAdjustment *) + gimp_scale_entry_new (GTK_TABLE (table2), 0, 2, + _("St_rength exp.:"), + 150, 6, 1.0, + 0.1, 10.9, 0.1, 0.5, 1, + TRUE, 0, 0, + _("Change the exponent of the strength"), + NULL); + g_signal_connect (smstrexpadjust, "value-changed", + G_CALLBACK (smstrexpsmadjmove), NULL); + + size_voronoi = tmpw = gtk_check_button_new_with_mnemonic ( _("_Voronoi")); + gtk_table_attach_defaults (GTK_TABLE (table2), tmpw, 3, 4, 0, 1); + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (tmpw), FALSE); + gtk_widget_show (tmpw); + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (tmpw), pcvals.size_voronoi); + g_signal_connect (tmpw, "clicked", + G_CALLBACK (smstrexpsmadjmove), NULL); + gimp_help_set_help_data (tmpw, _("Voronoi-mode makes only the smvector closest to the given point have any influence"), NULL); + + gtk_widget_show (smwindow); + + updatesmvectorprev (); + updatesmpreviewprev (); +} diff --git a/plug-ins/gimpressionist/utils.c b/plug-ins/gimpressionist/utils.c new file mode 100644 index 0000000..16244ae --- /dev/null +++ b/plug-ins/gimpressionist/utils.c @@ -0,0 +1,411 @@ +/* GIMP - The GNU Image Manipulation Program + * Copyright (C) 1995 Spencer Kimball and Peter Mattis + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <https://www.gnu.org/licenses/>. + */ + +/* + * utils.c - various utility routines that don't fit anywhere else. Usually + * these routines don't affect the state of the program. + */ + +#include "config.h" + +#include <string.h> + +#include <libgimp/gimp.h> + +#include "gimpressionist.h" + +#include "libgimp/stdplugins-intl.h" + + +/* Mathematical Utilities */ + +double +dist (double x, double y, double end_x, double end_y) +{ + double dx = end_x - x; + double dy = end_y - y; + return sqrt (dx * dx + dy * dy); +} + +double +getsiz_proto (double x, double y, int n, smvector_t *vec, + double smstrexp, int voronoi) +{ + int i; + double sum, ssum, dst; + int first = 0, last; + + if ((x < 0.0) || (x > 1.0)) + g_warning ("HUH? x = %f\n",x); + +#if 0 + if (from == 0) + { + n = numsmvect; + vec = smvector; + smstrexp = gtk_adjustment_get_value (GTK_ADJUSTMENT (smstrexpadjust)); + voronoi = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (size_voronoi)); + } + else + { + n = pcvals.num_size_vectors; + vec = pcvals.size_vectors; + smstrexp = pcvals.size_strength_exponent; + voronoi = pcvals.size_voronoi; + } +#endif + + if (voronoi) + { + gdouble bestdist = -1.0; + for (i = 0; i < n; i++) + { + dst = dist (x, y, vec[i].x, vec[i].y); + if ((bestdist < 0.0) || (dst < bestdist)) + { + bestdist = dst; + first = i; + } + } + last = first+1; + } + else + { + first = 0; + last = n; + } + + sum = ssum = 0.0; + for (i = first; i < last; i++) + { + gdouble s = vec[i].str; + + dst = dist (x,y,vec[i].x,vec[i].y); + dst = pow (dst, smstrexp); + if (dst < 0.0001) + dst = 0.0001; + s = s / dst; + + sum += vec[i].siz * s; + ssum += 1.0/dst; + } + sum = sum / ssum / 100.0; + return CLAMP (sum, 0.0, 1.0); +} + + +/* String and Path Manipulation Routines */ + + +static GList *parsepath_cached_path = NULL; + +/* This function is memoized. Once it finds the value it permanently + * caches it + * */ +GList * +parsepath (void) +{ + gchar *rc_path, *path; + + if (parsepath_cached_path) + return parsepath_cached_path; + + path = gimp_gimprc_query ("gimpressionist-path"); + if (path) + { + rc_path = g_filename_from_utf8 (path, -1, NULL, NULL, NULL); + g_free (path); + } + else + { + gchar *gimprc = gimp_personal_rc_file ("gimprc"); + gchar *full_path = gimp_config_build_data_path ("gimpressionist"); + gchar *esc_path = g_strescape (full_path, NULL); + + g_message (_("No %s in gimprc:\n" + "You need to add an entry like\n" + "(%s \"%s\")\n" + "to your %s file."), + "gflare-path", "gflare-path", + esc_path, gimp_filename_to_utf8 (gimprc)); + + g_free (gimprc); + g_free (esc_path); + + rc_path = gimp_config_path_expand (full_path, TRUE, NULL); + g_free (full_path); + } + + parsepath_cached_path = gimp_path_parse (rc_path, 256, FALSE, NULL); + + g_free (rc_path); + + return parsepath_cached_path; +} + +void +free_parsepath_cache (void) +{ + if (parsepath_cached_path != NULL) + return; + + g_list_free_full (parsepath_cached_path, (GDestroyNotify) g_free); + parsepath_cached_path = NULL; +} + +gchar * +findfile (const gchar *fn) +{ + GList *rcpath; + GList *thispath; + gchar *filename; + + g_return_val_if_fail (fn != NULL, NULL); + + rcpath = parsepath (); + + thispath = rcpath; + + while (thispath) + { + filename = g_build_filename (thispath->data, fn, NULL); + if (g_file_test (filename, G_FILE_TEST_IS_REGULAR)) + return filename; + g_free (filename); + thispath = thispath->next; + } + return NULL; +} + +/* GUI Routines */ + +void +reselect (GtkWidget *view, + gchar *fname) +{ + GtkTreeModel *model; + GtkTreeSelection *selection; + GtkTreeIter iter; + char *tmpfile; + + tmpfile = strrchr (fname, '/'); + if (tmpfile) + fname = ++tmpfile; + + model = gtk_tree_view_get_model (GTK_TREE_VIEW (view)); + selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (view)); + + if (gtk_tree_model_get_iter_first (model, &iter)) + { + gboolean quit = FALSE; + do + { + gchar *name; + + gtk_tree_model_get (model, &iter, 0, &name, -1); + if (!strcmp(name, fname)) + { + GtkTreePath *tree_path; + gtk_tree_selection_select_iter (selection, &iter); + tree_path = gtk_tree_model_get_path (model, + &iter); + gtk_tree_view_scroll_to_cell (GTK_TREE_VIEW (view), + tree_path, + NULL, + TRUE, + 0.5, + 0.5); + gtk_tree_path_free (tree_path); + quit = TRUE; + } + g_free (name); + + } while ((!quit) && gtk_tree_model_iter_next (model, &iter)); + } +} + +static void +readdirintolist_real (const char *subdir, + GtkWidget *view, + char *selected, + gboolean with_filename_column, + gchar *(*get_object_name_cb) (const gchar *dir, + gchar *filename, + void *context), + void *context) +{ + gchar *fpath; + const gchar *de; + GDir *dir; + GList *flist = NULL; + GtkTreeIter iter; + GtkListStore *store; + GtkTreeSelection *selection; + + store = GTK_LIST_STORE (gtk_tree_view_get_model (GTK_TREE_VIEW (view))); + + if (selected) + { + if (!selected[0]) + selected = NULL; + else + { + char *nsel; + + nsel = strrchr (selected, '/'); + if (nsel) selected = ++nsel; + } + } + + dir = g_dir_open (subdir, 0, NULL); + + if (!dir) + return; + + for (;;) + { + gboolean file_exists; + + de = g_dir_read_name (dir); + if (!de) + break; + + fpath = g_build_filename (subdir, de, NULL); + file_exists = g_file_test (fpath, G_FILE_TEST_IS_REGULAR); + g_free (fpath); + + if (!file_exists) + continue; + + flist = g_list_insert_sorted (flist, g_strdup (de), + (GCompareFunc)g_ascii_strcasecmp); + } + g_dir_close (dir); + + selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (view)); + + while (flist) + { + gtk_list_store_append (store, &iter); + /* Set the filename */ + gtk_list_store_set (store, &iter, PRESETS_LIST_COLUMN_FILENAME, + flist->data, -1); + /* Set the object name */ + if (with_filename_column) + { + gchar * object_name; + object_name = get_object_name_cb (subdir, flist->data, context); + if (object_name) + { + gtk_list_store_set (store, &iter, + PRESETS_LIST_COLUMN_OBJECT_NAME, + object_name, -1); + g_free (object_name); + } + else + { + /* Default to the filename */ + gtk_list_store_set (store, &iter, 1, flist->data, -1); + } + } + + if (selected) + { + if (!strcmp (flist->data, selected)) + { + gtk_tree_selection_select_iter (selection, &iter); + } + } + g_free (flist->data); + flist = g_list_remove (flist, flist->data); + } + + if (!selected) + { + if (gtk_tree_model_get_iter_first (GTK_TREE_MODEL (store), &iter)) + gtk_tree_selection_select_iter (selection, &iter); + } +} + +void +readdirintolist_extended (const char *subdir, + GtkWidget *view, + char *selected, + gboolean with_filename_column, + gchar *(*get_object_name_cb) (const gchar *dir, + gchar *filename, + void *context), + void *context) +{ + char *tmpdir; + GList *thispath = parsepath (); + + while (thispath) + { + tmpdir = g_build_filename ((gchar *) thispath->data, subdir, NULL); + readdirintolist_real (tmpdir, view, selected, with_filename_column, + get_object_name_cb, context); + g_free (tmpdir); + thispath = thispath->next; + } +} + +void +readdirintolist (const char *subdir, + GtkWidget *view, + char *selected) +{ + readdirintolist_extended (subdir, view, selected, FALSE, NULL, NULL); +} + +/* + * Creates a radio button. + * box - the containing box. + * orient_type - The orientation ID + * label, help_string - self-describing + * radio_group - + * A pointer to a radio group. The function assigns its value + * as the radio group of the radio button. Afterwards, it assigns it + * a new value of the new radio group of the button. + * This is useful to group buttons. Just reset the variable to NULL, + * to create a new group. + * */ +GtkWidget * +create_radio_button (GtkWidget *box, + int orient_type, + void (*callback) (GtkWidget *wg, void *d), + const gchar *label, + const gchar *help_string, + GSList **radio_group, + GtkWidget **buttons_array) +{ + GtkWidget *tmpw; + + buttons_array[orient_type] = tmpw = + gtk_radio_button_new_with_label ((*radio_group), label); + gtk_box_pack_start (GTK_BOX (box), tmpw, FALSE, FALSE, 0); + gtk_widget_show (tmpw); + + g_signal_connect (tmpw, "clicked", + G_CALLBACK (callback), GINT_TO_POINTER (orient_type)); + gimp_help_set_help_data (tmpw, help_string, NULL); + + *radio_group = gtk_radio_button_get_group (GTK_RADIO_BUTTON (tmpw)); + + return tmpw; +} + |